diff --git a/.changeset/better-deer-tap.md b/.changeset/better-deer-tap.md new file mode 100644 index 00000000..f51a28fe --- /dev/null +++ b/.changeset/better-deer-tap.md @@ -0,0 +1,5 @@ +--- +"@stackoverflow/stacks-editor": patch +--- + +Support both @stackoverflow/stacks v2 and v3 as peer dependencies diff --git a/.changeset/mean-tools-hammer.md b/.changeset/mean-tools-hammer.md new file mode 100644 index 00000000..03da4dd0 --- /dev/null +++ b/.changeset/mean-tools-hammer.md @@ -0,0 +1,5 @@ +--- +"@stackoverflow/stacks-editor": patch +--- + +Add beta publishing information to README diff --git a/.changeset/ninety-lizards-report.md b/.changeset/ninety-lizards-report.md new file mode 100644 index 00000000..589e62f4 --- /dev/null +++ b/.changeset/ninety-lizards-report.md @@ -0,0 +1,5 @@ +--- +"@stackoverflow/stacks-editor": patch +--- + +update stacks classic peer dependency to point to beta diff --git a/.changeset/odd-rules-jump.md b/.changeset/odd-rules-jump.md new file mode 100644 index 00000000..bc276e74 --- /dev/null +++ b/.changeset/odd-rules-jump.md @@ -0,0 +1,5 @@ +--- +"@stackoverflow/stacks-editor": minor +--- + +ensure editor continue to work with stacks v3 styles diff --git a/.changeset/pre.json b/.changeset/pre.json new file mode 100644 index 00000000..28d02c65 --- /dev/null +++ b/.changeset/pre.json @@ -0,0 +1,15 @@ +{ + "mode": "exit", + "tag": "beta", + "initialVersions": { + "@stackoverflow/stacks-editor": "0.15.3" + }, + "changesets": [ + "better-deer-tap", + "mean-tools-hammer", + "ninety-lizards-report", + "odd-rules-jump", + "ripe-carpets-pull", + "wise-horses-wear" + ] +} diff --git a/.changeset/ripe-carpets-pull.md b/.changeset/ripe-carpets-pull.md new file mode 100644 index 00000000..97b6cdde --- /dev/null +++ b/.changeset/ripe-carpets-pull.md @@ -0,0 +1,5 @@ +--- +"@stackoverflow/stacks-editor": patch +--- + +update workflow file diff --git a/.changeset/stable-editor-release.md b/.changeset/stable-editor-release.md new file mode 100644 index 00000000..93096b49 --- /dev/null +++ b/.changeset/stable-editor-release.md @@ -0,0 +1,5 @@ +--- +"@stackoverflow/stacks-editor": patch +--- + +Require stable Stacks Classic 3 and prepare the final Editor 1.0 release. diff --git a/.changeset/wise-horses-wear.md b/.changeset/wise-horses-wear.md new file mode 100644 index 00000000..a73269ac --- /dev/null +++ b/.changeset/wise-horses-wear.md @@ -0,0 +1,5 @@ +--- +"@stackoverflow/stacks-editor": major +--- + +enter prerelease mode for project shine diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..7368f60c --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @StackExchange/stacks diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4ed58abb..6536f99f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,9 +2,9 @@ name: CI on: push: - branches: [main, beta] + branches: [main] pull_request: - branches: [main, beta] + branches: [main] jobs: lint: @@ -38,6 +38,38 @@ jobs: - name: Run unit tests run: npm run test:unit + package-test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + + - name: Setup Node.js environment + uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: "npm" + + - name: Install dependencies + run: npm ci + + - name: Test package artifact + run: npm run test:package + release-config-test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + + - name: Setup Node.js environment + uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: "npm" + + - name: Install dependencies + run: npm ci + + - name: Run release configuration tests + run: npm run test:release-config e2e-test: runs-on: ubuntu-latest steps: @@ -64,9 +96,9 @@ jobs: name: playwright-test-results path: test-results/ release: - name: Release (latest or beta) - if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/beta' - needs: [lint, unit-test, e2e-test] + name: Release (latest) + if: github.ref == 'refs/heads/main' + needs: [lint, unit-test, e2e-test, package-test, release-config-test] runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 @@ -88,8 +120,8 @@ jobs: publish: npm run release title: "chore(new-release)" commit: "chore(new-release)" - branch: ${{ github.ref == 'refs/heads/beta' && 'beta' || null }} - createGithubReleases: ${{ github.ref == 'refs/heads/main' }} + branch: main + createGithubReleases: true env: GITHUB_TOKEN: ${{ secrets.STACKS_TOOLING_GH_RW_PAT }} NPM_TOKEN: ${{ secrets.NPM_API_KEY }} diff --git a/.prettierignore b/.prettierignore index dbccff9c..a0ee75d1 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,4 +2,5 @@ .vscode/ stats.json dist/ -test-results/ \ No newline at end of file +test-results/ +.changeset/ diff --git a/CHANGELOG.md b/CHANGELOG.md index edf5c7ec..2787270c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,41 @@ # Changelog +## 1.0.0-beta.5 + +### Minor Changes + +- [#505](https://github.com/StackExchange/Stacks-Editor/pull/505) [`4e0102a`](https://github.com/StackExchange/Stacks-Editor/commit/4e0102a6821436c5b307b747697aafa308229f4f) Thanks [@giamir](https://github.com/giamir)! - ensure editor continue to work with stacks v3 styles + +## 1.0.0-beta.4 + +### Patch Changes + +- [`2738c2e`](https://github.com/StackExchange/Stacks-Editor/commit/2738c2eae1e69dea5081df9f5c5a1fe22cac3119) Thanks [@giamir](https://github.com/giamir)! - Support both @stackoverflow/stacks v2 and v3 as peer dependencies + +## 1.0.0-beta.3 + +### Patch Changes + +- [`b9019be`](https://github.com/StackExchange/Stacks-Editor/commit/b9019bea1b4078016b352611edcf827c402adfd8) Thanks [@giamir](https://github.com/giamir)! - update stacks classic peer dependency to point to beta + +## 1.0.0-beta.2 + +### Patch Changes + +- [#482](https://github.com/StackExchange/Stacks-Editor/pull/482) [`d9ad150`](https://github.com/StackExchange/Stacks-Editor/commit/d9ad150ecf4cf0ae987fbb14020cb07fb17d20dd) Thanks [@ttaylor-stack](https://github.com/ttaylor-stack)! - update workflow file + +## 1.0.0-beta.1 + +### Patch Changes + +- [#475](https://github.com/StackExchange/Stacks-Editor/pull/475) [`73e4b6e`](https://github.com/StackExchange/Stacks-Editor/commit/73e4b6e0191b25518b52e015d63b4853ea330f34) Thanks [@ttaylor-stack](https://github.com/ttaylor-stack)! - Add beta publishing information to README + +## 1.0.0-beta.0 + +### Major Changes + +- enter prerelease mode for project shine + ## 0.15.4 ### Patch Changes diff --git a/README.md b/README.md index 239cd6f1..8be5460f 100644 --- a/README.md +++ b/README.md @@ -88,13 +88,13 @@ You can upload your `stats.json` file [here](http://webpack.github.io/analyse/) ## Publishing -We use [changesets](https://github.com/changesets/changesets) to automatize the steps necessary to publish to NPM, create GH releases and a changelog. +We use [Changesets](https://github.com/changesets/changesets) to publish to npm, create GitHub Releases, and update the changelog. -- Every time you do work that requires a new release to be published, [add a changesets entry](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md) by running `npx @changesets/cli` and follow the instructions on screen. (changes that do not require a new release - e.g. changing a test file - don't need a changeset). - - When opening a PR without a corresponding changeset the [changesets-bot](https://github.com/apps/changeset-bot) will remind you to do so. It generally makes sense to have one changeset for PR (if the PR changes do not require a new release to be published the bot message can be safely ignored) -- The release github job continuously check if there are new pending changesets in the main branch, if there are it creates a GH PR and continue updating it as more changesets are potentially pushed/merged to the main branch. -- When we are ready to cut a release we need to simply merge the `chore(release)` PR back to main and the release github workflow will take care of publishing the changes to NPM and create a GH release for us. The `chore(release)` PR also give us an opportunity to adjust the automatically generated changelog when necessary (the entry in the changelog file is also what will end up in the GH release notes). +- Add a changeset to pull requests that require a package release. +- The release workflow creates and updates a release pull request against `main` while changesets are pending. +- Merging the reviewed release pull request publishes the package under npm's `latest` tag and creates a GitHub Release. +- The `v0` branch preserves supported Editor 0.15.x maintenance and publishes under the separate `legacy-v0` npm tag. -_The release github job only run if the lint, unit-test and e2e-test jobs are all successful: this is to block accidental releases_. +_The release job runs only after lint, unit, and end-to-end tests pass._ -_Despite using changesets to communicate the intent of creating releases in a more explicit way, we still follow [conventional commits standards](https://www.conventionalcommits.org/en/v1.0.0/) for keeping our git history easily parseable by the human eye._ +Continue using [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) for repository history. diff --git a/package-lock.json b/package-lock.json index 497e655c..5ea37302 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@stackoverflow/stacks-editor", - "version": "0.15.4", + "version": "1.0.0-beta.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@stackoverflow/stacks-editor", - "version": "0.15.4", + "version": "1.0.0-beta.5", "license": "MIT", "dependencies": { "@lezer/highlight": "^1.2.0", @@ -37,7 +37,7 @@ "@playwright/test": "^1.42.1", "@stackoverflow/commitlint-config": "^1.0.0", "@stackoverflow/prettier-config": "^1.0.0", - "@stackoverflow/stacks": "^2.9.0", + "@stackoverflow/stacks": "^3.0.0", "@stackoverflow/tsconfig": "^1.0.0", "@types/jest": "^29.5.12", "@types/markdown-it": "^14.0.0", @@ -63,6 +63,7 @@ "postcss-loader": "^8.1.1", "prettier": "^3.2.5", "prosemirror-test-builder": "^1.1.1", + "semver": "^7.6.3", "ts-jest": "^29.1.2", "ts-loader": "^9.5.1", "typescript": "^5.4.3", @@ -73,7 +74,7 @@ "webpack-merge": "^6.0.1" }, "peerDependencies": { - "@stackoverflow/stacks": "^2.3.0", + "@stackoverflow/stacks": "^3.0.0", "highlight.js": "^11.6.0" } }, @@ -2436,9 +2437,9 @@ } }, "node_modules/@stackoverflow/stacks": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@stackoverflow/stacks/-/stacks-2.9.0.tgz", - "integrity": "sha512-6VX9GTYFqsBFaelZ0sJ9YGZDa+1eLjr6Dh8r6cIh02SA/BcocWe0lxNZTcLpBQEKtX/9A0jTRsY3Au0BXcFJWQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@stackoverflow/stacks/-/stacks-3.0.0.tgz", + "integrity": "sha512-pSyQ6IanWfv7KdjNsIN1lvCIL+OdGGsCzby/KD9NEUkcygBdjSJrzJbI692PCBIP3+ovIfQS/TdrrGbRedBB1w==", "dev": true, "dependencies": { "@hotwired/stimulus": "^3.2.2", diff --git a/package.json b/package.json index a6e8baa0..8ce81f20 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@stackoverflow/stacks-editor", - "version": "0.15.4", + "version": "1.0.0-beta.5", "description": "", "repository": { "type": "git", @@ -43,6 +43,8 @@ "test": "npm run test:unit && npm run test:e2e", "test:unit": "jest --config config/jest-unit.config.js", "test:e2e": "npx playwright test --config config/playwright.config.ts", + "test:package": "npm run prepublishOnly && node --test scripts/package-artifact.test.mjs", + "test:release-config": "node --test scripts/stable-release-config.test.mjs", "release": "npm run build && changeset publish", "version": "changeset version && npm install --package-lock-only", "prepublishOnly": "npm run build && tsc --module ES6 --sourceMap false", @@ -72,7 +74,7 @@ "@playwright/test": "^1.42.1", "@stackoverflow/commitlint-config": "^1.0.0", "@stackoverflow/prettier-config": "^1.0.0", - "@stackoverflow/stacks": "^2.9.0", + "@stackoverflow/stacks": "^3.0.0", "@stackoverflow/tsconfig": "^1.0.0", "@types/jest": "^29.5.12", "@types/markdown-it": "^14.0.0", @@ -98,6 +100,7 @@ "postcss-loader": "^8.1.1", "prettier": "^3.2.5", "prosemirror-test-builder": "^1.1.1", + "semver": "^7.6.3", "ts-jest": "^29.1.2", "ts-loader": "^9.5.1", "typescript": "^5.4.3", @@ -129,7 +132,7 @@ "prosemirror-view": "^1.37.1" }, "peerDependencies": { - "@stackoverflow/stacks": "^2.3.0", + "@stackoverflow/stacks": "^3.0.0", "highlight.js": "^11.6.0" } } diff --git a/plugins/official/stack-snippets/src/snippet-view.ts b/plugins/official/stack-snippets/src/snippet-view.ts index 742c2739..0421e98a 100644 --- a/plugins/official/stack-snippets/src/snippet-view.ts +++ b/plugins/official/stack-snippets/src/snippet-view.ts @@ -89,14 +89,14 @@ export class StackSnippetView implements NodeView { ctas.className = "snippet-ctas d-flex ai-center"; if (opts && opts.renderer) { const snippetButtonContainer = document.createElement("div"); - snippetButtonContainer.className = "snippet-buttons mb0 gs4"; + snippetButtonContainer.className = "snippet-buttons d-flex mb0 g4"; ctas.appendChild(snippetButtonContainer); this.buildRunButton(snippetButtonContainer); this.buildEditButton(snippetButtonContainer); const snippetResultButtonContainer = document.createElement("div"); snippetResultButtonContainer.className = - "snippet-result-buttons d-flex mb0 ml-auto gs4"; + "snippet-result-buttons d-flex mb0 ml-auto g24"; ctas.appendChild(snippetResultButtonContainer); this.showButton = this.buildShowButton( snippetResultButtonContainer @@ -290,12 +290,12 @@ export class StackSnippetView implements NodeView { private buildRunButton(container: HTMLDivElement): void { const runCodeButton = document.createElement("button"); runCodeButton.type = "button"; - runCodeButton.className = "s-btn s-btn__filled flex--item"; + runCodeButton.className = "s-btn s-btn__icon flex--item"; runCodeButton.title = "Run code snippet"; runCodeButton.setAttribute("aria-label", "Run code snippet"); // create the svg svg-icon-bg element const runIcon = document.createElement("span"); - runIcon.className = "svg-icon-bg mr4 iconPlay"; + runIcon.className = "svg-icon-bg mr4 h16 iconPlay"; runCodeButton.append(runIcon); const runText = document.createElement("span"); runText.textContent = "Run code snippet"; @@ -353,7 +353,7 @@ export class StackSnippetView implements NodeView { private buildEditButton(container: HTMLDivElement): HTMLButtonElement { const editButton = document.createElement("button"); editButton.type = "button"; - editButton.className = "s-btn s-btn__outlined flex--item"; + editButton.className = "s-btn s-btn__clear flex--item"; editButton.title = "Edit code snippet"; editButton.setAttribute("aria-label", "Edit code snippet"); editButton.textContent = "Edit code snippet"; @@ -368,11 +368,11 @@ export class StackSnippetView implements NodeView { private buildHideButton(container: HTMLDivElement): HTMLButtonElement { const hideButton = document.createElement("button"); hideButton.type = "button"; - hideButton.className = "s-btn flex--item"; + hideButton.className = "s-btn s-btn__link d-flex flex--item"; hideButton.title = "Hide results"; hideButton.setAttribute("aria-label", "Hide results"); const hideIcon = document.createElement("span"); - hideIcon.className = "svg-icon-bg mr4 iconEyeOff"; + hideIcon.className = "svg-icon-bg iconEyeOff"; hideButton.append(hideIcon); const hideText = document.createElement("span"); hideText.textContent = "Hide results"; @@ -394,11 +394,11 @@ export class StackSnippetView implements NodeView { private buildShowButton(container: HTMLDivElement): HTMLButtonElement { const showButton = document.createElement("button"); showButton.type = "button"; - showButton.className = "s-btn flex--item d-none"; + showButton.className = "s-btn s-btn__link flex--item d-flex d-none"; showButton.title = "Show results"; showButton.setAttribute("aria-label", "Show results"); const hideIcon = document.createElement("span"); - hideIcon.className = "svg-icon-bg mr4 iconEye"; + hideIcon.className = "svg-icon-bg iconEye"; showButton.append(hideIcon); const showText = document.createElement("span"); showText.textContent = "Show results"; @@ -423,7 +423,7 @@ export class StackSnippetView implements NodeView { ): HTMLButtonElement { const expandButton = document.createElement("button"); expandButton.type = "button"; - expandButton.className = "s-btn flex--item"; + expandButton.className = "s-btn s-btn__link d-flex flex--item"; expandButton.title = "Expand Snippet"; expandButton.setAttribute("aria-label", "Expand Snippet"); expandButton.addEventListener("click", () => { @@ -436,7 +436,7 @@ export class StackSnippetView implements NodeView { ); }); const expandIcon = document.createElement("span"); - expandIcon.className = "svg-icon-bg mr4 iconShareSm"; + expandIcon.className = "svg-icon-bg iconShareSm"; expandButton.append(expandIcon); const expandText = document.createElement("span"); expandText.textContent = "Expand Snippet"; @@ -451,7 +451,8 @@ export class StackSnippetView implements NodeView { ): HTMLButtonElement { const collapseButton = document.createElement("button"); collapseButton.type = "button"; - collapseButton.className = "s-btn flex--item td-underline ml-auto"; + collapseButton.className = + "s-btn s-btn__link d-flex flex--item ml-auto"; collapseButton.title = "Return to post"; collapseButton.setAttribute("aria-label", "Return to post"); collapseButton.addEventListener("click", () => { @@ -464,7 +465,7 @@ export class StackSnippetView implements NodeView { ); }); const collapseIcon = document.createElement("span"); - collapseIcon.className = "svg-icon-bg mr4 iconShareSm"; + collapseIcon.className = "svg-icon-bg iconShareSm"; collapseButton.append(collapseIcon); const expandText = document.createElement("span"); expandText.textContent = "Return to post"; diff --git a/scripts/package-artifact.test.mjs b/scripts/package-artifact.test.mjs new file mode 100644 index 00000000..7b9a31bd --- /dev/null +++ b/scripts/package-artifact.test.mjs @@ -0,0 +1,32 @@ +import assert from "node:assert/strict"; +import { execFileSync } from "node:child_process"; +import { readFile } from "node:fs/promises"; +import { describe, test } from "node:test"; + +const packageJson = JSON.parse( + await readFile(new URL("../package.json", import.meta.url), "utf8") +); + +describe("published package artifact", () => { + test("contains every public export", () => { + const packResult = JSON.parse( + execFileSync( + "npm", + ["pack", "--dry-run", "--json", "--ignore-scripts"], + { encoding: "utf8" } + ) + )[0]; + const packedFiles = new Set(packResult.files.map(({ path }) => path)); + const exportTargets = Object.values(packageJson.exports).flatMap( + (entry) => + typeof entry === "string" ? [entry] : Object.values(entry) + ); + + for (const target of exportTargets) { + assert.ok( + packedFiles.has(target.replace(/^\.\//, "")), + `${target} is missing from the packed package` + ); + } + }); +}); diff --git a/scripts/stable-release-config.test.mjs b/scripts/stable-release-config.test.mjs new file mode 100644 index 00000000..5155ece7 --- /dev/null +++ b/scripts/stable-release-config.test.mjs @@ -0,0 +1,117 @@ +import assert from "node:assert/strict"; +import { existsSync } from "node:fs"; +import { readFile } from "node:fs/promises"; +import { describe, test } from "node:test"; +import semver from "semver"; + +const readRepositoryFile = (path) => + readFile(new URL(`../${path}`, import.meta.url), "utf8"); + +describe("stable release configuration", () => { + test("uses stable V3 package metadata", async () => { + const packageJson = JSON.parse( + await readRepositoryFile("package.json") + ); + const packageLock = JSON.parse( + await readRepositoryFile("package-lock.json") + ); + const version = semver.parse(packageJson.version); + + assert.equal(version?.major, 1); + assert.equal(packageLock.version, packageJson.version); + assert.equal(packageLock.packages[""].version, packageJson.version); + assert.equal( + packageJson.devDependencies["@stackoverflow/stacks"], + "^3.0.0" + ); + assert.equal( + packageJson.peerDependencies["@stackoverflow/stacks"], + "^3.0.0" + ); + assert.equal( + packageJson.dependencies["@stackoverflow/stacks-icons"], + "^6.2.0" + ); + }); + + test("publishes only from main after every release gate passes", async () => { + const workflow = await readRepositoryFile(".github/workflows/main.yml"); + const changesetConfig = JSON.parse( + await readRepositoryFile(".changeset/config.json") + ); + const codeowners = await readRepositoryFile(".github/CODEOWNERS"); + + assert.equal(workflow.match(/branches: \[main\]/g)?.length, 2); + assert.match(workflow, /if: github\.ref == 'refs\/heads\/main'/); + assert.match(workflow, /publish: npm run release/); + assert.match(workflow, /branch: main/); + assert.match(workflow, /createGithubReleases: true/); + assert.match( + workflow, + /needs: \[lint, unit-test, e2e-test, package-test, release-config-test\]/ + ); + assert.doesNotMatch(workflow, /refs\/heads\/beta/); + assert.equal(changesetConfig.baseBranch, "main"); + assert.equal(codeowners.trim(), "* @StackExchange/stacks"); + }); + + test("has exited prerelease mode when prerelease state exists", async () => { + const preJsonPath = new URL("../.changeset/pre.json", import.meta.url); + const packageJson = JSON.parse( + await readRepositoryFile("package.json") + ); + + if (existsSync(preJsonPath)) { + const preState = JSON.parse(await readFile(preJsonPath, "utf8")); + + assert.equal(packageJson.version, "1.0.0-beta.5"); + assert.equal(preState.mode, "exit"); + assert.equal( + preState.initialVersions["@stackoverflow/stacks-editor"], + "0.15.3" + ); + assert.deepEqual(preState.changesets, [ + "better-deer-tap", + "mean-tools-hammer", + "ninety-lizards-report", + "odd-rules-jump", + "ripe-carpets-pull", + "wise-horses-wear", + ]); + assert.match( + await readRepositoryFile(".changeset/wise-horses-wear.md"), + /"@stackoverflow\/stacks-editor": major/ + ); + assert.match( + await readRepositoryFile(".changeset/stable-editor-release.md"), + /"@stackoverflow\/stacks-editor": patch/ + ); + } else { + assert.equal(packageJson.version, "1.0.0"); + assert.match( + await readRepositoryFile("CHANGELOG.md"), + /^## 1\.0\.0$/m + ); + } + }); + + test("removes beta branding from the stable site", async () => { + const layout = await readRepositoryFile("site/layout.html"); + const index = await readRepositoryFile("site/views/index.html"); + + assert.doesNotMatch(layout, /\[BETA\]|>BetaBeta { + const layout = await readRepositoryFile("site/layout.html"); + const menuHelpers = await readRepositoryFile( + "src/shared/menu/helpers.ts" + ); + + assert.doesNotMatch(layout, /s-block-link/); + assert.doesNotMatch(menuHelpers, /s-block-link/); + assert.match(layout, /s-menu--item/); + assert.match(menuHelpers, /s-menu--action/); + }); +}); diff --git a/site/layout.html b/site/layout.html index 7de4b59b..ae206131 100644 --- a/site/layout.html +++ b/site/layout.html @@ -14,7 +14,7 @@