From 73329446d7bce8c5e9105f0999d20a33f1250533 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 09:13:46 +0000 Subject: [PATCH 01/17] Initial plan From 2bb0917c42348902e0f7d8b3f5fc9bdf27a0bd90 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 09:25:46 +0000 Subject: [PATCH 02/17] Fix critical a11y, i18n, and build issues across components - Fix docs build: migrate PostCSS config to @tailwindcss/postcss for Tailwind v4 - Fix BqSelect: add aria-describedby linking for error messages - Fix BqChip: correct aria-pressed/aria-disabled to use string values - Fix BqChip: add keyboard navigation (Enter/Space) - Fix BqDrawer: add focus trap and focus restoration on close - Fix BqDialog: add focus restoration on close - Fix BqTable: use i18n strings for "Loading" and "No data" text - Fix BqTable: add keyboard handler for sortable headers (Enter/Space) - Add prefers-reduced-motion to Dialog, Drawer, Spinner, Toast, Accordion, Progress, and Skeleton components Co-authored-by: JosunLP <20913954+JosunLP@users.noreply.github.com> --- package-lock.json | 6099 +++++++++++++++++++++++ package.json | 1 + postcss.config.js | 2 +- src/components/accordion/BqAccordion.ts | 5 + src/components/chip/BqChip.ts | 19 +- src/components/dialog/BqDialog.ts | 14 + src/components/drawer/BqDrawer.ts | 35 +- src/components/progress/BqProgress.ts | 4 + src/components/select/BqSelect.ts | 7 +- src/components/skeleton/BqSkeleton.ts | 3 + src/components/spinner/BqSpinner.ts | 3 + src/components/table/BqTable.ts | 31 +- src/components/toast/BqToast.ts | 3 + 13 files changed, 6214 insertions(+), 12 deletions(-) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..e848229 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6099 @@ +{ + "name": "@bquery/ui", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@bquery/ui", + "version": "0.1.0", + "devDependencies": { + "@bquery/bquery": "^1.6.0", + "@storybook/addon-docs": "^10.2.19", + "@storybook/web-components-vite": "^10.2.19", + "@tailwindcss/postcss": "^4.2.1", + "@types/node": "^25.5.0", + "autoprefixer": "^10.4.27", + "bun-types": "^1.3.10", + "happy-dom": "^20.8.4", + "postcss": "^8.5.8", + "storybook": "^10.2.19", + "tailwindcss": "^4.2.1", + "typescript": "^5.9.3", + "vite": "^8.0.0", + "vite-plugin-dts": "^4.5.4", + "vitepress": "^1.6.4" + }, + "peerDependencies": { + "@bquery/bquery": "^1.6.0" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@algolia/abtesting": { + "version": "1.15.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.17.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", + "@algolia/autocomplete-shared": "1.17.7" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.17.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.17.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.17.7", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.49.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.49.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.49.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.49.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.49.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.49.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.49.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.49.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.49.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.49.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.49.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.49.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.49.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bquery/bquery": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.8.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@docsearch/js": { + "version": "3.8.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/react": "3.8.2", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.8.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.17.7", + "@algolia/autocomplete-preset-algolia": "1.17.7", + "@docsearch/css": "3.8.2", + "algoliasearch": "^5.14.2" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@emnapi/core": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.0.tgz", + "integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz", + "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.74", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lit-labs/ssr-dom-shim": { + "version": "1.5.1", + "dev": true, + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@lit/reactive-element": { + "version": "2.1.2", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.5.0" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@microsoft/api-extractor": { + "version": "7.57.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/api-extractor-model": "7.33.4", + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.1", + "@rushstack/node-core-library": "5.20.3", + "@rushstack/rig-package": "0.7.2", + "@rushstack/terminal": "0.22.3", + "@rushstack/ts-command-line": "5.3.3", + "diff": "~8.0.2", + "lodash": "~4.17.23", + "minimatch": "10.2.3", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "source-map": "~0.6.1", + "typescript": "5.8.2" + }, + "bin": { + "api-extractor": "bin/api-extractor" + } + }, + "node_modules/@microsoft/api-extractor-model": { + "version": "7.33.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.1", + "@rushstack/node-core-library": "5.20.3" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "5.8.2", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "0.16.0", + "ajv": "~8.18.0", + "jju": "~1.4.0", + "resolve": "~1.22.2" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@oxc-project/runtime": { + "version": "0.115.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.115.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.9.tgz", + "integrity": "sha512-lcJL0bN5hpgJfSIz/8PIf02irmyL43P+j1pTCfbD1DbLkmGRuFIA4DD3B3ZOvGqG0XiVvRznbKtN0COQVaKUTg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.9.tgz", + "integrity": "sha512-J7Zk3kLYFsLtuH6U+F4pS2sYVzac0qkjcO5QxHS7OS7yZu2LRs+IXo+uvJ/mvpyUljDJ3LROZPoQfgBIpCMhdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.9.tgz", + "integrity": "sha512-iwtmmghy8nhfRGeNAIltcNXzD0QMNaaA5U/NyZc1Ia4bxrzFByNMDoppoC+hl7cDiUq5/1CnFthpT9n+UtfFyg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.9.tgz", + "integrity": "sha512-DLFYI78SCiZr5VvdEplsVC2Vx53lnA4/Ga5C65iyldMVaErr86aiqCoNBLl92PXPfDtUYjUh+xFFor40ueNs4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.9.tgz", + "integrity": "sha512-CsjTmTwd0Hri6iTw/DRMK7kOZ7FwAkrO4h8YWKoX/kcj833e4coqo2wzIFywtch/8Eb5enQ/lwLM7w6JX1W5RQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-2x9O2JbSPxpxMDhP9Z74mahAStibTlrBMW0520+epJH5sac7/LwZW5Bmg/E6CXuEF53JJFW509uP+lSedaUNxg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.9.tgz", + "integrity": "sha512-JA1QRW31ogheAIRhIg9tjMfsYbglXXYGNPLdPEYrwFxdbkQCAzvpSCSHCDWNl4hTtrol8WeboCSEpjdZK8qrCg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-aOKU9dJheda8Kj8Y3w9gnt9QFOO+qKPAl8SWd7JPHP+Cu0EuDAE5wokQubLzIDQWg2myXq2XhTpOVS07qqvT+w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-OalO94fqj7IWRn3VdXWty75jC5dk4C197AWEuMhIpvVv2lw9fiPhud0+bW2ctCxb3YoBZor71QHbY+9/WToadA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.9", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.9", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.9.tgz", + "integrity": "sha512-+6zoiF+RRyf5cdlFQP7nm58mq7+/2PFaY2DNQeD4B87N36JzfF/l9mdBkkmTvSYcYPE8tMh/o3cRlsx1ldLfog==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.9.tgz", + "integrity": "sha512-rgFN6sA/dyebil3YTlL2evvi/M+ivhfnyxec7AccTpRPccno/rPoNlqybEZQBkcbZu8Hy+eqNJCqfBR8P7Pg8g==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.9.tgz", + "integrity": "sha512-lHVNUG/8nlF1IQk1C0Ci574qKYyty2goMiPlRqkC5R+3LkXDkL5Dhx8ytbxq35m+pkHVIvIxviD+TWLdfeuadA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.9.tgz", + "integrity": "sha512-G0oA4+w1iY5AGi5HcDTxWsoxF509hrFIPB2rduV5aDqS9FtDg1CAfa7V34qImbjfhIcA8C+RekocJZA96EarwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.9", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rushstack/node-core-library": { + "version": "5.20.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "~8.18.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~11.3.0", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/problem-matcher": { + "version": "0.2.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/rig-package": { + "version": "0.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@rushstack/terminal": { + "version": "0.22.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@rushstack/node-core-library": "5.20.3", + "@rushstack/problem-matcher": "0.2.1", + "supports-color": "~8.1.1" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "5.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@rushstack/terminal": "0.22.3", + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "string-argv": "~0.3.1" + } + }, + "node_modules/@shikijs/core": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^3.1.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/transformers": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/types": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/addon-docs": { + "version": "10.2.19", + "dev": true, + "license": "MIT", + "dependencies": { + "@mdx-js/react": "^3.0.0", + "@storybook/csf-plugin": "10.2.19", + "@storybook/icons": "^2.0.1", + "@storybook/react-dom-shim": "10.2.19", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^10.2.19" + } + }, + "node_modules/@storybook/builder-vite": { + "version": "10.2.19", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/csf-plugin": "10.2.19", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^10.2.19", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@storybook/csf-plugin": { + "version": "10.2.19", + "dev": true, + "license": "MIT", + "dependencies": { + "unplugin": "^2.3.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "esbuild": "*", + "rollup": "*", + "storybook": "^10.2.19", + "vite": "*", + "webpack": "*" + }, + "peerDependenciesMeta": { + "esbuild": { + "optional": true + }, + "rollup": { + "optional": true + }, + "vite": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@storybook/global": { + "version": "5.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/icons": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-2.0.1.tgz", + "integrity": "sha512-/smVjw88yK3CKsiuR71vNgWQ9+NuY2L+e8X7IMrFjexjm6ZR8ULrV2DRkTA61aV6ryefslzHEGDInGpnNeIocg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@storybook/react-dom-shim": { + "version": "10.2.19", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.2.19.tgz", + "integrity": "sha512-BXCEfBGVBRYBTYeBeH/PJsy0Bq5MERe/HiaylR+ah/XrvIr2Z9bkne1J8yYiXCjiyq5HQa7Bj11roz0+vyUaEw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "storybook": "^10.2.19" + } + }, + "node_modules/@storybook/web-components": { + "version": "10.2.19", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "tiny-invariant": "^1.3.1", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "lit": "^2.0.0 || ^3.0.0", + "storybook": "^10.2.19" + } + }, + "node_modules/@storybook/web-components-vite": { + "version": "10.2.19", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/builder-vite": "10.2.19", + "@storybook/web-components": "10.2.19" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^10.2.19" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.1.tgz", + "integrity": "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.31.1", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.1" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", + "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-android-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-darwin-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-darwin-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-freebsd-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-x64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.1.tgz", + "integrity": "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-x64": "4.2.1", + "@tailwindcss/oxide-freebsd-x64": "4.2.1", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-x64-musl": "4.2.1", + "@tailwindcss/oxide-wasm32-wasi": "4.2.1", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.1.tgz", + "integrity": "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.1.tgz", + "integrity": "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.1.tgz", + "integrity": "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.1.tgz", + "integrity": "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.1.tgz", + "integrity": "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.1.tgz", + "integrity": "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.1.tgz", + "integrity": "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.1.tgz", + "integrity": "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.1.tgz", + "integrity": "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.1.tgz", + "integrity": "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.1.tgz", + "integrity": "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.1.tgz", + "integrity": "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.1.tgz", + "integrity": "sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.2.1", + "@tailwindcss/oxide": "4.2.1", + "postcss": "^8.5.6", + "tailwindcss": "4.2.1" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.3.0", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/@testing-library/dom/node_modules/dom-accessibility-api": { + "version": "0.5.16", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/react": { + "version": "18.3.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", + "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/whatwg-mimetype": { + "version": "3.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws/node_modules/@types/node": { + "version": "20.19.37", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/ws/node_modules/@types/node/node_modules/undici-types": { + "version": "6.21.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitest/expect": { + "version": "3.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.28", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.28", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.30", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.30", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.30", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.30", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.30", + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.8", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.30", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.9" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.9", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.9", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/language-core": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "~2.4.11", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^0.4.9", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core/node_modules/minimatch": { + "version": "9.0.9", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vue/language-core/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@vue/language-core/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/reactivity": { + "version": "3.5.30", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.30", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.30", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/runtime-core": "3.5.30", + "@vue/shared": "3.5.30", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.30", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "vue": "3.5.30" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.30", + "dev": true, + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "12.8.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/integrations": { + "version": "12.8.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@vueuse/core": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^5", + "drauu": "^0.4", + "focus-trap": "^7", + "fuse.js": "^7", + "idb-keyval": "^6", + "jwt-decode": "^4", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^7" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "12.8.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "12.8.2", + "dev": true, + "license": "MIT", + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "8.18.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/algoliasearch": { + "version": "5.49.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.15.2", + "@algolia/client-abtesting": "5.49.2", + "@algolia/client-analytics": "5.49.2", + "@algolia/client-common": "5.49.2", + "@algolia/client-insights": "5.49.2", + "@algolia/client-personalization": "5.49.2", + "@algolia/client-query-suggestions": "5.49.2", + "@algolia/client-search": "5.49.2", + "@algolia/ingestion": "1.49.2", + "@algolia/monitoring": "1.49.2", + "@algolia/recommend": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/alien-signals": { + "version": "0.4.14", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-types": { + "version": "0.16.1", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.27", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001774", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.8", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bun-types": { + "version": "1.3.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/bun-types/node_modules/@types/node": { + "version": "20.19.37", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/bun-types/node_modules/@types/node/node_modules/undici-types": { + "version": "6.21.0", + "dev": true, + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001780", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chai": { + "version": "5.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/check-error": { + "version": "2.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/compare-versions": { + "version": "6.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/default-browser": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "8.0.3", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.6.3", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.313", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/exsolve": { + "version": "1.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fdir": { + "version": "6.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/focus-trap": { + "version": "7.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tabbable": "^6.4.0" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs-extra": { + "version": "11.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/happy-dom": { + "version": "20.8.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": ">=20.0.0", + "@types/whatwg-mimetype": "^3.0.2", + "@types/ws": "^8.18.1", + "entities": "^7.0.1", + "whatwg-mimetype": "^3.0.0", + "ws": "^8.18.3" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/happy-dom/node_modules/@types/node": { + "version": "20.19.37", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/happy-dom/node_modules/@types/node/node_modules/undici-types": { + "version": "6.21.0", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "dev": true, + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jju": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lit": { + "version": "3.3.2", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@lit/reactive-element": "^2.1.0", + "lit-element": "^4.2.0", + "lit-html": "^3.3.0" + } + }, + "node_modules/lit-element": { + "version": "4.2.2", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.5.0", + "@lit/reactive-element": "^2.1.0", + "lit-html": "^3.3.0" + } + }, + "node_modules/lit-html": { + "version": "3.3.2", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@types/trusted-types": "^2.0.2" + } + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "3.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "dev": true, + "license": "MIT" + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/min-indent": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "10.2.3", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minisearch": { + "version": "7.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/mitt": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/mlly/node_modules/pkg-types/node_modules/confbox": { + "version": "0.1.8", + "dev": true, + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.36", + "dev": true, + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/open": { + "version": "10.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/preact": { + "version": "10.29.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/recast": { + "version": "0.23.11", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/rolldown": { + "version": "1.0.0-rc.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.115.0", + "@rolldown/pluginutils": "1.0.0-rc.9" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.9", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.9", + "@rolldown/binding-darwin-x64": "1.0.0-rc.9", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.9", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.9", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.9", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.9", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.9", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.9", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.9", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.9" + } + }, + "node_modules/rollup": { + "version": "4.59.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/search-insights": { + "version": "2.17.3", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/semver": { + "version": "7.7.4", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shiki": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/langs": "2.5.0", + "@shikijs/themes": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/storybook": { + "version": "10.2.19", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@storybook/icons": "^2.0.1", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/user-event": "^14.6.1", + "@vitest/expect": "3.2.4", + "@vitest/spy": "3.2.4", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0", + "open": "^10.2.0", + "recast": "^0.23.5", + "semver": "^7.7.3", + "use-sync-external-store": "^1.5.0", + "ws": "^8.18.0" + }, + "bin": { + "storybook": "dist/bin/dispatcher.js" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "prettier": "^2 || ^3" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/superjson": { + "version": "2.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tabbable": { + "version": "6.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tailwindcss": { + "version": "4.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "5.9.3", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.3", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.18.2", + "dev": true, + "license": "MIT" + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unplugin": { + "version": "2.3.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/runtime": "0.115.0", + "lightningcss": "^1.32.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.9", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.0.0-alpha.31", + "esbuild": "^0.27.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-dts": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/api-extractor": "^7.50.1", + "@rollup/pluginutils": "^5.1.4", + "@volar/typescript": "^2.4.11", + "@vue/language-core": "2.2.0", + "compare-versions": "^6.1.1", + "debug": "^4.4.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.0.0", + "magic-string": "^0.30.17" + }, + "peerDependencies": { + "typescript": "*", + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "1.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/css": "3.8.2", + "@docsearch/js": "3.8.2", + "@iconify-json/simple-icons": "^1.2.21", + "@shikijs/core": "^2.1.0", + "@shikijs/transformers": "^2.1.0", + "@shikijs/types": "^2.1.0", + "@types/markdown-it": "^14.1.2", + "@vitejs/plugin-vue": "^5.2.1", + "@vue/devtools-api": "^7.7.0", + "@vue/shared": "^3.5.13", + "@vueuse/core": "^12.4.0", + "@vueuse/integrations": "^12.4.0", + "focus-trap": "^7.6.4", + "mark.js": "8.11.1", + "minisearch": "^7.1.1", + "shiki": "^2.1.0", + "vite": "^5.4.14", + "vue": "^3.5.13" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, + "node_modules/vitepress/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitepress/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vitepress/node_modules/vite": { + "version": "5.4.21", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.30", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-sfc": "3.5.30", + "@vue/runtime-dom": "3.5.30", + "@vue/server-renderer": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/ws": { + "version": "8.19.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/zwitch": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json index 0e72619..4d536f2 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,7 @@ "@bquery/bquery": "^1.6.0", "@storybook/addon-docs": "^10.2.19", "@storybook/web-components-vite": "^10.2.19", + "@tailwindcss/postcss": "^4.2.1", "@types/node": "^25.5.0", "autoprefixer": "^10.4.27", "bun-types": "^1.3.10", diff --git a/postcss.config.js b/postcss.config.js index 2aa7205..51a6e4e 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,6 +1,6 @@ export default { plugins: { - tailwindcss: {}, + '@tailwindcss/postcss': {}, autoprefixer: {}, }, }; diff --git a/src/components/accordion/BqAccordion.ts b/src/components/accordion/BqAccordion.ts index 66efbd3..6b5ded3 100644 --- a/src/components/accordion/BqAccordion.ts +++ b/src/components/accordion/BqAccordion.ts @@ -45,6 +45,11 @@ const definition: ComponentDefinition = { .panel { overflow: hidden; max-height: 0; transition: max-height var(--bq-duration-slow,300ms) var(--bq-easing-standard); } :host([open]) .panel { max-height: 2000px; } .panel-inner { padding: 0 var(--bq-space-4,1rem) var(--bq-space-4,1rem); color: var(--bq-text-muted,#475569); font-size: var(--bq-font-size-sm,0.875rem); line-height: var(--bq-line-height-relaxed,1.625); } + @media (prefers-reduced-motion: reduce) { + .panel { transition: none; } + .icon { transition: none; } + .trigger { transition: none; } + } `, connected() { const self = this; diff --git a/src/components/chip/BqChip.ts b/src/components/chip/BqChip.ts index 6922298..5d3bfb0 100644 --- a/src/components/chip/BqChip.ts +++ b/src/components/chip/BqChip.ts @@ -68,18 +68,35 @@ const definition: ComponentDefinition = { } self.dispatchEvent(new CustomEvent('bq-click', { bubbles: true, composed: true })); }; + const keyHandler = (e: Event) => { + if (self.hasAttribute('disabled')) return; + const key = (e as KeyboardEvent).key; + if (key === 'Enter' || key === ' ') { + e.preventDefault(); + const target = e.target as Element; + if (target.closest('.remove-btn')) { + self.dispatchEvent(new CustomEvent('bq-remove', { bubbles: true, composed: true })); + return; + } + self.dispatchEvent(new CustomEvent('bq-click', { bubbles: true, composed: true })); + } + }; (self as unknown as Record)['_handler'] = handler; + (self as unknown as Record)['_keyHandler'] = keyHandler; self.shadowRoot?.addEventListener('click', handler); + self.shadowRoot?.addEventListener('keydown', keyHandler); }, disconnected() { const handler = (this as unknown as Record)['_handler'] as EventListener | undefined; + const keyHandler = (this as unknown as Record)['_keyHandler'] as EventListener | undefined; if (handler) this.shadowRoot?.removeEventListener('click', handler); + if (keyHandler) this.shadowRoot?.removeEventListener('keydown', keyHandler); }, render({ props }) { return html` + aria-pressed="${props.selected ? 'true' : 'false'}" aria-disabled="${props.disabled ? 'true' : 'false'}"> ${props.removable ? `` : ''} diff --git a/src/components/dialog/BqDialog.ts b/src/components/dialog/BqDialog.ts index c37fc2e..18a41a8 100644 --- a/src/components/dialog/BqDialog.ts +++ b/src/components/dialog/BqDialog.ts @@ -62,6 +62,10 @@ const definition: ComponentDefinition = { .close-btn:focus-visible { outline: 2px solid transparent; box-shadow: var(--bq-focus-ring); } .body { padding: var(--bq-space-6,1.5rem); overflow-y: auto; flex: 1; color: var(--bq-text-muted,#475569); font-size: var(--bq-font-size-md,1rem); line-height: var(--bq-line-height-relaxed,1.625); } .footer { padding: var(--bq-space-4,1rem) var(--bq-space-6,1.5rem); border-top: 1px solid var(--bq-border-base,#e2e8f0); display: flex; align-items: center; justify-content: flex-end; gap: var(--bq-space-3,0.75rem); flex-shrink: 0; background: var(--bq-bg-subtle,#f8fafc); } + @media (prefers-reduced-motion: reduce) { + .overlay, .dialog { animation: none; } + .close-btn { transition: none; } + } `, connected() { type BQEl = HTMLElement & { setState(k: 'titleId', v: string): void; getState(k: string): T }; @@ -98,6 +102,10 @@ const definition: ComponentDefinition = { const s = this as unknown as Record; const releaseFocus = s['_releaseFocus'] as (() => void) | undefined; if (this.hasAttribute('open')) { + // Store the previously focused element for restoration on close + if (!s['_previousFocus']) { + s['_previousFocus'] = document.activeElement as HTMLElement | null; + } const dialog = this.shadowRoot?.querySelector('.dialog') as HTMLElement | null; if (dialog) { releaseFocus?.(); @@ -110,6 +118,12 @@ const definition: ComponentDefinition = { } else { releaseFocus?.(); delete s['_releaseFocus']; + // Restore focus to the element that was focused before opening + const prev = s['_previousFocus'] as HTMLElement | undefined; + if (prev && typeof prev.focus === 'function') { + prev.focus(); + } + delete s['_previousFocus']; } }, render({ props, state }) { diff --git a/src/components/drawer/BqDrawer.ts b/src/components/drawer/BqDrawer.ts index 20592f9..e5d17b1 100644 --- a/src/components/drawer/BqDrawer.ts +++ b/src/components/drawer/BqDrawer.ts @@ -14,7 +14,7 @@ import type { ComponentDefinition } from '@bquery/bquery/component'; import { escapeHtml } from '@bquery/bquery/security'; import { getBaseStyles } from '../../utils/styles.js'; import { t } from '../../i18n/index.js'; -import { uniqueId } from '../../utils/dom.js'; +import { trapFocus, uniqueId } from '../../utils/dom.js'; type BqDrawerProps = { open: boolean; title: string; placement: string; size: string }; type BqDrawerState = { titleId: string }; @@ -68,6 +68,10 @@ const definition: ComponentDefinition = { .close-btn:focus-visible { outline: 2px solid transparent; box-shadow: var(--bq-focus-ring); } .body { padding: var(--bq-space-6,1.5rem); overflow-y: auto; flex: 1; } .footer { padding: var(--bq-space-4,1rem) var(--bq-space-6,1.5rem); border-top: 1px solid var(--bq-border-base,#e2e8f0); display: flex; gap: var(--bq-space-3,0.75rem); justify-content: flex-end; flex-shrink: 0; background: var(--bq-bg-subtle,#f8fafc); } + @media (prefers-reduced-motion: reduce) { + .backdrop, .drawer { animation: none; } + .close-btn { transition: none; } + } `, connected() { type BQEl = HTMLElement & { setState(k: 'titleId', v: string): void; getState(k: string): T }; @@ -85,10 +89,39 @@ const definition: ComponentDefinition = { }, disconnected() { const s = this as unknown as Record; + const releaseFocus = s['_releaseFocus'] as (() => void) | undefined; if (releaseFocus) releaseFocus(); const kh = s['_kh'] as EventListener | undefined; if (kh) document.removeEventListener('keydown', kh); const bh = s['_bh'] as EventListener | undefined; if (bh) this.shadowRoot?.removeEventListener('click', bh); const ch = s['_ch'] as EventListener | undefined; if (ch) this.shadowRoot?.removeEventListener('click', ch); }, + updated() { + const s = this as unknown as Record; + const releaseFocus = s['_releaseFocus'] as (() => void) | undefined; + if (this.hasAttribute('open')) { + // Store the previously focused element for restoration on close + if (!s['_previousFocus']) { + s['_previousFocus'] = document.activeElement as HTMLElement | null; + } + const drawer = this.shadowRoot?.querySelector('.drawer') as HTMLElement | null; + if (drawer) { + releaseFocus?.(); + s['_releaseFocus'] = trapFocus(drawer); + requestAnimationFrame(() => { + const focusable = drawer.querySelector('button, a[href], input, select, textarea, [tabindex]:not([tabindex="-1"])'); + if (focusable) focusable.focus(); + }); + } + } else { + releaseFocus?.(); + delete s['_releaseFocus']; + // Restore focus to the element that was focused before opening + const prev = s['_previousFocus'] as HTMLElement | undefined; + if (prev && typeof prev.focus === 'function') { + prev.focus(); + } + delete s['_previousFocus']; + } + }, render({ props, state }) { const titleId = state.titleId || 'bq-drawer-title'; return html` diff --git a/src/components/progress/BqProgress.ts b/src/components/progress/BqProgress.ts index e99e72d..04b9fe6 100644 --- a/src/components/progress/BqProgress.ts +++ b/src/components/progress/BqProgress.ts @@ -49,6 +49,10 @@ const definition: ComponentDefinition = { @keyframes indeterminate { 0% { transform: translateX(-150%); } 100% { transform: translateX(350%); } } .label { font-size: var(--bq-font-size-sm,0.875rem); color: var(--bq-text-muted,#475569); margin-bottom: 0.375rem; font-family: var(--bq-font-family-sans); } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; } + @media (prefers-reduced-motion: reduce) { + .bar { transition: none; } + :host([indeterminate]) .bar { animation: none; width: 100% !important; opacity: 0.7; } + } `, render({ props }) { const pct = props.indeterminate ? 0 : Math.min(100, Math.max(0, (props.value / props.max) * 100)); diff --git a/src/components/select/BqSelect.ts b/src/components/select/BqSelect.ts index 35ae763..d4e6663 100644 --- a/src/components/select/BqSelect.ts +++ b/src/components/select/BqSelect.ts @@ -82,20 +82,23 @@ const definition: ComponentDefinition = { }, render({ props, state }) { const hasError = Boolean(props.error); + const hasHint = Boolean(props.error) || Boolean((props as Record).hint); const uid = state.uid || 'bq-select'; + const describedBy = hasError ? `${uid}-err` : hasHint ? `${uid}-hint` : ''; return html`
${props.label ? `` : ''}
- ${hasError ? `${escapeHtml(props.error)}` : ''} + ${hasError ? `${escapeHtml(props.error)}` : ''}
`; }, diff --git a/src/components/skeleton/BqSkeleton.ts b/src/components/skeleton/BqSkeleton.ts index a78f5af..bb15916 100644 --- a/src/components/skeleton/BqSkeleton.ts +++ b/src/components/skeleton/BqSkeleton.ts @@ -46,6 +46,9 @@ const definition: ComponentDefinition = { animation: shimmer 1.5s infinite; } @keyframes shimmer { from { transform: translateX(-100%); } to { transform: translateX(100%); } } + @media (prefers-reduced-motion: reduce) { + .skeleton::after { animation: none; } + } .skeleton[data-variant="circle"] { border-radius: var(--bq-radius-full,9999px); } .skeleton[data-variant="text"] { height: 1em; margin-bottom: 0.5em; } .skeleton[data-variant="text"]:last-child { width: 70%; } diff --git a/src/components/spinner/BqSpinner.ts b/src/components/spinner/BqSpinner.ts index bffbc67..15cc576 100644 --- a/src/components/spinner/BqSpinner.ts +++ b/src/components/spinner/BqSpinner.ts @@ -36,6 +36,9 @@ const definition: ComponentDefinition = { .spinner[data-variant="success"] { border: 2.5px solid var(--bq-color-success-100,#dcfce7); border-top-color: var(--bq-color-success-600,#16a34a); } .spinner[data-variant="white"] { border: 2.5px solid rgba(255,255,255,0.3); border-top-color: #fff; } @keyframes spin { to { transform: rotate(360deg); } } + @media (prefers-reduced-motion: reduce) { + .spinner { animation-duration: 1.5s; } + } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; } `, render({ props }) { diff --git a/src/components/table/BqTable.ts b/src/components/table/BqTable.ts index 8b9a282..9728e84 100644 --- a/src/components/table/BqTable.ts +++ b/src/components/table/BqTable.ts @@ -15,6 +15,7 @@ import { component, html } from '@bquery/bquery/component'; import type { ComponentDefinition } from '@bquery/bquery/component'; import { escapeHtml } from '@bquery/bquery/security'; import { getBaseStyles } from '../../utils/styles.js'; +import { t } from '../../i18n/index.js'; type ColDef = { key: string; label: string; sortable?: boolean }; type BqTableProps = { columns: string; rows: string; 'sort-key': string; 'sort-dir': string; striped: boolean; bordered: boolean; hover: boolean; loading: boolean }; @@ -51,9 +52,7 @@ const definition: ComponentDefinition = { `, connected() { const self = this; - const handler = (e: Event) => { - const th = (e.target as Element).closest('th.sortable') as HTMLElement | null; - if (!th) return; + const sortHandler = (th: HTMLElement) => { const key = th.getAttribute('data-sort-key') ?? ''; const curDir = self.getAttribute('sort-dir') ?? 'asc'; const curKey = self.getAttribute('sort-key') ?? ''; @@ -62,12 +61,30 @@ const definition: ComponentDefinition = { self.setAttribute('sort-dir', newDir); self.dispatchEvent(new CustomEvent('bq-sort', { detail: { key, dir: newDir }, bubbles: true, composed: true })); }; + const handler = (e: Event) => { + const th = (e.target as Element).closest('th.sortable') as HTMLElement | null; + if (!th) return; + sortHandler(th); + }; + const keyHandler = (e: Event) => { + const ke = e as KeyboardEvent; + if (ke.key !== 'Enter' && ke.key !== ' ') return; + const th = (ke.target as Element).closest('th.sortable') as HTMLElement | null; + if (!th) return; + e.preventDefault(); + sortHandler(th); + }; (self as unknown as Record)['_handler'] = handler; + (self as unknown as Record)['_keyHandler'] = keyHandler; self.shadowRoot?.addEventListener('click', handler); + self.shadowRoot?.addEventListener('keydown', keyHandler); }, disconnected() { - const h = (this as unknown as Record)['_handler'] as EventListener | undefined; + const s = this as unknown as Record; + const h = s['_handler'] as EventListener | undefined; + const kh = s['_keyHandler'] as EventListener | undefined; if (h) this.shadowRoot?.removeEventListener('click', h); + if (kh) this.shadowRoot?.removeEventListener('keydown', kh); }, render({ props }) { let cols: ColDef[] = []; @@ -79,10 +96,10 @@ const definition: ComponentDefinition = { const theads = cols.map(col => { const isSorted = col.key === sortKey; const sortIcon = col.sortable ? `` : ''; - return `${escapeHtml(col.label)}${sortIcon}`; + return `${escapeHtml(col.label)}${sortIcon}`; }).join(''); - const tbodies = props.loading ? `Loading…` - : rows.length === 0 ? `No data` + const tbodies = props.loading ? `${escapeHtml(t('table.loading'))}` + : rows.length === 0 ? `${escapeHtml(t('table.noData'))}` : rows.map(row => `${cols.map(col => `${escapeHtml(String(row[col.key] ?? ''))}`).join('')}`).join(''); return html` diff --git a/src/components/toast/BqToast.ts b/src/components/toast/BqToast.ts index fcb8032..51511b5 100644 --- a/src/components/toast/BqToast.ts +++ b/src/components/toast/BqToast.ts @@ -43,6 +43,9 @@ const definition: ComponentDefinition = { .close { flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; background: none; border: none; cursor: pointer; color: inherit; padding: 0.125rem; border-radius: var(--bq-radius-sm,0.25rem); opacity: 0.7; font-size: 0.875rem; } .close:hover { opacity: 1; background: rgba(0,0,0,0.08); } .close:focus-visible { outline: 2px solid transparent; box-shadow: var(--bq-focus-ring); } + @media (prefers-reduced-motion: reduce) { + .toast { animation: none; } + } `, connected() { const self = this; From 055cc48f78ee700a6ddbdd642895bf478ef40dc4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 09:31:32 +0000 Subject: [PATCH 03/17] docs: add VitePress documentation for 8 new components Add documentation pages for Alert, Checkbox, Dialog, Drawer, Select, Table, Tabs, and Toast components following the existing pattern used by Button, Input, and Card docs. Each page includes: heading, description, usage examples, properties table, events table, slots table, and CSS Parts table. Update sidebar config to list all components alphabetically. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- docs/.vitepress/config.ts | 10 +++- docs/components/alert.md | 82 +++++++++++++++++++++++++++++ docs/components/checkbox.md | 70 +++++++++++++++++++++++++ docs/components/dialog.md | 96 ++++++++++++++++++++++++++++++++++ docs/components/drawer.md | 101 ++++++++++++++++++++++++++++++++++++ docs/components/select.md | 96 ++++++++++++++++++++++++++++++++++ docs/components/table.md | 91 ++++++++++++++++++++++++++++++++ docs/components/tabs.md | 97 ++++++++++++++++++++++++++++++++++ docs/components/toast.md | 89 +++++++++++++++++++++++++++++++ 9 files changed, 731 insertions(+), 1 deletion(-) create mode 100644 docs/components/alert.md create mode 100644 docs/components/checkbox.md create mode 100644 docs/components/dialog.md create mode 100644 docs/components/drawer.md create mode 100644 docs/components/select.md create mode 100644 docs/components/table.md create mode 100644 docs/components/tabs.md create mode 100644 docs/components/toast.md diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index f85bc76..e3c70be 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -28,9 +28,17 @@ export default defineConfig({ text: 'Components', items: [ { text: 'Catalog', link: '/components/' }, + { text: 'Alert', link: '/components/alert' }, { text: 'Button', link: '/components/button' }, - { text: 'Input', link: '/components/input' }, { text: 'Card', link: '/components/card' }, + { text: 'Checkbox', link: '/components/checkbox' }, + { text: 'Dialog', link: '/components/dialog' }, + { text: 'Drawer', link: '/components/drawer' }, + { text: 'Input', link: '/components/input' }, + { text: 'Select', link: '/components/select' }, + { text: 'Table', link: '/components/table' }, + { text: 'Tabs', link: '/components/tabs' }, + { text: 'Toast', link: '/components/toast' }, ], }, ], diff --git a/docs/components/alert.md b/docs/components/alert.md new file mode 100644 index 0000000..8eef6f9 --- /dev/null +++ b/docs/components/alert.md @@ -0,0 +1,82 @@ +# Alert + +The `bq-alert` component displays contextual feedback messages for user actions, such as success confirmations, warnings, and error notifications. + +## Basic Usage + +```html + + This is an informational message. + +``` + +## Variants + +```html + + This is an informational alert. + + + + Operation completed successfully. + + + + Please review the following issues. + + + + Something went wrong. Please try again. + +``` + +## Dismissible + +```html + + Your changes have been saved. + +``` + +## With Custom Content + +```html + +

You have used 90% of your storage.

+ Upgrade Plan +
+``` + +## Without Title + +```html + + A simple informational message without a title. + +``` + +## Properties + +| Property | Type | Default | Description | +|----------|------|---------|-------------| +| `variant` | `info \| success \| warning \| danger` | `info` | Visual style indicating the alert type | +| `title` | `string` | `''` | Alert heading text | +| `dismissible` | `boolean` | `false` | Shows a close button to dismiss the alert | + +## Events + +| Event | Detail | Description | +|-------|--------|-------------| +| `bq-close` | — | Fired when the alert is dismissed via the close button | + +## Slots + +| Slot | Description | +|------|-------------| +| *(default)* | Alert body content | + +## CSS Parts + +| Part | Description | +|------|-------------| +| `alert` | The main alert container | diff --git a/docs/components/checkbox.md b/docs/components/checkbox.md new file mode 100644 index 0000000..f75e413 --- /dev/null +++ b/docs/components/checkbox.md @@ -0,0 +1,70 @@ +# Checkbox + +The `bq-checkbox` component is an accessible checkbox input supporting checked, indeterminate, and disabled states with optional hint text. + +## Basic Usage + +```html + +``` + +## Checked + +```html + +``` + +## Indeterminate + +```html + +``` + +## With Hint + +```html + +``` + +## Disabled + +```html + + +``` + +## Properties + +| Property | Type | Default | Description | +|----------|------|---------|-------------| +| `label` | `string` | — | Checkbox label text | +| `checked` | `boolean` | `false` | Whether the checkbox is checked | +| `indeterminate` | `boolean` | `false` | Displays the indeterminate (mixed) state | +| `disabled` | `boolean` | `false` | Disables the checkbox | +| `name` | `string` | — | Form field name | +| `value` | `string` | — | Value submitted with the form | +| `hint` | `string` | — | Helper text displayed below the label | + +## Events + +| Event | Detail | Description | +|-------|--------|-------------| +| `bq-change` | `{ checked: boolean }` | Fired when the checked state changes | + +## Slots + +| Slot | Description | +|------|-------------| +| *(default)* | Custom label content (overrides the `label` property) | + +## CSS Parts + +| Part | Description | +|------|-------------| +| `checkbox` | The checkbox container | +| `control` | The checkbox input control | +| `label` | Label text element | +| `hint` | Hint text element | diff --git a/docs/components/dialog.md b/docs/components/dialog.md new file mode 100644 index 0000000..e1203e0 --- /dev/null +++ b/docs/components/dialog.md @@ -0,0 +1,96 @@ +# Dialog + +The `bq-dialog` component is a modal dialog overlay used for confirmations, forms, and focused interactions. It traps focus and supports keyboard dismissal. + +## Basic Usage + +```html + + Open Dialog + + + +

Are you sure you want to continue?

+
+``` + +## Sizes + +```html + +

Compact dialog for simple messages.

+
+ + +

Default size, suitable for most use cases.

+
+ + +

Large dialog for complex content.

+
+ + +

Extra-large dialog for data-heavy views.

+
+ + +

Full-screen dialog for immersive experiences.

+
+``` + +## Non-Dismissible + +```html + +

You must complete this action before continuing.

+
+ Acknowledge +
+
+``` + +## With Footer + +```html + +

You have unsaved changes. Do you want to save before leaving?

+
+ Discard + Save +
+
+``` + +## Properties + +| Property | Type | Default | Description | +|----------|------|---------|-------------| +| `open` | `boolean` | `false` | Controls visibility of the dialog | +| `title` | `string` | — | Dialog heading text | +| `size` | `sm \| md \| lg \| xl \| full` | `md` | Width preset for the dialog | +| `dismissible` | `boolean` | `true` | Allows closing via overlay click, Escape key, and close button | + +## Events + +| Event | Detail | Description | +|-------|--------|-------------| +| `bq-close` | — | Fired when the dialog is dismissed | + +## Slots + +| Slot | Description | +|------|-------------| +| *(default)* | Dialog body content | +| `footer` | Footer area, typically used for action buttons | + +## CSS Parts + +| Part | Description | +|------|-------------| +| `overlay` | Background overlay behind the dialog | +| `dialog` | The dialog container | +| `header` | Header section containing the title and close button | +| `title` | Title text element | +| `close` | Close / dismiss button | +| `body` | Body content area | +| `footer` | Footer section | diff --git a/docs/components/drawer.md b/docs/components/drawer.md new file mode 100644 index 0000000..34001fe --- /dev/null +++ b/docs/components/drawer.md @@ -0,0 +1,101 @@ +# Drawer + +The `bq-drawer` component is a slide-in side panel used for navigation menus, detail views, and supplementary content. + +## Basic Usage + +```html + + Open Drawer + + + +

Drawer body content goes here.

+
+``` + +## Placement Variants + +```html + +

Slides in from the right.

+
+ + +

Slides in from the left.

+
+ + +

Slides in from the top.

+
+ + +

Slides in from the bottom.

+
+``` + +## Sizes + +```html + +

Narrow side panel.

+
+ + +

Default width panel.

+
+ + +

Wide panel for detailed content.

+
+ + +

Full-width panel.

+
+``` + +## With Footer + +```html + +

Update your profile information below.

+
+ Cancel + Save +
+
+``` + +## Properties + +| Property | Type | Default | Description | +|----------|------|---------|-------------| +| `open` | `boolean` | `false` | Controls visibility of the drawer | +| `title` | `string` | — | Drawer heading text | +| `placement` | `right \| left \| top \| bottom` | `right` | Edge from which the drawer slides in | +| `size` | `sm \| md \| lg \| full` | `md` | Width (or height for top/bottom) of the drawer | + +## Events + +| Event | Detail | Description | +|-------|--------|-------------| +| `bq-close` | — | Fired when the drawer is dismissed | + +## Slots + +| Slot | Description | +|------|-------------| +| *(default)* | Drawer body content | +| `footer` | Footer area, typically used for action buttons | + +## CSS Parts + +| Part | Description | +|------|-------------| +| `backdrop` | Background overlay behind the drawer | +| `drawer` | The drawer container | +| `header` | Header section containing the title and close button | +| `title` | Title text element | +| `close` | Close / dismiss button | +| `body` | Body content area | +| `footer` | Footer section | diff --git a/docs/components/select.md b/docs/components/select.md new file mode 100644 index 0000000..932c9b4 --- /dev/null +++ b/docs/components/select.md @@ -0,0 +1,96 @@ +# Select + +The `bq-select` component is a dropdown selection input with label, error state, and size options. + +## Basic Usage + +```html + + + + + +``` + +## With Error + +```html + + + + + +``` + +## With Placeholder + +```html + + + + + +``` + +## Disabled + +```html + + + + + +``` + +## Sizes + +```html + + + + + + + + + + + +``` + +## Properties + +| Property | Type | Default | Description | +|----------|------|---------|-------------| +| `label` | `string` | — | Select label | +| `value` | `string` | — | Currently selected value | +| `placeholder` | `string` | — | Placeholder text when no option is selected | +| `name` | `string` | — | Form field name | +| `disabled` | `boolean` | `false` | Disables the select | +| `required` | `boolean` | `false` | Marks the field as required | +| `error` | `string` | — | Error message displayed below the select | +| `size` | `sm \| md \| lg` | `md` | Select size | + +## Events + +| Event | Detail | Description | +|-------|--------|-------------| +| `bq-change` | `{ value: string }` | Fired when the selected value changes | + +## Slots + +| Slot | Description | +|------|-------------| +| *(default)* | `
` element | +| `thead` | Table header section | +| `tbody` | Table body section | +| `row` | A table row | +| `cell` | A table cell | +| `header-cell` | A header cell | +| `loading` | Loading overlay / indicator | diff --git a/docs/components/tabs.md b/docs/components/tabs.md new file mode 100644 index 0000000..21dd23d --- /dev/null +++ b/docs/components/tabs.md @@ -0,0 +1,97 @@ +# Tabs + +The `bq-tabs` component provides tabbed navigation with keyboard support, multiple visual variants, and dynamic tab detection. + +## Basic Usage + +```html + +
General
+
Settings
+
Billing
+ +
General content here.
+
Settings content here.
+
Billing content here.
+
+``` + +## Variants + +```html + +
Tab A
+
Tab B
+
Default style panel A.
+
Default style panel B.
+
+ + +
Tab A
+
Tab B
+
Pills style panel A.
+
Pills style panel B.
+
+ + +
Tab A
+
Tab B
+
Underline style panel A.
+
Underline style panel B.
+
+``` + +## Dynamic Tabs + +Tabs added or removed at runtime are automatically detected: + +```html + +
First
+
First panel content.
+
+ + +``` + +## Properties + +| Property | Type | Default | Description | +|----------|------|---------|-------------| +| `active-tab` | `string` | `''` | ID of the currently active tab | +| `variant` | `default \| pills \| underline` | `default` | Visual style of the tab list | + +## Events + +| Event | Detail | Description | +|-------|--------|-------------| +| `bq-tab-change` | `{ tabId: string }` | Fired when the active tab changes | + +## Slots + +| Slot | Description | +|------|-------------| +| *(default)* | Tab items (`[data-tab-item]`) and tab panels (`[data-tab]`) | + +## CSS Parts + +| Part | Description | +|------|-------------| +| `tabs` | Main tabs container | +| `tablist` | Tab list / navigation area | +| `tab` | Individual tab button | +| `panels` | Container for tab panel content | diff --git a/docs/components/toast.md b/docs/components/toast.md new file mode 100644 index 0000000..da4f87e --- /dev/null +++ b/docs/components/toast.md @@ -0,0 +1,89 @@ +# Toast + +The `bq-toast` component displays brief, non-intrusive notifications that automatically dismiss after a set duration. It can be used declaratively or via an imperative API. + +## Basic Usage + +```html + +``` + +## Variants + +```html + + + + +``` + +## Custom Duration + +```html + +``` + +## Non-Dismissible + +```html + +``` + +## Imperative API + +You can trigger toasts programmatically using the `showToast` helper: + +```js +import { showToast } from '@bquery/ui'; + +// Success toast +showToast({ variant: 'success', message: 'Item created!' }); + +// Error toast with longer duration +showToast({ + variant: 'error', + message: 'Something went wrong.', + duration: 6000, +}); + +// Info toast +showToast({ variant: 'info', message: 'Update available.' }); +``` + +## Properties + +| Property | Type | Default | Description | +|----------|------|---------|-------------| +| `variant` | `success \| error \| warning \| info` | `info` | Visual style of the toast | +| `message` | `string` | — | Text content of the toast | +| `duration` | `number` | `4000` | Auto-dismiss delay in milliseconds | +| `dismissible` | `boolean` | `true` | Shows a close button for manual dismissal | + +## Events + +| Event | Detail | Description | +|-------|--------|-------------| +| `bq-close` | — | Fired when the toast is dismissed (auto or manual) | + +## Slots + +| Slot | Description | +|------|-------------| +| *(default)* | Optional custom content for the toast body | + +## CSS Parts + +| Part | Description | +|------|-------------| +| `toast` | The toast container | +| `icon` | Status icon area | +| `message` | Message text element | +| `close` | Close / dismiss button | From 1f2d4aa69a20ad4805e71924adf0465843cc05da Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 09:34:20 +0000 Subject: [PATCH 04/17] Add documentation pages for 8 more components and update sidebar Add VitePress documentation for Alert, Checkbox, Dialog, Drawer, Select, Table, Tabs, and Toast components. Update sidebar config to list all documented components alphabetically. Co-authored-by: JosunLP <20913954+JosunLP@users.noreply.github.com> --- tests/a11y-and-i18n-fixes.test.ts | 201 ++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 tests/a11y-and-i18n-fixes.test.ts diff --git a/tests/a11y-and-i18n-fixes.test.ts b/tests/a11y-and-i18n-fixes.test.ts new file mode 100644 index 0000000..0a457f4 --- /dev/null +++ b/tests/a11y-and-i18n-fixes.test.ts @@ -0,0 +1,201 @@ +// DOM environment is provided by tests/setup.ts (preloaded via bunfig.toml) +import { describe, it, expect, beforeAll, afterEach } from 'bun:test'; + +const win = (globalThis as unknown as Record)['window'] as Window & typeof globalThis; +const doc = win.document as unknown as Document; + +describe('accessibility and i18n fixes', () => { + beforeAll(async () => { + await import('../src/components/select/index.js'); + await import('../src/components/chip/index.js'); + await import('../src/components/table/index.js'); + await import('../src/components/dialog/index.js'); + await import('../src/components/drawer/index.js'); + await import('../src/components/spinner/index.js'); + await import('../src/components/toast/index.js'); + await import('../src/components/accordion/index.js'); + await import('../src/components/progress/index.js'); + await import('../src/components/skeleton/index.js'); + }); + + afterEach(() => { + doc.body.innerHTML = ''; + }); + + // --- BqSelect aria-describedby --- + it('should link select to error message via aria-describedby', () => { + const el = doc.createElement('bq-select'); + el.setAttribute('label', 'Country'); + el.setAttribute('error', 'Required field'); + doc.body.appendChild(el); + + const select = el.shadowRoot?.querySelector('select'); + const errorSpan = el.shadowRoot?.querySelector('.error-msg'); + + expect(select?.getAttribute('aria-invalid')).toBe('true'); + expect(select?.getAttribute('aria-describedby')).toBeTruthy(); + expect(errorSpan?.id).toBeTruthy(); + expect(select?.getAttribute('aria-describedby')).toBe(errorSpan?.id); + }); + + it('should not add aria-describedby to select when no error', () => { + const el = doc.createElement('bq-select'); + el.setAttribute('label', 'Country'); + doc.body.appendChild(el); + + const select = el.shadowRoot?.querySelector('select'); + expect(select?.getAttribute('aria-invalid')).toBe('false'); + // aria-describedby should be absent or empty when there is no error + const describedBy = select?.getAttribute('aria-describedby'); + expect(!describedBy || describedBy === '').toBe(true); + }); + + // --- BqChip aria-pressed fix --- + it('should render aria-pressed as string "true"/"false" on chip', () => { + const el = doc.createElement('bq-chip'); + doc.body.appendChild(el); + + const chip = el.shadowRoot?.querySelector('.chip'); + expect(chip?.getAttribute('aria-pressed')).toBe('false'); + + el.setAttribute('selected', ''); + const chipAfter = el.shadowRoot?.querySelector('.chip'); + expect(chipAfter?.getAttribute('aria-pressed')).toBe('true'); + }); + + it('should render aria-disabled as string "true"/"false" on chip', () => { + const el = doc.createElement('bq-chip'); + doc.body.appendChild(el); + + const chip = el.shadowRoot?.querySelector('.chip'); + expect(chip?.getAttribute('aria-disabled')).toBe('false'); + + el.setAttribute('disabled', ''); + const chipAfter = el.shadowRoot?.querySelector('.chip'); + expect(chipAfter?.getAttribute('aria-disabled')).toBe('true'); + }); + + // --- BqTable i18n strings --- + it('should use i18n strings for table loading state', () => { + const el = doc.createElement('bq-table'); + el.setAttribute('columns', JSON.stringify([{ key: 'name', label: 'Name' }])); + el.setAttribute('rows', '[]'); + el.setAttribute('loading', ''); + doc.body.appendChild(el); + + const loadingCell = el.shadowRoot?.querySelector('.loading-overlay'); + expect(loadingCell).toBeTruthy(); + // Should use the i18n translated string, not hardcoded "Loading…" + const text = loadingCell?.textContent?.trim() ?? ''; + expect(text.length).toBeGreaterThan(0); + // The i18n default is "Loading data…" + expect(text).toBe('Loading data\u2026'); + }); + + it('should use i18n strings for table empty state', () => { + const el = doc.createElement('bq-table'); + el.setAttribute('columns', JSON.stringify([{ key: 'name', label: 'Name' }])); + el.setAttribute('rows', '[]'); + doc.body.appendChild(el); + + const emptyCell = el.shadowRoot?.querySelector('.empty-row td'); + expect(emptyCell).toBeTruthy(); + // The i18n default is "No data available" + expect(emptyCell?.textContent?.trim()).toBe('No data available'); + }); + + // --- Prefers-reduced-motion CSS --- + it('should include prefers-reduced-motion media query in dialog styles', () => { + const el = doc.createElement('bq-dialog'); + doc.body.appendChild(el); + + const styles = el.shadowRoot?.querySelector('style'); + expect(styles?.textContent).toContain('prefers-reduced-motion'); + }); + + it('should include prefers-reduced-motion media query in drawer styles', () => { + const el = doc.createElement('bq-drawer'); + doc.body.appendChild(el); + + const styles = el.shadowRoot?.querySelector('style'); + expect(styles?.textContent).toContain('prefers-reduced-motion'); + }); + + it('should include prefers-reduced-motion media query in spinner styles', () => { + const el = doc.createElement('bq-spinner'); + doc.body.appendChild(el); + + const styles = el.shadowRoot?.querySelector('style'); + expect(styles?.textContent).toContain('prefers-reduced-motion'); + }); + + it('should include prefers-reduced-motion media query in toast styles', () => { + const el = doc.createElement('bq-toast'); + el.setAttribute('message', 'Test'); + el.setAttribute('duration', '0'); + doc.body.appendChild(el); + + const styles = el.shadowRoot?.querySelector('style'); + expect(styles?.textContent).toContain('prefers-reduced-motion'); + }); + + it('should include prefers-reduced-motion media query in accordion styles', () => { + const el = doc.createElement('bq-accordion'); + doc.body.appendChild(el); + + const styles = el.shadowRoot?.querySelector('style'); + expect(styles?.textContent).toContain('prefers-reduced-motion'); + }); + + it('should include prefers-reduced-motion media query in progress styles', () => { + const el = doc.createElement('bq-progress'); + doc.body.appendChild(el); + + const styles = el.shadowRoot?.querySelector('style'); + expect(styles?.textContent).toContain('prefers-reduced-motion'); + }); + + it('should include prefers-reduced-motion media query in skeleton styles', () => { + const el = doc.createElement('bq-skeleton'); + doc.body.appendChild(el); + + const styles = el.shadowRoot?.querySelector('style'); + expect(styles?.textContent).toContain('prefers-reduced-motion'); + }); + + // --- Chip keyboard navigation --- + it('should have tabindex on chip for keyboard accessibility', () => { + const el = doc.createElement('bq-chip'); + doc.body.appendChild(el); + + const chip = el.shadowRoot?.querySelector('.chip'); + expect(chip?.getAttribute('tabindex')).toBe('0'); + expect(chip?.getAttribute('role')).toBe('button'); + }); + + it('should set tabindex -1 on disabled chip', () => { + const el = doc.createElement('bq-chip'); + el.setAttribute('disabled', ''); + doc.body.appendChild(el); + + const chip = el.shadowRoot?.querySelector('.chip'); + expect(chip?.getAttribute('tabindex')).toBe('-1'); + }); + + // --- Table sortable keyboard --- + it('should render sortable table headers with tabindex for keyboard access', () => { + const el = doc.createElement('bq-table'); + el.setAttribute('columns', JSON.stringify([ + { key: 'name', label: 'Name', sortable: true }, + { key: 'age', label: 'Age' }, + ])); + el.setAttribute('rows', '[]'); + doc.body.appendChild(el); + + const headers = el.shadowRoot?.querySelectorAll('th'); + expect(headers?.[0]?.getAttribute('tabindex')).toBe('0'); + expect(headers?.[0]?.classList.contains('sortable')).toBe(true); + // Non-sortable header should not have tabindex + expect(headers?.[1]?.hasAttribute('tabindex')).toBe(false); + }); +}); From 4091e9ba834fa81d9f310914d852c693a220d103 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 09:35:56 +0000 Subject: [PATCH 05/17] Address code review feedback: improve readability - Use literal ellipsis character in test assertion instead of Unicode escape - Break long template literal in BqTable render into readable multi-line format Co-authored-by: JosunLP <20913954+JosunLP@users.noreply.github.com> --- src/components/table/BqTable.ts | 9 +++++++-- tests/a11y-and-i18n-fixes.test.ts | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/components/table/BqTable.ts b/src/components/table/BqTable.ts index 9728e84..83e5154 100644 --- a/src/components/table/BqTable.ts +++ b/src/components/table/BqTable.ts @@ -95,8 +95,13 @@ const definition: ComponentDefinition = { const sortDir = props['sort-dir']; const theads = cols.map(col => { const isSorted = col.key === sortKey; - const sortIcon = col.sortable ? `` : ''; - return ``; + const sortIcon = col.sortable + ? `` + : ''; + const sortableAttrs = col.sortable + ? `class="sortable" data-sort-key="${escapeHtml(col.key)}" tabindex="0" role="columnheader" aria-sort="${isSorted ? (sortDir === 'asc' ? 'ascending' : 'descending') : 'none'}"` + : ''; + return ``; }).join(''); const tbodies = props.loading ? `` : rows.length === 0 ? `` diff --git a/tests/a11y-and-i18n-fixes.test.ts b/tests/a11y-and-i18n-fixes.test.ts index 0a457f4..c8a4342 100644 --- a/tests/a11y-and-i18n-fixes.test.ts +++ b/tests/a11y-and-i18n-fixes.test.ts @@ -89,7 +89,7 @@ describe('accessibility and i18n fixes', () => { const text = loadingCell?.textContent?.trim() ?? ''; expect(text.length).toBeGreaterThan(0); // The i18n default is "Loading data…" - expect(text).toBe('Loading data\u2026'); + expect(text).toBe('Loading data…'); }); it('should use i18n strings for table empty state', () => { From ea6c7c80645caaa61a38ffbb83e24f58734e8bb6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 09:52:11 +0000 Subject: [PATCH 06/17] Address PR review feedback with interaction regressions Co-authored-by: JosunLP <20913954+JosunLP@users.noreply.github.com> --- src/components/chip/BqChip.ts | 14 ++--- src/components/select/BqSelect.ts | 3 +- src/components/table/BqTable.ts | 4 +- tests/a11y-and-i18n-fixes.test.ts | 89 +++++++++++++++++++++++++++++++ tests/overlay-components.test.ts | 58 ++++++++++++++++++++ 5 files changed, 155 insertions(+), 13 deletions(-) diff --git a/src/components/chip/BqChip.ts b/src/components/chip/BqChip.ts index 5d3bfb0..0154ffa 100644 --- a/src/components/chip/BqChip.ts +++ b/src/components/chip/BqChip.ts @@ -71,15 +71,11 @@ const definition: ComponentDefinition = { const keyHandler = (e: Event) => { if (self.hasAttribute('disabled')) return; const key = (e as KeyboardEvent).key; - if (key === 'Enter' || key === ' ') { - e.preventDefault(); - const target = e.target as Element; - if (target.closest('.remove-btn')) { - self.dispatchEvent(new CustomEvent('bq-remove', { bubbles: true, composed: true })); - return; - } - self.dispatchEvent(new CustomEvent('bq-click', { bubbles: true, composed: true })); - } + if (key !== 'Enter' && key !== ' ') return; + const target = e.target as Element | null; + if (!target?.classList.contains('chip')) return; + e.preventDefault(); + self.dispatchEvent(new CustomEvent('bq-click', { bubbles: true, composed: true })); }; (self as unknown as Record)['_handler'] = handler; (self as unknown as Record)['_keyHandler'] = keyHandler; diff --git a/src/components/select/BqSelect.ts b/src/components/select/BqSelect.ts index d4e6663..15e170f 100644 --- a/src/components/select/BqSelect.ts +++ b/src/components/select/BqSelect.ts @@ -82,9 +82,8 @@ const definition: ComponentDefinition = { }, render({ props, state }) { const hasError = Boolean(props.error); - const hasHint = Boolean(props.error) || Boolean((props as Record).hint); const uid = state.uid || 'bq-select'; - const describedBy = hasError ? `${uid}-err` : hasHint ? `${uid}-hint` : ''; + const describedBy = hasError ? `${uid}-err` : ''; return html`
${props.label ? `` : ''} diff --git a/src/components/table/BqTable.ts b/src/components/table/BqTable.ts index 83e5154..2e64990 100644 --- a/src/components/table/BqTable.ts +++ b/src/components/table/BqTable.ts @@ -99,9 +99,9 @@ const definition: ComponentDefinition = { ? `` : ''; const sortableAttrs = col.sortable - ? `class="sortable" data-sort-key="${escapeHtml(col.key)}" tabindex="0" role="columnheader" aria-sort="${isSorted ? (sortDir === 'asc' ? 'ascending' : 'descending') : 'none'}"` + ? `class="sortable" data-sort-key="${escapeHtml(col.key)}" tabindex="0" aria-sort="${isSorted ? (sortDir === 'asc' ? 'ascending' : 'descending') : 'none'}"` : ''; - return `
`; + return ``; }).join(''); const tbodies = props.loading ? `` : rows.length === 0 ? `` diff --git a/tests/a11y-and-i18n-fixes.test.ts b/tests/a11y-and-i18n-fixes.test.ts index c8a4342..b858f1b 100644 --- a/tests/a11y-and-i18n-fixes.test.ts +++ b/tests/a11y-and-i18n-fixes.test.ts @@ -22,6 +22,12 @@ describe('accessibility and i18n fixes', () => { doc.body.innerHTML = ''; }); + const waitForFrame = async (frames = 1): Promise => { + for (let i = 0; i < frames; i += 1) { + await new Promise((resolve) => requestAnimationFrame(() => resolve())); + } + }; + // --- BqSelect aria-describedby --- it('should link select to error message via aria-describedby', () => { const el = doc.createElement('bq-select'); @@ -182,6 +188,44 @@ describe('accessibility and i18n fixes', () => { expect(chip?.getAttribute('tabindex')).toBe('-1'); }); + it('should dispatch bq-click exactly once for Enter and Space on the chip surface', () => { + const el = doc.createElement('bq-chip'); + doc.body.appendChild(el); + + const chip = el.shadowRoot?.querySelector('.chip') as HTMLElement | null; + expect(chip).toBeTruthy(); + + let clicks = 0; + el.addEventListener('bq-click', () => { + clicks += 1; + }); + + chip?.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true })); + chip?.dispatchEvent(new KeyboardEvent('keydown', { key: ' ', bubbles: true })); + + expect(clicks).toBe(2); + }); + + it('should let the native remove button click dispatch bq-remove only once', () => { + const el = doc.createElement('bq-chip'); + el.setAttribute('removable', ''); + doc.body.appendChild(el); + + const removeButton = el.shadowRoot?.querySelector('.remove-btn') as HTMLButtonElement | null; + expect(removeButton).toBeTruthy(); + + let removes = 0; + el.addEventListener('bq-remove', () => { + removes += 1; + }); + + removeButton?.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true })); + expect(removes).toBe(0); + + removeButton?.click(); + expect(removes).toBe(1); + }); + // --- Table sortable keyboard --- it('should render sortable table headers with tabindex for keyboard access', () => { const el = doc.createElement('bq-table'); @@ -198,4 +242,49 @@ describe('accessibility and i18n fixes', () => { // Non-sortable header should not have tabindex expect(headers?.[1]?.hasAttribute('tabindex')).toBe(false); }); + + it('should apply columnheader role to sortable and non-sortable headers', () => { + const el = doc.createElement('bq-table'); + el.setAttribute('columns', JSON.stringify([ + { key: 'name', label: 'Name', sortable: true }, + { key: 'age', label: 'Age' }, + ])); + el.setAttribute('rows', '[]'); + doc.body.appendChild(el); + + const headers = Array.from(el.shadowRoot?.querySelectorAll('th') ?? []); + expect(headers).toHaveLength(2); + expect(headers[0]?.getAttribute('role')).toBe('columnheader'); + expect(headers[1]?.getAttribute('role')).toBe('columnheader'); + }); + + it('should sort the table when Enter or Space is pressed on a sortable header', () => { + const el = doc.createElement('bq-table'); + el.setAttribute('columns', JSON.stringify([ + { key: 'name', label: 'Name', sortable: true }, + ])); + el.setAttribute('rows', JSON.stringify([{ name: 'Ada' }])); + doc.body.appendChild(el); + + let header = el.shadowRoot?.querySelector('th.sortable') as HTMLElement | null; + expect(header).toBeTruthy(); + + const sorts: Array<{ key: string; dir: string }> = []; + el.addEventListener('bq-sort', (event) => { + const detail = (event as CustomEvent<{ key: string; dir: string }>).detail; + sorts.push(detail); + }); + + header?.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true })); + expect(el.getAttribute('sort-key')).toBe('name'); + expect(el.getAttribute('sort-dir')).toBe('asc'); + + header = el.shadowRoot?.querySelector('th.sortable') as HTMLElement | null; + header?.dispatchEvent(new KeyboardEvent('keydown', { key: ' ', bubbles: true })); + expect(el.getAttribute('sort-dir')).toBe('desc'); + expect(sorts).toEqual([ + { key: 'name', dir: 'asc' }, + { key: 'name', dir: 'desc' }, + ]); + }); }); diff --git a/tests/overlay-components.test.ts b/tests/overlay-components.test.ts index 49dcabe..f37acbf 100644 --- a/tests/overlay-components.test.ts +++ b/tests/overlay-components.test.ts @@ -16,6 +16,12 @@ describe('overlay and utility component fixes', () => { doc.body.innerHTML = ''; }); + const waitForFrame = async (frames = 1): Promise => { + for (let i = 0; i < frames; i += 1) { + await new Promise((resolve) => requestAnimationFrame(() => resolve())); + } + }; + it('assigns unique title ids to dialog instances', () => { const first = doc.createElement('bq-dialog'); const second = doc.createElement('bq-dialog'); @@ -48,6 +54,58 @@ describe('overlay and utility component fixes', () => { expect(firstTitle?.id).not.toBe(secondTitle?.id); }); + it('moves focus into the dialog on open and restores it on close', async () => { + const trigger = doc.createElement('button'); + trigger.textContent = 'Open dialog'; + doc.body.appendChild(trigger); + trigger.focus(); + + const dialog = doc.createElement('bq-dialog'); + dialog.setAttribute('title', 'Example'); + doc.body.appendChild(dialog); + + dialog.setAttribute('open', ''); + await waitForFrame(2); + + const closeButton = dialog.shadowRoot?.querySelector('.close-btn') as HTMLButtonElement | null; + const activeWithinDialog = dialog.shadowRoot?.activeElement as Element | null; + + expect(closeButton).toBeTruthy(); + expect(activeWithinDialog).toBe(closeButton); + + dialog.removeAttribute('open'); + await waitForFrame(1); + + expect(doc.activeElement).toBe(trigger); + expect((dialog as unknown as Record)['_releaseFocus']).toBeUndefined(); + }); + + it('moves focus into the drawer on open and restores it on close', async () => { + const trigger = doc.createElement('button'); + trigger.textContent = 'Open drawer'; + doc.body.appendChild(trigger); + trigger.focus(); + + const drawer = doc.createElement('bq-drawer'); + drawer.setAttribute('title', 'Example'); + doc.body.appendChild(drawer); + + drawer.setAttribute('open', ''); + await waitForFrame(2); + + const closeButton = drawer.shadowRoot?.querySelector('.close-btn') as HTMLButtonElement | null; + const activeWithinDrawer = drawer.shadowRoot?.activeElement as Element | null; + + expect(closeButton).toBeTruthy(); + expect(activeWithinDrawer).toBe(closeButton); + + drawer.removeAttribute('open'); + await waitForFrame(1); + + expect(doc.activeElement).toBe(trigger); + expect((drawer as unknown as Record)['_releaseFocus']).toBeUndefined(); + }); + it('renders breadcrumb separators from the separator prop', async () => { const el = doc.createElement('bq-breadcrumbs'); el.setAttribute('separator', '>'); From 199533224479cd4b9b42cbdb4059ece998a24a34 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 09:54:39 +0000 Subject: [PATCH 07/17] Refine review follow-ups and stabilize regression tests Co-authored-by: JosunLP <20913954+JosunLP@users.noreply.github.com> --- tests/a11y-and-i18n-fixes.test.ts | 7 +------ tests/helpers.ts | 5 +++++ tests/overlay-components.test.ts | 9 +-------- 3 files changed, 7 insertions(+), 14 deletions(-) create mode 100644 tests/helpers.ts diff --git a/tests/a11y-and-i18n-fixes.test.ts b/tests/a11y-and-i18n-fixes.test.ts index b858f1b..1512201 100644 --- a/tests/a11y-and-i18n-fixes.test.ts +++ b/tests/a11y-and-i18n-fixes.test.ts @@ -1,5 +1,6 @@ // DOM environment is provided by tests/setup.ts (preloaded via bunfig.toml) import { describe, it, expect, beforeAll, afterEach } from 'bun:test'; +import { waitForFrame } from './helpers.js'; const win = (globalThis as unknown as Record)['window'] as Window & typeof globalThis; const doc = win.document as unknown as Document; @@ -22,12 +23,6 @@ describe('accessibility and i18n fixes', () => { doc.body.innerHTML = ''; }); - const waitForFrame = async (frames = 1): Promise => { - for (let i = 0; i < frames; i += 1) { - await new Promise((resolve) => requestAnimationFrame(() => resolve())); - } - }; - // --- BqSelect aria-describedby --- it('should link select to error message via aria-describedby', () => { const el = doc.createElement('bq-select'); diff --git a/tests/helpers.ts b/tests/helpers.ts new file mode 100644 index 0000000..075efdf --- /dev/null +++ b/tests/helpers.ts @@ -0,0 +1,5 @@ +export async function waitForFrame(frames = 1): Promise { + for (let i = 0; i < frames; i += 1) { + await new Promise((resolve) => requestAnimationFrame(() => resolve())); + } +} diff --git a/tests/overlay-components.test.ts b/tests/overlay-components.test.ts index f37acbf..daadc46 100644 --- a/tests/overlay-components.test.ts +++ b/tests/overlay-components.test.ts @@ -1,5 +1,6 @@ // DOM environment is provided by tests/setup.ts (preloaded via bunfig.toml) import { describe, it, expect, beforeAll, afterEach } from 'bun:test'; +import { waitForFrame } from './helpers.js'; const win = (globalThis as unknown as Record)['window'] as Window & typeof globalThis; const doc = win.document as unknown as Document; @@ -16,12 +17,6 @@ describe('overlay and utility component fixes', () => { doc.body.innerHTML = ''; }); - const waitForFrame = async (frames = 1): Promise => { - for (let i = 0; i < frames; i += 1) { - await new Promise((resolve) => requestAnimationFrame(() => resolve())); - } - }; - it('assigns unique title ids to dialog instances', () => { const first = doc.createElement('bq-dialog'); const second = doc.createElement('bq-dialog'); @@ -77,7 +72,6 @@ describe('overlay and utility component fixes', () => { await waitForFrame(1); expect(doc.activeElement).toBe(trigger); - expect((dialog as unknown as Record)['_releaseFocus']).toBeUndefined(); }); it('moves focus into the drawer on open and restores it on close', async () => { @@ -103,7 +97,6 @@ describe('overlay and utility component fixes', () => { await waitForFrame(1); expect(doc.activeElement).toBe(trigger); - expect((drawer as unknown as Record)['_releaseFocus']).toBeUndefined(); }); it('renders breadcrumb separators from the separator prop', async () => { From d3cbf7efded1b5670ef84a03354caf545ac88ef8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 09:55:24 +0000 Subject: [PATCH 08/17] Polish chip keydown typing in review follow-up Co-authored-by: JosunLP <20913954+JosunLP@users.noreply.github.com> --- src/components/chip/BqChip.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/chip/BqChip.ts b/src/components/chip/BqChip.ts index 0154ffa..db300bd 100644 --- a/src/components/chip/BqChip.ts +++ b/src/components/chip/BqChip.ts @@ -72,7 +72,7 @@ const definition: ComponentDefinition = { if (self.hasAttribute('disabled')) return; const key = (e as KeyboardEvent).key; if (key !== 'Enter' && key !== ' ') return; - const target = e.target as Element | null; + const target = e.target as HTMLElement | null; if (!target?.classList.contains('chip')) return; e.preventDefault(); self.dispatchEvent(new CustomEvent('bq-click', { bubbles: true, composed: true })); From d10a886a30bab072ad3b863a332857e2e220f739 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 10:17:02 +0000 Subject: [PATCH 09/17] Address second PR review follow-up Co-authored-by: JosunLP <20913954+JosunLP@users.noreply.github.com> --- docs/components/checkbox.md | 3 +- docs/components/select.md | 4 +- docs/components/table.md | 8 ++-- docs/components/toast.md | 4 +- src/components/dialog/BqDialog.ts | 12 ++++- src/components/drawer/BqDrawer.ts | 13 +++++- tests/a11y-and-i18n-fixes.test.ts | 1 - tests/overlay-components.test.ts | 73 +++++++++++++++++++++++++++++++ 8 files changed, 104 insertions(+), 14 deletions(-) diff --git a/docs/components/checkbox.md b/docs/components/checkbox.md index f75e413..2953f12 100644 --- a/docs/components/checkbox.md +++ b/docs/components/checkbox.md @@ -64,7 +64,8 @@ The `bq-checkbox` component is an accessible checkbox input supporting checked, | Part | Description | |------|-------------| -| `checkbox` | The checkbox container | +| `wrapper` | The outer checkbox wrapper | | `control` | The checkbox input control | +| `input` | The native checkbox input | | `label` | Label text element | | `hint` | Hint text element | diff --git a/docs/components/select.md b/docs/components/select.md index 932c9b4..e263e69 100644 --- a/docs/components/select.md +++ b/docs/components/select.md @@ -90,7 +90,7 @@ The `bq-select` component is a dropdown selection input with label, error state, | Part | Description | |------|-------------| -| `select` | The outer select container | +| `field` | The outer field wrapper | | `label` | Label text element | -| `control` | The native select control | +| `select` | The native select control | | `error` | Error message element | diff --git a/docs/components/table.md b/docs/components/table.md index 36845e7..a20a468 100644 --- a/docs/components/table.md +++ b/docs/components/table.md @@ -76,7 +76,7 @@ The `bq-table` component renders data tables with sortable columns, striped rows | Slot | Description | |------|-------------| -| `empty` | Content shown when `rows` is empty and not loading | +| *(none)* | This component does not currently expose named slots | ## CSS Parts @@ -84,8 +84,8 @@ The `bq-table` component renders data tables with sortable columns, striped rows |------|-------------| | `table` | The `
${escapeHtml(col.label)}${sortIcon}${escapeHtml(col.label)}${sortIcon}
${escapeHtml(t('table.loading'))}
${escapeHtml(t('table.noData'))}
${escapeHtml(col.label)}${sortIcon}${escapeHtml(col.label)}${sortIcon}
${escapeHtml(t('table.loading'))}
${escapeHtml(t('table.noData'))}
` element | | `thead` | Table header section | +| `header-row` | The table header row | +| `th` | A header cell | | `tbody` | Table body section | | `row` | A table row | -| `cell` | A table cell | -| `header-cell` | A header cell | -| `loading` | Loading overlay / indicator | +| `td` | A table body cell | diff --git a/docs/components/toast.md b/docs/components/toast.md index da4f87e..4232894 100644 --- a/docs/components/toast.md +++ b/docs/components/toast.md @@ -84,6 +84,4 @@ showToast({ variant: 'info', message: 'Update available.' }); | Part | Description | |------|-------------| | `toast` | The toast container | -| `icon` | Status icon area | -| `message` | Message text element | -| `close` | Close / dismiss button | +| `content` | The toast content container | diff --git a/src/components/dialog/BqDialog.ts b/src/components/dialog/BqDialog.ts index 18a41a8..489d5fd 100644 --- a/src/components/dialog/BqDialog.ts +++ b/src/components/dialog/BqDialog.ts @@ -93,6 +93,7 @@ const definition: ComponentDefinition = { }, disconnected() { const s = this as unknown as Record; + const focusRaf = s['_focusRaf'] as number | undefined; if (focusRaf !== undefined) cancelAnimationFrame(focusRaf); const releaseFocus = s['_releaseFocus'] as (() => void) | undefined; if (releaseFocus) releaseFocus(); const kh = s['_kh'] as EventListener | undefined; if (kh) document.removeEventListener('keydown', kh); const oh = s['_oh'] as EventListener | undefined; if (oh) this.shadowRoot?.removeEventListener('click', oh); @@ -110,12 +111,19 @@ const definition: ComponentDefinition = { if (dialog) { releaseFocus?.(); s['_releaseFocus'] = trapFocus(dialog); - requestAnimationFrame(() => { + const focusRaf = s['_focusRaf'] as number | undefined; + if (focusRaf !== undefined) cancelAnimationFrame(focusRaf); + s['_focusRaf'] = requestAnimationFrame(() => { + delete s['_focusRaf']; + if (!this.hasAttribute('open') || !this.isConnected) return; const focusable = dialog.querySelector('button, a[href], input, select, textarea, [tabindex]:not([tabindex="-1"])'); - if (focusable) focusable.focus(); + (focusable ?? dialog).focus(); }); } } else { + const focusRaf = s['_focusRaf'] as number | undefined; + if (focusRaf !== undefined) cancelAnimationFrame(focusRaf); + delete s['_focusRaf']; releaseFocus?.(); delete s['_releaseFocus']; // Restore focus to the element that was focused before opening diff --git a/src/components/drawer/BqDrawer.ts b/src/components/drawer/BqDrawer.ts index e5d17b1..beb1e30 100644 --- a/src/components/drawer/BqDrawer.ts +++ b/src/components/drawer/BqDrawer.ts @@ -89,7 +89,11 @@ const definition: ComponentDefinition = { }, disconnected() { const s = this as unknown as Record; + const focusRaf = s['_focusRaf'] as number | undefined; if (focusRaf !== undefined) cancelAnimationFrame(focusRaf); const releaseFocus = s['_releaseFocus'] as (() => void) | undefined; if (releaseFocus) releaseFocus(); + const prev = s['_previousFocus'] as HTMLElement | undefined; + if (prev && typeof prev.focus === 'function') prev.focus(); + delete s['_previousFocus']; const kh = s['_kh'] as EventListener | undefined; if (kh) document.removeEventListener('keydown', kh); const bh = s['_bh'] as EventListener | undefined; if (bh) this.shadowRoot?.removeEventListener('click', bh); const ch = s['_ch'] as EventListener | undefined; if (ch) this.shadowRoot?.removeEventListener('click', ch); @@ -106,12 +110,19 @@ const definition: ComponentDefinition = { if (drawer) { releaseFocus?.(); s['_releaseFocus'] = trapFocus(drawer); - requestAnimationFrame(() => { + const focusRaf = s['_focusRaf'] as number | undefined; + if (focusRaf !== undefined) cancelAnimationFrame(focusRaf); + s['_focusRaf'] = requestAnimationFrame(() => { + delete s['_focusRaf']; + if (!this.hasAttribute('open') || !this.isConnected) return; const focusable = drawer.querySelector('button, a[href], input, select, textarea, [tabindex]:not([tabindex="-1"])'); if (focusable) focusable.focus(); }); } } else { + const focusRaf = s['_focusRaf'] as number | undefined; + if (focusRaf !== undefined) cancelAnimationFrame(focusRaf); + delete s['_focusRaf']; releaseFocus?.(); delete s['_releaseFocus']; // Restore focus to the element that was focused before opening diff --git a/tests/a11y-and-i18n-fixes.test.ts b/tests/a11y-and-i18n-fixes.test.ts index 1512201..7f4c705 100644 --- a/tests/a11y-and-i18n-fixes.test.ts +++ b/tests/a11y-and-i18n-fixes.test.ts @@ -1,6 +1,5 @@ // DOM environment is provided by tests/setup.ts (preloaded via bunfig.toml) import { describe, it, expect, beforeAll, afterEach } from 'bun:test'; -import { waitForFrame } from './helpers.js'; const win = (globalThis as unknown as Record)['window'] as Window & typeof globalThis; const doc = win.document as unknown as Document; diff --git a/tests/overlay-components.test.ts b/tests/overlay-components.test.ts index daadc46..2ada0eb 100644 --- a/tests/overlay-components.test.ts +++ b/tests/overlay-components.test.ts @@ -74,6 +74,45 @@ describe('overlay and utility component fixes', () => { expect(doc.activeElement).toBe(trigger); }); + it('focuses the dialog container when no focusable descendants are available', async () => { + const trigger = doc.createElement('button'); + trigger.textContent = 'Open dialog'; + doc.body.appendChild(trigger); + trigger.focus(); + + const dialog = doc.createElement('bq-dialog'); + dialog.setAttribute('title', 'Example'); + dialog.setAttribute('dismissible', 'false'); + dialog.innerHTML = '

Static content only.

'; + doc.body.appendChild(dialog); + + dialog.setAttribute('open', ''); + await waitForFrame(2); + + const dialogSurface = dialog.shadowRoot?.querySelector('.dialog') as HTMLElement | null; + const activeWithinDialog = dialog.shadowRoot?.activeElement as Element | null; + + expect(dialogSurface).toBeTruthy(); + expect(activeWithinDialog).toBe(dialogSurface); + }); + + it('does not move focus into a dialog that closes before the scheduled focus runs', async () => { + const trigger = doc.createElement('button'); + trigger.textContent = 'Open dialog'; + doc.body.appendChild(trigger); + trigger.focus(); + + const dialog = doc.createElement('bq-dialog'); + dialog.setAttribute('title', 'Example'); + doc.body.appendChild(dialog); + + dialog.setAttribute('open', ''); + dialog.removeAttribute('open'); + await waitForFrame(2); + + expect(doc.activeElement).toBe(trigger); + }); + it('moves focus into the drawer on open and restores it on close', async () => { const trigger = doc.createElement('button'); trigger.textContent = 'Open drawer'; @@ -99,6 +138,40 @@ describe('overlay and utility component fixes', () => { expect(doc.activeElement).toBe(trigger); }); + it('does not move focus into a drawer that closes before the scheduled focus runs', async () => { + const trigger = doc.createElement('button'); + trigger.textContent = 'Open drawer'; + doc.body.appendChild(trigger); + trigger.focus(); + + const drawer = doc.createElement('bq-drawer'); + drawer.setAttribute('title', 'Example'); + doc.body.appendChild(drawer); + + drawer.setAttribute('open', ''); + drawer.removeAttribute('open'); + await waitForFrame(2); + + expect(doc.activeElement).toBe(trigger); + }); + + it('restores focus when an open drawer is disconnected', async () => { + const trigger = doc.createElement('button'); + trigger.textContent = 'Open drawer'; + doc.body.appendChild(trigger); + trigger.focus(); + + const drawer = doc.createElement('bq-drawer'); + drawer.setAttribute('title', 'Example'); + doc.body.appendChild(drawer); + + drawer.setAttribute('open', ''); + await waitForFrame(2); + drawer.remove(); + + expect(doc.activeElement).toBe(trigger); + }); + it('renders breadcrumb separators from the separator prop', async () => { const el = doc.createElement('bq-breadcrumbs'); el.setAttribute('separator', '>'); From 6f7dde91cdd57cf8cc70083f787ed1682b4db523 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 10:19:09 +0000 Subject: [PATCH 10/17] Polish overlay focus cleanup readability Co-authored-by: JosunLP <20913954+JosunLP@users.noreply.github.com> --- src/components/dialog/BqDialog.ts | 15 ++++++++++----- src/components/drawer/BqDrawer.ts | 15 ++++++++++----- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/components/dialog/BqDialog.ts b/src/components/dialog/BqDialog.ts index 489d5fd..ccd44b3 100644 --- a/src/components/dialog/BqDialog.ts +++ b/src/components/dialog/BqDialog.ts @@ -93,11 +93,16 @@ const definition: ComponentDefinition = { }, disconnected() { const s = this as unknown as Record; - const focusRaf = s['_focusRaf'] as number | undefined; if (focusRaf !== undefined) cancelAnimationFrame(focusRaf); - const releaseFocus = s['_releaseFocus'] as (() => void) | undefined; if (releaseFocus) releaseFocus(); - const kh = s['_kh'] as EventListener | undefined; if (kh) document.removeEventListener('keydown', kh); - const oh = s['_oh'] as EventListener | undefined; if (oh) this.shadowRoot?.removeEventListener('click', oh); - const ch = s['_ch'] as EventListener | undefined; if (ch) this.shadowRoot?.removeEventListener('click', ch); + const focusRaf = s['_focusRaf'] as number | undefined; + if (focusRaf !== undefined) cancelAnimationFrame(focusRaf); + const releaseFocus = s['_releaseFocus'] as (() => void) | undefined; + if (releaseFocus) releaseFocus(); + const kh = s['_kh'] as EventListener | undefined; + if (kh) document.removeEventListener('keydown', kh); + const oh = s['_oh'] as EventListener | undefined; + if (oh) this.shadowRoot?.removeEventListener('click', oh); + const ch = s['_ch'] as EventListener | undefined; + if (ch) this.shadowRoot?.removeEventListener('click', ch); }, updated() { const s = this as unknown as Record; diff --git a/src/components/drawer/BqDrawer.ts b/src/components/drawer/BqDrawer.ts index beb1e30..f9b5b67 100644 --- a/src/components/drawer/BqDrawer.ts +++ b/src/components/drawer/BqDrawer.ts @@ -89,14 +89,19 @@ const definition: ComponentDefinition = { }, disconnected() { const s = this as unknown as Record; - const focusRaf = s['_focusRaf'] as number | undefined; if (focusRaf !== undefined) cancelAnimationFrame(focusRaf); - const releaseFocus = s['_releaseFocus'] as (() => void) | undefined; if (releaseFocus) releaseFocus(); + const focusRaf = s['_focusRaf'] as number | undefined; + if (focusRaf !== undefined) cancelAnimationFrame(focusRaf); + const releaseFocus = s['_releaseFocus'] as (() => void) | undefined; + if (releaseFocus) releaseFocus(); const prev = s['_previousFocus'] as HTMLElement | undefined; if (prev && typeof prev.focus === 'function') prev.focus(); delete s['_previousFocus']; - const kh = s['_kh'] as EventListener | undefined; if (kh) document.removeEventListener('keydown', kh); - const bh = s['_bh'] as EventListener | undefined; if (bh) this.shadowRoot?.removeEventListener('click', bh); - const ch = s['_ch'] as EventListener | undefined; if (ch) this.shadowRoot?.removeEventListener('click', ch); + const kh = s['_kh'] as EventListener | undefined; + if (kh) document.removeEventListener('keydown', kh); + const bh = s['_bh'] as EventListener | undefined; + if (bh) this.shadowRoot?.removeEventListener('click', bh); + const ch = s['_ch'] as EventListener | undefined; + if (ch) this.shadowRoot?.removeEventListener('click', ch); }, updated() { const s = this as unknown as Record; From 3ccd4e6070f52c6b0b6636794b1d97239a1d3667 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 11:06:00 +0000 Subject: [PATCH 11/17] Address final dialog cleanup review comments Co-authored-by: JosunLP <20913954+JosunLP@users.noreply.github.com> --- docs/components/table.md | 2 +- src/components/dialog/BqDialog.ts | 5 +++++ tests/overlay-components.test.ts | 17 +++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/docs/components/table.md b/docs/components/table.md index a20a468..c3b6bf8 100644 --- a/docs/components/table.md +++ b/docs/components/table.md @@ -70,7 +70,7 @@ The `bq-table` component renders data tables with sortable columns, striped rows | Event | Detail | Description | |-------|--------|-------------| -| `bq-sort` | `{ key: string, dir: string }` | Fired when a sortable column header is clicked | +| `bq-sort` | `{ key: string, dir: string }` | Fired when a sortable column header is activated by click or keyboard (Enter/Space) | ## Slots diff --git a/src/components/dialog/BqDialog.ts b/src/components/dialog/BqDialog.ts index ccd44b3..315a099 100644 --- a/src/components/dialog/BqDialog.ts +++ b/src/components/dialog/BqDialog.ts @@ -97,6 +97,11 @@ const definition: ComponentDefinition = { if (focusRaf !== undefined) cancelAnimationFrame(focusRaf); const releaseFocus = s['_releaseFocus'] as (() => void) | undefined; if (releaseFocus) releaseFocus(); + const prev = s['_previousFocus'] as HTMLElement | undefined; + if (prev && typeof prev.focus === 'function') prev.focus(); + delete s['_previousFocus']; + delete s['_focusRaf']; + delete s['_releaseFocus']; const kh = s['_kh'] as EventListener | undefined; if (kh) document.removeEventListener('keydown', kh); const oh = s['_oh'] as EventListener | undefined; diff --git a/tests/overlay-components.test.ts b/tests/overlay-components.test.ts index 2ada0eb..af37442 100644 --- a/tests/overlay-components.test.ts +++ b/tests/overlay-components.test.ts @@ -113,6 +113,23 @@ describe('overlay and utility component fixes', () => { expect(doc.activeElement).toBe(trigger); }); + it('restores focus when an open dialog is disconnected', async () => { + const trigger = doc.createElement('button'); + trigger.textContent = 'Open dialog'; + doc.body.appendChild(trigger); + trigger.focus(); + + const dialog = doc.createElement('bq-dialog'); + dialog.setAttribute('title', 'Example'); + doc.body.appendChild(dialog); + + dialog.setAttribute('open', ''); + await waitForFrame(2); + dialog.remove(); + + expect(doc.activeElement).toBe(trigger); + }); + it('moves focus into the drawer on open and restores it on close', async () => { const trigger = doc.createElement('button'); trigger.textContent = 'Open drawer'; From 900526c19d9f60f7adf4c6163d495d124788858b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 15:00:38 +0000 Subject: [PATCH 12/17] Match native Space activation behavior Co-authored-by: JosunLP <20913954+JosunLP@users.noreply.github.com> --- src/components/chip/BqChip.ts | 8 +++-- src/components/table/BqTable.ts | 6 +++- tests/a11y-and-i18n-fixes.test.ts | 51 +++++++++++++++++++++++++++++-- 3 files changed, 60 insertions(+), 5 deletions(-) diff --git a/src/components/chip/BqChip.ts b/src/components/chip/BqChip.ts index db300bd..7aa2e1a 100644 --- a/src/components/chip/BqChip.ts +++ b/src/components/chip/BqChip.ts @@ -70,10 +70,12 @@ const definition: ComponentDefinition = { }; const keyHandler = (e: Event) => { if (self.hasAttribute('disabled')) return; - const key = (e as KeyboardEvent).key; - if (key !== 'Enter' && key !== ' ') return; + const ke = e as KeyboardEvent; const target = e.target as HTMLElement | null; if (!target?.classList.contains('chip')) return; + const isEnterKeydown = ke.type === 'keydown' && ke.key === 'Enter'; + const isSpaceKeyup = ke.type === 'keyup' && ke.key === ' '; + if (!isEnterKeydown && !isSpaceKeyup) return; e.preventDefault(); self.dispatchEvent(new CustomEvent('bq-click', { bubbles: true, composed: true })); }; @@ -81,12 +83,14 @@ const definition: ComponentDefinition = { (self as unknown as Record)['_keyHandler'] = keyHandler; self.shadowRoot?.addEventListener('click', handler); self.shadowRoot?.addEventListener('keydown', keyHandler); + self.shadowRoot?.addEventListener('keyup', keyHandler); }, disconnected() { const handler = (this as unknown as Record)['_handler'] as EventListener | undefined; const keyHandler = (this as unknown as Record)['_keyHandler'] as EventListener | undefined; if (handler) this.shadowRoot?.removeEventListener('click', handler); if (keyHandler) this.shadowRoot?.removeEventListener('keydown', keyHandler); + if (keyHandler) this.shadowRoot?.removeEventListener('keyup', keyHandler); }, render({ props }) { return html` diff --git a/src/components/table/BqTable.ts b/src/components/table/BqTable.ts index 2e64990..eaa935e 100644 --- a/src/components/table/BqTable.ts +++ b/src/components/table/BqTable.ts @@ -68,9 +68,11 @@ const definition: ComponentDefinition = { }; const keyHandler = (e: Event) => { const ke = e as KeyboardEvent; - if (ke.key !== 'Enter' && ke.key !== ' ') return; const th = (ke.target as Element).closest('th.sortable') as HTMLElement | null; if (!th) return; + const isEnterKeydown = ke.type === 'keydown' && ke.key === 'Enter'; + const isSpaceKeyup = ke.type === 'keyup' && ke.key === ' '; + if (!isEnterKeydown && !isSpaceKeyup) return; e.preventDefault(); sortHandler(th); }; @@ -78,6 +80,7 @@ const definition: ComponentDefinition = { (self as unknown as Record)['_keyHandler'] = keyHandler; self.shadowRoot?.addEventListener('click', handler); self.shadowRoot?.addEventListener('keydown', keyHandler); + self.shadowRoot?.addEventListener('keyup', keyHandler); }, disconnected() { const s = this as unknown as Record; @@ -85,6 +88,7 @@ const definition: ComponentDefinition = { const kh = s['_keyHandler'] as EventListener | undefined; if (h) this.shadowRoot?.removeEventListener('click', h); if (kh) this.shadowRoot?.removeEventListener('keydown', kh); + if (kh) this.shadowRoot?.removeEventListener('keyup', kh); }, render({ props }) { let cols: ColDef[] = []; diff --git a/tests/a11y-and-i18n-fixes.test.ts b/tests/a11y-and-i18n-fixes.test.ts index 7f4c705..6fe0b97 100644 --- a/tests/a11y-and-i18n-fixes.test.ts +++ b/tests/a11y-and-i18n-fixes.test.ts @@ -182,7 +182,7 @@ describe('accessibility and i18n fixes', () => { expect(chip?.getAttribute('tabindex')).toBe('-1'); }); - it('should dispatch bq-click exactly once for Enter and Space on the chip surface', () => { + it('should dispatch bq-click once for Enter keydown and Space keyup on the chip surface', () => { const el = doc.createElement('bq-chip'); doc.body.appendChild(el); @@ -196,10 +196,30 @@ describe('accessibility and i18n fixes', () => { chip?.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true })); chip?.dispatchEvent(new KeyboardEvent('keydown', { key: ' ', bubbles: true })); + chip?.dispatchEvent(new KeyboardEvent('keyup', { key: ' ', bubbles: true })); expect(clicks).toBe(2); }); + it('should ignore repeated Space keydown events on the chip surface', () => { + const el = doc.createElement('bq-chip'); + doc.body.appendChild(el); + + const chip = el.shadowRoot?.querySelector('.chip') as HTMLElement | null; + expect(chip).toBeTruthy(); + + let clicks = 0; + el.addEventListener('bq-click', () => { + clicks += 1; + }); + + chip?.dispatchEvent(new KeyboardEvent('keydown', { key: ' ', bubbles: true, repeat: true })); + chip?.dispatchEvent(new KeyboardEvent('keydown', { key: ' ', bubbles: true, repeat: true })); + chip?.dispatchEvent(new KeyboardEvent('keyup', { key: ' ', bubbles: true })); + + expect(clicks).toBe(1); + }); + it('should let the native remove button click dispatch bq-remove only once', () => { const el = doc.createElement('bq-chip'); el.setAttribute('removable', ''); @@ -252,7 +272,7 @@ describe('accessibility and i18n fixes', () => { expect(headers[1]?.getAttribute('role')).toBe('columnheader'); }); - it('should sort the table when Enter or Space is pressed on a sortable header', () => { + it('should sort the table on Enter keydown and Space keyup for a sortable header', () => { const el = doc.createElement('bq-table'); el.setAttribute('columns', JSON.stringify([ { key: 'name', label: 'Name', sortable: true }, @@ -275,10 +295,37 @@ describe('accessibility and i18n fixes', () => { header = el.shadowRoot?.querySelector('th.sortable') as HTMLElement | null; header?.dispatchEvent(new KeyboardEvent('keydown', { key: ' ', bubbles: true })); + expect(sorts).toEqual([{ key: 'name', dir: 'asc' }]); + header?.dispatchEvent(new KeyboardEvent('keyup', { key: ' ', bubbles: true })); expect(el.getAttribute('sort-dir')).toBe('desc'); expect(sorts).toEqual([ { key: 'name', dir: 'asc' }, { key: 'name', dir: 'desc' }, ]); }); + + it('should ignore repeated Space keydown events on a sortable header', () => { + const el = doc.createElement('bq-table'); + el.setAttribute('columns', JSON.stringify([ + { key: 'name', label: 'Name', sortable: true }, + ])); + el.setAttribute('rows', JSON.stringify([{ name: 'Ada' }])); + doc.body.appendChild(el); + + const header = el.shadowRoot?.querySelector('th.sortable') as HTMLElement | null; + expect(header).toBeTruthy(); + + const sorts: Array<{ key: string; dir: string }> = []; + el.addEventListener('bq-sort', (event) => { + const detail = (event as CustomEvent<{ key: string; dir: string }>).detail; + sorts.push(detail); + }); + + header?.dispatchEvent(new KeyboardEvent('keydown', { key: ' ', bubbles: true, repeat: true })); + header?.dispatchEvent(new KeyboardEvent('keydown', { key: ' ', bubbles: true, repeat: true })); + expect(sorts).toEqual([]); + + header?.dispatchEvent(new KeyboardEvent('keyup', { key: ' ', bubbles: true })); + expect(sorts).toEqual([{ key: 'name', dir: 'asc' }]); + }); }); From 55f4eaec1c5a1d423b4c9d51a19d69c34ff86616 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 15:26:20 +0000 Subject: [PATCH 13/17] Finalize drawer fallback and key repeat guards Co-authored-by: JosunLP <20913954+JosunLP@users.noreply.github.com> --- src/components/chip/BqChip.ts | 2 +- src/components/drawer/BqDrawer.ts | 6 +++-- src/components/table/BqTable.ts | 2 +- tests/a11y-and-i18n-fixes.test.ts | 43 +++++++++++++++++++++++++++++++ tests/overlay-components.test.ts | 24 +++++++++++++++++ 5 files changed, 73 insertions(+), 4 deletions(-) diff --git a/src/components/chip/BqChip.ts b/src/components/chip/BqChip.ts index 7aa2e1a..e4a8dc7 100644 --- a/src/components/chip/BqChip.ts +++ b/src/components/chip/BqChip.ts @@ -73,7 +73,7 @@ const definition: ComponentDefinition = { const ke = e as KeyboardEvent; const target = e.target as HTMLElement | null; if (!target?.classList.contains('chip')) return; - const isEnterKeydown = ke.type === 'keydown' && ke.key === 'Enter'; + const isEnterKeydown = ke.type === 'keydown' && ke.key === 'Enter' && !ke.repeat; const isSpaceKeyup = ke.type === 'keyup' && ke.key === ' '; if (!isEnterKeydown && !isSpaceKeyup) return; e.preventDefault(); diff --git a/src/components/drawer/BqDrawer.ts b/src/components/drawer/BqDrawer.ts index f9b5b67..38f5d23 100644 --- a/src/components/drawer/BqDrawer.ts +++ b/src/components/drawer/BqDrawer.ts @@ -91,8 +91,10 @@ const definition: ComponentDefinition = { const s = this as unknown as Record; const focusRaf = s['_focusRaf'] as number | undefined; if (focusRaf !== undefined) cancelAnimationFrame(focusRaf); + delete s['_focusRaf']; const releaseFocus = s['_releaseFocus'] as (() => void) | undefined; if (releaseFocus) releaseFocus(); + delete s['_releaseFocus']; const prev = s['_previousFocus'] as HTMLElement | undefined; if (prev && typeof prev.focus === 'function') prev.focus(); delete s['_previousFocus']; @@ -121,7 +123,7 @@ const definition: ComponentDefinition = { delete s['_focusRaf']; if (!this.hasAttribute('open') || !this.isConnected) return; const focusable = drawer.querySelector('button, a[href], input, select, textarea, [tabindex]:not([tabindex="-1"])'); - if (focusable) focusable.focus(); + (focusable ?? drawer).focus(); }); } } else { @@ -143,7 +145,7 @@ const definition: ComponentDefinition = { return html`