diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 5326336cc6..0c8ea6d125 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -33,7 +33,7 @@ body: label: Steps to reproduce description: | A description with steps to reproduce the issue. - Provide a link to a public repository or create a reproducible [sandbox](https://codesandbox.io/s/307qqv236): + Provide a link to a public repository or create a reproducible [sandbox](https://sandbox.docsifyjs.org/): placeholder: | 1. Step 1 2. Step 2 diff --git a/.github/semantic.yml b/.github/semantic.yml deleted file mode 100644 index e7f5bb59b9..0000000000 --- a/.github/semantic.yml +++ /dev/null @@ -1,4 +0,0 @@ -titleAndCommits: true -allowMergeCommits: true -allowRevertCommits: true -anyCommit: true diff --git a/.github/workflows/crowdin.yml b/.github/workflows/crowdin.yml index 793cbaaec1..78f6912655 100644 --- a/.github/workflows/crowdin.yml +++ b/.github/workflows/crowdin.yml @@ -16,7 +16,7 @@ jobs: uses: actions/checkout@v7 - name: Crowdin push - uses: crowdin/github-action@v2 + uses: crowdin/github-action@v3 with: upload_sources: true upload_translations: false diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8bb0b5348b..8019d5ce43 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -96,7 +96,7 @@ jobs: uses: actions/upload-artifact@v7 if: failure() with: - name: ${{ matrix.os }}-${{ matrix.node-version }}-artifacts + name: test-artifacts-${{ github.run_id }}-${{ github.run_attempt }} path: | _playwright-results/ _playwright-report/ diff --git a/.husky/install.mjs b/.husky/install.mjs new file mode 100644 index 0000000000..5a33bee71d --- /dev/null +++ b/.husky/install.mjs @@ -0,0 +1,6 @@ +// Skip Husky install in production and CI +if (process.env.NODE_ENV === 'production' || process.env.CI === 'true') { + process.exit(0); +} +const husky = (await import('husky')).default; +console.log(husky()); diff --git a/README.md b/README.md index 192a8c00f4..5813199be6 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ Docsify turns one or more Markdown files into a Website, with no build process r Get going fast by using a static web server or GitHub Pages with this ready-to-use [Docsify Template](https://github.com/docsifyjs/docsify-template), review the [quick start tutorial](https://docsify.js.org/#/quickstart) or jump right into a CodeSandbox example site with the button below. -[![Edit 307qqv236](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/307qqv236) +[![Edit in CodeSandbox](https://codesandbox.io/static/img/play-codesandbox.svg)](https://sandbox.docsifyjs.org/) ## Showcase diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index f57d273a08..0000000000 --- a/SECURITY.md +++ /dev/null @@ -1,23 +0,0 @@ -# Security Policy - -If you believe you have found a security vulnerability in docsify, please report it to us asap. - -## Reporting a Vulnerability - -**Please do not report security vulnerabilities through our public GitHub issues.** - -Send email to us via :email: maintainers@docsifyjs.org. - -Please include as much of the following information as possible to help us better understand the possible issue: - -- Type of issue (e.g. cross-site scripting) -- Full paths of source file(s) related to the manifestation of the issue -- The location of the affected source code (tag/branch/commit or direct URL) -- Any special configuration required to reproduce the issue -- Step-by-step instructions to reproduce the issue -- Proof-of-concept or exploit code -- Impact of the issue, including how an attacker might exploit the issue - -This information will help us triage your report more quickly. - -Thank you in advance. diff --git a/build/types.js b/build/types.js new file mode 100644 index 0000000000..3cfd66110f --- /dev/null +++ b/build/types.js @@ -0,0 +1,18 @@ +import fs from 'node:fs/promises'; +import path from 'node:path'; + +const projectDir = path.join(import.meta.dirname, '..'); +const sourcePath = path.join(projectDir, 'src/core/module.d.ts'); +const outputDir = path.join(projectDir, 'dist'); +const outputNames = ['docsify.module.d.ts', 'docsify.module.min.d.ts']; + +const declaration = (await fs.readFile(sourcePath, 'utf8')) + .replaceAll('"./', '"../src/core/') + .replace(/\/\/# sourceMappingURL=.*\n?$/, ''); + +await fs.mkdir(outputDir, { recursive: true }); +await Promise.all( + outputNames.map(outputName => + fs.writeFile(path.join(outputDir, outputName), declaration), + ), +); diff --git a/docs/README.md b/docs/README.md index 48fb465889..b3aefaa74e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -17,7 +17,7 @@ Docsify turns your Markdown files into a documentation website instantly. Unlike ## Examples -Check out the [Showcase](https://github.com/docsifyjs/awesome-docsify#showcase) to see docsify in use. +Check out the [Showcase](awesome?id=showcase) to see docsify in use. ## Donate diff --git a/docs/cdn.md b/docs/cdn.md index e4d38752ec..156f4d0e64 100644 --- a/docs/cdn.md +++ b/docs/cdn.md @@ -10,7 +10,6 @@ Other CDNs are available and may be required in locations where jsDelivr is not - https://cdnjs.com/libraries/docsify - https://unpkg.com/browse/docsify/ -- https://www.bootcdn.cn/docsify/ ## Specifying versions diff --git a/docs/configuration.md b/docs/configuration.md index 7b61752984..16d1fded40 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -12,6 +12,21 @@ You can configure Docsify by defining `window.$docsify` as an object: ``` +Docsify is also available as an ES module. Import `Docsify` from a CDN and pass +the configuration object to a new `Docsify` instance: + +```html + +``` + The config can also be defined as a function, in which case the first argument is the Docsify `vm` instance. The function should return a config object. This can be useful for referencing `vm` in places like the markdown configuration: ```html @@ -109,6 +124,37 @@ window.$docsify = { Determines if Docsify should handle uncaught _synchronous_ plugin errors automatically. This can prevent plugin errors from affecting docsify's ability to properly render live site content. +## collapseSidebarGroups + +- Type: `Boolean` +- Default: `false` + +Initially collapses all root sidebar groups when `collapsibleSidebarGroups` is +enabled. Visitors can still expand and collapse each group by selecting its +title. Their choices are preserved while navigating between pages. + +```js +window.$docsify = { + collapseSidebarGroups: true, + collapsibleSidebarGroups: true, +}; +``` + +## collapsibleSidebarGroups + +- Type: `Boolean` +- Default: `false` + +Enables visitors to expand and collapse root sidebar groups by selecting their +titles or using the Enter and Space keys. Enabling a +sidebar chevron theme class also displays chevrons on these group titles. + +```js +window.$docsify = { + collapsibleSidebarGroups: true, +}; +``` + ## cornerExternalLinkTarget - Type: `String` @@ -306,6 +352,20 @@ window.$docsify = { }; ``` +## sidebarPosition + +- Type: `String` +- Default: `'left'` + +Controls which side of the page displays the sidebar. Set this to `'right'` to +place the sidebar and its toggle on the right. + +```js +window.$docsify = { + sidebarPosition: 'right', +}; +``` + ## homepage - Type: `String` @@ -472,6 +532,21 @@ window.$docsify = { }; ``` +## navbarPreservePath + +- Type: `Boolean` +- Default: `false` + +If **true**, appends the current document path to navbar links that point to a language root. This makes it possible to switch languages while staying on the corresponding document. + +For example, when the current path is `/quickstart`, a navbar link to `/zh-cn/` becomes `/zh-cn/quickstart`. + +```js +window.$docsify = { + navbarPreservePath: true, +}; +``` + ## name - Type: `Boolean|String` diff --git a/docs/deploy.md b/docs/deploy.md index a806b82a1d..79af6c6956 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -256,3 +256,14 @@ To deploy your Docsify site using DeployHQ: Your Docsify site will be deployed to your server. You can enable automatic deployments to deploy on every Git push, or schedule deployments for specific times. For more information on advanced deployment features, see [DeployHQ's documentation](https://www.deployhq.com/support). + +## deed.page + +[deed.page](https://deed.page) hosts static sites published with one HTTP `PUT`. No account or build step is needed, so you can upload the `docs` folder as it is: + +```bash +tar -C docs -czf site.tar.gz . +curl -T site.tar.gz "https://deed.page/v1/sites?slug=my-docs" +``` + +The response includes the live `https://my-docs.deed.page/` URL and a token. To publish an update to the same slug, run the same command with `-H "Authorization: Bearer "`. A single upload is capped at 4 MB; see the [deed.page docs](https://deed.page/docs) for larger sites. diff --git a/docs/index.html b/docs/index.html index cb9ee980d5..c9300f0ad7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -112,6 +112,7 @@ 'https://cdn.jsdelivr.net/gh/docsifyjs/docs-zh@main/$1', }, auto2top: true, + collapsibleSidebarGroups: true, coverpage: true, executeScript: true, // hideSidebar: true, diff --git a/docs/plugins.md b/docs/plugins.md index 00da722c81..bca83191b4 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -65,6 +65,11 @@ By default, the hyperlink on the current page is recognized and the content is s // You can provide a regexp to match prefixes. In this case, // the matching substring will be used to identify the index pathNamespaces: /^(\/(zh-cn|ru-ru))?(\/(v1|v2))?/, + + // Show where each result comes from (default: 'none') + // 'page': the page title, e.g. "Guide" + // 'breadcrumb': the sidebar path, e.g. "Basics › Guide" + resultSource: 'none', }, }; diff --git a/docs/themes.md b/docs/themes.md index 6eb436bfd1..698ad90551 100644 --- a/docs/themes.md +++ b/docs/themes.md @@ -110,6 +110,10 @@ Display a loading animation while waiting for Docsify to initialize. Display expand/collapse icons on page links in the sidebar. +Root group titles display chevrons only when +[`collapsibleSidebarGroups`](configuration.md?id=collapsiblesidebargroups) is +enabled. + @@ -117,6 +121,10 @@ Display expand/collapse icons on page links in the sidebar. +
+ ```html @@ -128,6 +136,14 @@ Display expand/collapse icons on page links in the sidebar. ``` +To hide chevrons on all root-level page links and group titles while retaining +chevrons on nested page links, add the `sidebar-chevron-root-hidden` class: + + +```html + +``` + To prevent chevrons from displaying for specific page links, add a `no-chevron` class as follows: ```md diff --git a/docs/v5-upgrade.md b/docs/v5-upgrade.md index cd30ce455d..7db4000cb0 100644 --- a/docs/v5-upgrade.md +++ b/docs/v5-upgrade.md @@ -101,7 +101,7 @@ View [Theme Classes](themes.md?id=classes) for more details. - + ``` **Note:** If you're using additional Docsify plugins (such as emoji, external-script, front-matter, etc.), you'll need to update those URLs as well following the same pattern: @@ -110,12 +110,41 @@ View [Theme Classes](themes.md?id=classes) for more details. - Update version from `@4` (or non-versioned) to `@5` - Example: `//cdn.jsdelivr.net/npm/docsify/lib/plugins/emoji.min.js` becomes `//cdn.jsdelivr.net/npm/docsify@5/dist/plugins/emoji.min.js` +#### Plugin Authors + +If you've written a custom plugin that uses `window.Docsify.dom.toggleClass`, this helper has been removed in v5. Replace it with the native `Element.classList` API. + +Examples: + +```js +// v4 +window.Docsify.dom.toggleClass(element, 'className'); + +// v5 +element.classList.toggle('className'); +``` + +```js +// v4 +window.Docsify.dom.toggleClass(element, 'action', 'className'); + +// v5 +element.classList.action('className'); +``` + +```js +// v4 +window.Docsify.dom.toggleClass(element, isDark ? 'add' : 'remove', 'dark'); + +// v5 +element.classList[isDark ? 'add' : 'remove']('dark'); +``` + ## Key Differences Summary - **CDN Path**: Changed from `/lib/` to `/dist/` - **Version**: Updated from `@4` to `@5` - **Themes**: v5 uses a core theme (with optional add-ons available) -- **Plugin Names**: `zoom-image` → `zoom` ## Additional Notes diff --git a/package-lock.json b/package-lock.json index 387390f197..602b22db04 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,9 +32,9 @@ "@types/eslint": "^8.40.2", "@types/prismjs": "^1.26.5", "axios": "^1.5.0", - "browser-sync": "^3.0.2", + "browser-sync": "^3.0.4", "cross-env": "^10.0.0", - "cssnano": "^8.0.2", + "cssnano": "^9.9.0", "eslint": "^9.3.0", "eslint-config-prettier": "^10.0.1", "eslint-plugin-jest": "^29.2.1", @@ -47,7 +47,7 @@ "jest-environment-jsdom": "^30.0.5", "lint-staged": "^17.0.8", "npm-run-all": "^4.1.5", - "postcss-cli": "^11.0.0", + "postcss-cli": "^12.0.0", "postcss-import": "^16.1.0", "postcss-nesting": "^14.0.0", "prettier": "^3.2.5", @@ -448,9 +448,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "version": "7.29.11", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.11.tgz", + "integrity": "sha512-snZbO7MEDOof+hvNa97EjEY7qD7h2kwvQr5AJC3ZhQudKW5dnej6k3kP9NQV88hJwaS8vDqRLFo9rivLEhle2g==", "dev": true, "license": "MIT", "engines": { @@ -507,13 +507,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "version": "7.29.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.11.tgz", + "integrity": "sha512-OZ6+oaK7GMyg3IfCpj8JOmn8n+w2rJbDT0LLfVDTLb1ZFeKDh3AiNELgCMUw175IJHSkLl74hG0M0VLsvx+gag==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.7" + "@babel/types": "^7.29.11" }, "bin": { "parser": "bin/babel-parser.js" @@ -1816,13 +1816,13 @@ } }, "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "version": "7.29.11", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.11.tgz", + "integrity": "sha512-WCsemW40Cpc6gouC1SrY6PBaZ+oLRlEVY9XBvZBI7il/HyUrb2nJ505wE1MHEFyDZNnrWDEuy4jL50WVHfTTSQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-string-parser": "^7.29.11", "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { @@ -1836,9 +1836,9 @@ "dev": true }, "node_modules/@colordx/core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@colordx/core/-/core-5.5.0.tgz", - "integrity": "sha512-3PxTH8itZzltK0U9jTwVVnjLXvnDYuq3m+QXsHkENxWiPRh4WaoLcs1SQjqgZ55kS+QyirpH5BVwzP2gMVG6EQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@colordx/core/-/core-7.3.0.tgz", + "integrity": "sha512-LVzTTPhX7wpy7TkGjouA9zbbCBIw92RGm7ZQqSKFE0oYE3sMx2FGXz90eVpgw7k/+wrrY+qJ86nHXifZWMS5jA==", "dev": true, "license": "MIT" }, @@ -3153,9 +3153,9 @@ } }, "node_modules/@jest/reporters/node_modules/brace-expansion": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", - "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", "dev": true, "license": "MIT", "dependencies": { @@ -3931,10 +3931,11 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", - "dev": true + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.29", @@ -4582,18 +4583,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", @@ -4919,9 +4908,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", - "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", "dev": true, "license": "MIT", "dependencies": { @@ -5269,104 +5258,124 @@ ] }, "node_modules/@vue/compiler-core": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.31.tgz", - "integrity": "sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==", + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.44.tgz", + "integrity": "sha512-k34nCytbK8PQ1gR2mGROYOw6Pnv/mumqIdrZ3x2tbyXZDWm7ViKGLTfdB+DRrWqEQsLgGJvn0WN9jBif5zCTLQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "^7.24.7", - "@vue/shared": "3.4.31", - "entities": "^4.5.0", + "@babel/parser": "^7.29.9", + "@vue/shared": "3.5.44", + "entities": "^7.0.1", "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" + "source-map-js": "^1.2.2" + } + }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.31.tgz", - "integrity": "sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==", + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.44.tgz", + "integrity": "sha512-W5AoBFWdw1lQAKiHowkfgFKFab82oSRT6sGsPfw/q1GRjsy/ZJFLHGhJyBRIFN9APLTUduDH9U2JAiPOIyKuYg==", "dev": true, + "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.4.31", - "@vue/shared": "3.4.31" + "@vue/compiler-core": "3.5.44", + "@vue/shared": "3.5.44" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.31.tgz", - "integrity": "sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==", + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.44.tgz", + "integrity": "sha512-dzHmQ4jXTpdr5FjIQUeykVakN/uzqFbUo9/C5ikBFg3a3PeM6uRxeczx1ZbXBML0/zJstEh3ygYipzR5Z7b2Pw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "^7.24.7", - "@vue/compiler-core": "3.4.31", - "@vue/compiler-dom": "3.4.31", - "@vue/compiler-ssr": "3.4.31", - "@vue/shared": "3.4.31", + "@babel/parser": "^7.29.9", + "@vue/compiler-core": "3.5.44", + "@vue/compiler-dom": "3.5.44", + "@vue/compiler-ssr": "3.5.44", + "@vue/shared": "3.5.44", "estree-walker": "^2.0.2", - "magic-string": "^0.30.10", - "postcss": "^8.4.38", - "source-map-js": "^1.2.0" + "magic-string": "^0.30.21", + "postcss": "^8.5.29", + "source-map-js": "^1.2.2" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.31.tgz", - "integrity": "sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==", + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.44.tgz", + "integrity": "sha512-xr5gb1JVHlfXJwSlRz1FeP6uxoazdzHuMTVLE7up+4Vrqxk219CvxLPxD9NXBt47yvZW7+p4DXfyp4O1fkByIA==", "dev": true, + "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.31", - "@vue/shared": "3.4.31" + "@vue/compiler-dom": "3.5.44", + "@vue/shared": "3.5.44" } }, "node_modules/@vue/reactivity": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.31.tgz", - "integrity": "sha512-VGkTani8SOoVkZNds1PfJ/T1SlAIOf8E58PGAhIOUDYPC4GAmFA2u/E14TDAFcf3vVDKunc4QqCe/SHr8xC65Q==", + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.44.tgz", + "integrity": "sha512-u+QJdKeBBEADkPdevsL+6E12QlYVfBD8Zcw5qjDQKtamI6l14KyqazJMobhCKelhWN5zpyKUiEDoTyHE93cqWw==", "dev": true, + "license": "MIT", "dependencies": { - "@vue/shared": "3.4.31" + "@vue/shared": "3.5.44" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.31.tgz", - "integrity": "sha512-LDkztxeUPazxG/p8c5JDDKPfkCDBkkiNLVNf7XZIUnJ+66GVGkP+TIh34+8LtPisZ+HMWl2zqhIw0xN5MwU1cw==", + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.44.tgz", + "integrity": "sha512-uEa/ndwjhrrhnOfb2p+sZy6zeoamJOISqaLSJGk/8R6nABT1ZldpzcJoPzKj+zHVomVBPcmQYyC2r4LtvDV6CQ==", "dev": true, + "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.31", - "@vue/shared": "3.4.31" + "@vue/reactivity": "3.5.44", + "@vue/shared": "3.5.44" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.31.tgz", - "integrity": "sha512-2Auws3mB7+lHhTFCg8E9ZWopA6Q6L455EcU7bzcQ4x6Dn4cCPuqj6S2oBZgN2a8vJRS/LSYYxwFFq2Hlx3Fsaw==", + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.44.tgz", + "integrity": "sha512-3fc4ARcXVhVBaJ3ujWiNZJARD6pkyRcwG+ZYhMzjKtKUp7MAY0HLwr7r3Smep3Li6ZaWT6ewdmx8XqdaD5oNZg==", "dev": true, + "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.31", - "@vue/runtime-core": "3.4.31", - "@vue/shared": "3.4.31", - "csstype": "^3.1.3" + "@vue/reactivity": "3.5.44", + "@vue/runtime-core": "3.5.44", + "@vue/shared": "3.5.44", + "csstype": "^3.2.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.31.tgz", - "integrity": "sha512-D5BLbdvrlR9PE3by9GaUp1gQXlCNadIZytMIb8H2h3FMWJd4oUfkUTEH2wAr3qxoRz25uxbTcbqd3WKlm9EHQA==", + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.44.tgz", + "integrity": "sha512-R4S1UoH4h5Frrauv8Z5XE5TxV9oBiUSgWIC4TyVK1FK+RocRnOLwFA5Xcmo2011RlgJp+AbZCnw6afrhlgRuUQ==", "dev": true, + "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.4.31", - "@vue/shared": "3.4.31" - }, - "peerDependencies": { - "vue": "3.4.31" + "@vue/compiler-ssr": "3.5.44", + "@vue/runtime-dom": "3.5.44", + "@vue/shared": "3.5.44" } }, "node_modules/@vue/shared": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.31.tgz", - "integrity": "sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==", - "dev": true + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.44.tgz", + "integrity": "sha512-H82XLH0DjmSOdbEwO15x3QTo1f5PWEtv237eLpYKc0mqLu+B8hnq16lFWmuBmNurkeiG3wr+oM1FhOll/YVFRg==", + "dev": true, + "license": "MIT" }, "node_modules/accepts": { "version": "1.3.8", @@ -5588,14 +5597,14 @@ } }, "node_modules/axios": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.0.tgz", - "integrity": "sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.20.0.tgz", + "integrity": "sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==", "dev": true, "license": "MIT", "dependencies": { "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", + "form-data": "^4.0.6", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } @@ -5845,9 +5854,9 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.10.40", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.40.tgz", - "integrity": "sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==", + "version": "2.11.32", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.32.tgz", + "integrity": "sha512-UvuxFU9P3hM29LrQdwu0cD6w6/+SFr+UlB9s/knI7+O2rK9xFxKUwSDWxGdbbqQ9/V7BJ5s0NI5nQAE4uJp3gQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -5875,17 +5884,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC" - }, "node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, "license": "MIT", "dependencies": { @@ -6126,9 +6128,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", - "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", + "version": "4.29.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.4.tgz", + "integrity": "sha512-2TcbbiwXEq+N0kD36tykpCfyyQigUXmuwNQbnPp4Xk4PX9JOqVIKjJlIDjpH7uY6tmRGoAd+apeT1p60T8wsdA==", "dev": true, "funding": [ { @@ -6146,11 +6148,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.38", - "caniuse-lite": "^1.0.30001799", - "electron-to-chromium": "^1.5.376", - "node-releases": "^2.0.48", - "update-browserslist-db": "^1.2.3" + "baseline-browser-mapping": "^2.11.29", + "caniuse-lite": "^1.0.30001816", + "electron-to-chromium": "^1.5.459", + "node-releases": "^2.0.59", + "update-browserslist-db": "^1.3.4" }, "bin": { "browserslist": "cli.js" @@ -6287,9 +6289,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001799", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", - "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", + "version": "1.0.30001819", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001819.tgz", + "integrity": "sha512-LFUqIIAwpzsIuevnKnsR9qnStBcgzPShTX61lBwN9uFkkf8o8zLiebEjbW8AYtZiF+1YKDWfdt/pWDtMuG8Xwg==", "dev": true, "funding": [ { @@ -7036,50 +7038,6 @@ "node": ">= 8" } }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -7093,119 +7051,49 @@ } }, "node_modules/cssnano": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-8.0.2.tgz", - "integrity": "sha512-K+a76gA1v0/CsYgcsE95HGGyIuPKxpQSetwSwz4nHEM8fFXqSkzq2JzEXFL8v5+CCjxzVVVhPcTK3Oo8SaF/xA==", + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-9.9.0.tgz", + "integrity": "sha512-JS914Th2NRk2979JHJvbE3UjPtLmyXtPnr23NNul9BOQwEt9r/A2aM1STrKtKHAPc3XRaUDwMoqkXnjEpgHkAw==", "dev": true, "license": "MIT", "dependencies": { - "cssnano-preset-default": "^8.0.2", - "lilconfig": "^3.1.3" + "@colordx/core": "^7.3.0", + "@csstools/css-tokenizer": "^4.0.2", + "browserslist": "^4.29.3", + "caniuse-api": "^4.0.0", + "postcss-calc": "^11.2.2" }, "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" + "node": "^22.22.3 || ^24.15.0 || >=26.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/cssnano" }, "peerDependencies": { - "postcss": "^8.5.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-8.0.2.tgz", - "integrity": "sha512-+jQAqIKCqMmBjZs7741XkilU93ITZ/EW8gjAkMmujdCzfDkfjrDBv2VqkSu29Fzeig/0rZ3S9IAwfPLlmXEUfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.2", - "cssnano-utils": "^6.0.1", - "postcss-calc": "^10.1.1", - "postcss-colormin": "^8.0.1", - "postcss-convert-values": "^8.0.1", - "postcss-discard-comments": "^8.0.1", - "postcss-discard-duplicates": "^8.0.1", - "postcss-discard-empty": "^8.0.1", - "postcss-discard-overridden": "^8.0.1", - "postcss-merge-longhand": "^8.0.1", - "postcss-merge-rules": "^8.0.1", - "postcss-minify-font-values": "^8.0.1", - "postcss-minify-gradients": "^8.0.1", - "postcss-minify-params": "^8.0.1", - "postcss-minify-selectors": "^8.0.2", - "postcss-normalize-charset": "^8.0.1", - "postcss-normalize-display-values": "^8.0.1", - "postcss-normalize-positions": "^8.0.1", - "postcss-normalize-repeat-style": "^8.0.1", - "postcss-normalize-string": "^8.0.1", - "postcss-normalize-timing-functions": "^8.0.1", - "postcss-normalize-unicode": "^8.0.1", - "postcss-normalize-url": "^8.0.1", - "postcss-normalize-whitespace": "^8.0.1", - "postcss-ordered-values": "^8.0.1", - "postcss-reduce-initial": "^8.0.1", - "postcss-reduce-transforms": "^8.0.1", - "postcss-svgo": "^8.0.1", - "postcss-unique-selectors": "^8.0.1" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" + "postcss": "^8.5.29" } }, - "node_modules/cssnano-utils": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-6.0.1.tgz", - "integrity": "sha512-zk65GIxA8tCjqVk7nTm1mE+ZKxtnxAvU5JSUaBLXbAr3ZF7IOvz3fbPOnEDvZKhnS7GOIitXTS5BgehLzNoc8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" - } - }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "css-tree": "~2.2.0" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "node_modules/cssnano/node_modules/@csstools/css-tokenizer": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.2.tgz", + "integrity": "sha512-OoKoR0f76dCY666JlcbhmVTs2drYj1GUXZTYTcbUgJjh9Nv41aFfZ21bPQTERm5+L5cBDo466NltB2lplS5GBw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "node": ">=20.19.0" } }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "dev": true, - "license": "CC0-1.0" - }, "node_modules/cssstyle": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", @@ -7221,10 +7109,11 @@ } }, "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" }, "node_modules/dargs": { "version": "7.0.0", @@ -7455,12 +7344,13 @@ } }, "node_modules/dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.6.0" + "node": ">=4" } }, "node_modules/destroy": { @@ -7510,71 +7400,12 @@ "integrity": "sha512-SOKO002EqlvBYYKQSew3iymBoN2EQ4BDw/3yprjh7kAfFzjBYkaMNa/pZvcA7HSWlcKSQb9XhPe3wKyQ0x4A8A==", "license": "Apache-2.0" }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, "node_modules/dom-walk": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", "dev": true }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -7791,9 +7622,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.5.379", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.379.tgz", - "integrity": "sha512-v/qV5aV5EUA2pGilzUCq5/eyOloZAqDZBu9UMBIzgPpLlprjSR6zswsWBTv0KpqxLGUAZEwhO95ZCt7srymNVA==", + "version": "1.5.464", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.464.tgz", + "integrity": "sha512-nRa65aFge40viPAKxMKULIY8tcXKwKboJWNn4RoKwyWXJ6SP7BnrDGKUTzc64818jIciH0PK7LSF8QzZes19GA==", "dev": true, "license": "ISC" }, @@ -7920,18 +7751,6 @@ "dev": true, "license": "MIT" }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/environment": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", @@ -8811,22 +8630,6 @@ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -8967,9 +8770,9 @@ "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.1.tgz", + "integrity": "sha512-FNvFGzoMLWmE6Yj9spb/zjd7yiNCHiAW9/Tg9CXrQ8wuu32HtlJOwWO11OJafl5FfY3DxTdQ0vj42zU1kvv5jg==", "dev": true, "funding": [ { @@ -9372,18 +9175,6 @@ "node": ">= 0.4" } }, - "node_modules/get-stdin": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", - "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -9517,16 +9308,16 @@ } }, "node_modules/glob/node_modules/brace-expansion": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", - "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/glob/node_modules/minimatch": { @@ -9584,38 +9375,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", - "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", - "dev": true, - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -9636,13 +9395,13 @@ "dev": true }, "node_modules/handlebars": { - "version": "4.7.9", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", - "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", + "version": "4.7.10", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.10.tgz", + "integrity": "sha512-P5VJMVM7qgBn6vjXMw8WG9uVI+ncf2pi72j4de4yz5ZULLj2RGqLYaKOYGsgyrViQ0tePOVlN1tDCCXXtFqXKg==", "dev": true, "license": "MIT", "dependencies": { - "minimist": "^1.2.5", + "minimist": "^1.2.8", "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" @@ -9915,9 +9674,9 @@ } }, "node_modules/immutable": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.3.tgz", - "integrity": "sha512-AUY/VyX0E5XlibOmWt10uabJzam1zlYjwiEgQSDc5+UIkFNaF9WM0JxXKaNMGf+F/ffUF+7kRKXM9A7C0xXqMg==", + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.4.tgz", + "integrity": "sha512-ZQv17KolYrYmsDoDB8N67zhIKsNi9mGYlk96y/yuxyAqJB2hLzSGSM7k/sB0/ZvO4kx27U9+fBeD/XlLGh/uXQ==", "dev": true, "license": "MIT", "engines": { @@ -11208,9 +10967,9 @@ } }, "node_modules/jest-config/node_modules/brace-expansion": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", - "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", "dev": true, "license": "MIT", "dependencies": { @@ -12968,9 +12727,9 @@ } }, "node_modules/jest-runtime/node_modules/brace-expansion": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", - "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", "dev": true, "license": "MIT", "dependencies": { @@ -14727,12 +14486,13 @@ } }, "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/make-dir": { @@ -14806,13 +14566,6 @@ "node": ">= 0.4" } }, - "node_modules/mdn-data": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", - "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", - "dev": true, - "license": "CC0-1.0" - }, "node_modules/medium-zoom": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/medium-zoom/-/medium-zoom-1.1.0.tgz", @@ -15012,15 +14765,6 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -15181,9 +14925,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "version": "3.3.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", + "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", "dev": true, "funding": [ { @@ -15249,9 +14993,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.50", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", - "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", + "version": "2.0.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.60.tgz", + "integrity": "sha512-OmO8+GM1JUZqXET720VrJCwkjUCXmCMQm0Z3UDDRbfNLHS4NEAvY60j5jiFv0tkKw2PNNlqOLhahVmwJIOLDIQ==", "dev": true, "license": "MIT", "engines": { @@ -15413,19 +15157,6 @@ "node": ">=8" } }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, "node_modules/nwsapi": { "version": "2.2.21", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.21.tgz", @@ -15726,18 +15457,6 @@ "node": "20 || >=22" } }, - "node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -15908,9 +15627,9 @@ } }, "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "version": "8.5.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.32.tgz", + "integrity": "sha512-LJlKCCAUFKOuZxipUdYw1NzIITEsPcgyOG9LkvRJvuKj/bRzbuRY0ARXvL0pWGpsZvn8jku+LMep2eU0seHp8g==", "dev": true, "funding": [ { @@ -15928,84 +15647,172 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.12", + "nanoid": "^3.3.20", "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "source-map-js": "^1.2.2" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-calc": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz", - "integrity": "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==", + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-11.2.3.tgz", + "integrity": "sha512-pFW3MR2a4W7uHcSGUiyQGGXZWHon83ljbNwnUJ1mRKublWQbv+3o9NiqhlV4TJfNby+U+zLY2OgiywzhA5eFqw==", "dev": true, "license": "MIT", "dependencies": { - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.2.0" + "@csstools/css-tokenizer": "^4.0.2" }, "engines": { - "node": "^18.12 || ^20.9 || >=22.0" + "node": "^22.22.3 || ^24.15 || >=26.0" }, "peerDependencies": { - "postcss": "^8.4.38" + "postcss": "^8.5.29" + } + }, + "node_modules/postcss-calc/node_modules/@csstools/css-tokenizer": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.2.tgz", + "integrity": "sha512-OoKoR0f76dCY666JlcbhmVTs2drYj1GUXZTYTcbUgJjh9Nv41aFfZ21bPQTERm5+L5cBDo466NltB2lplS5GBw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" } }, "node_modules/postcss-cli": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-11.0.0.tgz", - "integrity": "sha512-xMITAI7M0u1yolVcXJ9XTZiO9aO49mcoKQy6pCDFdMh9kGqhzLVpWxeD/32M/QBmkhcGypZFFOLNLmIW4Pg4RA==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-12.0.0.tgz", + "integrity": "sha512-57J2u1NuXuqGXftaK9JFEr/J3vtLzWpdN+RHs8GeeKUlvX7PU18VQJA57t0Rzf4CmbSfQApCwJIPrSFanQu5tQ==", "dev": true, + "license": "MIT", "dependencies": { - "chokidar": "^3.3.0", - "dependency-graph": "^0.11.0", - "fs-extra": "^11.0.0", - "get-stdin": "^9.0.0", - "globby": "^14.0.0", + "chokidar": "^5.0.0", + "dependency-graph": "^1.0.0", "picocolors": "^1.0.0", - "postcss-load-config": "^5.0.0", + "postcss-load-config": "^6.0.0", "postcss-reporter": "^7.0.0", "pretty-hrtime": "^1.0.3", "read-cache": "^1.0.0", "slash": "^5.0.0", - "yargs": "^17.0.0" + "tinyglobby": "^0.2.12", + "yargs": "^18.0.0" }, "bin": { "postcss": "index.js" }, "engines": { - "node": ">=18" + "node": ">=22" }, "peerDependencies": { "postcss": "^8.0.0" } }, - "node_modules/postcss-cli/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "node_modules/postcss-cli/node_modules/ansi-regex": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.4.0.tgz", + "integrity": "sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==", "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, + "license": "MIT", "engines": { - "node": ">=14.14" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/postcss-cli/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/postcss-cli/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/postcss-cli/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "dev": true, + "license": "MIT", "dependencies": { - "universalify": "^2.0.0" + "readdirp": "^5.0.0" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/postcss-cli/node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/postcss-cli/node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/postcss-cli/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-cli/node_modules/readdirp": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/postcss-cli/node_modules/slash": { @@ -16020,104 +15827,101 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-cli/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/postcss-colormin": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-8.0.1.tgz", - "integrity": "sha512-qBY4ABQ6d8/mk5RRZHwMllrZMxeMey3azVY2dZUEk+RgiUC4ARdPR3/AITzNqqKTbvW/3y/MJKinDrzwqn8RDQ==", + "node_modules/postcss-cli/node_modules/string-width": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.3.0.tgz", + "integrity": "sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==", "dev": true, "license": "MIT", "dependencies": { - "@colordx/core": "^5.4.3", - "browserslist": "^4.28.2", - "caniuse-api": "^4.0.0", - "postcss-value-parser": "^4.2.0" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" + "node": ">=20" }, - "peerDependencies": { - "postcss": "^8.5.15" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-convert-values": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-8.0.1.tgz", - "integrity": "sha512-IdOSIX3BzfMvCc1TAHIha2gfy17xnb5vfML8e2BIKARnFOghksESfaSAB/3CXgyLfMozZAbTRPVQF5dbuKOidw==", + "node_modules/postcss-cli/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.28.2", - "postcss-value-parser": "^4.2.0" + "ansi-regex": "^6.2.2" }, "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" + "node": ">=12" }, - "peerDependencies": { - "postcss": "^8.5.15" + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/postcss-discard-comments": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-8.0.1.tgz", - "integrity": "sha512-FDvzm3tXlEsQBO2XQgnta5ugsAqwBrgWH+j5QgXpegEIDYA0VPnZg2aP7LtmWtC49POskeIhXesFiU/k3NyFHA==", + "node_modules/postcss-cli/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { - "postcss-selector-parser": "^7.1.2" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" + "node": ">=18" }, - "peerDependencies": { - "postcss": "^8.5.15" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/postcss-discard-duplicates": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-8.0.1.tgz", - "integrity": "sha512-stTDXkI8YkCUfADurQhp03oq5ynsgSx6Qrw5B1swds6oTHtAeOZ9I0SHGK8cY/VpWUsIYFDWMs3IWf9jIEfFvA==", + "node_modules/postcss-cli/node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" + "node": ">=18" }, - "peerDependencies": { - "postcss": "^8.5.15" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-discard-empty": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-8.0.1.tgz", - "integrity": "sha512-Zv4fM1Yfhk71tbt6gfiptbL6jDHi+7apSnaMeaO9n1uET+1embrXQw5m93Zp5x28UyQSuv+AVkFY193jdwZ33w==", + "node_modules/postcss-cli/node_modules/yargs": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.2.0.tgz", + "integrity": "sha512-9OpKOLeaoNFecEp7P6iYbzze/5CqWoH7N3SMs/6y1XF4nMvFMspEGZzJ6uFi9MmQwXhyzqYoSEKO3tvA3Z/o2w==", "dev": true, "license": "MIT", - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^8.2.1", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" }, - "peerDependencies": { - "postcss": "^8.5.15" + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" } }, - "node_modules/postcss-discard-overridden": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-8.0.1.tgz", - "integrity": "sha512-ykt4fvrC7yYGzbxKyqBVjDCbsjF/11JgWK8enrdkobRyqqEtb/uDUCbKOGdvrK8X7BrShW8Lv5cCRNbdkNHGkQ==", + "node_modules/postcss-cli/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/postcss-import": { @@ -16138,9 +15942,9 @@ } }, "node_modules/postcss-load-config": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz", - "integrity": "sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", "dev": true, "funding": [ { @@ -16152,9 +15956,9 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "lilconfig": "^3.1.1", - "yaml": "^2.4.2" + "lilconfig": "^3.1.1" }, "engines": { "node": ">= 18" @@ -16162,7 +15966,8 @@ "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", - "tsx": "^4.8.1" + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "jiti": { @@ -16173,116 +15978,12 @@ }, "tsx": { "optional": true + }, + "yaml": { + "optional": true } } }, - "node_modules/postcss-merge-longhand": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-8.0.1.tgz", - "integrity": "sha512-huTfSYgQ13O81SFvAuOi7GWnO48vvybjj3xF+X3qUoPjzvvaLpJH5DcUqqXcwOEulZUcvaV4s0V9WtWs+IAQPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^8.0.1" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" - } - }, - "node_modules/postcss-merge-rules": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-8.0.1.tgz", - "integrity": "sha512-o3rk4UpnPNg469tklYwbR/NtvKc/f/wJiVDTnNQ/EFPw/LeiPOHUCvV1GIBQIZHGrBAYdPjToK6a+ojYprsrxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.2", - "caniuse-api": "^4.0.0", - "cssnano-utils": "^6.0.1", - "postcss-selector-parser": "^7.1.2" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-8.0.1.tgz", - "integrity": "sha512-L8Nzs/PRlBSPrLdY/7rAiU5ZN5800+2J/4LRbfyG8SJnPljmgMaXVmQiCklvRS+yObfVRNtvmk/Ean/eoYcSeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-8.0.1.tgz", - "integrity": "sha512-qf+4s/hZMqTwpWN2teqf6+1yvR/SZK5HgHqXYuACeJXV7ABe7AXtBEomgxagUzcN4bSnmqBh5vnIml0dYqykYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@colordx/core": "^5.4.3", - "cssnano-utils": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" - } - }, - "node_modules/postcss-minify-params": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-8.0.1.tgz", - "integrity": "sha512-L0h3H59deFfFg0wQN1NVaS/8E/LfGvaMuZKGO7siwlG995zo3OshtQyRkqKdVqcBwAORBvZ1nDZrKPLRapYkQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.2", - "cssnano-utils": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-8.0.2.tgz", - "integrity": "sha512-3icdxc/zght5UAizdwqZBDE2KOWHf1jMQCxET6iLACeNlRxfTPyXS0/COpGk8CQ2cECyaEKTRUd/i/k8Gxmz4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.1", - "caniuse-api": "^4.0.0", - "cssesc": "^3.0.0", - "postcss-selector-parser": "^7.1.2" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" - } - }, "node_modules/postcss-nesting": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-14.0.0.tgz", @@ -16357,198 +16058,6 @@ "postcss-selector-parser": "^7.1.1" } }, - "node_modules/postcss-normalize-charset": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-8.0.1.tgz", - "integrity": "sha512-xzqr36F8UeIZOvOHsf3aul+RVJCADvSwuwpMLgizqKjisHZpBfztgW0XFLBfJvz9pJgaStaOXAtGb0zLqT6B0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-8.0.1.tgz", - "integrity": "sha512-ZDWOijOK1FFMlpgiQCUO9fCNKd7HJ9L7z9HWEq4iyubnUFWzdTSwm/LcrMbNW6iZ1oAtqeLYA0WA3xHszOI08g==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-8.0.1.tgz", - "integrity": "sha512-uuivan2poSqbE48ST4do20dGaFUeXey9/H8rhHzoyVHB2I6BmkoVLZ/C9+BRjUlpaAFYVOoDY7epkiidzaYbvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-8.0.1.tgz", - "integrity": "sha512-q2hq5fmKxk29K6DjKA3nZ17Q2dtjhLYFNmFweKALmooUqx6UWAHF1bBoWTu/EqlJ88josb82A/J0Atj9LJUmpQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-8.0.1.tgz", - "integrity": "sha512-+Wf+kQJhm1WgSGEAuUaswE9rdpR9QbrKRVemcVHs6rhOoOTVIdAbgaicftfYA6vLM346P8onRzkEVbFN29ktKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-8.0.1.tgz", - "integrity": "sha512-W8/tvwRlm3T+yjGkg0IRTF4bvHj0vILYr/LOogCrJKHz2ey2HFRwfsAA8Bk9N4BGR7z7WmmDu/KzzwhJ6FoGPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-8.0.1.tgz", - "integrity": "sha512-Ad0YHNRBp4WHEOYUM/4wL/8MoL2fimEF8se/0q+Rt/owMzYpbxsypC1P8fN/oluwoRmRKdNVX7X2oycEobPWcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" - } - }, - "node_modules/postcss-normalize-url": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-8.0.1.tgz", - "integrity": "sha512-tkYcip6pCDY806xuxpJYqMW2M3/623jzGFJmz3m5Us47q8P28+gbRZxaea3Rr/CmwwLUiVlh+BTGYwQ6gvaP8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-8.0.1.tgz", - "integrity": "sha512-XzORadNfSrKWDZZpgAEHPKINKx8r9r9RIfE9c70g/HThdpbmPHhDYCodHSVESDxmKeySAYw1p4liuBCf7j6LyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" - } - }, - "node_modules/postcss-ordered-values": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-8.0.1.tgz", - "integrity": "sha512-OLXq5lR1yk3KWQ1FPK6aWjFFdktHE9f9kb8cnt4LmIw7w30DnzgD9+sOVYJc5HenkWCX8i1MJhhFwmqc/GYqLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssnano-utils": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-8.0.1.tgz", - "integrity": "sha512-+aQsR6+61KRoIfcFNLP3v9RM7+0iYOTtPnjl1wr6JqMW1zx6S+t2ktHRefXwacFdHIDj5+ETG0KY7K3+SGQ4Nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.2", - "caniuse-api": "^4.0.0" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-8.0.1.tgz", - "integrity": "sha512-x71slHVykiFi5RuKEXM0wgYpY2PngC78x6R8TnZhHF3lhqt+u/w3MGwYLX+2t5O87ssRiMfEAhQH+3J4QwVzCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" - } - }, "node_modules/postcss-reporter": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz", @@ -16576,9 +16085,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", - "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.7.tgz", + "integrity": "sha512-wWBro/7hJ40ye6TPiXkUQoXKCw23xSsjriUvqd7Uls9Sso3oLiON1flc18cCdnjgCRXw4fBVqUJJeOdDTh3P3g==", "dev": true, "license": "MIT", "dependencies": { @@ -16589,39 +16098,6 @@ "node": ">=4" } }, - "node_modules/postcss-svgo": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-8.0.1.tgz", - "integrity": "sha512-HpnvWii7W0/FPrsejJa6ZTi0kNtTJP/Iba7CUMPX0xPV6QpnndOp+SDP74tFtgjA2cYKYNWJPOlmLXMsvi/9yA==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^4.0.1" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-8.0.1.tgz", - "integrity": "sha512-+xvKI5+/Cl8yYQwxDV39Uhuc4WV951xngFvPPjiPj2NIbIfm6vbbRTXblyw0FioLkIoGlw+7qUcY1h2YhaZYgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^7.1.2" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" - } - }, "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", @@ -16774,13 +16250,14 @@ } }, "node_modules/qs": { - "version": "6.15.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", - "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.17.0.tgz", + "integrity": "sha512-5LK5BZ2XDHMvcUJaf0CQ5HL3aVgKbpklvByC7qLSxYkfE8COEEbJg5xCHWCTqzqi0Gs4Jn5Mv5v3R38W6edscA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.1.0" + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" }, "engines": { "node": ">=0.6" @@ -17302,16 +16779,16 @@ } }, "node_modules/rimraf/node_modules/brace-expansion": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", - "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/rimraf/node_modules/glob": { @@ -17512,16 +16989,6 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "node_modules/sax": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", - "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=11.0.0" - } - }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -17611,9 +17078,9 @@ } }, "node_modules/serialize-javascript": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.5.tgz", - "integrity": "sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.1.4.tgz", + "integrity": "sha512-FqlEuoTq/zRmA4Lg6aOqyH3lCHbUtCB0bmHCeFniX2GBdDqMJM3FwdvEhlE5Pim1dlt2FfBdVPmUNNiGhhKqpw==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -17789,9 +17256,9 @@ } }, "node_modules/shell-quote": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz", - "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.12.0.tgz", + "integrity": "sha512-PcByqNyT/38F2kDNi006HAMRJaULuBzq/FOsw3qdZvX/GA9W/jamDaRskgHjubHiftXK5sIFxLNkvrXUwcof6Q==", "dev": true, "license": "MIT", "engines": { @@ -17802,15 +17269,15 @@ } }, "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" }, @@ -17822,14 +17289,14 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -18078,9 +17545,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -18620,23 +18087,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylehacks": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-8.0.1.tgz", - "integrity": "sha512-Gv095oTD0N+BdJALNFDsxZpETHZLTxbOl5RyIO7y6VAE6sR3z0MnV3Nix7N0IATNldNTrkvSASp2KR1Yt526HA==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.2", - "postcss-selector-parser": "^7.1.2" - }, - "engines": { - "node": "^22.11.0 || ^24.11.0 || >=26.0" - }, - "peerDependencies": { - "postcss": "^8.5.15" - } - }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -18661,42 +18111,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.2.tgz", - "integrity": "sha512-ekx94z1rRc5LDi6oSUaeRnYhd0UOJxdtQCL2rF8xpWxD3TPAsISWOrxezqGovqS38GRZOdpDfvQe3ts6F7nsng==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^11.1.0", - "css-select": "^5.1.0", - "css-tree": "^3.0.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.1.1", - "sax": "^1.5.0" - }, - "bin": { - "svgo": "bin/svgo.js" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" - } - }, - "node_modules/svgo/node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - } - }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -19215,18 +18629,6 @@ "node": ">=4" } }, - "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -19280,9 +18682,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.4.tgz", + "integrity": "sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A==", "dev": true, "funding": [ { @@ -19384,16 +18786,17 @@ } }, "node_modules/vue": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.31.tgz", - "integrity": "sha512-njqRrOy7W3YLAlVqSKpBebtZpDVg21FPoaq1I7f/+qqBThK9ChAIjkRWgeP6Eat+8C+iia4P3OYqpATP21BCoQ==", + "version": "3.5.44", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.44.tgz", + "integrity": "sha512-dvvmaOCG7lAMkJTPqPwWeGMsPS6DIsFsfZDUgBp9V6mHf9b3+/wyVwYR4Es+WV6uJC0FKRxp81Obcq0ZwUcGFQ==", "dev": true, + "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.31", - "@vue/compiler-sfc": "3.4.31", - "@vue/runtime-dom": "3.4.31", - "@vue/server-renderer": "3.4.31", - "@vue/shared": "3.4.31" + "@vue/compiler-dom": "3.5.44", + "@vue/compiler-sfc": "3.5.44", + "@vue/runtime-dom": "3.5.44", + "@vue/server-renderer": "3.5.44", + "@vue/shared": "3.5.44" }, "peerDependencies": { "typescript": "*" @@ -19807,6 +19210,7 @@ "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "dev": true, "license": "ISC", + "optional": true, "bin": { "yaml": "bin.mjs" }, diff --git a/package.json b/package.json index ee1eb75203..895d40b191 100644 --- a/package.json +++ b/package.json @@ -27,9 +27,12 @@ }, "type": "module", "main": "dist/docsify.js", - "types": "src/core/Docsify.d.ts", + "types": "dist/docsify.module.d.ts", "exports": { - ".": "./src/core/Docsify.js", + ".": { + "types": "./dist/docsify.module.d.ts", + "import": "./dist/docsify.module.js" + }, "./*": "./*" }, "files": [ @@ -66,7 +69,7 @@ "axios": "^1.5.0", "browser-sync": "^3.0.4", "cross-env": "^10.0.0", - "cssnano": "^8.0.2", + "cssnano": "^9.9.0", "eslint": "^9.3.0", "eslint-config-prettier": "^10.0.1", "eslint-plugin-jest": "^29.2.1", @@ -79,7 +82,7 @@ "jest-environment-jsdom": "^30.0.5", "lint-staged": "^17.0.8", "npm-run-all": "^4.1.5", - "postcss-cli": "^11.0.0", + "postcss-cli": "^12.0.0", "postcss-import": "^16.1.0", "postcss-nesting": "^14.0.0", "prettier": "^3.2.5", @@ -97,7 +100,7 @@ "build:css:min": "cross-env NODE_ENV='production' npm run build:css -- --ext .min.css", "build:emoji": "node ./build/emoji.js", "build:js": "rollup -c", - "build:types": "tsc", + "build:types": "rimraf --glob \"src/**/*.d.ts\" \"src/**/*.d.ts.map\" && tsc && node build/types.js", "build:v4": "git checkout release-v4 && npm clean-install && git checkout docs/emoji.md src/core/render/emoji-data.js && rimraf packages/ && git checkout - && npm clean-install && npm run build:v4:deprecate -- lib/docsify.js && npm run build:v4:deprecate -- lib/docsify.min.js", "build:v4:deprecate": "echo ';console.warn(\"Docsify v4 is no longer supported. See https://docsify.js.org for the latest version.\")' >> ", "build": "run-s clean build:types build:js build:css build:css:min build:cover", @@ -115,8 +118,8 @@ "docker:test": "npm run docker:cli -- test", "lint:fix": "prettier . --write && eslint . --fix", "lint": "prettier . --check && eslint .", - "postinstall": "opencollective-postinstall && npx husky install", - "prepare": "npm run build", + "postinstall": "opencollective-postinstall", + "prepare": "npm run build && node .husky/install.mjs", "prettier": "prettier . --write", "pub:next": "cross-env RELEASE_TAG=next sh build/release.sh", "pub": "sh build/release.sh", diff --git a/rollup.config.js b/rollup.config.js index b0d853c236..18245bcdf2 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -18,6 +18,13 @@ const docsifyConfig = { outputName: 'docsify', title: 'Docsify', }; +const docsifyEsmConfig = { + inputPath: 'src/core/module.js', + outputDir: 'dist', + outputName: 'docsify.module', + title: 'Docsify', + format: 'es', +}; // Plugins const pluginPaths = await glob(['src/plugins/*.js', 'src/plugins/*/index.js']); @@ -65,8 +72,9 @@ const baseConfig = { const bundleConfigs = []; // Generate rollup configurations -[docsifyConfig, ...pluginConfigs].forEach(bundleConfig => { - const { inputPath, outputDir, outputName, title } = bundleConfig; +[docsifyConfig, docsifyEsmConfig, ...pluginConfigs].forEach(bundleConfig => { + const { inputPath, outputDir, outputName, title, format } = bundleConfig; + const outputFormat = format || baseConfig.output.format; // prettier-ignore const banner = stripIndent` /*! @@ -83,6 +91,7 @@ const bundleConfigs = []; ...baseConfig.output, banner, file: path.join(outputDir, `${outputName}.min.js`), + format: outputFormat, sourcemap: true, }, plugins: [ @@ -101,6 +110,7 @@ const bundleConfigs = []; ...baseConfig.output, banner, file: path.join(outputDir, `${outputName}.js`), + format: outputFormat, }, plugins: [ ...baseConfig.plugins, diff --git a/src/core/config.js b/src/core/config.js index b2e2fdb9e2..030c35dc82 100644 --- a/src/core/config.js +++ b/src/core/config.js @@ -11,6 +11,8 @@ const defaultDocsifyConfig = () => ({ autoHeader: false, basePath: '', catchPluginErrors: true, + collapseSidebarGroups: false, + collapsibleSidebarGroups: false, cornerExternalLinkTarget: /** @type {'_blank' | '_self' | '_parent' | '_top' | '_unfencedTop'} */ ( '_blank' @@ -40,6 +42,7 @@ const defaultDocsifyConfig = () => ({ markdown: null, maxLevel: 6, mergeNavbar: false, + navbarPreservePath: false, name: /** @type {boolean | string} */ (''), nameLink: window.location.pathname, nativeEmoji: false, @@ -58,6 +61,7 @@ const defaultDocsifyConfig = () => ({ skipLink: /** @type {false | string | Record} */ ( 'Skip to main content' ), + sidebarPosition: /** @type {'left' | 'right'} */ ('left'), subMaxLevel: 0, vueComponents: /** @type {Record} */ ({}), vueGlobalOptions: /** @type {Record} */ ({}), diff --git a/src/core/event/index.js b/src/core/event/index.js index 8395761430..d61aa3210f 100644 --- a/src/core/event/index.js +++ b/src/core/event/index.js @@ -1,7 +1,11 @@ import { isMobile, mobileBreakpoint } from '../util/env.js'; import { noop } from '../util/core.js'; import * as dom from '../util/dom.js'; -import { stripUrlExceptId } from '../router/util.js'; +import { + findLinkByHref, + resolveHref, + stripUrlExceptId, +} from '../router/util.js'; /** @typedef {import('../Docsify.js').Constructor} Constructor */ @@ -252,6 +256,17 @@ export function Events(Base) { // Collapse toggle dom.on(sidebarElm, 'click', (/** @type {MouseEvent} */ { target }) => { + const groupToggle = /** @type {HTMLElement | null} */ ( + /** @type {HTMLElement} */ (target).closest( + '.group-toggle[role="button"]', + ) + ); + + if (groupToggle) { + this.#toggleSidebarGroup(groupToggle); + return; + } + const linkElm = /** @type {HTMLElement} */ (target).closest('a'); const linkParent = /** @type {HTMLLIElement} */ ( linkElm?.closest('li') @@ -259,11 +274,44 @@ export function Events(Base) { const hasSubSidebar = linkParent?.querySelector('.app-sub-sidebar'); if (hasSubSidebar) { - linkParent.classList.toggle('collapse'); + const isCollapsed = linkParent.classList.toggle('collapse'); + linkElm?.setAttribute('aria-expanded', String(!isCollapsed)); + } + }); + + dom.on(sidebarElm, 'keydown', (/** @type {KeyboardEvent} */ event) => { + const groupToggle = /** @type {HTMLElement | null} */ ( + /** @type {HTMLElement} */ (event.target).closest( + '.group-toggle[role="button"]', + ) + ); + + if (groupToggle && (event.key === 'Enter' || event.key === ' ')) { + event.preventDefault(); + this.#toggleSidebarGroup(groupToggle); } }); } + /** + * Toggle a root sidebar group and keep its accessible state in sync. + * + * @param {HTMLElement} groupToggle + * @void + */ + #toggleSidebarGroup(groupToggle) { + const group = /** @type {HTMLLIElement | null} */ ( + groupToggle.closest('li') + ); + + if (!group) { + return; + } + + const isCollapsed = group.classList.toggle('collapse'); + groupToggle.setAttribute('aria-expanded', String(!isCollapsed)); + } + /** * Initialize sidebar show/hide toggle behavior * @@ -360,9 +408,11 @@ export function Events(Base) { * @param {undefined|"history"|"navigate"} source Type of navigation where * undefined is initial load, "history" is forward/back, and "navigate" is * user click/tap + * @param {import('../router/util.js').SidebarNavigationTarget} [focusTarget] + * Sidebar link to restore after rendering * @void */ - onNavigate(source) { + onNavigate(source, focusTarget) { const { auto2top, topMargin } = this.config; const { path, query } = this.route; const activeSidebarElm = this.#markSidebarActiveElm(); @@ -403,7 +453,12 @@ export function Events(Base) { // Clicked anchor link or page load with anchor ID if (hasId || isNavigate) { - this.#focusContent(); + const sidebarFocused = + isNavigate && this.#focusSidebarNavigation(focusTarget); + + if (!sidebarFocused) { + this.#focusContent(); + } } } @@ -451,11 +506,47 @@ export function Events(Base) { return focusEl; } + /** + * Restore focus to the rendered sidebar link that initiated navigation. + * + * @param {import('../router/util.js').SidebarNavigationTarget} [target] + * Sidebar navigation target + * @returns {boolean} True when focus was restored + */ + #focusSidebarNavigation(target) { + if (!target || isMobile()) { + return false; + } + + const sidebarElm = dom.find('.sidebar'); + + if (!sidebarElm) { + return false; + } + + const focusElm = /** @type {HTMLElement|undefined} */ ( + dom + .findAll(sidebarElm, 'a') + .find( + linkElm => + linkElm.classList.contains(target.className) && + /** @type {HTMLAnchorElement} */ (linkElm).href === target.href, + ) + ); + + if (!focusElm) { + return false; + } + + focusElm.focus({ preventScroll: true }); + return true; + } + /** * Marks the active app nav item */ #markAppNavActiveElm() { - const href = decodeURIComponent(this.router.toURL(this.route.path)); + const href = resolveHref(this.router.toURL(this.route.path)); ['.app-nav', '.app-nav-merged'].forEach(selector => { const navElm = dom.find(selector); @@ -468,13 +559,7 @@ export function Events(Base) { dom.findAll(navElm, 'a') ) .sort((a, b) => b.href.length - a.href.length) - .find( - a => - href.includes(/** @type {string} */ (a.getAttribute('href'))) || - href.includes( - decodeURI(/** @type {string} */ (a.getAttribute('href'))), - ), - ) + .find(a => href.includes(a.href)) ?.closest('li'); const oldActive = dom.find(navElm, 'li.active'); @@ -501,15 +586,14 @@ export function Events(Base) { return; } - href = stripUrlExceptId(href); + const matchingHref = stripUrlExceptId(/** @type {string} */ (href)); const oldActive = dom.find(sidebar, 'li.active'); - const newActive = dom - .find( - sidebar, - `a[href="${href}"], a[href="${decodeURIComponent(/** @type {string} */ (href))}"]`, - ) - ?.closest('li'); + const newActive = findLinkByHref( + sidebar, + matchingHref, + '.sidebar-nav a', + )?.closest('li'); if (newActive && newActive !== oldActive) { oldActive?.classList.remove('active'); @@ -537,12 +621,9 @@ export function Events(Base) { const path = href?.split('?')[0]; const oldPage = dom.find(sidebar, 'li[aria-current]'); - const newPage = dom - .find( - sidebar, - `a[href="${path}"], a[href="${decodeURIComponent(/** @type {string} */ (path))}"]`, - ) - ?.closest('li'); + const newPage = path + ? findLinkByHref(sidebar, path, '.sidebar-nav a')?.closest('li') + : undefined; if (newPage && newPage !== oldPage) { oldPage?.removeAttribute('aria-current'); diff --git a/src/core/fetch/index.js b/src/core/fetch/index.js index 3dcc0caf9d..fbd5b3d1b6 100644 --- a/src/core/fetch/index.js +++ b/src/core/fetch/index.js @@ -23,6 +23,7 @@ export function Fetch(Base) { path = getParentPath(path); if (!path) { + next(''); return; } diff --git a/src/core/render/compiler.js b/src/core/render/compiler.js index e81aaa81f8..a0b5bbf8f5 100644 --- a/src/core/render/compiler.js +++ b/src/core/render/compiler.js @@ -160,7 +160,7 @@ export class Compiler { _initRenderer() { const renderer = new marked.Renderer(); - const { linkTarget, linkRel, router, contentBase } = this; + const { linkTarget, router, contentBase } = this; // Supports mermaid const origin = {}; @@ -179,7 +179,6 @@ export class Compiler { renderer, router, linkTarget, - linkRel, compiler: this, }); origin.paragraph = paragraphCompiler({ renderer }); @@ -206,7 +205,7 @@ export class Compiler { let html = ''; // compile sidebar from _sidebar.md - if (text) { + if (typeof text === 'string') { return this.compile(text); } // compile sidebar from content's headings toc diff --git a/src/core/render/compiler/link.js b/src/core/render/compiler/link.js index 6c017adcf3..93e042bfb7 100644 --- a/src/core/render/compiler/link.js +++ b/src/core/render/compiler/link.js @@ -4,8 +4,7 @@ import { isAbsolutePath } from '../../router/util.js'; export const linkCompiler = ({ renderer, router, - linkTarget, - linkRel, + linkTarget: defaultLinkTarget, compiler, }) => (renderer.link = function ({ href, title = '', tokens }) { @@ -16,8 +15,8 @@ export const linkCompiler = ({ const isNotCompilable = compiler._matchNotCompileLink(href); const isMailto = href.startsWith('mailto:'); - linkTarget = config.target || linkTarget; - linkRel = + const linkTarget = config.target || defaultLinkTarget; + const linkRel = linkTarget === '_blank' ? compiler.config.externalLinkRel || 'noopener' : ''; diff --git a/src/core/render/index.js b/src/core/render/index.js index f4db193754..1d55c66a3d 100644 --- a/src/core/render/index.js +++ b/src/core/render/index.js @@ -1,8 +1,13 @@ import tinydate from 'tinydate'; import * as dom from '../util/dom.js'; -import { getPath, isAbsolutePath } from '../router/util.js'; +import { + cleanPath, + findLinkByHref, + getPath, + isAbsolutePath, +} from '../router/util.js'; import { isMobile } from '../util/env.js'; -import { isPrimitive } from '../util/core.js'; +import { isExternal, isPrimitive } from '../util/core.js'; import { Compiler } from './compiler.js'; import * as tpl from './tpl.js'; import { prerenderEmbed } from './embed.js'; @@ -35,6 +40,32 @@ export function Render(Base) { }); } + /** + * Normalize links in loose Markdown lists from `
  • ` to + * `

  • ` so sidebar behavior and styling do not depend on list + * tightness. + * + * @param {Element} sidebarNavEl + */ + #normalizeSidebarPageLinks(sidebarNavEl) { + dom.findAll(sidebarNavEl, 'li > p').forEach(paragraph => { + const link = paragraph.firstElementChild; + const onlyContainsLink = [...paragraph.childNodes].every( + node => + node === link || (node.nodeType === 3 && !node.textContent?.trim()), + ); + + if ( + !paragraph.attributes.length && + paragraph.children.length === 1 && + link?.tagName === 'A' && + onlyContainsLink + ) { + paragraph.replaceWith(link); + } + }); + } + #executeScript() { const script = dom .findAll('.markdown-section>script') @@ -294,7 +325,14 @@ export function Render(Base) { } _renderSidebar(text) { - const { maxLevel, subMaxLevel, loadSidebar, hideSidebar } = this.config; + const { + collapseSidebarGroups, + collapsibleSidebarGroups, + maxLevel, + subMaxLevel, + loadSidebar, + hideSidebar, + } = this.config; const sidebarEl = dom.getNode('aside.sidebar'); const sidebarNavEl = dom.getNode('.sidebar-nav'); const sidebarToggleEl = dom.getNode('button.sidebar-toggle'); @@ -310,22 +348,40 @@ export function Render(Base) { throw new Error('Compiler is not initialized'); } + const sidebarGroupStates = new Map( + dom + .findAll( + sidebarNavEl, + 'li.group > .group-toggle[role="button"][data-group-id]', + ) + .map(elm => [ + elm.getAttribute('data-group-id'), + elm.closest('li')?.classList.contains('collapse'), + ]), + ); + dom.setHTML('.sidebar-nav', this.compiler.sidebar(text, maxLevel)); + this.#normalizeSidebarPageLinks(sidebarNavEl); sidebarToggleEl.setAttribute('aria-expanded', String(!isMobile())); - const activeElmHref = decodeURIComponent( - this.router.toURL(this.route.path), - ); const activeEl = /** @type {HTMLElement | null} */ ( - dom.find(`.sidebar-nav a[href="${activeElmHref}"]`) + findLinkByHref(sidebarNavEl, this.router.toURL(this.route.path), 'a') ); this.#addTextAsTitleAttribute('.sidebar-nav a'); if (loadSidebar && activeEl) { - const parent = /** @type {HTMLElement} */ (activeEl.parentElement); - parent.innerHTML += this.compiler.subSidebar(subMaxLevel) || ''; + const activeItem = activeEl.closest('li'); + + activeItem?.insertAdjacentHTML( + 'beforeend', + this.compiler.subSidebar(subMaxLevel) || '', + ); + + if (activeItem?.querySelector(':scope > .app-sub-sidebar')) { + activeEl.setAttribute('aria-expanded', 'true'); + } } else { this.compiler.resetToc(); } @@ -336,18 +392,18 @@ export function Render(Base) { // Mark page links and groups const pageLinks = dom.findAll( sidebarNavEl, - 'a:is(li > a, li > p > a):not(.section-link, [target="_blank"])', + 'li > a:not(.section-link, [target="_blank"])', ); const pageLinkGroups = dom // NOTE: Using filter() method as a replacement for :has() selector. It - // would be preferable to use only 'li:not(:has(> a, > p > a))' selector + // would be preferable to use only 'li:not(:has(> a))' selector // but the :has() selector is not supported by our Jest test environment // See: https://github.com/jsdom/jsdom/issues/3506#issuecomment-1769782333 .findAll(sidebarEl, 'li') .filter( elm => elm.querySelector(':scope > ul') && - !elm.querySelectorAll(':scope > a, :scope > p > a').length, + !elm.querySelector(':scope > a'), ); pageLinks.forEach(elm => { @@ -356,9 +412,57 @@ export function Render(Base) { pageLinkGroups.forEach(elm => { elm.classList.add('group'); - elm - .querySelector(':scope > p:not(:has(> *))') - ?.classList.add('group-title'); + + let groupTitle = [...elm.children].find( + child => child.tagName === 'P' && !child.querySelector('a'), + ); + // Preserve the original styling behavior: only text-only paragraphs + // produced by Markdown receive the group-title class. + const styledGroupTitle = + groupTitle && !groupTitle.children.length ? groupTitle : null; + + if (!groupTitle) { + const sublist = [...elm.children].find( + child => child.tagName === 'UL', + ); + const titleNodes = []; + + for (const child of elm.childNodes) { + if (child === sublist) { + break; + } + + titleNodes.push(child); + } + + if (sublist && titleNodes.some(node => node.textContent?.trim())) { + const newGroupTitle = document.createElement('p'); + titleNodes.forEach(node => newGroupTitle.append(node)); + groupTitle = newGroupTitle; + elm.insertBefore(newGroupTitle, sublist); + } + } + + styledGroupTitle?.classList.add('group-title'); + + const rootList = elm.parentElement; + + if ( + collapsibleSidebarGroups && + groupTitle && + rootList?.parentElement === sidebarNavEl + ) { + const groupId = `${[...sidebarNavEl.children].indexOf(rootList)}:${[...rootList.children].indexOf(elm)}`; + const isCollapsed = + sidebarGroupStates.get(groupId) ?? collapseSidebarGroups; + + elm.classList.toggle('collapse', isCollapsed); + groupTitle.classList.add('group-toggle'); + groupTitle.setAttribute('data-group-id', groupId); + groupTitle.setAttribute('role', 'button'); + groupTitle.setAttribute('tabindex', '0'); + groupTitle.setAttribute('aria-expanded', String(!isCollapsed)); + } }); } @@ -397,10 +501,59 @@ export function Render(Base) { ['.app-nav', '.app-nav-merged'].forEach(selector => { dom.setHTML(selector, html); + if (this.config.navbarPreservePath) { + this.#appendNavbarPath(selector); + } this.#addTextAsTitleAttribute(`${selector} a`); }); } + #appendNavbarPath(selector) { + const nav = dom.find(selector); + + if (!nav) { + return; + } + + const links = dom.findAll(nav, 'a').reduce((links, link) => { + const anchor = /** @type {HTMLAnchorElement} */ (link); + const href = anchor.getAttribute('href'); + + if ( + !href || + isExternal(anchor.href) || + (href.startsWith('#') && !href.startsWith('#/')) + ) { + return links; + } + + const route = this.router.parse(href); + const path = cleanPath(`/${route.path}`); + + if (route.query.id || (path !== '/' && !path.endsWith('/'))) { + return links; + } + + links.push({ link: anchor, path, query: route.query }); + return links; + }, /** @type {{link: HTMLAnchorElement, path: string, query: Record}[]} */ ([])); + + const currentPath = cleanPath(`/${this.route.path}`); + const currentRoot = links + .filter(({ path }) => currentPath.startsWith(path)) + .sort((a, b) => b.path.length - a.path.length)[0]; + + if (!currentRoot) { + return; + } + + const suffix = currentPath.slice(currentRoot.path.length); + + links.forEach(({ link, path, query }) => { + link.setAttribute('href', this.router.toURL(`${path}${suffix}`, query)); + }); + } + _renderMain(text, opt = {}, next) { const { response } = this.route; diff --git a/src/core/render/slugify.js b/src/core/render/slugify.js index 6f1f6a7ee2..825011779b 100644 --- a/src/core/render/slugify.js +++ b/src/core/render/slugify.js @@ -23,7 +23,7 @@ export function slugify(str) { .replace(/^(\d)/, '_$1'); let count = cache[slug]; - count = Object.keys(cache).includes(slug) ? count + 1 : 0; + count = Object.prototype.hasOwnProperty.call(cache, slug) ? count + 1 : 0; cache[slug] = count; if (count) { diff --git a/src/core/render/tpl.js b/src/core/render/tpl.js index 88b732a78f..b4c6de3b5c 100644 --- a/src/core/render/tpl.js +++ b/src/core/render/tpl.js @@ -36,18 +36,20 @@ export function corner(data, cornerExternalLinkTarget) { * @returns {String} HTML of the main content */ export function main(config) { - const { hideSidebar, name } = config; + const { hideSidebar, name, sidebarPosition } = config; + const sidebarPositionClass = + sidebarPosition === 'right' ? ' sidebar-right' : ''; // const name = config.name ? config.name : ''; const aside = /* html */ hideSidebar ? '' : ` - -