diff --git a/.gitignore b/.gitignore index 5f9386ec5..ed7c9f968 100644 --- a/.gitignore +++ b/.gitignore @@ -69,4 +69,6 @@ android/.project android/.settings/ android/app/.classpath android/app/.project -android/app/.settings/ \ No newline at end of file +android/app/.settings/ +*storybook.log +storybook-static diff --git a/.npmrc b/.npmrc index 7253a5cee..e69de29bb 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +0,0 @@ -min-release-age=7 diff --git a/.storybook/main.ts b/.storybook/main.ts new file mode 100644 index 000000000..fd3375591 --- /dev/null +++ b/.storybook/main.ts @@ -0,0 +1,8 @@ +import type { StorybookConfig } from "@storybook/react-vite"; + +const config: StorybookConfig = { + stories: ["../src/**/*.stories.@(js|jsx|ts|tsx)"], + addons: ["@chromatic-com/storybook", "@storybook/addon-a11y", "@storybook/addon-docs", "@storybook/addon-mcp"], + framework: "@storybook/react-vite", +}; +export default config; diff --git a/.storybook/preview-head.html b/.storybook/preview-head.html new file mode 100644 index 000000000..1552a600a --- /dev/null +++ b/.storybook/preview-head.html @@ -0,0 +1,6 @@ + + + diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx new file mode 100644 index 000000000..7e3fda139 --- /dev/null +++ b/.storybook/preview.tsx @@ -0,0 +1,37 @@ +import type { Preview } from "@storybook/react-vite"; +import { ThemeProvider, createTheme } from "@mui/material/styles"; +import React from "react"; + +const theme = createTheme(); + +const preview: Preview = { + parameters: { + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/i, + }, + }, + + a11y: { + // 'todo' - show a11y violations in the test UI only + // 'error' - fail CI on a11y violations + // 'off' - skip a11y checks entirely + test: "todo", + }, + + docs: { + toc: true, + }, + }, + + decorators: [ + (Story) => ( + + + + ), + ], +}; + +export default preview; diff --git a/package-lock.json b/package-lock.json index f4fa46a5d..c17c54e13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -67,11 +67,21 @@ "devDependencies": { "@babel/preset-env": "^7.16.11", "@babel/preset-react": "^7.28.5", + "@chromatic-com/storybook": "^5.2.1", + "@storybook/addon-a11y": "^10.4.6", + "@storybook/addon-docs": "^10.4.6", + "@storybook/addon-mcp": "^0.6.0", + "@storybook/addon-vitest": "^10.4.6", + "@storybook/react-vite": "^10.4.6", "@vitejs/plugin-react": "^5.1.1", + "@vitest/browser": "^3.2.4", + "@vitest/coverage-v8": "^3.2.4", "babel-loader": "^8.2.3", "babel-plugin-styled-components": "^2.1.4", "jsdom": "^27.0.1", + "playwright": "^1.61.0", "prettier": "3.2.5", + "storybook": "^10.4.6", "svg-inline-loader": "^0.8.2", "typescript": "^5.9.3", "vite": "^7.2.6", @@ -81,6 +91,27 @@ "webpack-bundle-analyzer": "^4.10.2" } }, + "node_modules/@adobe/css-tools": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.5.0.tgz", + "integrity": "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@asamuzakjp/css-color": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.0.tgz", @@ -1794,6 +1825,16 @@ "node": ">=6.9.0" } }, + "node_modules/@bcoe/v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@capacitor/android": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-7.4.4.tgz", @@ -1901,6 +1942,99 @@ "@capacitor/core": ">=7.0.0" } }, + "node_modules/@chromatic-com/storybook": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-5.2.1.tgz", + "integrity": "sha512-z6I7NJk/0VngA64y5TNYaB4Hc2X8+90n4op6lBt9PvWk5TmIlFLDqdX33rlrwbNRkkYijVgA/wO04rVYXi5Mlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@neoconfetti/react": "^1.0.0", + "chromatic": "16.10.0", + "jsonfile": "^6.1.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=20.0.0", + "yarn": ">=1.22.18" + }, + "peerDependencies": { + "storybook": "^0.0.0-0 || ^10.1.0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0 || ^10.4.0-0 || ^10.5.0-0 || ^10.6.0-0" + } + }, + "node_modules/@chromatic-com/storybook/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@chromatic-com/storybook/node_modules/chromatic": { + "version": "16.10.0", + "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-16.10.0.tgz", + "integrity": "sha512-nFsztmnu7rFiGafUJgXvLUNpqmRylz92eNvzBoJNTKKQj4EQUyxznwnfpf1dTs7hXtWD8JwcH92jADydaHA1sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "bin": { + "chroma": "dist/bin.cjs", + "chromatic": "dist/bin.cjs", + "chromatic-cli": "dist/bin.cjs" + }, + "peerDependencies": { + "@chromatic-com/cypress": "^0.*.* || ^1.0.0", + "@chromatic-com/playwright": "^0.*.* || ^1.0.0", + "@chromatic-com/vitest": "^0.*.* || ^1.0.0" + }, + "peerDependenciesMeta": { + "@chromatic-com/cypress": { + "optional": true + }, + "@chromatic-com/playwright": { + "optional": true + }, + "@chromatic-com/vitest": { + "optional": true + } + } + }, + "node_modules/@chromatic-com/storybook/node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@chromatic-com/storybook/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@csstools/color-helpers": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", @@ -2045,6 +2179,40 @@ "node": ">=10.0.0" } }, + "node_modules/@emnapi/core": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", + "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", + "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@emotion/babel-plugin": { "version": "11.13.5", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", @@ -2810,6 +2978,109 @@ "node": ">=16.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@isaacs/fs-minipass": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", @@ -2822,6 +3093,36 @@ "node": ">=18.0.0" } }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.7.0.tgz", + "integrity": "sha512-qvsTEwEFefhdirGOPnu9Wp6ChfIwy2dBCRuETU3uE+4cC+PFoxMSiiEhxk4lOluA34eARHA0OxqsEUYDqRMgeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^13.0.1", + "react-docgen-typescript": "^2.2.2" + }, + "peerDependencies": { + "typescript": ">= 4.3.x", + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -2878,6 +3179,24 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mdx-js/react": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", + "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", + "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/@mozilla/readability": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@mozilla/readability/-/readability-0.6.0.tgz", @@ -3112,74 +3431,757 @@ } } }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz", + "integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==", "dev": true, - "license": "MIT" - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@puppeteer/browsers": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.11.0.tgz", - "integrity": "sha512-n6oQX6mYkG8TRPuPXmbPidkUbsSRalhmaaVAQxvH1IkQy63cwsH+kOjB3e4cpCDHg0aSvsiX9bQ4s2VB6mGWUQ==", - "license": "Apache-2.0", + "optional": true, "dependencies": { - "debug": "^4.4.3", - "extract-zip": "^2.0.1", - "progress": "^2.0.3", - "proxy-agent": "^6.5.0", - "semver": "^7.7.3", - "tar-fs": "^3.1.1", - "yargs": "^17.7.2" + "@tybys/wasm-util": "^0.10.2" }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@puppeteer/browsers/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" } }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", - "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "node_modules/@neoconfetti/react": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@neoconfetti/react/-/react-1.0.0.tgz", + "integrity": "sha512-klcSooChXXOzIm+SE5IISIAn3bYzYfPjbX7D7HoqZL84oAfgREeSg5vSIaSFH+DaGzzvImTyWe1OyrJ67vik4A==", + "dev": true, "license": "MIT" }, - "node_modules/@radix-ui/react-accordion": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", - "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", + "node_modules/@oxc-parser/binding-android-arm-eabi": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.127.0.tgz", + "integrity": "sha512-0LC7ye4hvqbIKxAzThzvswgHLFu2AURKzYLeSVvLdu2TBOYWQDmHnTqPLeA597BcUCxiLqLsS4CJ5uoI5WYWCQ==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collapsible": "1.1.12", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-android-arm64": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.127.0.tgz", + "integrity": "sha512-b5jtVTH6AU5CJXHNdj7Jj9IEiR9yVjjnwHzPJhGyHGPdcsZSzBCkS9GBbV33niRMvKthDwQRFRJfI4a+k4PvYg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-darwin-arm64": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.127.0.tgz", + "integrity": "sha512-obCE8B7ISKkJidjlhv9xRGJPOSDG2Yu6PRga9Ruaz35uintHxbp1Ki/Yc71wx4rj3Edrm0a1kzG1TAwit0wFpg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-darwin-x64": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.127.0.tgz", + "integrity": "sha512-JL6Xb5IwPQT8rUzlpsX7E+AgfcdNklXNPFp8pjCQQ5MQOQo5rtEB2ui+3Hgg9Sn7Y9Egj6YOLLiHhLpdAe12Aw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-freebsd-x64": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.127.0.tgz", + "integrity": "sha512-SDQ/3MQFw58fqQz3Z1PhSKFF3JoCF4gmlNjziDm8X02tTahCw0qJbd7FGPDKw1i4VTBZene9JPyC3mHtSvi+wA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.127.0.tgz", + "integrity": "sha512-Av+D1MIqzV0YMGPT9we2SIZaMKD7Cxs4CvXSx/yxaWHewZjYEjScpOf5igc8IILASViw4WTnjlwUdI1KzVtDHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm-musleabihf": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.127.0.tgz", + "integrity": "sha512-Cs2fdJ8cPpFdeebj6p4dag8A4+56hPvZ0AhQQzlaLswGz1tz7bXt1nETLeorrM9+AMcWFFkqxcXwDGfTVidY8g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm64-gnu": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.127.0.tgz", + "integrity": "sha512-qdOfTcT6SY8gsJrrV92uyEUyjqMGPpIB5JZUG6QN5dukYd+7/j0kX6MwK1DgQj39jtUYixxPiaRUiEN1+0CXgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm64-musl": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.127.0.tgz", + "integrity": "sha512-EoTCZneNFU/P2qrpEM+RHmQwt+CvDkyGESG6qhr7KaegXLZwePfbrkCDfAk8/rhxbDUVGsZILX+2tqPzFtoFWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-ppc64-gnu": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.127.0.tgz", + "integrity": "sha512-zALjmZYgxFLHjXeudcDF0xFGNydTAtkAeXAr2EuC17ywCyFxcmQra4w0BMde0Yi/re4Bi4iwEoEXtYN7l6eBLQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-riscv64-gnu": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.127.0.tgz", + "integrity": "sha512-fPP8M6zQLS7Jz7o9d5ArUSuAuSK3e+WCYVrCpdzeCOejidtZExJ9tjhDrAd3HEPqARBCPmdpqxESPFqy44vkBQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-riscv64-musl": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.127.0.tgz", + "integrity": "sha512-7IcC4Ao02oGpfnjt+X/oF4U2mllo2qoSkw5xxiXNKL9MCTsTiAC6616beOuehdxGcnz1bRoPC1RQ2f1GQDdN+g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-s390x-gnu": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.127.0.tgz", + "integrity": "sha512-pbXIhiNFHoqWeqDNLiJ9JkpHz1IM9k4DXa66x+1GTWMG7iLxtkXgE53iiuKSXwmk3zIYmaPVfBvgcAhS583K4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-x64-gnu": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.127.0.tgz", + "integrity": "sha512-MYCguB9RvBvlSd6gbuNI7QwiLoCCAlGnlRJFPrzLI6U1/9wkC/WK6LtBAUln55H1Ctqw45PWmqrobKoMhsYQzQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-x64-musl": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.127.0.tgz", + "integrity": "sha512-5eY0B/bxf1xIUxb4NOTvOI3KWtBQfPWYyKAzgcrCt0mDibSZygVpO1Pz8bkeiSZ5Jj9+M09dkggG3H8I5d0Uyg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-openharmony-arm64": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.127.0.tgz", + "integrity": "sha512-Gld0ajrFTUXNtdw20fVBuTQx66FA75nIVg+//pPfR3sXkuABB4mTBhl3r9JNzrJpgW//qiwxf0nWXUWGJSL3UQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-wasm32-wasi": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.127.0.tgz", + "integrity": "sha512-T6KVD7rhLzFlwGRXMnxUFfkCZD8FHnb968wVXW1mXzgRFc5RNXOBY2mPPDZ77x5Ln76ltLMgtPg0cOkU1NSrEQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.9.2", + "@emnapi/runtime": "1.9.2", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-win32-arm64-msvc": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.127.0.tgz", + "integrity": "sha512-Ujvw4X+LD1CCGULcsQcvb4YNVoBGqt+JHgNNzGGaCImELiZLk477ifUH53gIbE7EKd933NdTi25JWEr9K2HwXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-win32-ia32-msvc": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.127.0.tgz", + "integrity": "sha512-0cwxKO7KHQQQfo4Uf4B2SQrhgm+cJaP9OvFFhx52Tkg4bezsacu83GB2/In5bC415Ueeym+kXdnge/57rbSfTw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-win32-x64-msvc": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.127.0.tgz", + "integrity": "sha512-rOrnSQSCbhI2kowr9XxE7m9a8oQXnBHjnS6j95LxxAnEZ0+Fz20WlRXG4ondQb+ejjt2KOsa65sE6++L6kUd+w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz", + "integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@oxc-resolver/binding-android-arm-eabi": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.20.0.tgz", + "integrity": "sha512-IjfWOXRgJFNdORDl+Uf1aibNgZY2guOD3zmOhx1BGVb/MIiqlFTdmjpQNplSN58lhWehnX4UNqC3QwpUo8pjJg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@oxc-resolver/binding-android-arm64": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm64/-/binding-android-arm64-11.20.0.tgz", + "integrity": "sha512-QqslZAuFQG8Q9xm7JuIn8JUbvywhSBMVhuQHtYW+auirZJloS41oxUUaBXk7uUhZJgp44c5zQLeVvmFaDQB+2Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@oxc-resolver/binding-darwin-arm64": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.20.0.tgz", + "integrity": "sha512-MUcavykj2ewlR+kc5arpg4tC2RvzJkUxWtNv74pf7lcNk00GpIpN43vXMj+j6r4eMmfZhlb8hueKoIb8e9kAGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oxc-resolver/binding-darwin-x64": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.20.0.tgz", + "integrity": "sha512-BGB16nRUK5Etiv//ihPyzj8Lj1px0mhh4YIfe0FDf045ywknfSm0GEbiRESpr6Q4K82AvnyaRIhhluHByvS4bg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oxc-resolver/binding-freebsd-x64": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.20.0.tgz", + "integrity": "sha512-JZgtePaqj3qmD5XFHJaSLWzHRxQu0LaPkdoM1KJXYADvAaa83ijXHclV3ej3CueeW0wxfIAbGCZVP45J0CA7uQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@oxc-resolver/binding-linux-arm-gnueabihf": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.20.0.tgz", + "integrity": "sha512-hOQ/p3ry3v3SchUBXicrrnszaI/UmYzM4wtS4RGfwgVUX7a+HbyQSzJ5aOzu+o6XZkFkS3ZXN4PZAzhOb77OSg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-arm-musleabihf": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-11.20.0.tgz", + "integrity": "sha512-2ArPksaw0AqeuGBfoS715VF+JvJQAhD2niWgjE5hVO+L+nAfikVQopvngCMX9x4BD8itWoQ3dnikrQyl5Ho5Jg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-arm64-gnu": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.20.0.tgz", + "integrity": "sha512-0bJnmYFp62JdZ4nVMDUZ/C58BCZOCcqgKtnUlp7L9Ojf/czIN+3j72YlLPeWLkzlr6SlYvIQA4SGV/HyO0d+qg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-arm64-musl": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.20.0.tgz", + "integrity": "sha512-wKHHzPKZo7Ufhv/Bt6yxT7FOgnIgW4gwXcJUipkShGp68W3wGVqvr1Sr0fY65lN0Oy6y41+g2kIDvkgZaMMUkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-ppc64-gnu": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-11.20.0.tgz", + "integrity": "sha512-RN8goF7Ie0B79L4i4G6OeBocTgSC56vJbQ65VJje+oXnldVpLnOU7j/AQ/dP94TcCS+Yh6WG8u3Qt4ETteXFNQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-riscv64-gnu": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.20.0.tgz", + "integrity": "sha512-5l1yU6/xQEqLZRzxqmMxJfWPslpwCmBsdDGaBvABPehxquCXDC7dd7oraNdKSJUMDXSM7VvVj8H2D2FTjU7oWw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-riscv64-musl": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-11.20.0.tgz", + "integrity": "sha512-xHEvkbgz6UC+A3JOyDQy76LkUaxsNSfIr3/GV8slwZsnuooJiIB34gzJfsyvR4JdCYNUUPsRJc/w/oWkODu+hg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-s390x-gnu": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.20.0.tgz", + "integrity": "sha512-aWPDUUmSeyHvlW+SoEUd+JIJsQhVhu6a5tBpDRMu058naPAchTgAVGCFy35zjbnFlt0i8hLWziff6HX0D3LU4g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-x64-gnu": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.20.0.tgz", + "integrity": "sha512-x2YeSimvhJjKLVD8KSu8f/rqU1potcdEMkApIPJqjZWN7c2Fpt4g2X32WDg1p+XDAmyT7nuQGe0vnhvXeLbH+g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-x64-musl": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.20.0.tgz", + "integrity": "sha512-kcRLEIxpZefeYfLChjpgFf3ilBzRDZ+yobMrpRsQlSrxuFGtm3U6PMU7AaEpMqo3NfDGVyJJseAjnRLzMFHjwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-openharmony-arm64": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-openharmony-arm64/-/binding-openharmony-arm64-11.20.0.tgz", + "integrity": "sha512-HHcfnApSZGtKhTiHqe8OZruOZe5XuFQH5/E0Yhj3u8fnFvzkM4/k6WjacUf4SvA0SPEAbfbgYmVPuo0VX/fIBQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@oxc-resolver/binding-wasm32-wasi": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.20.0.tgz", + "integrity": "sha512-Tn0y1XOFYHNfK1wp1Z5QK8Rcld/bsOwRISQXfqAZ5IBpv8Gz1IvV39fUWNprqNdRizgcvFhOzWwFun2zkJsyBg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-resolver/binding-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@oxc-resolver/binding-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@oxc-resolver/binding-win32-arm64-msvc": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.20.0.tgz", + "integrity": "sha512-qPi25YNPe4YenS8MgsQU2+bIFHxxpLx1LVna2444cEHqNPhNjvWf9zqj4aWE43H9LpAsTmkkAlA3eL5ElBU3mA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@oxc-resolver/binding-win32-x64-msvc": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.20.0.tgz", + "integrity": "sha512-Wb14jWEW8huH6It9F6sXd9vrYmIS7pMrgkU6sxpLxkP+9z+wRgs71hUEhRpcn8FOXAFa27FVWfY2tRpbfTzfLw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.11.0.tgz", + "integrity": "sha512-n6oQX6mYkG8TRPuPXmbPidkUbsSRalhmaaVAQxvH1IkQy63cwsH+kOjB3e4cpCDHg0aSvsiX9bQ4s2VB6mGWUQ==", + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.4.3", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.7.3", + "tar-fs": "^3.1.1", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@puppeteer/browsers/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", + "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" @@ -4409,40 +5411,329 @@ "react": "15.x || 16.x || 17.x || 18.x" } }, - "node_modules/@sentry/replay": { - "version": "7.120.4", - "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.120.4.tgz", - "integrity": "sha512-FW8sPenNFfnO/K7sncsSTX4rIVak9j7VUiLIagJrcqZIC7d1dInFNjy8CdVJUlyz3Y3TOgIl3L3+ZpjfyMnaZg==", + "node_modules/@sentry/replay": { + "version": "7.120.4", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.120.4.tgz", + "integrity": "sha512-FW8sPenNFfnO/K7sncsSTX4rIVak9j7VUiLIagJrcqZIC7d1dInFNjy8CdVJUlyz3Y3TOgIl3L3+ZpjfyMnaZg==", + "license": "MIT", + "dependencies": { + "@sentry-internal/tracing": "7.120.4", + "@sentry/core": "7.120.4", + "@sentry/types": "7.120.4", + "@sentry/utils": "7.120.4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@sentry/types": { + "version": "7.120.4", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.120.4.tgz", + "integrity": "sha512-cUq2hSSe6/qrU6oZsEP4InMI5VVdD86aypE+ENrQ6eZEVLTCYm1w6XhW1NvIu3UuWh7gZec4a9J7AFpYxki88Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/utils": { + "version": "7.120.4", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.120.4.tgz", + "integrity": "sha512-zCKpyDIWKHwtervNK2ZlaK8mMV7gVUijAgFeJStH+CU/imcdquizV3pFLlSQYRswG+Lbyd6CT/LGRh3IbtkCFw==", + "license": "MIT", + "dependencies": { + "@sentry/types": "7.120.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/addon-a11y": { + "version": "10.4.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-10.4.6.tgz", + "integrity": "sha512-XCJy+f0DFOiCgUU9knRDlLDxVFI+AAQ3/wE/NF85zB9iDPPS2DwkSN+mas3zDgHt66zhN8Cq3/UiyCDUweV9Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "axe-core": "^4.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^10.4.6" + } + }, + "node_modules/@storybook/addon-docs": { + "version": "10.4.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-10.4.6.tgz", + "integrity": "sha512-aWAfP5JMiT5a3zBJizwroCRzOCqZwDTJmvsYvwMD3ilIEa/kT1vhf6Xrbk4XIPhDwbh8Hpb/Gfnka1xBYEISWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mdx-js/react": "^3.0.0", + "@storybook/csf-plugin": "10.4.6", + "@storybook/icons": "^2.0.2", + "@storybook/react-dom-shim": "10.4.6", + "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": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "storybook": "^10.4.6" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-mcp": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@storybook/addon-mcp/-/addon-mcp-0.6.0.tgz", + "integrity": "sha512-E79m2S7ik9wiF1AnI49fwbLQkrD03PicIZpCdeFhbbB19MF4tKFKyaQtbT3f6eaAP4EP2+COLDVLCQ7B3rGF4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/mcp": "0.7.0", + "@tmcp/adapter-valibot": "^0.1.5", + "@tmcp/transport-http": "^0.8.5", + "picoquery": "^2.5.0", + "tmcp": "^1.19.3", + "valibot": "1.2.0" + }, + "peerDependencies": { + "@storybook/addon-vitest": "^0.0.0-0 || ^9.1.16 || ^10.0.0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0 || ^10.4.0-0", + "storybook": "^0.0.0-0 || ^9.1.16 || ^10.0.0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0 || ^10.4.0-0" + }, + "peerDependenciesMeta": { + "@storybook/addon-vitest": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-vitest": { + "version": "10.4.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-vitest/-/addon-vitest-10.4.6.tgz", + "integrity": "sha512-VvskHge0GZy86LG6kcY5Ww34z8rDV8JBxqSdUpcJVsWfIvyX6MfAbqI76LlereSyBIJGZJZsqaLwRXsQoVY+0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@storybook/icons": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@vitest/browser": "^3.0.0 || ^4.0.0", + "@vitest/browser-playwright": "^4.0.0", + "@vitest/runner": "^3.0.0 || ^4.0.0", + "storybook": "^10.4.6", + "vitest": "^3.0.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/runner": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@storybook/builder-vite": { + "version": "10.4.6", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.4.6.tgz", + "integrity": "sha512-BHBtD81HiXUiDQz/CaFynLtWmm7AFUQn8VnXuHipZ8KlnUANopa4yqdVuy/Gwz8ub254uFI5NMZsW/KlgWNgNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/csf-plugin": "10.4.6", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^10.4.6", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@storybook/csf-plugin": { + "version": "10.4.6", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.4.6.tgz", + "integrity": "sha512-NILLxDqpA/JR/AazGWpsz+4fadJwRU4uhHephGtYpVOWnQA/DkJfKT6zpcJVq8+QA8A2zKMLX3GVKsXIrxjuDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "unplugin": "^2.3.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "esbuild": "*", + "rollup": "*", + "storybook": "^10.4.6", + "vite": "*", + "webpack": "*" + }, + "peerDependenciesMeta": { + "esbuild": { + "optional": true + }, + "rollup": { + "optional": true + }, + "vite": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@storybook/global": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", + "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/icons": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-2.0.2.tgz", + "integrity": "sha512-KZBCpXsshAIjczYNXR/rlxEtCUX/eAbpFNwKi8bcOomrLA4t/SyPz5RF+lVPO2oZBUE4sAkt43mfJUevQDSEEw==", + "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/mcp": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@storybook/mcp/-/mcp-0.7.0.tgz", + "integrity": "sha512-Pr4E61tM5e7aDzqgNOL/Ylw8CGdb+BIDGOf3vbmFfkR8ZnXjPxaV/vhTEsiXynnIpjQWCzySCxOU1icxZsgjrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tmcp/adapter-valibot": "^0.1.5", + "@tmcp/transport-http": "^0.8.5", + "tmcp": "^1.19.3", + "valibot": "1.2.0" + } + }, + "node_modules/@storybook/react": { + "version": "10.4.6", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.4.6.tgz", + "integrity": "sha512-9Y7YecrVFe1/01KYjfOLxVqTg2Aq+IO6TEv6sC2U0PfD0AWCSCmQ91QqgBpN/XW4aFFWoiZNinyXMUlU8zxy2w==", + "dev": true, "license": "MIT", "dependencies": { - "@sentry-internal/tracing": "7.120.4", - "@sentry/core": "7.120.4", - "@sentry/types": "7.120.4", - "@sentry/utils": "7.120.4" + "@storybook/global": "^5.0.0", + "@storybook/react-dom-shim": "10.4.6", + "react-docgen": "^8.0.2", + "react-docgen-typescript": "^2.2.2" }, - "engines": { - "node": ">=12" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "@types/react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "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.4.6", + "typescript": ">= 4.9.x" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + }, + "typescript": { + "optional": true + } } }, - "node_modules/@sentry/types": { - "version": "7.120.4", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.120.4.tgz", - "integrity": "sha512-cUq2hSSe6/qrU6oZsEP4InMI5VVdD86aypE+ENrQ6eZEVLTCYm1w6XhW1NvIu3UuWh7gZec4a9J7AFpYxki88Q==", + "node_modules/@storybook/react-dom-shim": { + "version": "10.4.6", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.4.6.tgz", + "integrity": "sha512-iGNmKzrq9vgl2PDrYAnZKI+yvac3Ym+lJXXuQaqlFRS23zA5MNm4EBX+rAG7WulqchoK6NaZ0KQOs2mAgEpTMg==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "@types/react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "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.4.6" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@sentry/utils": { - "version": "7.120.4", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.120.4.tgz", - "integrity": "sha512-zCKpyDIWKHwtervNK2ZlaK8mMV7gVUijAgFeJStH+CU/imcdquizV3pFLlSQYRswG+Lbyd6CT/LGRh3IbtkCFw==", + "node_modules/@storybook/react-vite": { + "version": "10.4.6", + "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-10.4.6.tgz", + "integrity": "sha512-0arEQtybqGYXHbXpTot+Wv9YtG+V5Vp43QayXavPKQ20M8mpEzhyCPKd0EhqMGSC1Z1UEt0hm365WUBhI9LfKA==", + "dev": true, "license": "MIT", "dependencies": { - "@sentry/types": "7.120.4" + "@joshwooding/vite-plugin-react-docgen-typescript": "^0.7.0", + "@rollup/pluginutils": "^5.0.2", + "@storybook/builder-vite": "10.4.6", + "@storybook/react": "10.4.6", + "empathic": "^2.0.0", + "magic-string": "^0.30.0", + "react-docgen": "^8.0.0", + "resolve": "^1.22.8", + "tsconfig-paths": "^4.2.0" }, - "engines": { - "node": ">=8" + "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.4.6", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { @@ -4710,6 +6001,67 @@ "@svgr/core": "*" } }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", + "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/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "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/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, "node_modules/@tiptap/core": { "version": "2.27.1", "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.27.1.tgz", @@ -5112,12 +6464,101 @@ "url": "https://github.com/sponsors/ueberdosis" } }, + "node_modules/@tmcp/adapter-valibot": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@tmcp/adapter-valibot/-/adapter-valibot-0.1.6.tgz", + "integrity": "sha512-drirZeNinhYLiRSMksN+m//u0ImFxtGRk1Vp425Xp/7CbBXFQdjAG+f7grssyHAukbVTGzmWsMMP6ejrGVErUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@valibot/to-json-schema": "^1.3.0", + "valibot": "^1.1.0" + }, + "peerDependencies": { + "tmcp": "^1.17.0", + "valibot": "^1.1.0" + } + }, + "node_modules/@tmcp/adapter-valibot/node_modules/@valibot/to-json-schema": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@valibot/to-json-schema/-/to-json-schema-1.7.1.tgz", + "integrity": "sha512-3qkmU6KXWh8GIThEAW3kuRHPQBMjWkKy+Ppz3WkUucx53DTpOa6siMn4xDGSOhlVyMrDaJTCTMLYPZVAIk1P0A==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "valibot": "^1.4.0" + } + }, + "node_modules/@tmcp/adapter-valibot/node_modules/valibot": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.4.1.tgz", + "integrity": "sha512-klCmFTz2jeDluy9RwX+F884TCiogtdBJ/YaxSx1EOBYXa3NXNWj8kR1jjN8rzluwojJVWWaHJ4r1U5LfICnM3g==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": ">=5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@tmcp/session-manager": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@tmcp/session-manager/-/session-manager-0.2.2.tgz", + "integrity": "sha512-UrCRpTsxh5XnMbplspvftEYboiZWgAiXqqAUbyFTHoHMJ0LoNDy8bQd0+7qtxtT4S5Qsnv650gvs/Nbec5NTCQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "tmcp": "^1.16.3" + } + }, + "node_modules/@tmcp/transport-http": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/@tmcp/transport-http/-/transport-http-0.8.6.tgz", + "integrity": "sha512-iLcxu+tEMbkVHbhFfyXQhxfPDDTfm+F0kEw8Xg/a1rm29s4cBg1vwcpbtk02XTxsdDh8RJ1AZkQwF9WDGeb/IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tmcp/session-manager": "^0.2.2", + "esm-env": "^1.2.2" + }, + "peerDependencies": { + "@tmcp/auth": "^0.3.3 || ^0.4.0", + "tmcp": "^1.18.0" + }, + "peerDependenciesMeta": { + "@tmcp/auth": { + "optional": true + } + } + }, "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", "license": "MIT" }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -5181,6 +6622,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/doctrine": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz", + "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/eslint": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", @@ -5244,6 +6692,13 @@ "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", "license": "MIT" }, + "node_modules/@types/mdx": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.14.tgz", + "integrity": "sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "24.10.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", @@ -5284,6 +6739,13 @@ "@types/react": "*" } }, + "node_modules/@types/resolve": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", + "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", @@ -5333,6 +6795,119 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, + "node_modules/@vitest/browser": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-3.2.6.tgz", + "integrity": "sha512-CNjSynGBtAVOMTfQITv6Bc8da4/XTU1izorocbDStjUsynXcgx2FHVssh+10a8bKd/BxoqDdQtuSbYHfk302Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@testing-library/dom": "^10.4.0", + "@testing-library/user-event": "^14.6.1", + "@vitest/mocker": "3.2.6", + "@vitest/utils": "3.2.6", + "magic-string": "^0.30.17", + "sirv": "^3.0.1", + "tinyrainbow": "^2.0.0", + "ws": "^8.18.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "playwright": "*", + "vitest": "3.2.6", + "webdriverio": "^7.0.0 || ^8.0.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/@vitest/browser/node_modules/@vitest/pretty-format": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.6.tgz", + "integrity": "sha512-lb7XXXzmm2h2ASzFnRvQpDo6onT1NmMJA3tkGTWiBFtRJ9lxGY3d3mm/Apt36gej2bkkOVLL/yTOtufDaFa/jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/browser/node_modules/@vitest/utils": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.6.tgz", + "integrity": "sha512-lI23nIs4bnT3T8NIoh+vFaz5s2/DdP0Jgt2jxwgWljvwn82cLJtyi/If+fjFyoLMGIOz0U/fKvWE0d4jsNQEfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.6", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/browser/node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/coverage-v8": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.6.tgz", + "integrity": "sha512-LsAdmUapA0qSN306d8+zOyawM0hFm2m2Hg9IwVNIKBm+qJV8cijiq2c+gxKZcB1HCfIWAy+0qEZDCUQA58A1cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@bcoe/v8-coverage": "^1.0.2", + "ast-v8-to-istanbul": "^0.3.3", + "debug": "^4.4.1", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magic-string": "^0.30.17", + "magicast": "^0.3.5", + "std-env": "^3.9.0", + "test-exclude": "^7.0.1", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "3.2.6", + "vitest": "3.2.6" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, "node_modules/@vitest/expect": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", @@ -5351,13 +6926,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.6.tgz", + "integrity": "sha512-EZOrpDbkKotFAP7wPAQV1UIyoGOk4oX7ynWhBhLB7v+meMHbQhU16oPpIYGTTe4oFlhpryGpgpcZP/sin3hYuw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.2.4", + "@vitest/spy": "3.2.6", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, @@ -5377,6 +6952,19 @@ } } }, + "node_modules/@vitest/mocker/node_modules/@vitest/spy": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.6.tgz", + "integrity": "sha512-oq6BbH68WzcWmwtBrU9nqLeaXTR4XwJF7FSLkKEZo4i6eoXcrxjcwSuTvWBIRUTC6VC72nXYunzqgZA+IKdtxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/@vitest/mocker/node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -5401,13 +6989,13 @@ } }, "node_modules/@vitest/runner": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", - "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.6.tgz", + "integrity": "sha512-HYcoSj1w5tcgUnzoF0HcyaAQjpA1gj9ftUJ7iSJSuipc02jW9gKkigwZbjFldAfYHA1fa8UZVRftdMY5msWM9Q==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.2.4", + "@vitest/utils": "3.2.6", "pathe": "^2.0.3", "strip-literal": "^3.0.0" }, @@ -5415,16 +7003,57 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/snapshot": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "node_modules/@vitest/runner/node_modules/@vitest/pretty-format": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.6.tgz", + "integrity": "sha512-lb7XXXzmm2h2ASzFnRvQpDo6onT1NmMJA3tkGTWiBFtRJ9lxGY3d3mm/Apt36gej2bkkOVLL/yTOtufDaFa/jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/@vitest/utils": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.6.tgz", + "integrity": "sha512-lI23nIs4bnT3T8NIoh+vFaz5s2/DdP0Jgt2jxwgWljvwn82cLJtyi/If+fjFyoLMGIOz0U/fKvWE0d4jsNQEfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.6", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.6.tgz", + "integrity": "sha512-H+ZjNTWGpObenh0YnlBctAPnJSI20P81PL8BPzWpx54YXLLTm8hEsWawtcYLMrwvpK48hGxLLbCS+1KRXhsKhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.6", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot/node_modules/@vitest/pretty-format": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.6.tgz", + "integrity": "sha512-lb7XXXzmm2h2ASzFnRvQpDo6onT1NmMJA3tkGTWiBFtRJ9lxGY3d3mm/Apt36gej2bkkOVLL/yTOtufDaFa/jA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.4", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" @@ -5604,6 +7233,13 @@ "@xtuc/long": "4.2.2" } }, + "node_modules/@webcontainer/env": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@webcontainer/env/-/env-1.1.1.tgz", + "integrity": "sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==", + "dev": true, + "license": "MIT" + }, "node_modules/@webpack-cli/configtest": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", @@ -5776,6 +7412,28 @@ "ajv": "^6.9.1" } }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -5794,6 +7452,16 @@ "node": ">=10" } }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", @@ -5853,6 +7521,35 @@ "node": ">=4" } }, + "node_modules/ast-v8-to-istanbul": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.12.tgz", + "integrity": "sha512-BRRC8VRZY2R4Z4lFIL35MwNXmwVqBityvOIwETtsCSwvjl0IdgFsy9NhdaA6j74nUdtJJlIypeRhpDam19Wq3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", + "estree-walker": "^3.0.3", + "js-tokens": "^10.0.0" + } + }, + "node_modules/ast-v8-to-istanbul/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", + "dev": true, + "license": "MIT" + }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -5901,6 +7598,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axe-core": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.12.1.tgz", + "integrity": "sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, "node_modules/axios": { "version": "1.13.6", "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", @@ -6253,6 +7960,22 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "license": "MIT" }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -6635,6 +8358,13 @@ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, "node_modules/cssstyle": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.3.tgz", @@ -6787,6 +8517,36 @@ "node": ">=6" } }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "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", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -6853,6 +8613,16 @@ "node": ">=0.4.0" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", @@ -6865,6 +8635,26 @@ "integrity": "sha512-26T91cV5dbOYnXdJi5qQHoTtUoNEqwkHcAyu/IKtjIAxiEqPMrDiRkDOPWVsGfNZGmlQVHQbZRSjD8sxagWVsQ==", "license": "BSD-3-Clause" }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" + }, "node_modules/dom-helpers": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", @@ -6907,6 +8697,13 @@ "dev": true, "license": "MIT" }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, "node_modules/electron-to-chromium": { "version": "1.5.266", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.266.tgz", @@ -6949,6 +8746,16 @@ "node": ">= 4" } }, + "node_modules/empathic": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.1.tgz", + "integrity": "sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", @@ -7267,6 +9074,13 @@ "node": ">=8.0.0" } }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "dev": true, + "license": "MIT" + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -7541,6 +9355,36 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", @@ -7771,17 +9615,17 @@ } }, "node_modules/glob": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", - "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "license": "BlueOak-1.0.0", "dependencies": { - "minimatch": "^10.1.1", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -8110,6 +9954,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -8348,6 +10202,41 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "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-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "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-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -8576,6 +10465,118 @@ "node": ">=0.10.0" } }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -8705,6 +10706,13 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "license": "MIT" }, + "node_modules/json-rpc-2.0": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/json-rpc-2.0/-/json-rpc-2.0-1.7.1.tgz", + "integrity": "sha512-JqZjhjAanbpkXIzFE7u8mE/iFblawwlXtONaCvRqI+pyABVz7B4M1EUNpyVW+dZjqgQ2L5HFmZCmOCgUKm00hg==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -8945,6 +10953,16 @@ "yallist": "^3.0.2" } }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -8955,6 +10973,18 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -9057,6 +11087,16 @@ "node": ">= 0.6" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", @@ -9080,10 +11120,10 @@ } }, "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -9533,6 +11573,75 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/oxc-parser": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.127.0.tgz", + "integrity": "sha512-bkgD4qHlN7WxLdX8bLXdaU54TtQtAIg/ZBAfm0aje/mo3MRDo3P0hZSgr4U7O3xfX+fQmR5AP04JS/TGcZLcFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "^0.127.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-parser/binding-android-arm-eabi": "0.127.0", + "@oxc-parser/binding-android-arm64": "0.127.0", + "@oxc-parser/binding-darwin-arm64": "0.127.0", + "@oxc-parser/binding-darwin-x64": "0.127.0", + "@oxc-parser/binding-freebsd-x64": "0.127.0", + "@oxc-parser/binding-linux-arm-gnueabihf": "0.127.0", + "@oxc-parser/binding-linux-arm-musleabihf": "0.127.0", + "@oxc-parser/binding-linux-arm64-gnu": "0.127.0", + "@oxc-parser/binding-linux-arm64-musl": "0.127.0", + "@oxc-parser/binding-linux-ppc64-gnu": "0.127.0", + "@oxc-parser/binding-linux-riscv64-gnu": "0.127.0", + "@oxc-parser/binding-linux-riscv64-musl": "0.127.0", + "@oxc-parser/binding-linux-s390x-gnu": "0.127.0", + "@oxc-parser/binding-linux-x64-gnu": "0.127.0", + "@oxc-parser/binding-linux-x64-musl": "0.127.0", + "@oxc-parser/binding-openharmony-arm64": "0.127.0", + "@oxc-parser/binding-wasm32-wasi": "0.127.0", + "@oxc-parser/binding-win32-arm64-msvc": "0.127.0", + "@oxc-parser/binding-win32-ia32-msvc": "0.127.0", + "@oxc-parser/binding-win32-x64-msvc": "0.127.0" + } + }, + "node_modules/oxc-resolver": { + "version": "11.20.0", + "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.20.0.tgz", + "integrity": "sha512-CblytBiV/a/ZXY34dsVU2NxhIOxMXst8CvDCtyBelVITgd7PLrKzbEbA6oKLdPjvDKDzCiW48qzmzZ+mYaqn+g==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-resolver/binding-android-arm-eabi": "11.20.0", + "@oxc-resolver/binding-android-arm64": "11.20.0", + "@oxc-resolver/binding-darwin-arm64": "11.20.0", + "@oxc-resolver/binding-darwin-x64": "11.20.0", + "@oxc-resolver/binding-freebsd-x64": "11.20.0", + "@oxc-resolver/binding-linux-arm-gnueabihf": "11.20.0", + "@oxc-resolver/binding-linux-arm-musleabihf": "11.20.0", + "@oxc-resolver/binding-linux-arm64-gnu": "11.20.0", + "@oxc-resolver/binding-linux-arm64-musl": "11.20.0", + "@oxc-resolver/binding-linux-ppc64-gnu": "11.20.0", + "@oxc-resolver/binding-linux-riscv64-gnu": "11.20.0", + "@oxc-resolver/binding-linux-riscv64-musl": "11.20.0", + "@oxc-resolver/binding-linux-s390x-gnu": "11.20.0", + "@oxc-resolver/binding-linux-x64-gnu": "11.20.0", + "@oxc-resolver/binding-linux-x64-musl": "11.20.0", + "@oxc-resolver/binding-openharmony-arm64": "11.20.0", + "@oxc-resolver/binding-wasm32-wasi": "11.20.0", + "@oxc-resolver/binding-win32-arm64-msvc": "11.20.0", + "@oxc-resolver/binding-win32-x64-msvc": "11.20.0" + } + }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -9697,25 +11806,25 @@ "license": "MIT" }, "node_modules/path-scurry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.2.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", - "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -9781,6 +11890,13 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/picoquery": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/picoquery/-/picoquery-2.5.0.tgz", + "integrity": "sha512-j1kgOFxtaCyoFCkpoYG2Oj3OdGakadO7HZ7o5CqyRazlmBekKhbDoUnNnXASE07xSY4nDImWZkrZv7toSxMi/g==", + "dev": true, + "license": "MIT" + }, "node_modules/pidtree": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", @@ -9814,6 +11930,53 @@ "node": ">=8" } }, + "node_modules/playwright": { + "version": "1.61.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.0.tgz", + "integrity": "sha512-Z+7BeeqQPRRzklHsVFP4KTGIyMxKUmfeRA4WisM6G3/XW6nwGeX6fX9qYaDa+CiUqpOkb2f6X3nar05R3kSuJQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.61.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.61.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.0.tgz", + "integrity": "sha512-caX7TrY3Ml6egyDX0WUcTHDxodl/b51y5wJOdCEA36QviK/s2g081hvmGs8eaE3DWb6NYZQ6BjO/QkNRPenoPA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/plist": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", @@ -9888,6 +12051,28 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "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/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -10347,6 +12532,38 @@ "react-dom": "^16.9.0 || ^17 || ^18" } }, + "node_modules/react-docgen": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-8.0.3.tgz", + "integrity": "sha512-aEZ9qP+/M+58x2qgfSFEWH1BxLyHe5+qkLNJOZQb5iGS017jpbRnoKhNRrXPeA6RfBrZO5wZrT9DMC1UqE1f1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.2", + "@types/babel__core": "^7.20.5", + "@types/babel__traverse": "^7.20.7", + "@types/doctrine": "^0.0.9", + "@types/resolve": "^1.20.2", + "doctrine": "^3.0.0", + "resolve": "^1.22.1", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": "^20.9.0 || >=22" + } + }, + "node_modules/react-docgen-typescript": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.4.0.tgz", + "integrity": "sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": ">= 4.3.x" + } + }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", @@ -10702,6 +12919,46 @@ "node": ">= 6" } }, + "node_modules/recast": { + "version": "0.23.11", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", + "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", + "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/recast/node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/recast/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/rechoir": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", @@ -10714,6 +12971,33 @@ "node": ">= 0.10" } }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redent/node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -10971,6 +13255,19 @@ "dev": true, "license": "MIT" }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/safe-array-concat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", @@ -11502,6 +13799,13 @@ "node": ">= 10.x" } }, + "node_modules/sqids": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/sqids/-/sqids-0.3.0.tgz", + "integrity": "sha512-lOQK1ucVg+W6n3FhRwwSeUijxe93b51Bfz5PMRMihVf1iVkl82ePQG7V5vwrhzB11v0NtsR25PSZRGiSomJaJw==", + "dev": true, + "license": "MIT" + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -11529,6 +13833,98 @@ "node": ">= 0.4" } }, + "node_modules/storybook": { + "version": "10.4.6", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.4.6.tgz", + "integrity": "sha512-6wkA6LxfDSSilloITsrFOJfsnw0mDUP2h8Ls+lRt8oRsudtz2RWFhLv+Toiwg6NW7hUpdTDc2hzR7DztJid6+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@storybook/icons": "^2.0.2", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/user-event": "^14.6.1", + "@vitest/expect": "3.2.4", + "@vitest/spy": "3.2.4", + "@webcontainer/env": "^1.1.1", + "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 || ^0.28.0", + "open": "^10.2.0", + "oxc-parser": "^0.127.0", + "oxc-resolver": "^11.19.1", + "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": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "prettier": "^2 || ^3", + "vite-plus": "^0.1.15" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "prettier": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, + "node_modules/storybook/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/storybook/node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "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/storybook/node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/streamx": { "version": "2.23.0", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", @@ -11563,6 +13959,22 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.padend": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", @@ -11649,11 +14061,16 @@ "node": ">=8" } }, - "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { "node": ">=8" } @@ -11667,6 +14084,19 @@ "node": ">=4" } }, + "node_modules/strip-indent": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz", + "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/strip-literal": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", @@ -12075,6 +14505,139 @@ "source-map": "^0.6.0" } }, + "node_modules/test-exclude": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.2.tgz", + "integrity": "sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^10.2.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/test-exclude/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/test-exclude/node_modules/glob/node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/test-exclude/node_modules/glob/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "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/test-exclude/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/text-decoder": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", @@ -12209,6 +14772,20 @@ "dev": true, "license": "MIT" }, + "node_modules/tmcp": { + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/tmcp/-/tmcp-1.19.4.tgz", + "integrity": "sha512-fMoUJ3Gef9iA0yKZNeW2SQCCKTluCwghUyOz/qxPS8XxrQk6Jlw4lgql3S+s6L//FteLeSJ7erKxMWl727mZoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "json-rpc-2.0": "^1.7.1", + "sqids": "^0.3.0", + "uri-template-matcher": "^1.1.1", + "valibot": "^1.1.0" + } + }, "node_modules/totalist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", @@ -12268,6 +14845,31 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/ts-dedent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.3.0.tgz", + "integrity": "sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -12457,6 +15059,22 @@ "node": ">= 10.0.0" } }, + "node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "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/untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", @@ -12506,6 +15124,13 @@ "punycode": "^2.1.0" } }, + "node_modules/uri-template-matcher": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/uri-template-matcher/-/uri-template-matcher-1.1.2.tgz", + "integrity": "sha512-uZc1h12jdO3m/R77SfTEOuo6VbMhgWznaawKpBjRGSJb7i91x5PgI37NQJtG+Cerxkk0yr1pylBY2qG1kQ+aEQ==", + "dev": true, + "license": "ISC" + }, "node_modules/use-callback-ref": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", @@ -12577,6 +15202,21 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/valibot": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.2.0.tgz", + "integrity": "sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": ">=5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -12707,20 +15347,20 @@ } }, "node_modules/vitest": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.6.tgz", + "integrity": "sha512-xejya+bT/j/+R/AGa1XOfRxLmNUlLtlwjRsFUILF+xHfzElmGcmFydy2gqqIrd62ptIEfwVMofd19uNWD9L7Nw==", "dev": true, "license": "MIT", "dependencies": { "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.4", - "@vitest/mocker": "3.2.4", - "@vitest/pretty-format": "^3.2.4", - "@vitest/runner": "3.2.4", - "@vitest/snapshot": "3.2.4", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", + "@vitest/expect": "3.2.6", + "@vitest/mocker": "3.2.6", + "@vitest/pretty-format": "^3.2.6", + "@vitest/runner": "3.2.6", + "@vitest/snapshot": "3.2.6", + "@vitest/spy": "3.2.6", + "@vitest/utils": "3.2.6", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", @@ -12750,8 +15390,8 @@ "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.4", - "@vitest/ui": "3.2.4", + "@vitest/browser": "3.2.6", + "@vitest/ui": "3.2.6", "happy-dom": "*", "jsdom": "*" }, @@ -12779,6 +15419,64 @@ } } }, + "node_modules/vitest/node_modules/@vitest/expect": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.6.tgz", + "integrity": "sha512-1+7q9BtaKzEmO+fmNT3kYvoNn5Y71XWAx2Q5HRim4tTVRQVRv4uJFAQ5FbK0OPUeNP/WmVCpxYxoJdvuHVjzBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.6", + "@vitest/utils": "3.2.6", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/@vitest/pretty-format": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.6.tgz", + "integrity": "sha512-lb7XXXzmm2h2ASzFnRvQpDo6onT1NmMJA3tkGTWiBFtRJ9lxGY3d3mm/Apt36gej2bkkOVLL/yTOtufDaFa/jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/@vitest/spy": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.6.tgz", + "integrity": "sha512-oq6BbH68WzcWmwtBrU9nqLeaXTR4XwJF7FSLkKEZo4i6eoXcrxjcwSuTvWBIRUTC6VC72nXYunzqgZA+IKdtxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/@vitest/utils": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.6.tgz", + "integrity": "sha512-lI23nIs4bnT3T8NIoh+vFaz5s2/DdP0Jgt2jxwgWljvwn82cLJtyi/If+fjFyoLMGIOz0U/fKvWE0d4jsNQEfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.6", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/w3c-keyname": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", @@ -13028,6 +15726,13 @@ "node": ">=10.13.0" } }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true, + "license": "MIT" + }, "node_modules/webpack/node_modules/ajv": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", @@ -13270,6 +15975,61 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -13330,6 +16090,38 @@ } } }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/xml-name-validator": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", diff --git a/package.json b/package.json index 98154525b..dbd41fbb8 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,9 @@ "ios:release-force": "npm run ios:build && cd ios/App && fastlane release_force", "ios:copy-screenshots": "node ios/App/appstore-screenshots/copy-to-fastlane.js", "ios:render-screenshots": "node ios/App/appstore-screenshots/render.js", - "ios:render-live-screenshots": "node ios/App/appstore-screenshots/render-live.js" + "ios:render-live-screenshots": "node ios/App/appstore-screenshots/render-live.js", + "storybook": "storybook dev -p 6006", + "build-storybook": "storybook build" }, "browserslist": { "production": [ @@ -142,18 +144,38 @@ "devDependencies": { "@babel/preset-env": "^7.16.11", "@babel/preset-react": "^7.28.5", + "@chromatic-com/storybook": "^5.2.1", + "@storybook/addon-a11y": "^10.4.6", + "@storybook/addon-docs": "^10.4.6", + "@storybook/addon-mcp": "^0.6.0", + "@storybook/addon-vitest": "^10.4.6", + "@storybook/react-vite": "^10.4.6", "@vitejs/plugin-react": "^5.1.1", + "@vitest/browser": "^3.2.4", + "@vitest/coverage-v8": "^3.2.4", "babel-loader": "^8.2.3", "babel-plugin-styled-components": "^2.1.4", "jsdom": "^27.0.1", + "playwright": "^1.61.0", "prettier": "3.2.5", + "storybook": "^10.4.6", "svg-inline-loader": "^0.8.2", "typescript": "^5.9.3", "vite": "^7.2.6", "vite-plugin-svgr": "^4.5.0", "vitest": "^3.2.4", "webpack": "^5.76.0", - "webpack-bundle-analyzer": "^4.10.2" + "webpack-bundle-analyzer": "^4.10.2", + "storybook": "^10.4.6", + "@storybook/react-vite": "^10.4.6", + "@chromatic-com/storybook": "^5.2.1", + "@storybook/addon-vitest": "^10.4.6", + "@storybook/addon-a11y": "^10.4.6", + "@storybook/addon-docs": "^10.4.6", + "@storybook/addon-mcp": "^0.6.0", + "playwright": "^1.61.0", + "@vitest/browser": "^3.2.4", + "@vitest/coverage-v8": "^3.2.4" }, "overrides": { "d3-color": "3.1.0", diff --git a/src/MainAppRouter.js b/src/MainAppRouter.js index 799a78cb4..306ffeb83 100644 --- a/src/MainAppRouter.js +++ b/src/MainAppRouter.js @@ -43,7 +43,7 @@ const TeacherRouter = (props) => ( import { PrivateRouteWithLayout } from "./PrivateRouteWithLayout"; import { PrivateRoute } from "./PrivateRoute"; import AppLayout from "./AppLayout"; -import DeleteAccount from "./pages/DeleteAccount/DeleteAccount"; +import DeleteAccount from "./pages/Settings/DeleteAccount/DeleteAccount"; import SettingsRouter from "./pages/Settings/_SettingsRouter"; import ProfileRouter from "./profile/_ProfileRouter"; import ExercisesForArticle from "./exercises/ExercisesForArticle"; diff --git a/src/articles/ClassroomOtherLanguages.js b/src/articles/ClassroomOtherLanguages.js index 97c2d71e4..b63373367 100644 --- a/src/articles/ClassroomOtherLanguages.js +++ b/src/articles/ClassroomOtherLanguages.js @@ -1,6 +1,6 @@ import { useState } from "react"; import DynamicFlagImage from "../components/DynamicFlagImage"; -import EmptyState from "../components/EmptyState"; +import EmptyState from "../components/EmptyMessageState"; import useGuardedLanguageSwitch from "../hooks/useGuardedLanguageSwitch"; import { languageName } from "../utils/misc/languageCodeToName"; import * as s from "./ClassroomOtherLanguages.sc"; @@ -60,8 +60,7 @@ export default function ClassroomOtherLanguages({ options, learnedLanguage }) { {option.cohortName} - {option.count} {option.count === 1 ? "text" : "texts"} in{" "} - {languageName(option.languageCode)} + {option.count} {option.count === 1 ? "text" : "texts"} in {languageName(option.languageCode)} {title && {title}} diff --git a/src/components/Icons/LinkOffIconButton.js b/src/components/Icons/LinkOffIconButton.js new file mode 100644 index 000000000..d1b799efc --- /dev/null +++ b/src/components/Icons/LinkOffIconButton.js @@ -0,0 +1,26 @@ +import React from "react"; +import LinkOffIcon from "@mui/icons-material/LinkOff"; + +export default function LinkOffIconButton({ onClick, ariaLabel = "Unlink word", style = {}, iconStyle = {} }) { + return ( + + ); +} diff --git a/src/components/Icons/SettingsIconButton.sc.js b/src/components/Icons/SettingsIconButton.sc.js new file mode 100644 index 000000000..a4c21cb35 --- /dev/null +++ b/src/components/Icons/SettingsIconButton.sc.js @@ -0,0 +1,17 @@ +import styled from "styled-components"; + +export const SettingsButtonRoot = styled.div` + padding: 0.5rem; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; +`; + +export const SettingsIconStyle = styled.div` + display: flex; + align-items: center; + justify-content: center; + font-size: 1.4em; + color: #999; +`; diff --git a/src/components/Icons/VisibilityOffIconButton.js b/src/components/Icons/VisibilityOffIconButton.js new file mode 100644 index 000000000..ed01e116c --- /dev/null +++ b/src/components/Icons/VisibilityOffIconButton.js @@ -0,0 +1,31 @@ +import React from "react"; +import VisibilityOffIcon from "@mui/icons-material/VisibilityOff"; + +export default function VisibilityOffIconButton({ + onClick, + ariaLabel = "Hide translation", + style = {}, + iconStyle = {}, +}) { + return ( + + ); +} diff --git a/src/exercises/OutOfWordsMessage.js b/src/exercises/OutOfWordsMessage.js index be6ee567e..f29840c05 100644 --- a/src/exercises/OutOfWordsMessage.js +++ b/src/exercises/OutOfWordsMessage.js @@ -1,17 +1,13 @@ -import EmptyState from "../components/EmptyState"; +import EmptyMessageState from "../components/EmptyMessageState"; export default function OutOfWordsMessage({ hasAnyWords = true }) { if (!hasAnyWords) { return ( - + ); } return ( - + ); } diff --git a/src/i18n/definitions.js b/src/i18n/definitions.js index c304ef16e..d77b2200d 100644 --- a/src/i18n/definitions.js +++ b/src/i18n/definitions.js @@ -388,10 +388,6 @@ let strings = new LocalizedStrings( backToEditing: "Back to editing", saveCopyToShare: "Save Copy to Share", - //BookmarkButton - addToBookmarks: "Add to bookmarks", - removeFromBookmarks: "Remove from bookmarks", - //SortingButtons sortBy: "Sort by:", difficulty: "Difficulty", @@ -1304,10 +1300,6 @@ let strings = new LocalizedStrings( backToEditing: "Tilbage til redigering", saveCopyToShare: "Gem kopi til deling", - //BookmarkButton - addToBookmarks: "Tilføj til bogmærker", - removeFromBookmarks: "Fjern fra bogmærker", - //SortingButtons sortBy: "Sorter efter:", difficulty: "Sværhedsgrad", diff --git a/src/pages/LogIn.js b/src/pages/LogIn.js index 31886668f..0a6d1da37 100644 --- a/src/pages/LogIn.js +++ b/src/pages/LogIn.js @@ -17,7 +17,7 @@ import Form from "./_pages_shared/Form.sc"; import FormSection from "./_pages_shared/FormSection.sc"; import FullWidthErrorMsg from "../components/FullWidthErrorMsg.sc"; import InputField from "../components/InputField"; -import Footer from "./_pages_shared/Footer.sc"; +import Footer from "./_pages_shared/CardPageFooter.sc"; import ButtonContainer from "./_pages_shared/ButtonContainer.sc"; import Button from "./_pages_shared/Button.sc"; diff --git a/src/pages/ResetPassword.js b/src/pages/ResetPassword.js index d2b12266e..37c5b8477 100644 --- a/src/pages/ResetPassword.js +++ b/src/pages/ResetPassword.js @@ -7,7 +7,7 @@ import CardPage from "./_pages_shared/CardPage"; import Header from "./_pages_shared/Header"; import PageTitle from "./_pages_shared/PageTitle.sc"; import Main from "./_pages_shared/Main.sc"; -import Footer from "./_pages_shared/Footer.sc"; +import Footer from "./_pages_shared/CardPageFooter.sc"; import ResetPasswordStep1 from "./ResetPasswordStep1"; import ResetPasswordStep2 from "./ResetPasswordStep2"; diff --git a/src/pages/DeleteAccount/DeleteAccount.js b/src/pages/Settings/DeleteAccount/DeleteAccount.js similarity index 80% rename from src/pages/DeleteAccount/DeleteAccount.js rename to src/pages/Settings/DeleteAccount/DeleteAccount.js index 76dbe6ee9..29fe55e5d 100644 --- a/src/pages/DeleteAccount/DeleteAccount.js +++ b/src/pages/Settings/DeleteAccount/DeleteAccount.js @@ -1,15 +1,15 @@ import { useEffect, useState, useContext } from "react"; -import { UserContext } from "../../contexts/UserContext"; -import CardPage from "../_pages_shared/CardPage"; -import Header from "../_pages_shared/Header"; -import PageTitle from "../_pages_shared/PageTitle.sc"; -import Main from "../_pages_shared/Main.sc"; -import Footer from "../_pages_shared/Footer.sc"; -import LoadingAnimation from "../../components/LoadingAnimation"; -import redirect from "../../utils/routing/routing"; -import SessionStorage from "../../assorted/SessionStorage"; -import { APP_DOMAIN } from "../../appConstants"; -import { APIContext } from "../../contexts/APIContext"; +import { UserContext } from "../../../contexts/UserContext"; +import CardPage from "../../_pages_shared/CardPage"; +import Header from "../../_pages_shared/Header"; +import PageTitle from "../../_pages_shared/PageTitle.sc"; +import Main from "../../_pages_shared/Main.sc"; +import Footer from "../../_pages_shared/CardPageFooter.sc"; +import LoadingAnimation from "../../../components/LoadingAnimation"; +import redirect from "../../../utils/routing/routing"; +import SessionStorage from "../../../assorted/SessionStorage"; +import { APP_DOMAIN } from "../../../appConstants"; +import { APIContext } from "../../../contexts/APIContext"; import { Capacitor } from "@capacitor/core"; const isCapacitor = () => { diff --git a/src/pages/DeleteAccount/DeleteAccountButton.js b/src/pages/Settings/DeleteAccount/DeleteAccountButton.js similarity index 69% rename from src/pages/DeleteAccount/DeleteAccountButton.js rename to src/pages/Settings/DeleteAccount/DeleteAccountButton.js index 5e39e6fa0..f0b0bbcc0 100644 --- a/src/pages/DeleteAccount/DeleteAccountButton.js +++ b/src/pages/Settings/DeleteAccount/DeleteAccountButton.js @@ -1,14 +1,14 @@ import { useState } from "react"; -import Modal from "../../components/modal_shared/Modal"; -import Header from "../../components/modal_shared/Header.sc"; -import ModalTitle from "../../components/modal_shared/ModalTitle.sc"; -import Main from "../../components/modal_shared/Main.sc"; -import Footer from "../../components/modal_shared/Footer.sc"; -import ButtonContainer from "../../components/modal_shared/ButtonContainer.sc"; -import * as s from "../../components/FormPage.sc"; -import redirect from "../../utils/routing/routing"; -import SessionStorage from "../../assorted/SessionStorage.js"; -import Button from "../_pages_shared/Button.sc"; +import Modal from "../../../components/modal_shared/Modal"; +import Header from "../../../components/modal_shared/Header.sc"; +import ModalTitle from "../../../components/modal_shared/ModalTitle.sc"; +import Main from "../../../components/modal_shared/Main.sc"; +import Footer from "../../../components/modal_shared/Footer.sc"; +import ButtonContainer from "../../../components/modal_shared/ButtonContainer.sc"; +import * as s from "../../../components/FormPage.sc"; +import redirect from "../../../utils/routing/routing"; +import SessionStorage from "../../../assorted/SessionStorage.js"; +import Button from "../../_pages_shared/Button.sc"; export default function DeleteAccountButton() { const [showConfirmationModal, setShowConfirmationModal] = useState(false); @@ -41,8 +41,8 @@ export default function DeleteAccountButton() {

- This will delete all the data associated with your account. Texts - you might have added will not be associated with your user anymore. + This will delete all the data associated with your account. Texts you might have added will not be + associated with your user anymore.

If you need to contact us, please reach us at diff --git a/src/pages/Settings/Pages/DeleteAccount.js b/src/pages/Settings/Pages/DeleteAccount.js index e7f9752eb..f3e021aa5 100644 --- a/src/pages/Settings/Pages/DeleteAccount.js +++ b/src/pages/Settings/Pages/DeleteAccount.js @@ -1,5 +1,5 @@ import { useEffect } from "react"; -import DeleteAccountButton from "../../DeleteAccount/DeleteAccountButton"; +import DeleteAccountButton from "../DeleteAccount/DeleteAccountButton"; import CardPage from "../../_pages_shared/CardPage"; import Main from "../../_pages_shared/Main.sc"; import SettingsPageHeader from "../SharedComponents/SettingsPageHeader"; diff --git a/src/pages/_pages_shared/Footer.sc.js b/src/pages/_pages_shared/CardPageFooter.sc.js similarity index 100% rename from src/pages/_pages_shared/Footer.sc.js rename to src/pages/_pages_shared/CardPageFooter.sc.js diff --git a/src/pages/onboarding/CreateAccount.js b/src/pages/onboarding/CreateAccount.js index 4d2616214..bd8ab67b2 100644 --- a/src/pages/onboarding/CreateAccount.js +++ b/src/pages/onboarding/CreateAccount.js @@ -27,7 +27,7 @@ import FullWidthErrorMsg from "../../components/FullWidthErrorMsg.sc"; import FormSection from "../_pages_shared/FormSection.sc"; import InputField from "../../components/InputField"; import useShadowRef from "../../hooks/useShadowRef"; -import Footer from "../_pages_shared/Footer.sc"; +import Footer from "../_pages_shared/CardPageFooter.sc"; import ButtonContainer from "../_pages_shared/ButtonContainer.sc"; import Button from "../_pages_shared/Button.sc"; import Modal from "../../components/modal_shared/Modal"; diff --git a/src/pages/onboarding/ExtensionInstalled.js b/src/pages/onboarding/ExtensionInstalled.js index 48fd2823d..10ebea6cd 100644 --- a/src/pages/onboarding/ExtensionInstalled.js +++ b/src/pages/onboarding/ExtensionInstalled.js @@ -7,7 +7,7 @@ import PageTitle from "../_pages_shared/PageTitle.sc"; import Main from "../_pages_shared/Main.sc"; import FullWidthImage from "../../components/FullWidthImage"; import ButtonContainer from "../_pages_shared/ButtonContainer.sc"; -import Footer from "../_pages_shared/Footer.sc"; +import Footer from "../_pages_shared/CardPageFooter.sc"; import Button from "../_pages_shared/Button.sc"; import strings from "../../i18n/definitions"; diff --git a/src/pages/onboarding/InstallExtension.js b/src/pages/onboarding/InstallExtension.js index b6625b609..db2a1747e 100644 --- a/src/pages/onboarding/InstallExtension.js +++ b/src/pages/onboarding/InstallExtension.js @@ -9,7 +9,7 @@ import Header from "../_pages_shared/Header"; import PageTitle from "../_pages_shared/PageTitle.sc"; import Main from "../_pages_shared/Main.sc"; import ButtonContainer from "../_pages_shared/ButtonContainer.sc"; -import Footer from "../_pages_shared/Footer.sc"; +import Footer from "../_pages_shared/CardPageFooter.sc"; import Button from "../_pages_shared/Button.sc"; import FullWidthImage from "../../components/FullWidthImage"; import RoundedForwardArrow from "@mui/icons-material/ArrowForwardRounded"; diff --git a/src/pages/onboarding/SelectInterests.js b/src/pages/onboarding/SelectInterests.js index b4a64d58f..7cad38187 100644 --- a/src/pages/onboarding/SelectInterests.js +++ b/src/pages/onboarding/SelectInterests.js @@ -7,7 +7,7 @@ import Header from "../_pages_shared/Header"; import PageTitle from "../_pages_shared/PageTitle.sc"; import Main from "../_pages_shared/Main.sc"; import ButtonContainer from "../_pages_shared/ButtonContainer.sc"; -import Footer from "../_pages_shared/Footer.sc"; +import Footer from "../_pages_shared/CardPageFooter.sc"; import Button from "../_pages_shared/Button.sc"; import Tag from "../_pages_shared/Tag.sc"; import TagContainer from "../_pages_shared/TagContainer.sc"; diff --git a/src/pages/onboarding/VerifyEmail.js b/src/pages/onboarding/VerifyEmail.js index f36f0c0ef..26ae3cf49 100644 --- a/src/pages/onboarding/VerifyEmail.js +++ b/src/pages/onboarding/VerifyEmail.js @@ -13,7 +13,7 @@ import Form from "../_pages_shared/Form.sc"; import FullWidthErrorMsg from "../../components/FullWidthErrorMsg.sc"; import FormSection from "../_pages_shared/FormSection.sc"; import InputField from "../../components/InputField"; -import Footer from "../_pages_shared/Footer.sc"; +import Footer from "../_pages_shared/CardPageFooter.sc"; import ButtonContainer from "../_pages_shared/ButtonContainer.sc"; import Button from "../_pages_shared/Button.sc"; import LocalStorage from "../../assorted/LocalStorage"; diff --git a/src/reader/ArticleAuthors.js b/src/reader/ArticleAuthors.js index 8b7225a5b..72dd5dc33 100644 --- a/src/reader/ArticleAuthors.js +++ b/src/reader/ArticleAuthors.js @@ -1,4 +1,5 @@ import * as s from "./ArticleReader.sc"; +//only visible if the article has authors (like is a teacher has written it), otherwise it is not rendered at all // Scrapers sometimes store a "published on " fragment as the first // author (e.g. "Publiceret D.", "Publié Le Mai À"). The backend now strips diff --git a/src/reader/ArticleLanguageModal.js b/src/reader/ArticleLanguageModal.js index 001e6e29b..252cc2048 100644 --- a/src/reader/ArticleLanguageModal.js +++ b/src/reader/ArticleLanguageModal.js @@ -22,15 +22,7 @@ function LevelBars({ level }) { aria-hidden="true" > {CEFR_BAR_GEOMETRY.map((bar, i) => ( - + ))} ); @@ -128,9 +120,7 @@ export default function ArticleLanguageModal({ <>

Article is above your level
-
- Do you want to adapt it before saving? -
+
Do you want to adapt it before saving?
); } else if (articleCefrLevel) { diff --git a/src/reader/ArticleReader.sc.js b/src/reader/ArticleReader.sc.js index c26c6dd1f..8b6968957 100644 --- a/src/reader/ArticleReader.sc.js +++ b/src/reader/ArticleReader.sc.js @@ -208,23 +208,6 @@ let Title = styled.div` line-height: 2em; `; -let BookmarkButton = styled.div` - cursor: pointer; - float: right; - img { - height: 1.4em; - } - - .tooltiptext { - visibility: hidden; - color: ${zeeguuOrange}; - } - - :hover .tooltiptext { - visibility: visible; - } -`; - let MainText = styled.div` font-size: 1.2em; /* 2em leading floated the lines too far apart to track comfortably; 1.7 @@ -480,7 +463,6 @@ export { TopReaderButtonsContainer, Toolbar, Title, - BookmarkButton, MainText, BottomFade, OrangeButton, diff --git a/src/reader/BookmarkButton.js b/src/reader/BookmarkButton.js deleted file mode 100644 index 1db48ce6e..000000000 --- a/src/reader/BookmarkButton.js +++ /dev/null @@ -1,19 +0,0 @@ -import strings from "../i18n/definitions"; - -export default function BookmarkButton({ bookmarked, toggleBookmarkedState }) { - let fileName = (bookmarked ? "bookmarked" : "not-bookmarked") + ".svg"; - let actionDescription = - //(bookmarked ? "Remove from" : "Add to") + " bookmarks"; - (bookmarked ? strings.removeFromBookmarks : strings.addToBookmarks) - - return ( - <> - {actionDescription} - {actionDescription} - - ); -} diff --git a/src/reader/TranslatableWord.js b/src/reader/TranslatableWord.js index a5704bdae..171b23b98 100644 --- a/src/reader/TranslatableWord.js +++ b/src/reader/TranslatableWord.js @@ -1,5 +1,6 @@ import { useState, useEffect, useRef } from "react"; import AlterMenu from "./AlterMenu"; +import TranslationDisplay from "./TranslationDisplay"; import extractDomain from "../utils/web/extractDomain"; import addProtocolToLink from "../utils/web/addProtocolToLink"; import redirect from "../utils/routing/routing"; @@ -7,7 +8,6 @@ import LinkOffIcon from "@mui/icons-material/LinkOff"; import VisibilityOffIcon from "@mui/icons-material/VisibilityOff"; import EditBookmarkModal from "../words/EditBookmarkModal"; - export default function TranslatableWord({ interactiveText, word, @@ -80,25 +80,32 @@ export default function TranslatableWord({ } // For MWE words, update prevWord to fused text and trigger re-render // This ensures the loading animation shows "suntem prezenți" not just "suntem" - const onFusionComplete = mweGroupId ? () => { - setPreviousWord(word.word); // word.word is now the fused MWE text - wordUpdated(); - } : null; - interactiveText.translate(word, true, () => { - wordUpdated(); - setIsLoading(false); - setIsWordTranslating(false); - setIsTranslationVisible(true); - // Clear MWE loading state - if (mweGroupId && setLoadingMWEGroupId) { - setLoadingMWEGroupId(null); - } - // Backend flagged a 3-way provider disagreement; surface the - // alternatives menu so the user can pick the right answer. - if (word.disagreement) { - openAlterMenu(word); - } - }, onFusionComplete); + const onFusionComplete = mweGroupId + ? () => { + setPreviousWord(word.word); // word.word is now the fused MWE text + wordUpdated(); + } + : null; + interactiveText.translate( + word, + true, + () => { + wordUpdated(); + setIsLoading(false); + setIsWordTranslating(false); + setIsTranslationVisible(true); + // Clear MWE loading state + if (mweGroupId && setLoadingMWEGroupId) { + setLoadingMWEGroupId(null); + } + // Backend flagged a 3-way provider disagreement; surface the + // alternatives menu so the user can pick the right answer. + if (word.disagreement) { + openAlterMenu(word); + } + }, + onFusionComplete, + ); } else { // For non-translatable words in exercises, track the click if (interactiveText.trackWordClick) { @@ -322,8 +329,10 @@ export default function TranslatableWord({ if (word.token.is_punct) { classes.push("punct", "no-hover"); } - if (word.token.is_left_punct || - (word.token.is_punct && word.prev && [":", ".", ","].includes(word.prev.word.trim()))) { + if ( + word.token.is_left_punct || + (word.token.is_punct && word.prev && [":", ".", ","].includes(word.prev.word.trim())) + ) { classes.push("left-punct"); } if (["–", "—", "\u201c", "\u2019", '"'].includes(word.word.trim())) { @@ -368,7 +377,9 @@ export default function TranslatableWord({ } function getWordClass(word) { - return [...getSpecialTokenClasses(word), ...getMWEClasses(word), ...getSolutionHighlightClasses()].filter(Boolean).join(" "); + return [...getSpecialTokenClasses(word), ...getMWEClasses(word), ...getSolutionHighlightClasses()] + .filter(Boolean) + .join(" "); } const wordClass = getWordClass(word); @@ -407,7 +418,8 @@ export default function TranslatableWord({ onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave} > - {word.word + (word.token.has_space === true && !word.word.endsWith("-") && !word.next?.word?.startsWith("-") ? " " : "")} + {word.word + + (word.token.has_space === true && !word.word.endsWith("-") && !word.next?.word?.startsWith("-") ? " " : "")} ); @@ -416,40 +428,21 @@ export default function TranslatableWord({ return ( <> - {word.translation && (isTranslationVisible || word.isTranslationVisible) && ( - - - - { - // Toggle both React state and word object flag - const newVisibility = !(isTranslationVisible || word.isTranslationVisible); - setIsTranslationVisible(newVisibility); - word.isTranslationVisible = newVisibility; - setShowingAlterMenu(false); - }} - /> - - toggleAlterMenu(e, word)}> - {word.translation} - - toggleAlterMenu(e, word)}> - {showingAlterMenu ? "▲" : "▼"} - - {word.mergedTokens.length > 1 && !word.mweExpression && ( - - { - unlinkLastWord(e, word); - }} - /> - - )} - - - )} + { + const newVisibility = !(isTranslationVisible || word.isTranslationVisible); + setIsTranslationVisible(newVisibility); + word.isTranslationVisible = newVisibility; + setShowingAlterMenu(false); + }} + /> {isWordTranslating ? ( {prevWord} diff --git a/src/reader/TranslationDisplay.js b/src/reader/TranslationDisplay.js new file mode 100644 index 000000000..7d7726abc --- /dev/null +++ b/src/reader/TranslationDisplay.js @@ -0,0 +1,48 @@ +import LinkOffIconButton from "../components/Icons/LinkOffIconButton"; +import VisibilityOffIconButton from "../components/Icons/VisibilityOffIconButton"; + +export default function TranslationDisplay({ + translation, + isTranslationVisible, + word, + showingAlterMenu, + refToTranslation, + toggleAlterMenu, + unlinkLastWord, + onTranslationVisibilityToggle, +}) { + if (!translation || !(isTranslationVisible || word.isTranslationVisible)) { + return null; + } + + return ( + + + + { + e.stopPropagation(); + onTranslationVisibilityToggle(); + }} + /> + + toggleAlterMenu(e, word)}> + {translation} + + toggleAlterMenu(e, word)}> + {showingAlterMenu ? "▲" : "▼"} + + {word.mergedTokens.length > 1 && !word.mweExpression && ( + + { + e.stopPropagation(); + unlinkLastWord(e, word); + }} + /> + + )} + + + ); +} diff --git a/src/stories/Bars/ExerciseSessionProgressBar.stories.js b/src/stories/Bars/ExerciseSessionProgressBar.stories.js new file mode 100644 index 000000000..af50d7a76 --- /dev/null +++ b/src/stories/Bars/ExerciseSessionProgressBar.stories.js @@ -0,0 +1,10 @@ +import ExerciseSessionProgressBar from "../../exercises/ExerciseSessionProgressBar"; + +export default { + title: "Bars/ExerciseSessionProgressBar", + component: ExerciseSessionProgressBar, +}; + +export const Default = { + render: () => , +}; diff --git a/src/stories/Bars/LevelIndicator.stories.js b/src/stories/Bars/LevelIndicator.stories.js new file mode 100644 index 000000000..e17743823 --- /dev/null +++ b/src/stories/Bars/LevelIndicator.stories.js @@ -0,0 +1,63 @@ +import LevelIndicator from "../../exercises/progressBars/levelIndicator/LevelIndicator"; + +export default { + title: "Bars/LevelIndicator", + component: LevelIndicator, +}; + +const bookmark = { + from: "learn", + to: "apprendre", + level: 2, + cooling_interval: 1, + is_last_in_cycle: false, +}; + +export const InProgress = { + args: { + bookmark, + userIsCorrect: false, + userIsWrong: false, + isGreyedOutBar: false, + }, +}; + +export const Correct = { + args: { + bookmark, + userIsCorrect: true, + userIsWrong: false, + isGreyedOutBar: false, + }, +}; + +export const Incorrect = { + args: { + bookmark, + userIsCorrect: false, + userIsWrong: true, + isGreyedOutBar: false, + }, +}; + +export const GreyedOut = { + args: { + bookmark: null, + userIsCorrect: false, + userIsWrong: false, + isGreyedOutBar: true, + }, +}; + +export const NewBookmark = { + args: { + bookmark: { + ...bookmark, + level: 0, + cooling_interval: null, + }, + userIsCorrect: false, + userIsWrong: false, + isGreyedOutBar: false, + }, +}; diff --git a/src/stories/BigComponents/AlternativeMenu.stories.js b/src/stories/BigComponents/AlternativeMenu.stories.js new file mode 100644 index 000000000..d53a21a79 --- /dev/null +++ b/src/stories/BigComponents/AlternativeMenu.stories.js @@ -0,0 +1,28 @@ +import AlterMenu from "../../reader/AlterMenu"; +import "../../index.css"; + +const baseWord = { + translation: "house", + alternatives: [ + { translation: "home", source: "Google - v1" }, + { translation: "dwelling", source: "Microsoft - v2" }, + ], + competing_translations: null, + disagreement: false, + mergedTokens: [], + _llmAsked: null, +}; + +export default { title: "BigComponents/AlterMenu", component: AlterMenu }; + +export const NoAlternatives = { + render: () => , +}; + +export const WithAlternatives = { + render: () => , +}; + +export const AskingLLM = { + render: () => , +}; diff --git a/src/stories/BigComponents/DifficultyFeedbackBox.stories.js b/src/stories/BigComponents/DifficultyFeedbackBox.stories.js new file mode 100644 index 000000000..7a66ecbc1 --- /dev/null +++ b/src/stories/BigComponents/DifficultyFeedbackBox.stories.js @@ -0,0 +1,23 @@ +import DifficultyFeedbackBox from "../../reader/DifficultyFeedbackBox"; + +export default { title: "BigComponents/DifficultyFeedbackBox", component: DifficultyFeedbackBox }; + +const noop = () => {}; + +export const TooEasy = { + render: () => ( + + ), +}; + +export const JustRight = { + render: () => ( + + ), +}; + +export const TooHard = { + render: () => ( + + ), +}; diff --git a/src/stories/BigComponents/ExerciseShell.stories.js b/src/stories/BigComponents/ExerciseShell.stories.js new file mode 100644 index 000000000..c58e71323 --- /dev/null +++ b/src/stories/BigComponents/ExerciseShell.stories.js @@ -0,0 +1,50 @@ +import * as s from "../../exercises/Exercises.sc"; + +export default { + title: "BigComponents/ExerciseShell", + component: s.ExercisesColumn, +}; + +export const Default = { + render: () => ( + +
+
+
Timer
+
+
+ + +
+

Translate the sentence

+

I have been learning a lot lately.

+ + +
+
+
+ ), +}; + +export const WithMessageAbove = { + render: () => ( + +
+
+
Timer
+
+
+ + Hint: Pay attention to verb tense + + +
+

Translate the sentence

+

I have been learning a lot lately.

+ + +
+
+
+ ), +}; diff --git a/src/stories/BigComponents/LikeFeedbackBox.stories.js b/src/stories/BigComponents/LikeFeedbackBox.stories.js new file mode 100644 index 000000000..591dd089a --- /dev/null +++ b/src/stories/BigComponents/LikeFeedbackBox.stories.js @@ -0,0 +1,17 @@ +import LikeFeedbackBox from "../../reader/LikeFeedbackBox"; + +export default { title: "BigComponents/LikeFeedbackBox", component: LikeFeedbackBox }; + +const noop = () => {}; + +export const Neutral = { + render: () => , +}; + +export const Liked = { + render: () => , +}; + +export const Disliked = { + render: () => , +}; diff --git a/src/stories/BigComponents/TextSizeControl.stories.js b/src/stories/BigComponents/TextSizeControl.stories.js new file mode 100644 index 000000000..7ed570243 --- /dev/null +++ b/src/stories/BigComponents/TextSizeControl.stories.js @@ -0,0 +1,12 @@ +import TextSizeControl from "../../components/Controls/TextSizeControl"; + +export default { + title: "BigComponents/TextSizeControl", + component: TextSizeControl, +}; + +export const Default = { + args: { + value: 16, + }, +}; diff --git a/src/stories/BigComponents/TranslationDisplay.stories.js b/src/stories/BigComponents/TranslationDisplay.stories.js new file mode 100644 index 000000000..a37a4699c --- /dev/null +++ b/src/stories/BigComponents/TranslationDisplay.stories.js @@ -0,0 +1,18 @@ +import TranslationDisplay from "../../reader/TranslationDisplay"; +import "../../index.css"; + +const baseWord = { + id: 1, + isTranslationVisible: true, + mergedTokens: [], + mweExpression: false, +}; + +export default { + title: "BigComponents/TranslationDisplay", + component: TranslationDisplay, +}; + +export const Default = { + render: () => , +}; diff --git a/src/stories/Buttons/Button.stories.js b/src/stories/Buttons/Button.stories.js new file mode 100644 index 000000000..045b01f2e --- /dev/null +++ b/src/stories/Buttons/Button.stories.js @@ -0,0 +1,78 @@ +import React from "react"; +import Button from "../../pages/_pages_shared/Button.sc"; + +export default { + title: "Buttons/Button", + component: Button, + args: { + children: "Continue", + }, +}; + +export const Default = {}; + +export const Small = { + args: { + className: "small", + }, +}; + +export const LeftAligned = { + args: { + className: "left-aligned", + }, +}; + +export const Warning = { + args: { + className: "warning small", + }, +}; + +export const Grey = { + args: { + className: "grey small", + }, +}; + +export const Pressed = { + args: { + className: "pressed", + }, +}; + +export const FullWidth = { + args: { + className: "full-width-btn", + }, +}; + +export const SmallSquare = { + args: { + className: "small-square-btn", + }, +}; + +export const SmallBorder = { + args: { + className: "small-border-btn", + }, +}; + +export const Blue = { + args: { + className: "blue-btn", + }, +}; + +export const White = { + args: { + className: "small-border-btn white-btn", + }, +}; + +export const BlueOutline = { + args: { + className: "small-border-btn blue-outline-btn", + }, +}; diff --git a/src/stories/Buttons/ButtonContainer.stories.js b/src/stories/Buttons/ButtonContainer.stories.js new file mode 100644 index 000000000..134b9f7d9 --- /dev/null +++ b/src/stories/Buttons/ButtonContainer.stories.js @@ -0,0 +1,50 @@ +import React from "react"; +import ButtonContainer from "../../pages/_pages_shared/ButtonContainer.sc"; +import Button from "../../pages/_pages_shared/Button.sc"; + +export default { + title: "Buttons/ButtonContainer", + component: ButtonContainer, +}; + +export const Default = { + render: () => ( + + + + ), +}; + +export const Link = { + render: () => ( + + + Learn more + + + ), +}; + +export const AdaptiveAlignmentHorizontal = { + render: () => ( + + + + ), +}; + +export const VerticalPaddingMedium = { + render: () => ( + + + + ), +}; + +export const VerticalPaddingLarge = { + render: () => ( + + + + ), +}; diff --git a/src/stories/Buttons/ExerciseButtons.stories.js b/src/stories/Buttons/ExerciseButtons.stories.js new file mode 100644 index 000000000..252e3f90f --- /dev/null +++ b/src/stories/Buttons/ExerciseButtons.stories.js @@ -0,0 +1,99 @@ +import * as s from "../../exercises/exerciseTypes/Exercise.sc"; + +export default { + title: "Buttons/ExerciseButtons", +}; + +export const OrangeButton = { + render: () => ( +
+ Orange button +
+ ), +}; + +export const FeedbackButton = { + render: () => ( +
+ Next +
+ ), +}; + +export const StyledGreyButton = { + render: () => ( +
+ Show solution +
+ ), +}; + +export const BlueButton = { + render: () => ( +
+ Change example +
+ ), +}; + +export const MatchButton = { + render: () => ( +
+ Match option +
+ ), +}; + +export const LeftFeedbackButton = { + render: () => ( +
+ Hint +
+ ), +}; +export const RightFeedbackButton = { + render: () => ( +
+ Check +
+ ), +}; + +export const ReportButton = { + render: () => ( +
+ Report +
+ ), +}; + +export const ReportedBadge = { + render: () => ( +
+ Reported +
+ ), +}; + +export const AnimatedOrangeButton = { + render: () => ( +
+ Wrong answer +
+ ), +}; +export const AnimatedMatchButton = { + render: () => ( +
+ Wrong match +
+ ), +}; + +export const AnimatedInput = { + render: () => ( +
+ +
+ ), +}; diff --git a/src/stories/Buttons/FriendActionButtons.stories.js b/src/stories/Buttons/FriendActionButtons.stories.js new file mode 100644 index 000000000..a0a9dc636 --- /dev/null +++ b/src/stories/Buttons/FriendActionButtons.stories.js @@ -0,0 +1,62 @@ +import { FriendActionButtons } from "../../profile/FriendActionButtons"; +import "../../index.css"; + +const friendActionHandlers = { + onAdd: () => {}, + onCancel: () => {}, + onAccept: () => {}, + onReject: () => {}, + onUnfriend: () => {}, +}; + +export default { + title: "Buttons/FriendActionButtons", + component: FriendActionButtons, +}; + +export const Add = { + render: () => ( + + ), +}; + +export const PendingRequestFromMe = { + render: () => ( + + ), +}; + +export const PendingRequestFromThem = { + render: () => ( + + ), +}; + +export const Accepted = { + render: () => ( + + ), +}; diff --git a/src/stories/Buttons/LogOutButton.stories.js b/src/stories/Buttons/LogOutButton.stories.js new file mode 100644 index 000000000..154cd9986 --- /dev/null +++ b/src/stories/Buttons/LogOutButton.stories.js @@ -0,0 +1,9 @@ +import LogOutButton from "../../pages/Settings/LogOut/LogOutButton"; +import "../../index.css"; + +export default { + title: "Buttons/LogOutButton", + component: LogOutButton, +}; + +export const Default = {}; diff --git a/src/stories/Buttons/ReviewWordsButton.stories.js b/src/stories/Buttons/ReviewWordsButton.stories.js new file mode 100644 index 000000000..220e2d9d3 --- /dev/null +++ b/src/stories/Buttons/ReviewWordsButton.stories.js @@ -0,0 +1,13 @@ +import ReviewWordsButton from "../../reader/ReviewVocabularyInfoBox"; +import "../../index.css"; + +export default { + title: "Buttons/ReviewWordsButton", + component: ReviewWordsButton, +}; + +export const Default = { + args: { + bookmarks: ["word1"], + }, +}; diff --git a/src/stories/Buttons/SaveAndEditButton.stories.js b/src/stories/Buttons/SaveAndEditButton.stories.js new file mode 100644 index 000000000..a4675f4dc --- /dev/null +++ b/src/stories/Buttons/SaveAndEditButton.stories.js @@ -0,0 +1,8 @@ +import SaveAndEditButton from "../../components/Buttons/SaveAndEditButton"; + +export default { + title: "Buttons/SaveAndEditButton", + component: SaveAndEditButton, +}; + +export const Default = {}; diff --git a/src/stories/Buttons/SelectionButton.stories.js b/src/stories/Buttons/SelectionButton.stories.js new file mode 100644 index 000000000..3948fcf22 --- /dev/null +++ b/src/stories/Buttons/SelectionButton.stories.js @@ -0,0 +1,18 @@ +import SelectionButton from "../../pages/_pages_shared/SelectionButton.sc"; + +export default { + title: "Buttons/SelectionButton", + component: SelectionButton, + args: { + children: "Continue", + }, +}; + +export const Default = {}; + +export const Selected = { + args: { + className: "selected", + children: "Selected option", + }, +}; diff --git a/src/stories/Buttons/SettingsItemButton.stories.js b/src/stories/Buttons/SettingsItemButton.stories.js new file mode 100644 index 000000000..09c9f1a3f --- /dev/null +++ b/src/stories/Buttons/SettingsItemButton.stories.js @@ -0,0 +1,9 @@ +import SettingsItemButton from "../../pages/Settings/SharedComponents/SettingsItemButton"; +import "../../index.css"; + +export default { + title: "Buttons/SettingsItemButton", + component: SettingsItemButton, +}; + +export const Default = {}; diff --git a/src/stories/Buttons/SpeakButton.stories.js b/src/stories/Buttons/SpeakButton.stories.js new file mode 100644 index 000000000..96bc2dd2b --- /dev/null +++ b/src/stories/Buttons/SpeakButton.stories.js @@ -0,0 +1,39 @@ +import SpeakButton from "../../exercises/exerciseTypes/SpeakButton"; + +export default { + title: "Buttons/SpeakButton", + component: SpeakButton, +}; + +export const Default = { + render: () => , +}; +export const Small = { + args: { styling: "small" }, +}; + +export const Inline = { + args: { styling: "inline" }, +}; + +export const Large = { + args: { styling: "large" }, +}; + +export const Selected = { + args: { + styling: "selected", + isSelected: true, + }, +}; + +export const Square = { + args: { styling: "square" }, +}; + +export const Speaking = { + args: { + styling: "next", + parentIsSpeakingControl: true, + }, +}; diff --git a/src/stories/Configure.mdx b/src/stories/Configure.mdx new file mode 100644 index 000000000..2edddcf9c --- /dev/null +++ b/src/stories/Configure.mdx @@ -0,0 +1,388 @@ +import { Meta } from "@storybook/addon-docs/blocks"; + +import Github from "./assets/github.svg"; +import Discord from "./assets/discord.svg"; +import Youtube from "./assets/youtube.svg"; +import Tutorials from "./assets/tutorials.svg"; +import Styling from "./assets/styling.png"; +import Context from "./assets/context.png"; +import Assets from "./assets/assets.png"; +import Docs from "./assets/docs.png"; +import Share from "./assets/share.png"; +import FigmaPlugin from "./assets/figma-plugin.png"; +import Testing from "./assets/testing.png"; +import Accessibility from "./assets/accessibility.png"; +import Theming from "./assets/theming.png"; +import AddonLibrary from "./assets/addon-library.png"; + +export const RightArrow = () => + + + + + +
+
+ # Configure your project + + Because Storybook works separately from your app, you'll need to configure it for your specific stack and setup. Below, explore guides for configuring Storybook with popular frameworks and tools. If you get stuck, learn how you can ask for help from our community. +
+
+
+ A wall of logos representing different styling technologies +

Add styling and CSS

+

Like with web applications, there are many ways to include CSS within Storybook. Learn more about setting up styling within Storybook.

+ Learn more +
+
+ An abstraction representing the composition of data for a component +

Provide context and mocking

+

Often when a story doesn't render, it's because your component is expecting a specific environment or context (like a theme provider) to be available.

+ Learn more +
+
+ A representation of typography and image assets +
+

Load assets and resources

+

To link static files (like fonts) to your projects and stories, use the + `staticDirs` configuration option to specify folders to load when + starting Storybook.

+ Learn more +
+
+
+
+
+
+ # Do more with Storybook + + Now that you know the basics, let's explore other parts of Storybook that will improve your experience. This list is just to get you started. You can customise Storybook in many ways to fit your needs. +
+ +
+
+
+ A screenshot showing the autodocs tag being set, pointing a docs page being generated +

Autodocs

+

Auto-generate living, + interactive reference documentation from your components and stories.

+ Learn more +
+
+ A browser window showing a Storybook being published to a chromatic.com URL +

Publish to Chromatic

+

Publish your Storybook to review and collaborate with your entire team.

+ Learn more +
+
+ Windows showing the Storybook plugin in Figma +

Figma Plugin

+

Embed your stories into Figma to cross-reference the design and live + implementation in one place.

+ Learn more +
+
+ Screenshot of tests passing and failing +

Testing

+

Use stories to test a component in all its variations, no matter how + complex.

+ Learn more +
+
+ Screenshot of accessibility tests passing and failing +

Accessibility

+

Automatically test your components for a11y issues as you develop.

+ Learn more +
+
+ Screenshot of Storybook in light and dark mode +

Theming

+

Theme Storybook's UI to personalize it to your project.

+ Learn more +
+
+
+
+
+
+

Addons

+

Integrate your tools with Storybook to connect workflows.

+ Discover all addons +
+
+ Integrate your tools with Storybook to connect workflows. +
+
+ +
+
+ Github logo + Join our contributors building the future of UI development. + + Star on GitHub +
+
+ Discord logo +
+ Get support and chat with frontend developers. + + Join Discord server +
+
+
+ Youtube logo +
+ Watch tutorials, feature previews and interviews. + + Watch on YouTube +
+
+
+ A book +

Follow guided walkthroughs on for key workflows.

+ + Discover tutorials +
+
+ + diff --git a/src/stories/Dialogs/CelebrationModal.stories.js b/src/stories/Dialogs/CelebrationModal.stories.js new file mode 100644 index 000000000..55f672113 --- /dev/null +++ b/src/stories/Dialogs/CelebrationModal.stories.js @@ -0,0 +1,12 @@ +import CelebrationModal from "../../exercises/CelebrationModal"; + +export default { + title: "Dialogs/CelebrationModal", + component: CelebrationModal, +}; + +export const Default = { + args: { + open: true, + }, +}; diff --git a/src/stories/Dialogs/ExplainTopicsModal.stories.js b/src/stories/Dialogs/ExplainTopicsModal.stories.js new file mode 100644 index 000000000..4f77947c7 --- /dev/null +++ b/src/stories/Dialogs/ExplainTopicsModal.stories.js @@ -0,0 +1,10 @@ +import ExplainTopicsModal from "../../pages/ExplainTopicsModal"; + +export default { + title: "Dialogs/ExplainTopicsModal", + component: ExplainTopicsModal, +}; + +export const Default = { + render: () => , +}; diff --git a/src/stories/Dialogs/KeyboardTestSection.stories.js b/src/stories/Dialogs/KeyboardTestSection.stories.js new file mode 100644 index 000000000..18af0a232 --- /dev/null +++ b/src/stories/Dialogs/KeyboardTestSection.stories.js @@ -0,0 +1,20 @@ +import KeyboardTestSection from "../../pages/KeyboardTest/KeyboardTestSection"; +import "../../index.css"; + +export default { + title: "Dialogs/KeyboardTestSection", + component: KeyboardTestSection, +}; + +export const Danish = { + args: { + title: "Danish Keyboard (da)", + value: "", + onChange: () => {}, + placeholder: "Type or use the virtual keyboard below...", + languageCode: "da", + infoText: "Danish keyboard includes special characters: æ, ø, å", + inputMode: "none", + initialCollapsed: false, + }, +}; diff --git a/src/stories/Dialogs/LanguagesModal.stories.js b/src/stories/Dialogs/LanguagesModal.stories.js new file mode 100644 index 000000000..e50e688aa --- /dev/null +++ b/src/stories/Dialogs/LanguagesModal.stories.js @@ -0,0 +1,26 @@ +import { LanguagesModal } from "../../profile/LanguagesModal"; +import "../../index.css"; + +const activeLanguages = [ + { + code: "en", + language: "English", + daily_streak: 4, + max_streak: 12, + }, + { + code: "da", + language: "Danish", + daily_streak: 2, + max_streak: 8, + }, +]; + +export default { + title: "Dialogs/LanguagesModal", + component: LanguagesModal, +}; + +export const Default = { + render: () => {}} isOwnProfile={true} activeLanguages={activeLanguages} />, +}; diff --git a/src/stories/Dialogs/RemoveBookmarkModal.stories.js b/src/stories/Dialogs/RemoveBookmarkModal.stories.js new file mode 100644 index 000000000..1087b1201 --- /dev/null +++ b/src/stories/Dialogs/RemoveBookmarkModal.stories.js @@ -0,0 +1,51 @@ +import Header from "../../components/modal_shared/Header.sc"; +import Main from "../../components/modal_shared/Main.sc"; +import ModalTitle from "../../components/modal_shared/ModalTitle.sc"; +import ButtonContainer from "../../components/modal_shared/ButtonContainer.sc"; +import Button from "../../pages/_pages_shared/Button.sc"; +import Modal from "../../components/modal_shared/Modal"; +import FormSection from "../../pages/_pages_shared/FormSection.sc"; +import Form from "../../pages/_pages_shared/Form.sc"; +import TextField from "../../components/TextField"; + +export default { + title: "Dialogs/RemoveBookmarkModal", +}; + +export const Default = { + render: () => ( + +
+ Why remove learn/apprendre? +
+
+ + + + + +
+
+ ), +}; + +export const OtherFeedback = { + render: () => ( + +
+ Why remove learn/apprendre? +
+
+
+ + + + + + + +
+
+
+ ), +}; diff --git a/src/stories/Dialogs/ReplaceExampleModal.stories.js b/src/stories/Dialogs/ReplaceExampleModal.stories.js new file mode 100644 index 000000000..70de7a6ad --- /dev/null +++ b/src/stories/Dialogs/ReplaceExampleModal.stories.js @@ -0,0 +1,87 @@ +import * as s from "../../exercises/replaceExample/ReplaceExampleModal.sc"; + +export default { + title: "Dialogs/ReplaceExampleModal", +}; + +export const Default = { + render: () => ( + + + +

Replace Example

+ × +
+ + + Available Examples + + + "I have been learning for years" + Jeg har været ved at lære i årevis + B2 + + + + "We are studying hard" + Vi studerer hårdt + A2 + + + + "They have finished the project" + De har afsluttet projektet + B1 + + + + + + Cancel + Save + +
+
+ ), +}; + +export const Loading = { + render: () => ( + + + +

Replace Example

+ × +
+ + + +
Loading...
+

Finding alternative examples

+
+
+
+
+ ), +}; + +export const Empty = { + render: () => ( + + + +

Replace Example

+ × +
+ + + No alternative examples available for this word. + + + + Close + +
+
+ ), +}; diff --git a/src/stories/Dialogs/ReportDialog.stories.js b/src/stories/Dialogs/ReportDialog.stories.js new file mode 100644 index 000000000..310b8a377 --- /dev/null +++ b/src/stories/Dialogs/ReportDialog.stories.js @@ -0,0 +1,22 @@ +import ReportDialog from "../../components/ReportDialog"; +import "../../index.css"; + +export default { + title: "Dialogs/ReportDialog", + component: ReportDialog, +}; + +export const Default = { + args: { + open: true, + title: "Report broken article", + onClose: () => {}, + onFeedbackChange: () => {}, + onSubmit: () => {}, + feedback: "", + isSubmitting: false, + isFeedbackSent: false, + reportInfo: null, + error: null, + }, +}; diff --git a/src/stories/Dialogs/ReportExerciseDialog.stories.js b/src/stories/Dialogs/ReportExerciseDialog.stories.js new file mode 100644 index 000000000..cab72b0a3 --- /dev/null +++ b/src/stories/Dialogs/ReportExerciseDialog.stories.js @@ -0,0 +1,14 @@ +import ReportExerciseDialog from "../../exercises/exerciseTypes/ReportExerciseDialog"; + +export default { + title: "Dialogs/ReportExerciseDialog", + component: ReportExerciseDialog, +}; + +export const BeforeExercise = { + render: () => {}} isExerciseOver={false} />, +}; + +export const AfterExercise = { + render: () => {}} isExerciseOver={true} />, +}; diff --git a/src/stories/Dialogs/ResetPassword/ResetPasswordStep1.stories.js b/src/stories/Dialogs/ResetPassword/ResetPasswordStep1.stories.js new file mode 100644 index 000000000..6d5c88c7d --- /dev/null +++ b/src/stories/Dialogs/ResetPassword/ResetPasswordStep1.stories.js @@ -0,0 +1,20 @@ +import ResetPasswordStep1 from "../../../pages/ResetPasswordStep1"; +import "../../../index.css"; + +export default { + title: "Dialogs/ResetPassword/ResetPasswordStep1", + component: ResetPasswordStep1, +}; + +export const Default = { + render: () => ( + {}} + validateEmail={() => true} + isEmailValid={true} + emailErrorMsg={""} + notifyEmailSent={() => {}} + /> + ), +}; diff --git a/src/stories/Dialogs/ResetPassword/ResetPasswordStep2.stories.js b/src/stories/Dialogs/ResetPassword/ResetPasswordStep2.stories.js new file mode 100644 index 000000000..a6af3eeb8 --- /dev/null +++ b/src/stories/Dialogs/ResetPassword/ResetPasswordStep2.stories.js @@ -0,0 +1,11 @@ +import ResetPasswordStep2 from "../../../pages/ResetPasswordStep2"; +import "../../../index.css"; + +export default { + title: "Dialogs/ResetPassword/ResetPasswordStep2", + component: ResetPasswordStep2, +}; + +export const Default = { + render: () => , +}; diff --git a/src/stories/Dialogs/SharedArticleErrorDialog.stories.js b/src/stories/Dialogs/SharedArticleErrorDialog.stories.js new file mode 100644 index 000000000..620b9de43 --- /dev/null +++ b/src/stories/Dialogs/SharedArticleErrorDialog.stories.js @@ -0,0 +1,13 @@ +import ErrorDialog from "../../components/ErrorDialog"; +import "../../index.css"; + +export default { + title: "Dialogs/ErrorDialog", + component: ErrorDialog, +}; + +export const Default = { + args: { + title: "Could not open video", + }, +}; diff --git a/src/stories/Dialogs/UnfriendConfirmModal.stories.js b/src/stories/Dialogs/UnfriendConfirmModal.stories.js new file mode 100644 index 000000000..3d5a45ae2 --- /dev/null +++ b/src/stories/Dialogs/UnfriendConfirmModal.stories.js @@ -0,0 +1,16 @@ +import { UnfriendConfirmModal } from "../../profile/UnfriendConfirmModal"; + +export default { + title: "Dialogs/UnfriendConfirmModal", + component: UnfriendConfirmModal, +}; + +export const Default = { + args: { + open: true, + onClose: () => {}, + onConfirm: () => {}, + displayName: "Ada", + isPendingConfirm: false, + }, +}; diff --git a/src/stories/Exercises/OrderWordsInput.stories.js b/src/stories/Exercises/OrderWordsInput.stories.js new file mode 100644 index 000000000..942554977 --- /dev/null +++ b/src/stories/Exercises/OrderWordsInput.stories.js @@ -0,0 +1,58 @@ +import * as sOW from "../../exercises/exerciseTypes/orderWords/ExerciseTypeOW.sc.js"; +import OrderWordsInput from "../../exercises/exerciseTypes/orderWords/OrderWordsInput"; + +const wordPool = [ + { id: 1, word: "The", status: "normal", inUse: false, feedback: "" }, + { id: 2, word: "cat", status: "normal", inUse: false, feedback: "" }, + { id: 3, word: "is", status: "normal", inUse: false, feedback: "" }, + { id: 4, word: "sleeping", status: "normal", inUse: false, feedback: "" }, +]; + +const sentencePreview = [ + { id: 1, word: "The", status: "correct", inUse: true, feedback: "" }, + { id: 2, word: "cat", status: "incorrect", inUse: true, feedback: "A noun comes here." }, + { id: 3, word: "is", status: "normal", inUse: false, feedback: "" }, + { id: 4, word: "sleeping", status: "normal", inUse: false, feedback: "" }, +]; + +export default { + title: "Exercises/OrderWordsInput", + component: OrderWordsInput, + args: { + buttonOptions: wordPool, + isWordSoup: false, + isCorrect: false, + }, +}; + +export const Default = { + render: (args) => ( + + + + ), +}; + +export const WordSoup = { + render: (args) => ( + + + + ), + args: { + buttonOptions: wordPool, + isWordSoup: true, + }, +}; + +export const Constructed = { + render: (args) => ( + + + + ), + args: { + buttonOptions: sentencePreview, + isWordSoup: false, + }, +}; diff --git a/src/stories/Headers/ExerciseInstructionHeader.stories.js b/src/stories/Headers/ExerciseInstructionHeader.stories.js new file mode 100644 index 000000000..5d8331dd5 --- /dev/null +++ b/src/stories/Headers/ExerciseInstructionHeader.stories.js @@ -0,0 +1,13 @@ +import ExerciseInstructionHeader from "../../exercises/components/ExerciseInstructionHeader"; + +export default { + title: "Headers/ExerciseInstructionHeader", + component: ExerciseInstructionHeader, + args: { + headline: "Instruction Header", + l2Prompt: "example", + isExerciseOver: false, + }, +}; + +export const Default = {}; diff --git a/src/stories/Headers/Header.stories.js b/src/stories/Headers/Header.stories.js new file mode 100644 index 000000000..64387962b --- /dev/null +++ b/src/stories/Headers/Header.stories.js @@ -0,0 +1,18 @@ +import Header from "../../pages/_pages_shared/Header"; + +export default { + title: "Headers/Header", + component: Header, +}; + +export const Default = { + render: () =>
Header Content
, +}; + +export const WithoutLogo = { + render: () =>
Header Content
, +}; + +export const ShowVersion = { + render: () =>
Header Content
, +}; diff --git a/src/stories/Headers/LandingPageTopNav.stories.js b/src/stories/Headers/LandingPageTopNav.stories.js new file mode 100644 index 000000000..27d9b1cac --- /dev/null +++ b/src/stories/Headers/LandingPageTopNav.stories.js @@ -0,0 +1,15 @@ +import LandingPageTopNav from "../../landingPage/LandingPageTopNav"; +import { MemoryRouter } from "react-router-dom"; + +export default { + title: "Headers/LandingPageTopNav", + component: LandingPageTopNav, +}; + +export const Default = { + render: () => ( + + + + ), +}; diff --git a/src/stories/Headers/ProfileHeaderCard.stories.js b/src/stories/Headers/ProfileHeaderCard.stories.js new file mode 100644 index 000000000..8f54b37c1 --- /dev/null +++ b/src/stories/Headers/ProfileHeaderCard.stories.js @@ -0,0 +1,37 @@ +import { ProfileHeaderCard } from "../../profile/ProfileHeaderCard"; +import "../../index.css"; + +const profileData = { + username: "witty beaver", + name: "Ada Lovelace", + created_at: "2024-01-10T00:00:00.000Z", + user_avatar: { + image_name: "avatar-1", + character_color: "#2f80ed", + background_color: "#f2f2f2", + }, + friendship: null, +}; + +export default { + title: "Headers/ProfileHeaderCard", + component: ProfileHeaderCard, +}; + +export const Default = { + render: () => ( + {}} + onEditProfile={() => {}} + friendActionHandlers={{}} + isPendingFriendAction={false} + /> + ), +}; diff --git a/src/stories/Headers/SettingsPageHeader.stories.js b/src/stories/Headers/SettingsPageHeader.stories.js new file mode 100644 index 000000000..4d3978c6f --- /dev/null +++ b/src/stories/Headers/SettingsPageHeader.stories.js @@ -0,0 +1,13 @@ +import SettingsPageHeader from "../../pages/Settings/SharedComponents/SettingsPageHeader"; +import "../../index.css"; + +export default { + title: "Headers/SettingsPageHeader", + component: SettingsPageHeader, +}; + +export const Default = { + args: { + title: "Settings", + }, +}; diff --git a/src/stories/Icons/BackArrow.stories.js b/src/stories/Icons/BackArrow.stories.js new file mode 100644 index 000000000..82aaf2c3f --- /dev/null +++ b/src/stories/Icons/BackArrow.stories.js @@ -0,0 +1,15 @@ +import BackArrow from "../../pages/Settings/SharedComponents/BackArrow"; +import "../../index.css"; + +export default { + title: "Icons/BackArrow", + component: BackArrow, +}; + +export const Default = {}; + +export const WithRedirect = { + args: { + redirectLink: "/account_settings", + }, +}; diff --git a/src/stories/Icons/LinkOffButton.stories.js b/src/stories/Icons/LinkOffButton.stories.js new file mode 100644 index 000000000..ac94f0ee6 --- /dev/null +++ b/src/stories/Icons/LinkOffButton.stories.js @@ -0,0 +1,8 @@ +import LinkOffIcon from "../../components/Icons/LinkOffIconButton"; + +export default { + title: "Icons/LinkOffIcon", + component: LinkOffIcon, +}; + +export const Default = {}; diff --git a/src/stories/Icons/Logo.stories.js b/src/stories/Icons/Logo.stories.js new file mode 100644 index 000000000..89c8b444c --- /dev/null +++ b/src/stories/Icons/Logo.stories.js @@ -0,0 +1,8 @@ +import Logo from "../../pages/_pages_shared/Logo"; + +export default { + title: "Icons/Logo", + component: Logo, +}; + +export const Default = {}; diff --git a/src/stories/Icons/ReportIcon.stories.js b/src/stories/Icons/ReportIcon.stories.js new file mode 100644 index 000000000..c8d403366 --- /dev/null +++ b/src/stories/Icons/ReportIcon.stories.js @@ -0,0 +1,13 @@ +import ReportIcon from "../../components/Icons/ReportIcon"; +import "../../index.css"; + +export default { + title: "Icons/ReportIcon", + component: ReportIcon, +}; + +export const Default = { + args: { + onClick: () => {}, + }, +}; diff --git a/src/stories/Icons/ShareArticleButton.stories.js b/src/stories/Icons/ShareArticleButton.stories.js new file mode 100644 index 000000000..f3a1b1f5e --- /dev/null +++ b/src/stories/Icons/ShareArticleButton.stories.js @@ -0,0 +1,9 @@ +import ShareArticleIcon from "../../reader/ShareArticle"; +import "../../index.css"; + +export default { + title: "Icons/ShareArticleIcon", + component: ShareArticleIcon, +}; + +export const Default = {}; diff --git a/src/stories/Icons/VisibilityOffIconButton.stories.js b/src/stories/Icons/VisibilityOffIconButton.stories.js new file mode 100644 index 000000000..348acfbcd --- /dev/null +++ b/src/stories/Icons/VisibilityOffIconButton.stories.js @@ -0,0 +1,8 @@ +import VisibilityOffIconIcon from "../../components/Icons/VisibilityOffIconButton"; + +export default { + title: "Icons/VisibilityOffIcon", + component: VisibilityOffIconIcon, +}; + +export const Default = {}; diff --git a/src/stories/Items/SettingsItem.stories.js b/src/stories/Items/SettingsItem.stories.js new file mode 100644 index 000000000..a62c0af43 --- /dev/null +++ b/src/stories/Items/SettingsItem.stories.js @@ -0,0 +1,27 @@ +import SettingsItem from "../../pages/Settings/SharedComponents/SettingsItem"; +import { MemoryRouter } from "react-router-dom"; +import "../../index.css"; + +export default { + title: "Items/SettingsItem", + component: SettingsItem, + decorators: [ + (Story) => ( + + + + ), + ], +}; + +export const Default = { + render: () => Profile Details, +}; + +export const WithState = { + render: () => ( + + Language Settings + + ), +}; diff --git a/src/stories/Lists&Tables/Contributors.stories.js b/src/stories/Lists&Tables/Contributors.stories.js new file mode 100644 index 000000000..cdc6aa7e2 --- /dev/null +++ b/src/stories/Lists&Tables/Contributors.stories.js @@ -0,0 +1,10 @@ +import Contributors from "../../landingPage/Contributors"; + +export default { + title: "Lists&Tables/Contributors", + component: Contributors, +}; + +export const Default = { + render: () => , +}; diff --git a/src/stories/Lists&Tables/FriendRow.stories.js b/src/stories/Lists&Tables/FriendRow.stories.js new file mode 100644 index 000000000..2152d9c1b --- /dev/null +++ b/src/stories/Lists&Tables/FriendRow.stories.js @@ -0,0 +1,26 @@ +import FriendRow from "../../friends/FriendRow"; + +export default { + title: "Lists&Tables/FriendRow", + component: FriendRow, +}; + +const sampleUser = { + username: "brad", + name: "Brad Pitt", + avatar: { + image_name: "1", + character_color: "blue", + background_color: "light", + }, + languages: [{ code: "en" }, { code: "es" }, { code: "fr" }], + friendship: { friend_streak: 12 }, +}; + +export const Default = { + render: () => ( +
    + +
+ ), +}; diff --git a/src/stories/Lists&Tables/LeaderboardRow.stories.js b/src/stories/Lists&Tables/LeaderboardRow.stories.js new file mode 100644 index 000000000..bcf597451 --- /dev/null +++ b/src/stories/Lists&Tables/LeaderboardRow.stories.js @@ -0,0 +1,26 @@ +import LeaderboardRow from "../../leaderboards/LeaderboardRow"; + +export default { + title: "Lists&Tables/LeaderboardRow", + component: LeaderboardRow, +}; + +const sampleUser = { + username: "brad", + name: "Brad Pitt", + avatar: { + image_name: "1", + character_color: "blue", + background_color: "light", + }, +}; + +export const Default = { + render: () => ( + + + + +
+ ), +}; diff --git a/src/stories/Lists&Tables/ListOfSettingsItems.stories.js b/src/stories/Lists&Tables/ListOfSettingsItems.stories.js new file mode 100644 index 000000000..89aa17441 --- /dev/null +++ b/src/stories/Lists&Tables/ListOfSettingsItems.stories.js @@ -0,0 +1,26 @@ +import ListOfSettingsItems from "../../pages/Settings/SharedComponents/ListOfSettingsItems"; +import SettingsItem from "../../pages/Settings/SharedComponents/SettingsItem"; +import { MemoryRouter } from "react-router-dom"; +import "../../index.css"; + +export default { + title: "Lists&Tables/ListOfSettingsItems", + component: ListOfSettingsItems, + decorators: [ + (Story) => ( + + + + ), + ], +}; + +export const Default = { + render: () => ( + + Profile Details + Language Settings + Feed Preferences + + ), +}; diff --git a/src/stories/Messages/CorrectMessage.stories.js b/src/stories/Messages/CorrectMessage.stories.js new file mode 100644 index 000000000..5ffeac8df --- /dev/null +++ b/src/stories/Messages/CorrectMessage.stories.js @@ -0,0 +1,12 @@ +import CorrectMessage from "../../exercises/exerciseTypes/CorrectMessage"; + +export default { + title: "Messages/CorrectMessage", + component: CorrectMessage, +}; + +export const Default = { + args: { + info: "The exercise is correct!", + }, +}; diff --git a/src/stories/Messages/EmptyMessageState.stories.js b/src/stories/Messages/EmptyMessageState.stories.js new file mode 100644 index 000000000..db59d5549 --- /dev/null +++ b/src/stories/Messages/EmptyMessageState.stories.js @@ -0,0 +1,16 @@ +import EmptyMessageState from "../../components/EmptyMessageState"; + +export default { + title: "Messages/EmptyMessageState", + component: EmptyMessageState, + args: { + message: "some message", + fillHeight: true, + }, +}; + +export const Default = { + args: { + message: "The exercise is empty!", + }, +}; diff --git a/src/stories/Pages/CardPage.stories.js b/src/stories/Pages/CardPage.stories.js new file mode 100644 index 000000000..80941d1b1 --- /dev/null +++ b/src/stories/Pages/CardPage.stories.js @@ -0,0 +1,102 @@ +import CardPage from "../../pages/_pages_shared/CardPage"; +import { MemoryRouter } from "react-router-dom"; +import LogIn from "../../pages/LogIn"; +import NotFound from "../../pages/NotFound"; +import "../../index.css"; + +export default { + title: "Pages/CardPage", + component: CardPage, + args: { + pageWidth: "default", + layoutVariant: "default", + isBackgroundFixed: false, + isTransparent: false, + reducedPadding: false, + defaultEmail: "user@example.com", + defaultPassword: "password", + }, + decorators: [ + (Story) => ( + + + + ), + ], +}; + +export const Default = { + render: (args) => ( + +

Card Page

+

This is sample content inside the card.

+
+ ), +}; + +export const NarrowWidth = { + args: { + pageWidth: "narrow", + }, + render: (args) => ( + +

Narrow Card

+

Uses the narrow page width variant.

+
+ ), +}; + +export const CardUnderMenu = { + args: { + layoutVariant: "card-under-menu", + }, + render: (args) => ( + +

Card Under Menu

+

Uses the card-under-menu layout variant.

+
+ ), +}; + +export const FixedBackground = { + args: { + isBackgroundFixed: true, + }, + render: (args) => ( + +

Fixed Background

+

Backdrop is fixed to viewport.

+
+ ), +}; + +export const TransparentCard = { + args: { + isTransparent: true, + }, + render: (args) => ( + +

Transparent Card

+

Card surface background is transparent.

+
+ ), +}; + +export const ReducedPadding = { + args: { + reducedPadding: true, + }, + render: (args) => ( + +

Reduced Padding

+

Card uses compact inner spacing.

+
+ ), +}; +export const LoginPage = { + render: () => {}} />, +}; + +export const NotFoundPage = { + render: () => , +}; diff --git a/src/stories/Pages/Form.stories.js b/src/stories/Pages/Form.stories.js new file mode 100755 index 000000000..bbdd71b36 --- /dev/null +++ b/src/stories/Pages/Form.stories.js @@ -0,0 +1,17 @@ +import Form from "../../pages/_pages_shared/Form.sc"; +import Button from "../../pages/_pages_shared/Button.sc"; + +export default { + title: "Pages/Form", + component: Form, +}; + +export const Default = { + render: () => ( +
+ + + +
+ ), +}; diff --git a/src/stories/Pages/FormSection.stories.js b/src/stories/Pages/FormSection.stories.js new file mode 100644 index 000000000..afeec04c1 --- /dev/null +++ b/src/stories/Pages/FormSection.stories.js @@ -0,0 +1,16 @@ +import FormSection from "../../pages/_pages_shared/FormSection.sc"; + +export default { + title: "Pages/FormSection", + component: FormSection, +}; + +export const Default = { + render: () => ( + + + + We will only use this for account notifications. + + ), +}; diff --git a/src/stories/Pages/HowToDeleteAccount.stories.js b/src/stories/Pages/HowToDeleteAccount.stories.js new file mode 100644 index 000000000..4a359e266 --- /dev/null +++ b/src/stories/Pages/HowToDeleteAccount.stories.js @@ -0,0 +1,9 @@ +import HowToDeleteAccount from "../../pages/HowToDeleteAccount"; +import "../../index.css"; + +export default { + title: "Pages/HowToDeleteAccount", + component: HowToDeleteAccount, +}; + +export const Default = {}; diff --git a/src/stories/Pills/Tag.stories.js b/src/stories/Pills/Tag.stories.js new file mode 100644 index 000000000..5bda50db4 --- /dev/null +++ b/src/stories/Pills/Tag.stories.js @@ -0,0 +1,48 @@ +import Tag from "../../pages/_pages_shared/Tag.sc"; +import TagContainer from "../../pages/_pages_shared/TagContainer.sc"; + +export default { + title: "Pills/Tag", + component: Tag, + args: { + children: "Tag", + }, +}; + +export const Default = {}; + +export const Small = { + args: { + className: "small", + }, +}; + +export const OutlinedOrange = { + args: { + className: "outlined-orange", + }, +}; + +export const OutlinedBlue = { + args: { + className: "outlined-blue", + }, +}; + +export const Selected = { + args: { + className: "selected", + children: "Selected tag", + }, +}; + +// TagContainer is the wrapper that arranges multiple tags in a row/wrap layout. +export const MultipleTags = () => ( + + News + tag + Sport + Science + Story + +); diff --git a/src/stories/Tabs/ProfileTabs.stories.js b/src/stories/Tabs/ProfileTabs.stories.js new file mode 100644 index 000000000..7b219d12c --- /dev/null +++ b/src/stories/Tabs/ProfileTabs.stories.js @@ -0,0 +1,18 @@ +import { ProfileTabs } from "../../profile/ProfileTabs"; + +export default { + title: "Tabs/ProfileTabs", + component: ProfileTabs, +}; + +export const Default = { + args: { + tabs: [ + { key: "profile", label: "Profile" }, + { key: "settings", label: "Settings" }, + ], + activeTab: "profile", + onTabChange: () => {}, + children:
Profile content
, + }, +}; diff --git a/src/stories/Text/SolutionFeedbackLinks.stories.js b/src/stories/Text/SolutionFeedbackLinks.stories.js new file mode 100755 index 000000000..ee2db06dd --- /dev/null +++ b/src/stories/Text/SolutionFeedbackLinks.stories.js @@ -0,0 +1,52 @@ +import SolutionFeedbackLinks from "../../exercises/exerciseTypes/SolutionFeedbackLinks"; +import { EXERCISE_TYPES } from "../../exercises/ExerciseTypeConstants"; + +export default { + title: "Text/SolutionFeedbackLinks", + component: SolutionFeedbackLinks, +}; + +const exerciseBookmark = { + from: "learn", + to: "вчити", + user_word_id: 1, +}; + +const commonArgs = { + exerciseBookmark, + exerciseType: EXERCISE_TYPES.translateL2toL1, + onReportClick: () => {}, +}; + +export const BeforeExercise = { + args: { + ...commonArgs, + isExerciseOver: false, + isReported: false, + }, +}; + +export const AfterExercise = { + args: { + ...commonArgs, + isExerciseOver: true, + isReported: false, + }, +}; + +export const WithShareLink = { + args: { + ...commonArgs, + isExerciseOver: true, + isReported: false, + shareableUrl: "https://zeeguu.org/exercise/example", + }, +}; + +export const Reported = { + args: { + ...commonArgs, + isExerciseOver: true, + isReported: true, + }, +}; diff --git a/src/stories/Toggles/DarkModeToggle.stories.js b/src/stories/Toggles/DarkModeToggle.stories.js new file mode 100644 index 000000000..76424313a --- /dev/null +++ b/src/stories/Toggles/DarkModeToggle.stories.js @@ -0,0 +1,31 @@ +import DarkModeToggle from "../../pages/Settings/ThemeToggle/DarkModeToggle"; +import { ThemeContext } from "../../contexts/ThemeContext"; +import "../../index.css"; + +const ThemeDecorator = (Story, { args }) => ( + {} }}> + + +); + +export default { + title: "Toggles/DarkModeToggle", + component: DarkModeToggle, + decorators: [ThemeDecorator], +}; + +export const Default = { + args: { + value: "auto", + }, +}; +export const LightMode = { + args: { + value: "light", + }, +}; +export const DarkMode = { + args: { + value: "dark", + }, +}; diff --git a/src/stories/Toggles/ToggleOption.stories.js b/src/stories/Toggles/ToggleOption.stories.js new file mode 100644 index 000000000..23c247d96 --- /dev/null +++ b/src/stories/Toggles/ToggleOption.stories.js @@ -0,0 +1,9 @@ +import ToggleOption from "../../components/Toggles/ToggleOption"; +import "../../index.css"; + +export default { + title: "Toggles/ToggleOption", + component: ToggleOption, +}; + +export const Default = {}; diff --git a/src/stories/assets/accessibility.png b/src/stories/assets/accessibility.png new file mode 100644 index 000000000..6ffe6feab Binary files /dev/null and b/src/stories/assets/accessibility.png differ diff --git a/src/stories/assets/accessibility.svg b/src/stories/assets/accessibility.svg new file mode 100644 index 000000000..107e93f83 --- /dev/null +++ b/src/stories/assets/accessibility.svg @@ -0,0 +1 @@ +Accessibility \ No newline at end of file diff --git a/src/stories/assets/addon-library.png b/src/stories/assets/addon-library.png new file mode 100644 index 000000000..95deb38a8 Binary files /dev/null and b/src/stories/assets/addon-library.png differ diff --git a/src/stories/assets/assets.png b/src/stories/assets/assets.png new file mode 100644 index 000000000..cfba6817a Binary files /dev/null and b/src/stories/assets/assets.png differ diff --git a/src/stories/assets/avif-test-image.avif b/src/stories/assets/avif-test-image.avif new file mode 100644 index 000000000..530709bc1 Binary files /dev/null and b/src/stories/assets/avif-test-image.avif differ diff --git a/src/stories/assets/context.png b/src/stories/assets/context.png new file mode 100644 index 000000000..e5cd249a2 Binary files /dev/null and b/src/stories/assets/context.png differ diff --git a/src/stories/assets/discord.svg b/src/stories/assets/discord.svg new file mode 100644 index 000000000..d638958b6 --- /dev/null +++ b/src/stories/assets/discord.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/stories/assets/docs.png b/src/stories/assets/docs.png new file mode 100644 index 000000000..a749629df Binary files /dev/null and b/src/stories/assets/docs.png differ diff --git a/src/stories/assets/figma-plugin.png b/src/stories/assets/figma-plugin.png new file mode 100644 index 000000000..8f79b08cd Binary files /dev/null and b/src/stories/assets/figma-plugin.png differ diff --git a/src/stories/assets/github.svg b/src/stories/assets/github.svg new file mode 100644 index 000000000..dc513528c --- /dev/null +++ b/src/stories/assets/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/stories/assets/share.png b/src/stories/assets/share.png new file mode 100644 index 000000000..8097a3707 Binary files /dev/null and b/src/stories/assets/share.png differ diff --git a/src/stories/assets/styling.png b/src/stories/assets/styling.png new file mode 100644 index 000000000..d341e8263 Binary files /dev/null and b/src/stories/assets/styling.png differ diff --git a/src/stories/assets/testing.png b/src/stories/assets/testing.png new file mode 100644 index 000000000..d4ac39a0c Binary files /dev/null and b/src/stories/assets/testing.png differ diff --git a/src/stories/assets/theming.png b/src/stories/assets/theming.png new file mode 100644 index 000000000..1535eb9b8 Binary files /dev/null and b/src/stories/assets/theming.png differ diff --git a/src/stories/assets/tutorials.svg b/src/stories/assets/tutorials.svg new file mode 100644 index 000000000..b492a9c66 --- /dev/null +++ b/src/stories/assets/tutorials.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/stories/assets/youtube.svg b/src/stories/assets/youtube.svg new file mode 100644 index 000000000..a7515d7e9 --- /dev/null +++ b/src/stories/assets/youtube.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/words/Learning.js b/src/words/Learning.js index 63c112429..491de27a7 100644 --- a/src/words/Learning.js +++ b/src/words/Learning.js @@ -2,7 +2,7 @@ import React, { useContext, useEffect, useState } from "react"; import { Link } from "react-router-dom"; import LoadingAnimation from "../components/LoadingAnimation"; -import EmptyState from "../components/EmptyState"; +import EmptyMessageState from "../components/EmptyMessageState"; import { setTitle } from "../assorted/setTitle"; import strings from "../i18n/definitions"; import Word from "./Word"; @@ -161,7 +161,7 @@ export default function Learning() { <> {inLearning.length === 0 && ( - diff --git a/src/words/SessionHistory.js b/src/words/SessionHistory.js index ff029a5b4..ef5434573 100644 --- a/src/words/SessionHistory.js +++ b/src/words/SessionHistory.js @@ -1,7 +1,7 @@ import { useState, useEffect, useContext } from "react"; import { Link } from "react-router-dom"; import LoadingAnimation from "../components/LoadingAnimation"; -import EmptyState from "../components/EmptyState"; +import EmptyMessageState from "../components/EmptyMessageState"; import strings from "../i18n/definitions"; import { setTitle } from "../assorted/setTitle"; import { APIContext } from "../contexts/APIContext"; @@ -558,7 +558,7 @@ export default function SessionHistory() { {loading && } {!loading && sessions && sessions.length === 0 && ( - + )} {!loading && sessions && sessions.length > 0 && } diff --git a/src/words/WordHistory.js b/src/words/WordHistory.js index 702fdaac2..fd96733da 100644 --- a/src/words/WordHistory.js +++ b/src/words/WordHistory.js @@ -6,7 +6,7 @@ import strings from "../i18n/definitions"; import * as sc from "../components/ColumnWidth.sc"; import { setTitle } from "../assorted/setTitle"; import { PageTitle } from "../components/PageTitle"; -import EmptyState from "../components/EmptyState"; +import EmptyMessageState from "../components/EmptyMessageState"; import { APIContext } from "../contexts/APIContext"; export default function ReadingHistory() { @@ -37,12 +37,7 @@ export default function ReadingHistory() { return ( {strings.wordHistoryTitle} - {wordsByDay.length === 0 && ( - - )} + {wordsByDay.length === 0 && } {wordsByDay.map((day) => ( ))} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..35c7bb11a --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES2020", + "lib": ["ES2020", "DOM"], + "jsx": "react-jsx", + "module": "ESNext", + "moduleResolution": "bundler", + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": false, + "resolveJsonModule": true, + "noEmit": true + }, + "include": ["src", ".storybook"], + "exclude": ["node_modules"] +} diff --git a/vitest.shims.d.ts b/vitest.shims.d.ts new file mode 100644 index 000000000..f923d47d4 --- /dev/null +++ b/vitest.shims.d.ts @@ -0,0 +1 @@ +/// \ No newline at end of file