From 334877b7abd216a6e2360cac305ac75018f50f65 Mon Sep 17 00:00:00 2001 From: Matthew Warman Date: Sun, 23 Aug 2026 06:30:48 -0400 Subject: [PATCH 01/41] initial changes for shared ui package --- package-lock.json | 140 ++++++++++++++-- package.json | 1 + packages/shared/components.json | 25 +++ packages/shared/package.json | 20 ++- .../src}/components/shadcn/alert.test.tsx | 0 .../src}/components/shadcn/alert.tsx | 2 +- packages/shared/src/index.ts | 6 +- packages/shared/src/styles/globals.css | 149 +++++++++++++++++ .../common => shared/src}/utils/css.test.ts | 0 .../src/common => shared/src}/utils/css.ts | 0 packages/shared/tsconfig.json | 9 +- packages/web/components.json | 12 +- packages/web/package.json | 13 +- .../common/components/Accordion/Accordion.tsx | 2 +- .../components/Alert/ErrorAlert.test.tsx | 2 +- .../common/components/Alert/ErrorAlert.tsx | 8 +- .../Alert/__stories__/ErrorAlert.stories.tsx | 2 +- .../common/components/Backdrop/Backdrop.tsx | 2 +- .../web/src/common/components/Badge/Badge.tsx | 2 +- .../components/Breadcrumbs/Breadcrumbs.tsx | 2 +- .../src/common/components/Button/Button.tsx | 2 +- .../web/src/common/components/Card/Card.tsx | 2 +- .../common/components/Card/MessageCard.tsx | 2 +- .../src/common/components/Content/Columns.tsx | 2 +- .../common/components/Content/Container.tsx | 2 +- .../src/common/components/Content/Page.tsx | 2 +- .../src/common/components/Dialog/Dialog.tsx | 2 +- .../src/common/components/Divider/Divider.tsx | 2 +- .../components/Dropdown/DropdownMenu.tsx | 2 +- .../src/common/components/Footer/Footer.tsx | 2 +- .../src/common/components/Form/Checkbox.tsx | 2 +- .../src/common/components/Form/FieldError.tsx | 2 +- .../web/src/common/components/Form/Input.tsx | 2 +- .../web/src/common/components/Form/Label.tsx | 2 +- .../src/common/components/Form/RadioGroup.tsx | 2 +- .../common/components/Form/SearchInput.tsx | 2 +- .../common/components/Form/SearchResult.tsx | 2 +- .../web/src/common/components/Form/Select.tsx | 2 +- .../src/common/components/Form/Textarea.tsx | 2 +- .../web/src/common/components/Form/Toggle.tsx | 2 +- .../web/src/common/components/Icon/Avatar.tsx | 2 +- .../web/src/common/components/Icon/FAIcon.tsx | 2 +- .../web/src/common/components/Link/Link.tsx | 2 +- .../src/common/components/Loader/Skeleton.tsx | 2 +- .../src/common/components/Loader/Spinner.tsx | 2 +- .../components/Menu/MenuCloseButton.tsx | 2 +- .../common/components/Menu/MenuNavLink.tsx | 2 +- .../common/components/Menu/MenuSeparator.tsx | 2 +- .../components/Menu/SideMenu/SideMenu.tsx | 2 +- .../Menu/SideMenu/SideMenuHeader.tsx | 2 +- .../src/common/components/Popover/Popover.tsx | 2 +- .../web/src/common/components/Table/Table.tsx | 2 +- .../web/src/common/components/Tabs/Tabs.tsx | 2 +- .../src/common/components/Text/Heading.tsx | 2 +- .../src/common/components/Text/HelpText.tsx | 2 +- .../web/src/common/components/Text/Text.tsx | 2 +- .../web/src/common/components/Toast/Toast.tsx | 2 +- .../shadcn/__stories__/alert.stories.tsx | 153 ------------------ packages/web/src/main.tsx | 2 +- .../Auth/Signin/components/SigninForm.tsx | 4 +- .../Components/components/AlertComponents.tsx | 2 +- .../components/AppearanceSettings.tsx | 2 +- .../pages/Tasks/components/Add/TaskAdd.tsx | 2 +- .../components/Chart/TaskStatusDonutChart.tsx | 2 +- .../components/Delete/TaskDeleteDialog.tsx | 2 +- .../components/Edit/TaskCompleteToggle.tsx | 2 +- .../pages/Tasks/components/Edit/TaskEdit.tsx | 4 +- .../pages/Tasks/components/Form/TaskForm.tsx | 2 +- .../pages/Tasks/components/List/TaskList.tsx | 2 +- .../Tasks/components/List/TaskListItem.tsx | 2 +- .../Tasks/components/TaskDetailLayout.tsx | 2 +- .../pages/Tasks/components/View/TaskView.tsx | 2 +- packages/web/tsconfig.json | 6 +- 73 files changed, 407 insertions(+), 255 deletions(-) create mode 100644 packages/shared/components.json rename packages/{web/src/common => shared/src}/components/shadcn/alert.test.tsx (100%) rename packages/{web/src/common => shared/src}/components/shadcn/alert.tsx (97%) create mode 100644 packages/shared/src/styles/globals.css rename packages/{web/src/common => shared/src}/utils/css.test.ts (100%) rename packages/{web/src/common => shared/src}/utils/css.ts (100%) delete mode 100644 packages/web/src/common/components/shadcn/__stories__/alert.stories.tsx diff --git a/package-lock.json b/package-lock.json index c6924d0c..a2853cb2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,6 +31,7 @@ "prettier": "3.9.6", "prettier-plugin-tailwindcss": "0.8.1", "rimraf": "6.1.3", + "shadcn": "4.18.0", "typescript": "5.9.3", "typescript-eslint": "8.67.0", "vitest": "4.1.10" @@ -954,6 +955,7 @@ "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": { @@ -965,6 +967,7 @@ "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": { @@ -975,6 +978,7 @@ "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": { @@ -988,6 +992,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1004,6 +1009,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1020,6 +1026,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1036,6 +1043,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1052,6 +1060,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1068,6 +1077,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1084,6 +1094,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1100,6 +1111,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1116,6 +1128,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1132,6 +1145,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1148,6 +1162,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1164,6 +1179,7 @@ "cpu": [ "loong64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1180,6 +1196,7 @@ "cpu": [ "mips64el" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1196,6 +1213,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1212,6 +1230,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1228,6 +1247,7 @@ "cpu": [ "s390x" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1244,6 +1264,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1260,6 +1281,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1276,6 +1298,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1292,6 +1315,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1308,6 +1332,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1324,6 +1349,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1340,6 +1366,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1356,6 +1383,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1372,6 +1400,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1388,6 +1417,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1867,6 +1897,7 @@ "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -1877,6 +1908,7 @@ "version": "2.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -1887,6 +1919,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -1896,12 +1929,14 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -2020,6 +2055,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.2.tgz", "integrity": "sha512-JfB4kuJQjaoHuCTseIINHtHWeJnvgEcxjwA5t/Y00ZgaOO1Crz3fjT/p8kT28zA/Caz7oiUMn3d6H2yOVCVwuw==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -4433,6 +4469,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4449,6 +4486,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4465,6 +4503,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4481,6 +4520,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4497,6 +4537,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4513,6 +4554,7 @@ "cpu": [ "arm64" ], + "dev": true, "libc": [ "glibc" ], @@ -4532,6 +4574,7 @@ "cpu": [ "arm64" ], + "dev": true, "libc": [ "musl" ], @@ -4551,6 +4594,7 @@ "cpu": [ "ppc64" ], + "dev": true, "libc": [ "glibc" ], @@ -4570,6 +4614,7 @@ "cpu": [ "s390x" ], + "dev": true, "libc": [ "glibc" ], @@ -4589,6 +4634,7 @@ "cpu": [ "x64" ], + "dev": true, "libc": [ "glibc" ], @@ -4608,6 +4654,7 @@ "cpu": [ "x64" ], + "dev": true, "libc": [ "musl" ], @@ -4627,6 +4674,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4643,6 +4691,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4659,6 +4708,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4672,6 +4722,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, "license": "MIT" }, "node_modules/@rollup/pluginutils": { @@ -4967,6 +5018,7 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.5", @@ -4982,6 +5034,7 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "dev": true, "license": "MIT", "engines": { "node": ">= 20" @@ -5008,6 +5061,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5024,6 +5078,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5040,6 +5095,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5056,6 +5112,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5072,6 +5129,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5088,6 +5146,7 @@ "cpu": [ "arm64" ], + "dev": true, "libc": [ "glibc" ], @@ -5107,6 +5166,7 @@ "cpu": [ "arm64" ], + "dev": true, "libc": [ "musl" ], @@ -5126,6 +5186,7 @@ "cpu": [ "x64" ], + "dev": true, "libc": [ "glibc" ], @@ -5145,6 +5206,7 @@ "cpu": [ "x64" ], + "dev": true, "libc": [ "musl" ], @@ -5172,6 +5234,7 @@ "cpu": [ "wasm32" ], + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -5193,6 +5256,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5209,6 +5273,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5222,6 +5287,7 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", + "dev": true, "license": "MIT", "dependencies": { "@tailwindcss/node": "4.3.3", @@ -5462,6 +5528,7 @@ "version": "0.10.3", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -5670,7 +5737,7 @@ "version": "26.2.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-26.2.0.tgz", "integrity": "sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "undici-types": "~8.3.0" @@ -7777,6 +7844,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, "license": "Apache-2.0", "engines": { "node": ">=8" @@ -7906,6 +7974,7 @@ "version": "5.24.5", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -8042,7 +8111,7 @@ "version": "0.28.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", - "devOptional": true, + "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { @@ -8591,6 +8660,7 @@ "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, "license": "MIT", "engines": { "node": ">=12.0.0" @@ -8796,6 +8866,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -9026,6 +9097,7 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, "license": "ISC" }, "node_modules/graphql": { @@ -9709,6 +9781,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" @@ -9914,6 +9987,7 @@ "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, "license": "MPL-2.0", "dependencies": { "detect-libc": "^2.0.3" @@ -9946,6 +10020,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -9966,6 +10041,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -9986,6 +10062,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -10006,6 +10083,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -10026,6 +10104,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -10046,6 +10125,7 @@ "cpu": [ "arm64" ], + "dev": true, "libc": [ "glibc" ], @@ -10069,6 +10149,7 @@ "cpu": [ "arm64" ], + "dev": true, "libc": [ "musl" ], @@ -10092,6 +10173,7 @@ "cpu": [ "x64" ], + "dev": true, "libc": [ "glibc" ], @@ -10115,6 +10197,7 @@ "cpu": [ "x64" ], + "dev": true, "libc": [ "musl" ], @@ -10138,6 +10221,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -10158,6 +10242,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -10304,6 +10389,7 @@ "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" @@ -10586,6 +10672,7 @@ "version": "3.3.17", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz", "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==", + "dev": true, "funding": [ { "type": "github", @@ -11099,12 +11186,14 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -11206,6 +11295,7 @@ "version": "8.5.26", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -12131,6 +12221,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.3.tgz", "integrity": "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==", + "dev": true, "license": "MIT", "dependencies": { "@oxc-project/types": "=0.143.0", @@ -12163,6 +12254,7 @@ "version": "0.143.0", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.143.0.tgz", "integrity": "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/Boshen" @@ -12709,6 +12801,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -13138,12 +13231,14 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "dev": true, "license": "MIT" }, "node_modules/tapable": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -13180,6 +13275,7 @@ "version": "0.2.17", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", @@ -13360,6 +13456,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/Wombosvideo" @@ -13506,7 +13603,7 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/unicorn-magic": { @@ -13727,6 +13824,7 @@ "version": "8.2.1", "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz", "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==", + "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.33.0", @@ -13804,6 +13902,7 @@ "version": "1.33.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, "license": "MPL-2.0", "dependencies": { "detect-libc": "^2.0.3" @@ -13836,6 +13935,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -13856,6 +13956,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -13876,6 +13977,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -13896,6 +13998,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -13916,6 +14019,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -13936,6 +14040,7 @@ "cpu": [ "arm64" ], + "dev": true, "libc": [ "glibc" ], @@ -13959,6 +14064,7 @@ "cpu": [ "arm64" ], + "dev": true, "libc": [ "musl" ], @@ -13982,6 +14088,7 @@ "cpu": [ "x64" ], + "dev": true, "libc": [ "glibc" ], @@ -14005,6 +14112,7 @@ "cpu": [ "x64" ], + "dev": true, "libc": [ "musl" ], @@ -14028,6 +14136,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -14048,6 +14157,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -14519,40 +14629,44 @@ }, "packages/shared": { "name": "@react-starter/shared", - "version": "1.8.0-alpha.1" + "version": "1.8.0-alpha.1", + "dependencies": { + "@fontsource-variable/inter": "5.3.0", + "class-variance-authority": "0.7.1", + "clsx": "2.1.1", + "radix-ui": "1.6.7", + "tailwind-merge": "3.6.0" + }, + "devDependencies": { + "tailwindcss": "4.3.3", + "tw-animate-css": "1.4.0" + } }, "packages/web": { "name": "@react-starter/web", "version": "1.8.0-alpha.1", "dependencies": { - "@fontsource-variable/inter": "5.3.0", "@fortawesome/fontawesome-svg-core": "7.3.1", "@fortawesome/free-regular-svg-icons": "7.3.1", "@fortawesome/free-solid-svg-icons": "7.3.1", "@fortawesome/react-fontawesome": "3.5.0", "@hookform/resolvers": "5.7.1", "@react-spring/web": "10.1.2", - "@tailwindcss/vite": "4.3.3", + "@react-starter/shared": "*", "@tanstack/react-query": "5.101.4", "@tanstack/react-query-devtools": "5.101.4", "@tanstack/react-table": "8.21.3", "axios": "1.19.0", - "class-variance-authority": "0.7.1", - "clsx": "2.1.1", "dayjs": "1.11.21", "i18next": "26.3.6", "i18next-browser-languagedetector": "8.2.1", "lodash": "4.18.1", "lucide-react": "1.31.0", - "radix-ui": "1.6.7", "react-hook-form": "7.85.0", "react-i18next": "17.0.11", "react-router-dom": "7.18.2", "react-syntax-highlighter": "16.1.1", "recharts": "3.10.1", - "tailwind-merge": "3.6.0", - "tailwindcss": "4.3.3", - "tw-animate-css": "1.4.0", "uuid": "14.0.1", "zod": "4.4.3" }, @@ -14562,6 +14676,7 @@ "@storybook/addon-onboarding": "10.5.7", "@storybook/addon-themes": "10.5.7", "@storybook/react-vite": "10.5.7", + "@tailwindcss/vite": "4.3.3", "@testing-library/jest-dom": "6.9.1", "@testing-library/react": "16.3.2", "@testing-library/user-event": "14.6.4", @@ -14573,7 +14688,6 @@ "@vitest/ui": "4.1.10", "jsdom": "29.1.1", "msw": "2.15.0", - "shadcn": "4.18.0", "storybook": "10.5.7", "vite": "8.2.1" } diff --git a/package.json b/package.json index 9be766cf..9053b9ec 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "prettier": "3.9.6", "prettier-plugin-tailwindcss": "0.8.1", "rimraf": "6.1.3", + "shadcn": "4.18.0", "typescript": "5.9.3", "typescript-eslint": "8.67.0", "vitest": "4.1.10" diff --git a/packages/shared/components.json b/packages/shared/components.json new file mode 100644 index 00000000..1e5ad674 --- /dev/null +++ b/packages/shared/components.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "radix-nova", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/styles/globals.css", + "baseColor": "mist", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "rtl": false, + "aliases": { + "components": "@react-starter/shared/components", + "lib": "@react-starter/shared/utils", + "hooks": "@react-starter/shared/hooks", + "utils": "@react-starter/shared/utils/css", + "ui": "@react-starter/shared/components/shadcn" + }, + "menuColor": "default", + "menuAccent": "subtle", + "registries": {} +} diff --git a/packages/shared/package.json b/packages/shared/package.json index 3119cfaa..4b7a2f92 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -3,11 +3,27 @@ "version": "1.8.0-alpha.1", "private": true, "type": "module", - "main": "./src/index.ts", + "exports": { + "./globals.css": "./src/styles/globals.css", + "./components/*": "./src/components/*", + "./hooks/*": "./src/hooks/*", + "./utils/*": "./src/utils/*" + }, "scripts": { - "build": "tsc --project tsconfig.build.json", + "build": "tsc --noEmit --project tsconfig.build.json", "clean": "rimraf coverage dist", "test": "vitest run --silent passed-only", "test:coverage": "vitest run --coverage --silent passed-only" + }, + "dependencies": { + "@fontsource-variable/inter": "5.3.0", + "class-variance-authority": "0.7.1", + "clsx": "2.1.1", + "radix-ui": "1.6.7", + "tailwind-merge": "3.6.0" + }, + "devDependencies": { + "tailwindcss": "4.3.3", + "tw-animate-css": "1.4.0" } } diff --git a/packages/web/src/common/components/shadcn/alert.test.tsx b/packages/shared/src/components/shadcn/alert.test.tsx similarity index 100% rename from packages/web/src/common/components/shadcn/alert.test.tsx rename to packages/shared/src/components/shadcn/alert.test.tsx diff --git a/packages/web/src/common/components/shadcn/alert.tsx b/packages/shared/src/components/shadcn/alert.tsx similarity index 97% rename from packages/web/src/common/components/shadcn/alert.tsx rename to packages/shared/src/components/shadcn/alert.tsx index dac76381..67a71269 100644 --- a/packages/web/src/common/components/shadcn/alert.tsx +++ b/packages/shared/src/components/shadcn/alert.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { cva, type VariantProps } from 'class-variance-authority'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; const alertVariants = cva( "group/alert relative grid w-full gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4", diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index cb0ff5c3..7b1aeceb 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -1 +1,5 @@ -export {}; +// Utilities +export { cn } from './utils/css'; + +// Components +export { Alert, AlertTitle, AlertDescription, AlertAction } from './components/shadcn/alert'; diff --git a/packages/shared/src/styles/globals.css b/packages/shared/src/styles/globals.css new file mode 100644 index 00000000..6508e97d --- /dev/null +++ b/packages/shared/src/styles/globals.css @@ -0,0 +1,149 @@ +@import 'tailwindcss'; +@import 'tw-animate-css'; +@import 'shadcn/tailwind.css'; +@import '@fontsource-variable/inter'; + +@custom-variant dark (&:is(.dark *)); +@source '../**/*.{ts,tsx}'; + +:root { + --background: oklch(1 0 0); + --foreground: oklch(0.148 0.004 228.8); + --card: oklch(1 0 0); + --card-foreground: oklch(0.148 0.004 228.8); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.148 0.004 228.8); + --primary: oklch(0.488 0.243 264.376); + --primary-foreground: oklch(0.97 0.014 254.604); + --secondary: oklch(0.967 0.001 286.375); + --secondary-foreground: oklch(0.21 0.006 285.885); + --muted: oklch(0.963 0.002 197.1); + --muted-foreground: oklch(0.56 0.021 213.5); + --accent: oklch(0.963 0.002 197.1); + --accent-foreground: oklch(0.218 0.008 223.9); + --destructive: oklch(0.577 0.245 27.325); + --info: oklch(0.922 0 0 / 90%); + --info-foreground: oklch(0.205 0 0); + --success: oklch(0.448 0.119 151.328 / 90%); + --success-foreground: oklch(1 0 0); + --warning: oklch(0.666 0.179 58.318); + --warning-foreground: oklch(0.205 0 0); + --border: oklch(0.925 0.005 214.3); + --input: oklch(0.925 0.005 214.3); + --ring: oklch(0.723 0.014 214.4); + --chart-1: oklch(0.879 0.169 91.605); + --chart-2: oklch(0.769 0.188 70.08); + --chart-3: oklch(0.666 0.179 58.318); + --chart-4: oklch(0.555 0.163 48.998); + --chart-5: oklch(0.473 0.137 46.201); + --radius: 0.625rem; + --sidebar: oklch(0.987 0.002 197.1); + --sidebar-foreground: oklch(0.148 0.004 228.8); + --sidebar-primary: oklch(0.546 0.245 262.881); + --sidebar-primary-foreground: oklch(0.97 0.014 254.604); + --sidebar-accent: oklch(0.963 0.002 197.1); + --sidebar-accent-foreground: oklch(0.218 0.008 223.9); + --sidebar-border: oklch(0.925 0.005 214.3); + --sidebar-ring: oklch(0.723 0.014 214.4); +} + +.dark { + --background: oklch(0.148 0.004 228.8); + --foreground: oklch(0.987 0.002 197.1); + --card: oklch(0.218 0.008 223.9); + --card-foreground: oklch(0.987 0.002 197.1); + --popover: oklch(0.218 0.008 223.9); + --popover-foreground: oklch(0.987 0.002 197.1); + --primary: oklch(0.424 0.199 265.638); + --primary-foreground: oklch(0.97 0.014 254.604); + --secondary: oklch(0.274 0.006 286.033); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.275 0.011 216.9); + --muted-foreground: oklch(0.723 0.014 214.4); + --accent: oklch(0.275 0.011 216.9); + --accent-foreground: oklch(0.987 0.002 197.1); + --destructive: oklch(0.704 0.191 22.216); + --info: oklch(0.922 0 0 / 90%); + --info-foreground: oklch(0.205 0 0); + --success: oklch(52.7% 0.154 150.069); + --success-foreground: oklch(1 0 0); + --warning: oklch(0.828 0.189 84.429 / 90%); + --warning-foreground: oklch(0.205 0 0); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.56 0.021 213.5); + --chart-1: oklch(0.879 0.169 91.605); + --chart-2: oklch(0.769 0.188 70.08); + --chart-3: oklch(0.666 0.179 58.318); + --chart-4: oklch(0.555 0.163 48.998); + --chart-5: oklch(0.473 0.137 46.201); + --sidebar: oklch(0.218 0.008 223.9); + --sidebar-foreground: oklch(0.987 0.002 197.1); + --sidebar-primary: oklch(0.623 0.214 259.815); + --sidebar-primary-foreground: oklch(0.97 0.014 254.604); + --sidebar-accent: oklch(0.275 0.011 216.9); + --sidebar-accent-foreground: oklch(0.987 0.002 197.1); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.56 0.021 213.5); +} + +@theme inline { + --font-sans: 'Inter Variable', sans-serif; + --color-sidebar-ring: var(--sidebar-ring); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar: var(--sidebar); + --color-chart-5: var(--chart-5); + --color-chart-4: var(--chart-4); + --color-chart-3: var(--chart-3); + --color-chart-2: var(--chart-2); + --color-chart-1: var(--chart-1); + --color-ring: var(--ring); + --color-input: var(--input); + --color-border: var(--border); + --color-destructive: var(--destructive); + --color-accent-foreground: var(--accent-foreground); + --color-accent: var(--accent); + --color-muted-foreground: var(--muted-foreground); + --color-muted: var(--muted); + --color-secondary-foreground: var(--secondary-foreground); + --color-secondary: var(--secondary); + --color-primary-foreground: var(--primary-foreground); + --color-primary: var(--primary); + --color-info: var(--info); + --color-info-foreground: var(--info-foreground); + --color-success: var(--success); + --color-success-foreground: var(--success-foreground); + --color-warning: var(--warning); + --color-warning-foreground: var(--warning-foreground); + --color-popover-foreground: var(--popover-foreground); + --color-popover: var(--popover); + --color-card-foreground: var(--card-foreground); + --color-card: var(--card); + --color-foreground: var(--foreground); + --color-background: var(--background); + --radius-sm: calc(var(--radius) * 0.6); + --radius-md: calc(var(--radius) * 0.8); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) * 1.4); + --radius-2xl: calc(var(--radius) * 1.8); + --radius-3xl: calc(var(--radius) * 2.2); + --radius-4xl: calc(var(--radius) * 2.6); + --font-heading: var(--font-sans); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } + html { + @apply font-sans; + } +} diff --git a/packages/web/src/common/utils/css.test.ts b/packages/shared/src/utils/css.test.ts similarity index 100% rename from packages/web/src/common/utils/css.test.ts rename to packages/shared/src/utils/css.test.ts diff --git a/packages/web/src/common/utils/css.ts b/packages/shared/src/utils/css.ts similarity index 100% rename from packages/web/src/common/utils/css.ts rename to packages/shared/src/utils/css.ts diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json index 792172fb..2e4e1402 100644 --- a/packages/shared/tsconfig.json +++ b/packages/shared/tsconfig.json @@ -1,8 +1,13 @@ { "extends": "../../tsconfig.base.json", "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "jsx": "react-jsx", + "noEmit": true, + "types": ["node", "vitest/globals", "@testing-library/jest-dom"], + "paths": { + "@react-starter/shared/*": ["./src/*"] + } }, "include": ["src"] } diff --git a/packages/web/components.json b/packages/web/components.json index 36d46575..3a26937e 100644 --- a/packages/web/components.json +++ b/packages/web/components.json @@ -5,7 +5,7 @@ "tsx": true, "tailwind": { "config": "", - "css": "src/index.css", + "css": "../shared/src/styles/globals.css", "baseColor": "mist", "cssVariables": true, "prefix": "" @@ -13,11 +13,11 @@ "iconLibrary": "lucide", "rtl": false, "aliases": { - "components": "src/common/components", - "utils": "src/common/utils/css", - "ui": "src/common/components/shadcn", - "lib": "src/common/utils", - "hooks": "src/common/hooks" + "components": "@/common/components", + "hooks": "@/common/hooks", + "lib": "@/common/utils", + "utils": "@react-starter/shared/utils/css", + "ui": "@react-starter/shared/components/shadcn" }, "menuColor": "default", "menuAccent": "subtle", diff --git a/packages/web/package.json b/packages/web/package.json index 59cc91ef..acd8b630 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -5,7 +5,7 @@ "type": "module", "main": "./src/main.tsx", "scripts": { - "build": "tsc && vite build", + "build": "tsc --noEmit && vite build", "build:storybook": "storybook build", "clean": "rimraf coverage dist storybook-static", "dev": "vite --open", @@ -15,34 +15,27 @@ "test:coverage": "vitest run --coverage --silent passed-only" }, "dependencies": { - "@fontsource-variable/inter": "5.3.0", "@fortawesome/fontawesome-svg-core": "7.3.1", "@fortawesome/free-regular-svg-icons": "7.3.1", "@fortawesome/free-solid-svg-icons": "7.3.1", "@fortawesome/react-fontawesome": "3.5.0", "@hookform/resolvers": "5.7.1", "@react-spring/web": "10.1.2", - "@tailwindcss/vite": "4.3.3", + "@react-starter/shared": "*", "@tanstack/react-query": "5.101.4", "@tanstack/react-query-devtools": "5.101.4", "@tanstack/react-table": "8.21.3", "axios": "1.19.0", - "class-variance-authority": "0.7.1", - "clsx": "2.1.1", "dayjs": "1.11.21", "i18next": "26.3.6", "i18next-browser-languagedetector": "8.2.1", "lodash": "4.18.1", "lucide-react": "1.31.0", - "radix-ui": "1.6.7", "react-hook-form": "7.85.0", "react-i18next": "17.0.11", "react-router-dom": "7.18.2", "react-syntax-highlighter": "16.1.1", "recharts": "3.10.1", - "tailwind-merge": "3.6.0", - "tailwindcss": "4.3.3", - "tw-animate-css": "1.4.0", "uuid": "14.0.1", "zod": "4.4.3" }, @@ -52,6 +45,7 @@ "@storybook/addon-onboarding": "10.5.7", "@storybook/addon-themes": "10.5.7", "@storybook/react-vite": "10.5.7", + "@tailwindcss/vite": "4.3.3", "@testing-library/jest-dom": "6.9.1", "@testing-library/react": "16.3.2", "@testing-library/user-event": "14.6.4", @@ -63,7 +57,6 @@ "@vitest/ui": "4.1.10", "jsdom": "29.1.1", "msw": "2.15.0", - "shadcn": "4.18.0", "storybook": "10.5.7", "vite": "8.2.1" } diff --git a/packages/web/src/common/components/Accordion/Accordion.tsx b/packages/web/src/common/components/Accordion/Accordion.tsx index 9b3d131e..6ff3fc72 100644 --- a/packages/web/src/common/components/Accordion/Accordion.tsx +++ b/packages/web/src/common/components/Accordion/Accordion.tsx @@ -2,7 +2,7 @@ import { createContext, PropsWithChildren, useCallback, useContext, useEffect, u import noop from 'lodash/noop'; import { animated, useSpring } from '@react-spring/web'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; import FAIcon from '../Icon/FAIcon'; diff --git a/packages/web/src/common/components/Alert/ErrorAlert.test.tsx b/packages/web/src/common/components/Alert/ErrorAlert.test.tsx index 1a449d87..11d6c7d0 100644 --- a/packages/web/src/common/components/Alert/ErrorAlert.test.tsx +++ b/packages/web/src/common/components/Alert/ErrorAlert.test.tsx @@ -2,7 +2,7 @@ import { describe, expect, it } from 'vitest'; import { render, screen } from '@/test/test-utils'; -import ErrorAlert from './ErrorAlert'; +import { ErrorAlert } from '@/common/components/Alert/ErrorAlert'; describe('ErrorAlert', () => { const descriptionValue = 'the description text'; diff --git a/packages/web/src/common/components/Alert/ErrorAlert.tsx b/packages/web/src/common/components/Alert/ErrorAlert.tsx index 24588fd6..5de55ab4 100644 --- a/packages/web/src/common/components/Alert/ErrorAlert.tsx +++ b/packages/web/src/common/components/Alert/ErrorAlert.tsx @@ -1,7 +1,7 @@ import { AlertCircleIcon } from 'lucide-react'; -import { cn } from '@/common/utils/css'; -import { Alert, AlertDescription, AlertTitle } from '@/common/components/shadcn/alert'; +import { cn } from '@react-starter/shared/utils/css'; +import { Alert, AlertDescription, AlertTitle } from '@react-starter/shared/components/shadcn/alert'; import { BaseComponentProps } from '@/common/utils/types'; /** @@ -16,7 +16,7 @@ export interface ErrorAlertProps extends BaseComponentProps { * The `ErrorAlert` component renders a bespoke `Alert` layout for error * messages. */ -const ErrorAlert = ({ className, description, testId = 'alert-error', title, ...props }: ErrorAlertProps) => { +export const ErrorAlert = ({ className, description, testId = 'alert-error', title, ...props }: ErrorAlertProps) => { return ( @@ -25,5 +25,3 @@ const ErrorAlert = ({ className, description, testId = 'alert-error', title, ... ); }; - -export default ErrorAlert; diff --git a/packages/web/src/common/components/Alert/__stories__/ErrorAlert.stories.tsx b/packages/web/src/common/components/Alert/__stories__/ErrorAlert.stories.tsx index 5de36b5a..46ec8d8f 100644 --- a/packages/web/src/common/components/Alert/__stories__/ErrorAlert.stories.tsx +++ b/packages/web/src/common/components/Alert/__stories__/ErrorAlert.stories.tsx @@ -1,6 +1,6 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; -import ErrorAlert from '../ErrorAlert'; +import { ErrorAlert } from '@/common/components/Alert/ErrorAlert'; const meta = { title: 'Common/Alert/ErrorAlert', diff --git a/packages/web/src/common/components/Backdrop/Backdrop.tsx b/packages/web/src/common/components/Backdrop/Backdrop.tsx index 407b7276..83853038 100644 --- a/packages/web/src/common/components/Backdrop/Backdrop.tsx +++ b/packages/web/src/common/components/Backdrop/Backdrop.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren } from 'react'; import { BaseComponentProps } from '@/common/utils/types'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; /** * Properties for the `Backdrop` component. diff --git a/packages/web/src/common/components/Badge/Badge.tsx b/packages/web/src/common/components/Badge/Badge.tsx index 56fd6d26..1001c93f 100644 --- a/packages/web/src/common/components/Badge/Badge.tsx +++ b/packages/web/src/common/components/Badge/Badge.tsx @@ -2,7 +2,7 @@ import { PropsWithChildren } from 'react'; import { cva, VariantProps } from 'class-variance-authority'; import { BaseComponentProps } from '@/common/utils/types'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; /** * Define the component base and variant styles. diff --git a/packages/web/src/common/components/Breadcrumbs/Breadcrumbs.tsx b/packages/web/src/common/components/Breadcrumbs/Breadcrumbs.tsx index a19dde9e..624cc93e 100644 --- a/packages/web/src/common/components/Breadcrumbs/Breadcrumbs.tsx +++ b/packages/web/src/common/components/Breadcrumbs/Breadcrumbs.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren } from 'react'; import { BaseComponentProps } from '@/common/utils/types'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { default as CommonLink, LinkProps as CommonLinkProps } from '@/common/components/Link/Link'; import FAIcon, { FAIconProps } from '../Icon/FAIcon'; diff --git a/packages/web/src/common/components/Button/Button.tsx b/packages/web/src/common/components/Button/Button.tsx index 0ddcef63..3ad1efd9 100644 --- a/packages/web/src/common/components/Button/Button.tsx +++ b/packages/web/src/common/components/Button/Button.tsx @@ -2,7 +2,7 @@ import { ButtonHTMLAttributes } from 'react'; import { cva, type VariantProps } from 'class-variance-authority'; import { PropsWithTestId } from '@/common/utils/types'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; /** * Define the component base and variant styles. diff --git a/packages/web/src/common/components/Card/Card.tsx b/packages/web/src/common/components/Card/Card.tsx index a3937fa1..ea1a0e53 100644 --- a/packages/web/src/common/components/Card/Card.tsx +++ b/packages/web/src/common/components/Card/Card.tsx @@ -1,7 +1,7 @@ import { ImgHTMLAttributes, PropsWithChildren } from 'react'; import { BaseComponentProps } from '@/common/utils/types'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import Divider from '../Divider/Divider'; /** diff --git a/packages/web/src/common/components/Card/MessageCard.tsx b/packages/web/src/common/components/Card/MessageCard.tsx index 43192fc5..4f2ce2db 100644 --- a/packages/web/src/common/components/Card/MessageCard.tsx +++ b/packages/web/src/common/components/Card/MessageCard.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import Card, { CardProps } from './Card'; import FAIcon, { FAIconProps } from '@/common/components/Icon/FAIcon'; diff --git a/packages/web/src/common/components/Content/Columns.tsx b/packages/web/src/common/components/Content/Columns.tsx index 57d30b47..92a6fe81 100644 --- a/packages/web/src/common/components/Content/Columns.tsx +++ b/packages/web/src/common/components/Content/Columns.tsx @@ -2,7 +2,7 @@ import { PropsWithChildren } from 'react'; import { cva, VariantProps } from 'class-variance-authority'; import { BaseComponentProps } from '@/common/utils/types'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; /** * Define the `Columns` component base and variant styles. diff --git a/packages/web/src/common/components/Content/Container.tsx b/packages/web/src/common/components/Content/Container.tsx index cc18a4a8..63009a82 100644 --- a/packages/web/src/common/components/Content/Container.tsx +++ b/packages/web/src/common/components/Content/Container.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren } from 'react'; import { cva, VariantProps } from 'class-variance-authority'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; /** diff --git a/packages/web/src/common/components/Content/Page.tsx b/packages/web/src/common/components/Content/Page.tsx index 701fe64d..8fb74dc4 100644 --- a/packages/web/src/common/components/Content/Page.tsx +++ b/packages/web/src/common/components/Content/Page.tsx @@ -1,6 +1,6 @@ import { PropsWithChildren } from 'react'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; /** diff --git a/packages/web/src/common/components/Dialog/Dialog.tsx b/packages/web/src/common/components/Dialog/Dialog.tsx index ea2e6057..0523862b 100644 --- a/packages/web/src/common/components/Dialog/Dialog.tsx +++ b/packages/web/src/common/components/Dialog/Dialog.tsx @@ -3,7 +3,7 @@ import noop from 'lodash/noop'; import { cva, VariantProps } from 'class-variance-authority'; import { BaseComponentProps } from '@/common/utils/types'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import Backdrop from '../Backdrop/Backdrop'; import Divider from '../Divider/Divider'; import { default as CommonButton, ButtonProps as CommonButtonProps } from '../Button/Button'; diff --git a/packages/web/src/common/components/Divider/Divider.tsx b/packages/web/src/common/components/Divider/Divider.tsx index a8f1af9e..abfbfab2 100644 --- a/packages/web/src/common/components/Divider/Divider.tsx +++ b/packages/web/src/common/components/Divider/Divider.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; /** diff --git a/packages/web/src/common/components/Dropdown/DropdownMenu.tsx b/packages/web/src/common/components/Dropdown/DropdownMenu.tsx index ffeac297..207c84ac 100644 --- a/packages/web/src/common/components/Dropdown/DropdownMenu.tsx +++ b/packages/web/src/common/components/Dropdown/DropdownMenu.tsx @@ -2,7 +2,7 @@ import { createContext, PropsWithChildren, useContext, useState } from 'react'; import noop from 'lodash/noop'; import { BaseComponentProps } from '@/common/utils/types'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import Backdrop from '../Backdrop/Backdrop'; import Divider from '../Divider/Divider'; diff --git a/packages/web/src/common/components/Footer/Footer.tsx b/packages/web/src/common/components/Footer/Footer.tsx index f4a81572..5bc4ed09 100644 --- a/packages/web/src/common/components/Footer/Footer.tsx +++ b/packages/web/src/common/components/Footer/Footer.tsx @@ -1,7 +1,7 @@ import dayjs from 'dayjs'; import { useTranslation } from 'react-i18next'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import type { BaseComponentProps } from '@/common/utils/types'; import Link from '@/common/components/Link/Link'; diff --git a/packages/web/src/common/components/Form/Checkbox.tsx b/packages/web/src/common/components/Form/Checkbox.tsx index 55eee771..2b9c629a 100644 --- a/packages/web/src/common/components/Form/Checkbox.tsx +++ b/packages/web/src/common/components/Form/Checkbox.tsx @@ -2,7 +2,7 @@ import { Control, FieldValues, Path, useController } from 'react-hook-form'; import { cva } from 'class-variance-authority'; import { BaseComponentProps } from '@/common/utils/types'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import Label from './Label'; import FieldError from './FieldError'; import HelpText from '../Text/HelpText'; diff --git a/packages/web/src/common/components/Form/FieldError.tsx b/packages/web/src/common/components/Form/FieldError.tsx index 8904ff73..41677096 100644 --- a/packages/web/src/common/components/Form/FieldError.tsx +++ b/packages/web/src/common/components/Form/FieldError.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; /** diff --git a/packages/web/src/common/components/Form/Input.tsx b/packages/web/src/common/components/Form/Input.tsx index 79fe2b59..091d95cd 100644 --- a/packages/web/src/common/components/Form/Input.tsx +++ b/packages/web/src/common/components/Form/Input.tsx @@ -1,7 +1,7 @@ import { InputHTMLAttributes } from 'react'; import { Control, FieldValues, Path, useController } from 'react-hook-form'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { PropsWithTestId } from '@/common/utils/types'; import Label from './Label'; import FieldError from './FieldError'; diff --git a/packages/web/src/common/components/Form/Label.tsx b/packages/web/src/common/components/Form/Label.tsx index e64969c3..5951a0c1 100644 --- a/packages/web/src/common/components/Form/Label.tsx +++ b/packages/web/src/common/components/Form/Label.tsx @@ -1,7 +1,7 @@ import { LabelHTMLAttributes } from 'react'; import { cva } from 'class-variance-authority'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; /** diff --git a/packages/web/src/common/components/Form/RadioGroup.tsx b/packages/web/src/common/components/Form/RadioGroup.tsx index 5a3d9861..e3e7214d 100644 --- a/packages/web/src/common/components/Form/RadioGroup.tsx +++ b/packages/web/src/common/components/Form/RadioGroup.tsx @@ -4,7 +4,7 @@ import { cva } from 'class-variance-authority'; import noop from 'lodash/noop'; import { PropsWithTestId } from '@/common/utils/types'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import Label from './Label'; import FieldError from './FieldError'; import HelpText from '../Text/HelpText'; diff --git a/packages/web/src/common/components/Form/SearchInput.tsx b/packages/web/src/common/components/Form/SearchInput.tsx index 9f6cf489..f688b0a5 100644 --- a/packages/web/src/common/components/Form/SearchInput.tsx +++ b/packages/web/src/common/components/Form/SearchInput.tsx @@ -1,6 +1,6 @@ import { ChangeEvent, type JSX, useEffect, useRef } from 'react'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; import FAIcon from '@/common/components/Icon/FAIcon'; diff --git a/packages/web/src/common/components/Form/SearchResult.tsx b/packages/web/src/common/components/Form/SearchResult.tsx index 85d038d8..5ad0b06b 100644 --- a/packages/web/src/common/components/Form/SearchResult.tsx +++ b/packages/web/src/common/components/Form/SearchResult.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren } from 'react'; import { BaseComponentProps } from '@/common/utils/types'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; /** * Properties for the `SearchResult` React component. diff --git a/packages/web/src/common/components/Form/Select.tsx b/packages/web/src/common/components/Form/Select.tsx index b567b7d5..ff7d67d4 100644 --- a/packages/web/src/common/components/Form/Select.tsx +++ b/packages/web/src/common/components/Form/Select.tsx @@ -2,7 +2,7 @@ import { createContext, PropsWithChildren, useContext, useEffect, useState } fro import { Control, FieldValues, Path, useController } from 'react-hook-form'; import noop from 'lodash/noop'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; import Label from './Label'; import FieldError from './FieldError'; diff --git a/packages/web/src/common/components/Form/Textarea.tsx b/packages/web/src/common/components/Form/Textarea.tsx index 6caacb89..0a12c451 100644 --- a/packages/web/src/common/components/Form/Textarea.tsx +++ b/packages/web/src/common/components/Form/Textarea.tsx @@ -1,7 +1,7 @@ import { TextareaHTMLAttributes } from 'react'; import { Control, FieldValues, Path, useController } from 'react-hook-form'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; import Label from './Label'; import FieldError from './FieldError'; diff --git a/packages/web/src/common/components/Form/Toggle.tsx b/packages/web/src/common/components/Form/Toggle.tsx index da88f5df..d7f77384 100644 --- a/packages/web/src/common/components/Form/Toggle.tsx +++ b/packages/web/src/common/components/Form/Toggle.tsx @@ -1,7 +1,7 @@ import { Control, FieldValues, Path, useController } from 'react-hook-form'; import { BaseComponentProps } from '@/common/utils/types'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import FAIcon from '../Icon/FAIcon'; import Label from './Label'; import FieldError from './FieldError'; diff --git a/packages/web/src/common/components/Icon/Avatar.tsx b/packages/web/src/common/components/Icon/Avatar.tsx index 82d7856d..f75c3927 100644 --- a/packages/web/src/common/components/Icon/Avatar.tsx +++ b/packages/web/src/common/components/Icon/Avatar.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; /** diff --git a/packages/web/src/common/components/Icon/FAIcon.tsx b/packages/web/src/common/components/Icon/FAIcon.tsx index 1edaaee3..c66775da 100644 --- a/packages/web/src/common/components/Icon/FAIcon.tsx +++ b/packages/web/src/common/components/Icon/FAIcon.tsx @@ -42,7 +42,7 @@ import { } from '@fortawesome/free-solid-svg-icons'; import { BaseComponentProps } from '@/common/utils/types'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; /** * A union type of all Font Awesome icon names (without the `fa-` prefix) diff --git a/packages/web/src/common/components/Link/Link.tsx b/packages/web/src/common/components/Link/Link.tsx index f1a91eae..31c47685 100644 --- a/packages/web/src/common/components/Link/Link.tsx +++ b/packages/web/src/common/components/Link/Link.tsx @@ -1,6 +1,6 @@ import { Link as RouterLink, LinkProps as RouterLinkProps } from 'react-router-dom'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { PropsWithTestId } from '@/common/utils/types'; /** diff --git a/packages/web/src/common/components/Loader/Skeleton.tsx b/packages/web/src/common/components/Loader/Skeleton.tsx index dde953fe..71d42c03 100644 --- a/packages/web/src/common/components/Loader/Skeleton.tsx +++ b/packages/web/src/common/components/Loader/Skeleton.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; /** diff --git a/packages/web/src/common/components/Loader/Spinner.tsx b/packages/web/src/common/components/Loader/Spinner.tsx index f9fe6e7d..f4387fb4 100644 --- a/packages/web/src/common/components/Loader/Spinner.tsx +++ b/packages/web/src/common/components/Loader/Spinner.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren } from 'react'; import { BaseComponentProps } from '@/common/utils/types'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import FAIcon, { FAIconProps } from '@/common/components/Icon/FAIcon'; /** diff --git a/packages/web/src/common/components/Menu/MenuCloseButton.tsx b/packages/web/src/common/components/Menu/MenuCloseButton.tsx index 2dc4ed93..f37336ba 100644 --- a/packages/web/src/common/components/Menu/MenuCloseButton.tsx +++ b/packages/web/src/common/components/Menu/MenuCloseButton.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; import Button from '@/common/components/Button/Button'; import FAIcon from '@/common/components/Icon/FAIcon'; diff --git a/packages/web/src/common/components/Menu/MenuNavLink.tsx b/packages/web/src/common/components/Menu/MenuNavLink.tsx index e1516438..f817d46f 100644 --- a/packages/web/src/common/components/Menu/MenuNavLink.tsx +++ b/packages/web/src/common/components/Menu/MenuNavLink.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren } from 'react'; import { NavLink, NavLinkProps } from 'react-router-dom'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { PropsWithTestId } from '@/common/utils/types'; import FAIcon, { FAIconProps } from '@/common/components/Icon/FAIcon'; diff --git a/packages/web/src/common/components/Menu/MenuSeparator.tsx b/packages/web/src/common/components/Menu/MenuSeparator.tsx index 249890c1..1448be1b 100644 --- a/packages/web/src/common/components/Menu/MenuSeparator.tsx +++ b/packages/web/src/common/components/Menu/MenuSeparator.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; /** diff --git a/packages/web/src/common/components/Menu/SideMenu/SideMenu.tsx b/packages/web/src/common/components/Menu/SideMenu/SideMenu.tsx index 004b7cce..d93f8f7a 100644 --- a/packages/web/src/common/components/Menu/SideMenu/SideMenu.tsx +++ b/packages/web/src/common/components/Menu/SideMenu/SideMenu.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren, ReactNode } from 'react'; import { animated, useSpring } from '@react-spring/web'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; import { MenuProps } from '../Menu'; import SideMenuHeader from './SideMenuHeader'; diff --git a/packages/web/src/common/components/Menu/SideMenu/SideMenuHeader.tsx b/packages/web/src/common/components/Menu/SideMenu/SideMenuHeader.tsx index 7c2662f9..48cd5170 100644 --- a/packages/web/src/common/components/Menu/SideMenu/SideMenuHeader.tsx +++ b/packages/web/src/common/components/Menu/SideMenu/SideMenuHeader.tsx @@ -1,6 +1,6 @@ import { PropsWithChildren } from 'react'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; import MenuCloseButton from '../MenuCloseButton'; diff --git a/packages/web/src/common/components/Popover/Popover.tsx b/packages/web/src/common/components/Popover/Popover.tsx index 3c524a0b..517fbb4f 100644 --- a/packages/web/src/common/components/Popover/Popover.tsx +++ b/packages/web/src/common/components/Popover/Popover.tsx @@ -1,7 +1,7 @@ import { createContext, PropsWithChildren, useContext, useEffect, useMemo, useRef, useState } from 'react'; import noop from 'lodash/noop'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; import Backdrop from '../Backdrop/Backdrop'; diff --git a/packages/web/src/common/components/Table/Table.tsx b/packages/web/src/common/components/Table/Table.tsx index 9cad8673..82bee30d 100644 --- a/packages/web/src/common/components/Table/Table.tsx +++ b/packages/web/src/common/components/Table/Table.tsx @@ -1,6 +1,6 @@ import { ColumnDef, flexRender, getCoreRowModel, useReactTable } from '@tanstack/react-table'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; /** diff --git a/packages/web/src/common/components/Tabs/Tabs.tsx b/packages/web/src/common/components/Tabs/Tabs.tsx index 4965e05f..5f2ca80b 100644 --- a/packages/web/src/common/components/Tabs/Tabs.tsx +++ b/packages/web/src/common/components/Tabs/Tabs.tsx @@ -2,7 +2,7 @@ import { createContext, PropsWithChildren, useContext, useState } from 'react'; import { cva, VariantProps } from 'class-variance-authority'; import noop from 'lodash/noop'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; import Button from '../Button/Button'; diff --git a/packages/web/src/common/components/Text/Heading.tsx b/packages/web/src/common/components/Text/Heading.tsx index a258a863..3e784d13 100644 --- a/packages/web/src/common/components/Text/Heading.tsx +++ b/packages/web/src/common/components/Text/Heading.tsx @@ -2,7 +2,7 @@ import { HTMLAttributes } from 'react'; import { cva, VariantProps } from 'class-variance-authority'; import { BaseComponentProps } from '@/common/utils/types'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; /** * Defines the types of heading elements. diff --git a/packages/web/src/common/components/Text/HelpText.tsx b/packages/web/src/common/components/Text/HelpText.tsx index 7642a3dc..9f96aedf 100644 --- a/packages/web/src/common/components/Text/HelpText.tsx +++ b/packages/web/src/common/components/Text/HelpText.tsx @@ -1,6 +1,6 @@ import { PropsWithChildren } from 'react'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; /** diff --git a/packages/web/src/common/components/Text/Text.tsx b/packages/web/src/common/components/Text/Text.tsx index 9c10e2c1..f864b688 100644 --- a/packages/web/src/common/components/Text/Text.tsx +++ b/packages/web/src/common/components/Text/Text.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren } from 'react'; import { cva, VariantProps } from 'class-variance-authority'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; /** diff --git a/packages/web/src/common/components/Toast/Toast.tsx b/packages/web/src/common/components/Toast/Toast.tsx index 771422c2..92b0aa48 100644 --- a/packages/web/src/common/components/Toast/Toast.tsx +++ b/packages/web/src/common/components/Toast/Toast.tsx @@ -3,7 +3,7 @@ import dayjs from 'dayjs'; import { animated, useSpring } from '@react-spring/web'; import { cva, VariantProps } from 'class-variance-authority'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; import { config } from '@/common/utils/config'; import { ToastDetail } from '@/common/providers/ToastsContext'; diff --git a/packages/web/src/common/components/shadcn/__stories__/alert.stories.tsx b/packages/web/src/common/components/shadcn/__stories__/alert.stories.tsx deleted file mode 100644 index 140e67b3..00000000 --- a/packages/web/src/common/components/shadcn/__stories__/alert.stories.tsx +++ /dev/null @@ -1,153 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; -import { CircleAlertIcon, Info } from 'lucide-react'; - -import { Alert, AlertDescription, AlertTitle } from '../alert'; - -const meta = { - title: 'Common/Alert/Alert', - component: Alert, - tags: ['autodocs'], - argTypes: { - children: { description: 'The content.' }, - className: { description: 'Additional CSS classes.' }, - variant: { - description: 'Optional. The style variant.', - control: { type: 'select' }, - options: ['default', 'destructive', 'info', 'success', 'warning'], - }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const WithIcon: Story = { - render: (args) => ( - - - Something unexpected has happened! - - Mollit proident aliqua vel pariatur dolor cupidatat sunt. Tempus quis elit officia ero exercitation labore a. - Nisi commodo nunc id et. Labore facilisis do nibh fermentum exercitation voluptate. Aute et ut est justo veniam. - Ut do convallis reprehenderit qui. Consectetur nibh nibh est pariatur tempor. Qos laoreet qui labore a neque - incididunt. - - - ), - args: { - variant: 'destructive', - }, -}; - -export const NoIcon: Story = { - render: (args) => ( - - Something unexpected has happened! - - Mollit proident aliqua vel pariatur dolor cupidatat sunt. Tempus quis elit officia ero exercitation labore a. - Nisi commodo nunc id et. Labore facilisis do nibh fermentum exercitation voluptate. Aute et ut est justo veniam. - Ut do convallis reprehenderit qui. Consectetur nibh nibh est pariatur tempor. Qos laoreet qui labore a neque - incididunt. - - - ), - args: { - variant: 'destructive', - }, -}; - -export const DescriptionOnly: Story = { - render: (args) => ( - - - Mollit proident aliqua vel pariatur dolor cupidatat sunt. Tempus quis elit officia ero exercitation labore a. - Nisi commodo nunc id et. Labore facilisis do nibh fermentum exercitation voluptate. Aute et ut est justo veniam. - Ut do convallis reprehenderit qui. Consectetur nibh nibh est pariatur tempor. Qos laoreet qui labore a neque - incididunt. - - - ), - args: { - variant: 'destructive', - }, -}; - -export const TitleOnly: Story = { - render: (args) => ( - - - Something unexpected has happened! - - ), - args: { - variant: 'destructive', - }, -}; - -export const DefaultVariant: Story = { - render: (args) => ( - - - Something you should know... - - Mollit proident aliqua vel pariatur dolor cupidatat sunt. Tempus quis elit officia ero exercitation labore a. - Nisi commodo nunc id et. Labore facilisis do nibh fermentum exercitation voluptate. Aute et ut est justo veniam. - Ut do convallis reprehenderit qui. Consectetur nibh nibh est pariatur tempor. Qos laoreet qui labore a neque - incididunt. - - - ), -}; - -export const DestructiveVariant: Story = { - render: (args) => ( - - - Something unexpected has happened! - - Mollit proident aliqua vel pariatur dolor cupidatat sunt. Tempus quis elit officia ero exercitation labore a. - Nisi commodo nunc id et. Labore facilisis do nibh fermentum exercitation voluptate. Aute et ut est justo veniam. - Ut do convallis reprehenderit qui. Consectetur nibh nibh est pariatur tempor. Qos laoreet qui labore a neque - incididunt. - - - ), - args: { - variant: 'destructive', - }, -}; - -export const WarningVariant: Story = { - render: (args) => ( - - Proceed with caution! - - Mollit proident aliqua vel pariatur dolor cupidatat sunt. Tempus quis elit officia ero exercitation labore a. - Nisi commodo nunc id et. Labore facilisis do nibh fermentum exercitation voluptate. Aute et ut est justo veniam. - Ut do convallis reprehenderit qui. Consectetur nibh nibh est pariatur tempor. Qos laoreet qui labore a neque - incididunt. - - - ), - args: { - variant: 'warning', - }, -}; - -export const SuccessVariant: Story = { - render: (args) => ( - - You did it! - - Mollit proident aliqua vel pariatur dolor cupidatat sunt. Tempus quis elit officia ero exercitation labore a. - Nisi commodo nunc id et. Labore facilisis do nibh fermentum exercitation voluptate. Aute et ut est justo veniam. - Ut do convallis reprehenderit qui. Consectetur nibh nibh est pariatur tempor. Qos laoreet qui labore a neque - incididunt. - - - ), - args: { - variant: 'success', - }, -}; diff --git a/packages/web/src/main.tsx b/packages/web/src/main.tsx index e938b0ca..cc28f73b 100644 --- a/packages/web/src/main.tsx +++ b/packages/web/src/main.tsx @@ -3,7 +3,7 @@ import ReactDOM from 'react-dom/client'; import '@/common/utils/i18n'; import App from './App'; -import './index.css'; +import '@react-starter/shared/globals.css'; ReactDOM.createRoot(document.getElementById('root')!).render( diff --git a/packages/web/src/pages/Auth/Signin/components/SigninForm.tsx b/packages/web/src/pages/Auth/Signin/components/SigninForm.tsx index ee50b0b0..f37cc1a1 100644 --- a/packages/web/src/pages/Auth/Signin/components/SigninForm.tsx +++ b/packages/web/src/pages/Auth/Signin/components/SigninForm.tsx @@ -5,12 +5,12 @@ import { useTranslation } from 'react-i18next'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; import { useSignin } from '../api/useSignin'; import Input from '@/common/components/Form/Input'; import Button from '@/common/components/Button/Button'; -import ErrorAlert from '@/common/components/Alert/ErrorAlert'; +import { ErrorAlert } from '@/common/components/Alert/ErrorAlert'; /** * Signin form values. diff --git a/packages/web/src/pages/Components/components/AlertComponents.tsx b/packages/web/src/pages/Components/components/AlertComponents.tsx index ea4a3034..5db95495 100644 --- a/packages/web/src/pages/Components/components/AlertComponents.tsx +++ b/packages/web/src/pages/Components/components/AlertComponents.tsx @@ -6,7 +6,7 @@ import { ComponentProperty } from '../model/components'; import Table from '@/common/components/Table/Table'; import CodeSnippet from '@/common/components/Text/CodeSnippet'; import Heading from '@/common/components/Text/Heading'; -import { Alert, AlertDescription, AlertTitle } from '@/common/components/shadcn/alert'; +import { Alert, AlertDescription, AlertTitle } from '@react-starter/shared/components/shadcn/alert'; /** * The `AlertComponents` React component renders a set of examples illustrating diff --git a/packages/web/src/pages/Settings/components/AppearanceSettings.tsx b/packages/web/src/pages/Settings/components/AppearanceSettings.tsx index 0a373910..e60d75fd 100644 --- a/packages/web/src/pages/Settings/components/AppearanceSettings.tsx +++ b/packages/web/src/pages/Settings/components/AppearanceSettings.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { PropsWithTestId } from '@/common/utils/types'; import { useSettings } from '@/common/hooks/useSettings'; import { useSetSettings } from '@/common/api/useSetSettings'; diff --git a/packages/web/src/pages/Tasks/components/Add/TaskAdd.tsx b/packages/web/src/pages/Tasks/components/Add/TaskAdd.tsx index 329443ec..ac6270ed 100644 --- a/packages/web/src/pages/Tasks/components/Add/TaskAdd.tsx +++ b/packages/web/src/pages/Tasks/components/Add/TaskAdd.tsx @@ -7,7 +7,7 @@ import { useGetCurrentUser } from '@/common/api/useGetCurrentUser'; import { useCreateTask } from '@/pages/Tasks/api/useCreateTask'; import { BaseComponentProps } from '@/common/utils/types'; import TaskForm, { TaskFormValues } from '../Form/TaskForm'; -import ErrorAlert from '@/common/components/Alert/ErrorAlert'; +import { ErrorAlert } from '@/common/components/Alert/ErrorAlert'; /** * The `TaskAdd` component renders the layout for creating a new Task including diff --git a/packages/web/src/pages/Tasks/components/Chart/TaskStatusDonutChart.tsx b/packages/web/src/pages/Tasks/components/Chart/TaskStatusDonutChart.tsx index 716b9644..5c1a90c1 100644 --- a/packages/web/src/pages/Tasks/components/Chart/TaskStatusDonutChart.tsx +++ b/packages/web/src/pages/Tasks/components/Chart/TaskStatusDonutChart.tsx @@ -3,7 +3,7 @@ import { filter, reject } from 'lodash'; import colors from 'tailwindcss/colors'; import { useTranslation } from 'react-i18next'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; import { Task } from '@/pages/Tasks/api/useGetUserTasks'; import DonutChart, { DonutChartData, DonutChartProps } from '@/common/components/Chart/DonutChart'; diff --git a/packages/web/src/pages/Tasks/components/Delete/TaskDeleteDialog.tsx b/packages/web/src/pages/Tasks/components/Delete/TaskDeleteDialog.tsx index 8ed5acfa..d3b20669 100644 --- a/packages/web/src/pages/Tasks/components/Delete/TaskDeleteDialog.tsx +++ b/packages/web/src/pages/Tasks/components/Delete/TaskDeleteDialog.tsx @@ -7,7 +7,7 @@ import { Task } from '@/pages/Tasks/api/useGetUserTasks'; import { useDeleteTask } from '@/pages/Tasks/api/useDeleteTask'; import { useToasts } from '@/common/hooks/useToasts'; import Dialog from '@/common/components/Dialog/Dialog'; -import ErrorAlert from '@/common/components/Alert/ErrorAlert'; +import { ErrorAlert } from '@/common/components/Alert/ErrorAlert'; /** * Properties for the `TaskDeleteDialog` component. diff --git a/packages/web/src/pages/Tasks/components/Edit/TaskCompleteToggle.tsx b/packages/web/src/pages/Tasks/components/Edit/TaskCompleteToggle.tsx index 66cb3687..1ab481ca 100644 --- a/packages/web/src/pages/Tasks/components/Edit/TaskCompleteToggle.tsx +++ b/packages/web/src/pages/Tasks/components/Edit/TaskCompleteToggle.tsx @@ -1,7 +1,7 @@ import { useTranslation } from 'react-i18next'; import { useState } from 'react'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; import { Task } from '@/pages/Tasks/api/useGetUserTasks'; import { useUpdateTask } from '@/pages/Tasks/api/useUpdateTask'; diff --git a/packages/web/src/pages/Tasks/components/Edit/TaskEdit.tsx b/packages/web/src/pages/Tasks/components/Edit/TaskEdit.tsx index 0ae9e0ec..774f16a9 100644 --- a/packages/web/src/pages/Tasks/components/Edit/TaskEdit.tsx +++ b/packages/web/src/pages/Tasks/components/Edit/TaskEdit.tsx @@ -3,7 +3,7 @@ import { useNavigate, useParams } from 'react-router-dom'; import toNumber from 'lodash/toNumber'; import { useTranslation } from 'react-i18next'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; import { Task } from '@/pages/Tasks/api/useGetUserTasks'; import { useGetTask } from '@/pages/Tasks/api/useGetTask'; @@ -11,7 +11,7 @@ import { useToasts } from '@/common/hooks/useToasts'; import { useUpdateTask } from '@/pages/Tasks/api/useUpdateTask'; import TaskForm, { TaskFormValues } from '../Form/TaskForm'; import Skeleton from '@/common/components/Loader/Skeleton'; -import ErrorAlert from '@/common/components/Alert/ErrorAlert'; +import { ErrorAlert } from '@/common/components/Alert/ErrorAlert'; /** * The `TaskEdit` component renders the layout for updating a Task including diff --git a/packages/web/src/pages/Tasks/components/Form/TaskForm.tsx b/packages/web/src/pages/Tasks/components/Form/TaskForm.tsx index a1d5dd37..141eb6d0 100644 --- a/packages/web/src/pages/Tasks/components/Form/TaskForm.tsx +++ b/packages/web/src/pages/Tasks/components/Form/TaskForm.tsx @@ -3,7 +3,7 @@ import { useTranslation } from 'react-i18next'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; import { Task } from '@/pages/Tasks/api/useGetUserTasks'; import Input from '@/common/components/Form/Input'; diff --git a/packages/web/src/pages/Tasks/components/List/TaskList.tsx b/packages/web/src/pages/Tasks/components/List/TaskList.tsx index aba48efc..e6c7f87e 100644 --- a/packages/web/src/pages/Tasks/components/List/TaskList.tsx +++ b/packages/web/src/pages/Tasks/components/List/TaskList.tsx @@ -8,7 +8,7 @@ import { BaseComponentProps } from '@/common/utils/types'; import Skeleton from '@/common/components/Loader/Skeleton'; import TaskListItem from './TaskListItem'; import Badge from '@/common/components/Badge/Badge'; -import ErrorAlert from '@/common/components/Alert/ErrorAlert'; +import { ErrorAlert } from '@/common/components/Alert/ErrorAlert'; /** * Type describes the possible sort order directions. diff --git a/packages/web/src/pages/Tasks/components/List/TaskListItem.tsx b/packages/web/src/pages/Tasks/components/List/TaskListItem.tsx index a2b8f55d..b905be0f 100644 --- a/packages/web/src/pages/Tasks/components/List/TaskListItem.tsx +++ b/packages/web/src/pages/Tasks/components/List/TaskListItem.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; import { Task } from '@/pages/Tasks/api/useGetUserTasks'; import TaskCompleteToggle from '@/pages/Tasks/components/Edit/TaskCompleteToggle'; diff --git a/packages/web/src/pages/Tasks/components/TaskDetailLayout.tsx b/packages/web/src/pages/Tasks/components/TaskDetailLayout.tsx index 373f6289..8851eb32 100644 --- a/packages/web/src/pages/Tasks/components/TaskDetailLayout.tsx +++ b/packages/web/src/pages/Tasks/components/TaskDetailLayout.tsx @@ -8,7 +8,7 @@ import FAIcon from '@/common/components/Icon/FAIcon'; import TaskDeleteDialog from './Delete/TaskDeleteDialog'; import Button from '@/common/components/Button/Button'; import TaskView from './View/TaskView'; -import ErrorAlert from '@/common/components/Alert/ErrorAlert'; +import { ErrorAlert } from '@/common/components/Alert/ErrorAlert'; /** * The `TaskDetailLayout` component renders a layout for viewing and maintaining diff --git a/packages/web/src/pages/Tasks/components/View/TaskView.tsx b/packages/web/src/pages/Tasks/components/View/TaskView.tsx index 0b25ff00..fc675f86 100644 --- a/packages/web/src/pages/Tasks/components/View/TaskView.tsx +++ b/packages/web/src/pages/Tasks/components/View/TaskView.tsx @@ -1,6 +1,6 @@ import { useTranslation } from 'react-i18next'; -import { cn } from '@/common/utils/css'; +import { cn } from '@react-starter/shared/utils/css'; import { BaseComponentProps } from '@/common/utils/types'; import { Task } from '@/pages/Tasks/api/useGetUserTasks'; import { useGetUser } from '@/common/api/useGetUser'; diff --git a/packages/web/tsconfig.json b/packages/web/tsconfig.json index 0b036d2a..b5140fe5 100644 --- a/packages/web/tsconfig.json +++ b/packages/web/tsconfig.json @@ -2,12 +2,12 @@ "extends": "../../tsconfig.base.json", "compilerOptions": { "lib": ["ES2022", "DOM", "DOM.Iterable"], - "outDir": "./dist", - "rootDir": ".", "jsx": "react-jsx", + "noEmit": true, "types": ["node", "vitest/globals", "@testing-library/jest-dom"], "paths": { - "@/*": ["./src/*"] + "@/*": ["./src/*"], + "@react-starter/shared/*": ["../shared/src/*"] } }, "include": ["src", ".storybook/**/*.{ts,tsx}"] From 433788925a8aca3b0e1cff384a234b6ff8e73d01 Mon Sep 17 00:00:00 2001 From: Matthew Warman Date: Thu, 27 Aug 2026 06:30:42 -0400 Subject: [PATCH 02/41] feat: move common modules from web to shared package --- package-lock.json | 2304 ++++++++++------- package.json | 6 + packages/shared/src/__fixtures__/charts.ts | 16 + .../components/Accordion/Accordion.test.tsx | 2 +- .../src}/components/Accordion/Accordion.tsx | 2 +- .../src}/components/Alert/ErrorAlert.test.tsx | 4 +- .../src}/components/Alert/ErrorAlert.tsx | 2 +- .../components/Backdrop/Backdrop.test.tsx | 2 +- .../src}/components/Backdrop/Backdrop.tsx | 4 +- .../src}/components/Badge/Badge.test.tsx | 2 +- .../src}/components/Badge/Badge.tsx | 2 +- .../Breadcrumbs/Breadcrumbs.test.tsx | 7 +- .../components/Breadcrumbs/Breadcrumbs.tsx | 6 +- .../src}/components/Button/Button.test.tsx | 2 +- .../src}/components/Button/Button.tsx | 2 +- .../src}/components/Card/Card.test.tsx | 6 +- .../src}/components/Card/Card.tsx | 2 +- .../src}/components/Card/MessageCard.test.tsx | 2 +- .../src}/components/Card/MessageCard.tsx | 2 +- .../src}/components/Chart/DonutChart.test.tsx | 4 +- .../src}/components/Chart/DonutChart.tsx | 2 +- .../src}/components/Content/Columns.test.tsx | 2 +- .../src}/components/Content/Columns.tsx | 2 +- .../components/Content/Container.test.tsx | 2 +- .../src}/components/Content/Container.tsx | 2 +- .../src}/components/Content/Page.test.tsx | 2 +- .../src}/components/Content/Page.tsx | 2 +- .../src}/components/Dialog/Dialog.test.tsx | 2 +- .../src}/components/Dialog/Dialog.tsx | 2 +- .../src}/components/Divider/Divider.test.tsx | 2 +- .../src}/components/Divider/Divider.tsx | 2 +- .../components/Dropdown/DropdownMenu.test.tsx | 2 +- .../src}/components/Dropdown/DropdownMenu.tsx | 2 +- .../src}/components/Form/Checkbox.test.tsx | 2 +- .../src}/components/Form/Checkbox.tsx | 2 +- .../src}/components/Form/FieldError.test.tsx | 2 +- .../src}/components/Form/FieldError.tsx | 2 +- .../src}/components/Form/Input.test.tsx | 2 +- .../src}/components/Form/Input.tsx | 2 +- .../src}/components/Form/Label.test.tsx | 2 +- .../src}/components/Form/Label.tsx | 2 +- .../src}/components/Form/RadioGroup.test.tsx | 2 +- .../src}/components/Form/RadioGroup.tsx | 2 +- .../src}/components/Form/SearchInput.test.tsx | 2 +- .../src}/components/Form/SearchInput.tsx | 4 +- .../components/Form/SearchResult.test.tsx | 2 +- .../src}/components/Form/SearchResult.tsx | 2 +- .../src}/components/Form/Select.test.tsx | 2 +- .../src}/components/Form/Select.tsx | 2 +- .../src}/components/Form/Textarea.test.tsx | 2 +- .../src}/components/Form/Textarea.tsx | 2 +- .../src}/components/Form/Toggle.test.tsx | 2 +- .../src}/components/Form/Toggle.tsx | 2 +- .../src}/components/Icon/Avatar.test.tsx | 2 +- .../src}/components/Icon/Avatar.tsx | 2 +- .../src}/components/Icon/FAIcon.test.tsx | 2 +- .../src}/components/Icon/FAIcon.tsx | 2 +- .../src}/components/Link/Link.test.tsx | 7 +- .../src}/components/Link/Link.tsx | 2 +- .../components/Loader/LoaderSuspense.test.tsx | 4 +- .../src}/components/Loader/LoaderSuspense.tsx | 2 +- .../src}/components/Loader/Skeleton.test.tsx | 2 +- .../src}/components/Loader/Skeleton.tsx | 2 +- .../src}/components/Loader/Spinner.test.tsx | 2 +- .../src}/components/Loader/Spinner.tsx | 4 +- .../src}/components/Menu/Menu.tsx | 0 .../src}/components/Menu/MenuButton.test.tsx | 2 +- .../src}/components/Menu/MenuButton.tsx | 6 +- .../components/Menu/MenuCloseButton.test.tsx | 2 +- .../src}/components/Menu/MenuCloseButton.tsx | 6 +- .../src}/components/Menu/MenuNavLink.test.tsx | 20 +- .../src}/components/Menu/MenuNavLink.tsx | 4 +- .../components/Menu/MenuSeparator.test.tsx | 2 +- .../src}/components/Menu/MenuSeparator.tsx | 2 +- .../Menu/SideMenu/SideMenu.test.tsx | 2 +- .../components/Menu/SideMenu/SideMenu.tsx | 2 +- .../Menu/SideMenu/SideMenuHeader.test.tsx | 2 +- .../Menu/SideMenu/SideMenuHeader.tsx | 2 +- .../src}/components/Popover/Popover.test.tsx | 2 +- .../src}/components/Popover/Popover.tsx | 2 +- .../src}/components/Table/Table.test.tsx | 2 +- .../src}/components/Table/Table.tsx | 2 +- .../src}/components/Tabs/Tabs.test.tsx | 2 +- .../src}/components/Tabs/Tabs.tsx | 2 +- .../src}/components/Text/CodeSnippet.test.tsx | 15 +- .../src}/components/Text/CodeSnippet.tsx | 17 +- .../src}/components/Text/Currency.test.tsx | 4 +- .../src}/components/Text/Currency.tsx | 6 +- .../src}/components/Text/Date.test.tsx | 4 +- .../src}/components/Text/Date.tsx | 4 +- .../components/Text/DayOfTheWeek.test.tsx | 2 +- .../src}/components/Text/DayOfTheWeek.tsx | 6 +- .../src}/components/Text/Decimal.test.tsx | 4 +- .../src}/components/Text/Decimal.tsx | 6 +- .../src}/components/Text/Heading.test.tsx | 2 +- .../src}/components/Text/Heading.tsx | 2 +- .../src}/components/Text/HelpText.test.tsx | 2 +- .../src}/components/Text/HelpText.tsx | 2 +- .../src}/components/Text/Integer.test.tsx | 4 +- .../src}/components/Text/Integer.tsx | 6 +- .../src}/components/Text/Percent.test.tsx | 4 +- .../src}/components/Text/Percent.tsx | 6 +- .../src}/components/Text/Text.test.tsx | 2 +- .../src}/components/Text/Text.tsx | 2 +- .../src/components/shadcn/alert.test.tsx | 78 - packages/shared/src/index.test.ts | 7 - packages/shared/src/index.ts | 5 - .../src/types/components.ts} | 0 packages/shared/src/utils/constants.ts | 85 + .../src}/utils/numbers.test.ts | 2 +- .../common => shared/src}/utils/numbers.ts | 0 packages/shared/vitest.config.ts | 32 + packages/shared/vitest.setup.ts | 1 + packages/web/package.json | 7 - .../__stories__/Accordion.stories.tsx | 137 - .../Alert/__stories__/ErrorAlert.stories.tsx | 33 - .../Badge/__stories__/Badge.stories.tsx | 119 - .../__stories__/Breadcrumbs.stories.tsx | 93 - .../components/Button/LanguageToggle.tsx | 6 +- .../common/components/Button/ThemeToggle.tsx | 2 +- .../Button/__stories__/Button.stories.tsx | 81 - .../__stories__/LanguageToggle.stories.tsx | 21 - .../__stories__/ThemeToggle.stories.tsx | 23 - .../Card/__stories__/Card.stories.tsx | 108 - .../Card/__stories__/MessageCard.stories.tsx | 46 - .../Chart/__stories__/DonutChart.stories.tsx | 52 - .../Content/__stories__/Columns.stories.tsx | 114 - .../Content/__stories__/Container.stories.tsx | 100 - .../Dialog/__stories__/Dialog.stories.tsx | 96 - .../Divider/__stories__/Divider.stories.tsx | 41 - .../__stories__/DropdownMenu.stories.tsx | 56 - .../Form/__stories__/Checkbox.stories.tsx | 112 - .../Form/__stories__/FieldError.stories.tsx | 32 - .../Form/__stories__/Input.stories.tsx | 82 - .../Form/__stories__/Label.stories.tsx | 54 - .../Form/__stories__/RadioGroup.stories.tsx | 132 - .../Form/__stories__/SearchInput.stories.tsx | 81 - .../Form/__stories__/Select.stories.tsx | 156 -- .../Form/__stories__/Textarea.stories.tsx | 76 - .../Form/__stories__/Toggle.stories.tsx | 74 - .../Icon/__stories__/Avatar.stories.tsx | 46 - .../Icon/__stories__/FAIcon.stories.tsx | 48 - .../Link/__stories__/Link.stories.tsx | 62 - .../Loader/__stories__/Skeleton.stories.tsx | 44 - .../Loader/__stories__/Spinner.stories.tsx | 50 - .../SideMenu/__stories__/SideMenu.stories.tsx | 78 - .../Table/__stories__/Table.stories.tsx | 84 - .../Tabs/__stories__/Tabs.stories.tsx | 56 - .../Text/__stories__/CodeSnippet.stories.tsx | 42 - .../Text/__stories__/Currency.stories.tsx | 42 - .../Text/__stories__/Date.stories.tsx | 50 - .../Text/__stories__/DayOfTheWeek.stories.tsx | 54 - .../Text/__stories__/Decimal.stories.tsx | 50 - .../Text/__stories__/Heading.stories.tsx | 53 - .../Text/__stories__/HelpText.stories.tsx | 32 - .../Text/__stories__/Integer.stories.tsx | 40 - .../Text/__stories__/Percent.stories.tsx | 44 - .../Text/__stories__/Text.stories.tsx | 39 - packages/web/src/common/utils/constants.ts | 86 - 159 files changed, 1652 insertions(+), 4136 deletions(-) create mode 100644 packages/shared/src/__fixtures__/charts.ts rename packages/{web/src/common => shared/src}/components/Accordion/Accordion.test.tsx (98%) rename packages/{web/src/common => shared/src}/components/Accordion/Accordion.tsx (98%) rename packages/{web/src/common => shared/src}/components/Alert/ErrorAlert.test.tsx (92%) rename packages/{web/src/common => shared/src}/components/Alert/ErrorAlert.tsx (92%) rename packages/{web/src/common => shared/src}/components/Backdrop/Backdrop.test.tsx (95%) rename packages/{web/src/common => shared/src}/components/Backdrop/Backdrop.tsx (89%) rename packages/{web/src/common => shared/src}/components/Badge/Badge.test.tsx (94%) rename packages/{web/src/common => shared/src}/components/Badge/Badge.tsx (95%) rename packages/{web/src/common => shared/src}/components/Breadcrumbs/Breadcrumbs.test.tsx (88%) rename packages/{web/src/common => shared/src}/components/Breadcrumbs/Breadcrumbs.tsx (96%) rename packages/{web/src/common => shared/src}/components/Button/Button.test.tsx (98%) rename packages/{web/src/common => shared/src}/components/Button/Button.tsx (95%) rename packages/{web/src/common => shared/src}/components/Card/Card.test.tsx (92%) rename packages/{web/src/common => shared/src}/components/Card/Card.tsx (98%) rename packages/{web/src/common => shared/src}/components/Card/MessageCard.test.tsx (96%) rename packages/{web/src/common => shared/src}/components/Card/MessageCard.tsx (94%) rename packages/{web/src/common => shared/src}/components/Chart/DonutChart.test.tsx (72%) rename packages/{web/src/common => shared/src}/components/Chart/DonutChart.tsx (95%) rename packages/{web/src/common => shared/src}/components/Content/Columns.test.tsx (89%) rename packages/{web/src/common => shared/src}/components/Content/Columns.tsx (96%) rename packages/{web/src/common => shared/src}/components/Content/Container.test.tsx (89%) rename packages/{web/src/common => shared/src}/components/Content/Container.tsx (95%) rename packages/{web/src/common => shared/src}/components/Content/Page.test.tsx (94%) rename packages/{web/src/common => shared/src}/components/Content/Page.tsx (88%) rename packages/{web/src/common => shared/src}/components/Dialog/Dialog.test.tsx (99%) rename packages/{web/src/common => shared/src}/components/Dialog/Dialog.tsx (99%) rename packages/{web/src/common => shared/src}/components/Divider/Divider.test.tsx (93%) rename packages/{web/src/common => shared/src}/components/Divider/Divider.tsx (81%) rename packages/{web/src/common => shared/src}/components/Dropdown/DropdownMenu.test.tsx (98%) rename packages/{web/src/common => shared/src}/components/Dropdown/DropdownMenu.tsx (98%) rename packages/{web/src/common => shared/src}/components/Form/Checkbox.test.tsx (98%) rename packages/{web/src/common => shared/src}/components/Form/Checkbox.tsx (97%) rename packages/{web/src/common => shared/src}/components/Form/FieldError.test.tsx (94%) rename packages/{web/src/common => shared/src}/components/Form/FieldError.tsx (90%) rename packages/{web/src/common => shared/src}/components/Form/Input.test.tsx (97%) rename packages/{web/src/common => shared/src}/components/Form/Input.tsx (96%) rename packages/{web/src/common => shared/src}/components/Form/Label.test.tsx (94%) rename packages/{web/src/common => shared/src}/components/Form/Label.tsx (93%) rename packages/{web/src/common => shared/src}/components/Form/RadioGroup.test.tsx (98%) rename packages/{web/src/common => shared/src}/components/Form/RadioGroup.tsx (98%) rename packages/{web/src/common => shared/src}/components/Form/SearchInput.test.tsx (97%) rename packages/{web/src/common => shared/src}/components/Form/SearchInput.tsx (96%) rename packages/{web/src/common => shared/src}/components/Form/SearchResult.test.tsx (96%) rename packages/{web/src/common => shared/src}/components/Form/SearchResult.tsx (93%) rename packages/{web/src/common => shared/src}/components/Form/Select.test.tsx (99%) rename packages/{web/src/common => shared/src}/components/Form/Select.tsx (99%) rename packages/{web/src/common => shared/src}/components/Form/Textarea.test.tsx (97%) rename packages/{web/src/common => shared/src}/components/Form/Textarea.tsx (96%) rename packages/{web/src/common => shared/src}/components/Form/Toggle.test.tsx (97%) rename packages/{web/src/common => shared/src}/components/Form/Toggle.tsx (96%) rename packages/{web/src/common => shared/src}/components/Icon/Avatar.test.tsx (96%) rename packages/{web/src/common => shared/src}/components/Icon/Avatar.tsx (96%) rename packages/{web/src/common => shared/src}/components/Icon/FAIcon.test.tsx (87%) rename packages/{web/src/common => shared/src}/components/Icon/FAIcon.tsx (97%) rename packages/{web/src/common => shared/src}/components/Link/Link.test.tsx (72%) rename packages/{web/src/common => shared/src}/components/Link/Link.tsx (92%) rename packages/{web/src/common => shared/src}/components/Loader/LoaderSuspense.test.tsx (78%) rename packages/{web/src/common => shared/src}/components/Loader/LoaderSuspense.tsx (90%) rename packages/{web/src/common => shared/src}/components/Loader/Skeleton.test.tsx (93%) rename packages/{web/src/common => shared/src}/components/Loader/Skeleton.tsx (85%) rename packages/{web/src/common => shared/src}/components/Loader/Spinner.test.tsx (95%) rename packages/{web/src/common => shared/src}/components/Loader/Spinner.tsx (89%) rename packages/{web/src/common => shared/src}/components/Menu/Menu.tsx (100%) rename packages/{web/src/common => shared/src}/components/Menu/MenuButton.test.tsx (97%) rename packages/{web/src/common => shared/src}/components/Menu/MenuButton.tsx (85%) rename packages/{web/src/common => shared/src}/components/Menu/MenuCloseButton.test.tsx (95%) rename packages/{web/src/common => shared/src}/components/Menu/MenuCloseButton.tsx (82%) rename packages/{web/src/common => shared/src}/components/Menu/MenuNavLink.test.tsx (82%) rename packages/{web/src/common => shared/src}/components/Menu/MenuNavLink.tsx (93%) rename packages/{web/src/common => shared/src}/components/Menu/MenuSeparator.test.tsx (93%) rename packages/{web/src/common => shared/src}/components/Menu/MenuSeparator.tsx (86%) rename packages/{web/src/common => shared/src}/components/Menu/SideMenu/SideMenu.test.tsx (98%) rename packages/{web/src/common => shared/src}/components/Menu/SideMenu/SideMenu.tsx (97%) rename packages/{web/src/common => shared/src}/components/Menu/SideMenu/SideMenuHeader.test.tsx (97%) rename packages/{web/src/common => shared/src}/components/Menu/SideMenu/SideMenuHeader.tsx (94%) rename packages/{web/src/common => shared/src}/components/Popover/Popover.test.tsx (99%) rename packages/{web/src/common => shared/src}/components/Popover/Popover.tsx (98%) rename packages/{web/src/common => shared/src}/components/Table/Table.test.tsx (96%) rename packages/{web/src/common => shared/src}/components/Table/Table.tsx (97%) rename packages/{web/src/common => shared/src}/components/Tabs/Tabs.test.tsx (99%) rename packages/{web/src/common => shared/src}/components/Tabs/Tabs.tsx (98%) rename packages/{web/src/common => shared/src}/components/Text/CodeSnippet.test.tsx (77%) rename packages/{web/src/common => shared/src}/components/Text/CodeSnippet.tsx (80%) rename packages/{web/src/common => shared/src}/components/Text/Currency.test.tsx (94%) rename packages/{web/src/common => shared/src}/components/Text/Currency.tsx (85%) rename packages/{web/src/common => shared/src}/components/Text/Date.test.tsx (95%) rename packages/{web/src/common => shared/src}/components/Text/Date.tsx (86%) rename packages/{web/src/common => shared/src}/components/Text/DayOfTheWeek.test.tsx (97%) rename packages/{web/src/common => shared/src}/components/Text/DayOfTheWeek.tsx (89%) rename packages/{web/src/common => shared/src}/components/Text/Decimal.test.tsx (97%) rename packages/{web/src/common => shared/src}/components/Text/Decimal.tsx (89%) rename packages/{web/src/common => shared/src}/components/Text/Heading.test.tsx (93%) rename packages/{web/src/common => shared/src}/components/Text/Heading.tsx (94%) rename packages/{web/src/common => shared/src}/components/Text/HelpText.test.tsx (88%) rename packages/{web/src/common => shared/src}/components/Text/HelpText.tsx (90%) rename packages/{web/src/common => shared/src}/components/Text/Integer.test.tsx (96%) rename packages/{web/src/common => shared/src}/components/Text/Integer.tsx (87%) rename packages/{web/src/common => shared/src}/components/Text/Percent.test.tsx (94%) rename packages/{web/src/common => shared/src}/components/Text/Percent.tsx (88%) rename packages/{web/src/common => shared/src}/components/Text/Text.test.tsx (95%) rename packages/{web/src/common => shared/src}/components/Text/Text.tsx (92%) delete mode 100644 packages/shared/src/components/shadcn/alert.test.tsx delete mode 100644 packages/shared/src/index.test.ts delete mode 100644 packages/shared/src/index.ts rename packages/{web/src/common/utils/types.ts => shared/src/types/components.ts} (100%) create mode 100644 packages/shared/src/utils/constants.ts rename packages/{web/src/common => shared/src}/utils/numbers.test.ts (96%) rename packages/{web/src/common => shared/src}/utils/numbers.ts (100%) create mode 100644 packages/shared/vitest.config.ts create mode 100644 packages/shared/vitest.setup.ts delete mode 100644 packages/web/src/common/components/Accordion/__stories__/Accordion.stories.tsx delete mode 100644 packages/web/src/common/components/Alert/__stories__/ErrorAlert.stories.tsx delete mode 100644 packages/web/src/common/components/Badge/__stories__/Badge.stories.tsx delete mode 100644 packages/web/src/common/components/Breadcrumbs/__stories__/Breadcrumbs.stories.tsx delete mode 100644 packages/web/src/common/components/Button/__stories__/Button.stories.tsx delete mode 100644 packages/web/src/common/components/Button/__stories__/LanguageToggle.stories.tsx delete mode 100644 packages/web/src/common/components/Button/__stories__/ThemeToggle.stories.tsx delete mode 100644 packages/web/src/common/components/Card/__stories__/Card.stories.tsx delete mode 100644 packages/web/src/common/components/Card/__stories__/MessageCard.stories.tsx delete mode 100644 packages/web/src/common/components/Chart/__stories__/DonutChart.stories.tsx delete mode 100644 packages/web/src/common/components/Content/__stories__/Columns.stories.tsx delete mode 100644 packages/web/src/common/components/Content/__stories__/Container.stories.tsx delete mode 100644 packages/web/src/common/components/Dialog/__stories__/Dialog.stories.tsx delete mode 100644 packages/web/src/common/components/Divider/__stories__/Divider.stories.tsx delete mode 100644 packages/web/src/common/components/Dropdown/__stories__/DropdownMenu.stories.tsx delete mode 100644 packages/web/src/common/components/Form/__stories__/Checkbox.stories.tsx delete mode 100644 packages/web/src/common/components/Form/__stories__/FieldError.stories.tsx delete mode 100644 packages/web/src/common/components/Form/__stories__/Input.stories.tsx delete mode 100644 packages/web/src/common/components/Form/__stories__/Label.stories.tsx delete mode 100644 packages/web/src/common/components/Form/__stories__/RadioGroup.stories.tsx delete mode 100644 packages/web/src/common/components/Form/__stories__/SearchInput.stories.tsx delete mode 100644 packages/web/src/common/components/Form/__stories__/Select.stories.tsx delete mode 100644 packages/web/src/common/components/Form/__stories__/Textarea.stories.tsx delete mode 100644 packages/web/src/common/components/Form/__stories__/Toggle.stories.tsx delete mode 100644 packages/web/src/common/components/Icon/__stories__/Avatar.stories.tsx delete mode 100644 packages/web/src/common/components/Icon/__stories__/FAIcon.stories.tsx delete mode 100644 packages/web/src/common/components/Link/__stories__/Link.stories.tsx delete mode 100644 packages/web/src/common/components/Loader/__stories__/Skeleton.stories.tsx delete mode 100644 packages/web/src/common/components/Loader/__stories__/Spinner.stories.tsx delete mode 100644 packages/web/src/common/components/Menu/SideMenu/__stories__/SideMenu.stories.tsx delete mode 100644 packages/web/src/common/components/Table/__stories__/Table.stories.tsx delete mode 100644 packages/web/src/common/components/Tabs/__stories__/Tabs.stories.tsx delete mode 100644 packages/web/src/common/components/Text/__stories__/CodeSnippet.stories.tsx delete mode 100644 packages/web/src/common/components/Text/__stories__/Currency.stories.tsx delete mode 100644 packages/web/src/common/components/Text/__stories__/Date.stories.tsx delete mode 100644 packages/web/src/common/components/Text/__stories__/DayOfTheWeek.stories.tsx delete mode 100644 packages/web/src/common/components/Text/__stories__/Decimal.stories.tsx delete mode 100644 packages/web/src/common/components/Text/__stories__/Heading.stories.tsx delete mode 100644 packages/web/src/common/components/Text/__stories__/HelpText.stories.tsx delete mode 100644 packages/web/src/common/components/Text/__stories__/Integer.stories.tsx delete mode 100644 packages/web/src/common/components/Text/__stories__/Percent.stories.tsx delete mode 100644 packages/web/src/common/components/Text/__stories__/Text.stories.tsx diff --git a/package-lock.json b/package-lock.json index a2853cb2..4cdb6480 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,17 +17,23 @@ "class-variance-authority": "0.7.1", "react": "19.2.8", "react-dom": "19.2.8", + "react-router-dom": "^7.18.2", "zod": "4.4.3" }, "devDependencies": { "@eslint/js": "9.39.2", + "@testing-library/jest-dom": "7.0.1", + "@testing-library/react": "16.3.2", + "@testing-library/user-event": "14.6.6", "@types/node": "26.2.0", "@types/react": "19.2.18", "@types/react-dom": "19.2.4", + "@vitejs/plugin-react": "6.0.5", "@vitest/coverage-v8": "4.1.10", "eslint": "9.39.2", "globals": "17.10.0", "husky": "9.1.7", + "jsdom": "30.0.1", "prettier": "3.9.6", "prettier-plugin-tailwindcss": "0.8.1", "rimraf": "6.1.3", @@ -45,56 +51,38 @@ "license": "MIT" }, "node_modules/@asamuzakjp/css-color": { - "version": "5.1.11", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz", - "integrity": "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-6.0.7.tgz", + "integrity": "sha512-vC/bk1Lz7Tn/EfU9/apOTBk80/8dyGyWMowPoV1tJ52muDGsDqt2HPT2klrFUiY60MQmQv9q8yIht15JnBgDGw==", "dev": true, "license": "MIT", "dependencies": { - "@asamuzakjp/generational-cache": "^1.0.1", - "@csstools/css-calc": "^3.2.0", - "@csstools/css-color-parser": "^4.1.0", + "@csstools/css-calc": "^3.3.0", + "@csstools/css-color-parser": "^4.1.10", "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" + "@csstools/css-tokenizer": "^4.0.0", + "lru-cache": "^11.5.2" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "node": "^22.13.0 || >=24.0.0" } }, "node_modules/@asamuzakjp/dom-selector": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz", - "integrity": "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-8.3.2.tgz", + "integrity": "sha512-93Z1N+BQNXysodoicpOIyNh2drHfz/CTf9nnT0FEx72GJcIiwgydD7tGAr78j41LsYn3hlRn+LdGPuBLn1Bl8Q==", "dev": true, "license": "MIT", "dependencies": { - "@asamuzakjp/generational-cache": "^1.0.1", - "@asamuzakjp/nwsapi": "^2.3.9", "bidi-js": "^1.0.3", "css-tree": "^3.2.1", - "is-potential-custom-element-name": "^1.0.1" + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.5.2" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/@asamuzakjp/generational-cache": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz", - "integrity": "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "node": "^22.13.0 || >=24.0.0" } }, - "node_modules/@asamuzakjp/nwsapi": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", - "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@aws-cdk/asset-awscli-v1": { "version": "2.2.282", "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.282.tgz", @@ -110,9 +98,9 @@ "license": "Apache-2.0" }, "node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "54.16.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-54.16.0.tgz", - "integrity": "sha512-Mhwh/L1buy8r6ucxdjPqSAQB559pX1ehcfusRBpDrpoOi4vHKl/iWDjXz0p1QD6ySptlzCgqbBP8TE+EE6ew0w==", + "version": "54.20.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-54.20.0.tgz", + "integrity": "sha512-ts2dVBi0VUXOLKcqyLYsHUWYpwGPFd+xm4q+6Y4jjP8orwodjRi2mJrmpy9b0gHnbv8e/hFnmEbqrD0bBJOnPA==", "bundleDependencies": [ "jsonschema", "semver" @@ -163,13 +151,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@babel/compat-data": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", @@ -681,9 +662,9 @@ } }, "node_modules/@csstools/color-helpers": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.0.tgz", - "integrity": "sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.1.tgz", + "integrity": "sha512-gLNsunvwf3mCi5u5o46/Z/JcJMnhbHSaZ69rkgPzNM3J4s8hWwpPUQB6/tt0EDFyCiWzxANlx+2LJwpYj4zS1w==", "dev": true, "funding": [ { @@ -725,9 +706,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.10.tgz", - "integrity": "sha512-UZhQLIUyJaaMepqehrCODwCg2KW25vFvLWBmqYFaPclYvvxzj/sG8LBOhBFCp11i9uE7t1EyS+RAoV9tztPFyw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.2.0.tgz", + "integrity": "sha512-5+5LEmFuY1AjXdYhmgjTJogtQnP1evJ1zrBZGUNZ0thkpwnnmKxcHdAMn/OtFjAb25zA+jKDVYVRl+5G7rjv1A==", "dev": true, "funding": [ { @@ -741,7 +722,7 @@ ], "license": "MIT", "dependencies": { - "@csstools/color-helpers": "^6.1.0", + "@csstools/color-helpers": "^6.1.1", "@csstools/css-calc": "^3.3.0" }, "engines": { @@ -776,9 +757,9 @@ } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.7.tgz", - "integrity": "sha512-fQ+05118eQS1cofO3aJpB5efgpBZMvIzwr/sbC8kDLVA5XLG8q1kJV5yzrUAI1f7lvhPnm8fgIjzFB8/O/5Dig==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.8.tgz", + "integrity": "sha512-CpMLjAvwQg3BL5S0IeqsZNMH7EQrEWi0kLKOC13ZBF0ZwERiLWlibNPJr8G1kdU3Ms/r2KiNrF81pUh2HwAHdg==", "dev": true, "funding": [ { @@ -871,6 +852,53 @@ "node": ">=8" } }, + "node_modules/@dotenvx/dotenvx/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, "node_modules/@dotenvx/dotenvx/node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -887,6 +915,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@dotenvx/dotenvx/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@dotenvx/dotenvx/node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -910,6 +951,19 @@ "node": ">=18" } }, + "node_modules/@dotenvx/dotenvx/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@dotenvx/dotenvx/node_modules/open": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", @@ -928,6 +982,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@dotenvx/dotenvx/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@dotenvx/dotenvx/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/undici": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", + "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, "node_modules/@dotenvx/dotenvx/node_modules/which": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", @@ -986,9 +1067,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", - "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", "cpu": [ "ppc64" ], @@ -1003,9 +1084,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", - "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", "cpu": [ "arm" ], @@ -1020,9 +1101,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", - "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", "cpu": [ "arm64" ], @@ -1037,9 +1118,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", - "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", "cpu": [ "x64" ], @@ -1054,9 +1135,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", - "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", "cpu": [ "arm64" ], @@ -1071,9 +1152,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", - "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", "cpu": [ "x64" ], @@ -1088,9 +1169,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", - "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", "cpu": [ "arm64" ], @@ -1105,9 +1186,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", - "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", "cpu": [ "x64" ], @@ -1122,9 +1203,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", - "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", "cpu": [ "arm" ], @@ -1139,9 +1220,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", - "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", "cpu": [ "arm64" ], @@ -1156,9 +1237,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", - "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", "cpu": [ "ia32" ], @@ -1173,9 +1254,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", - "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", "cpu": [ "loong64" ], @@ -1190,9 +1271,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", - "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", "cpu": [ "mips64el" ], @@ -1207,9 +1288,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", - "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", "cpu": [ "ppc64" ], @@ -1224,9 +1305,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", - "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", "cpu": [ "riscv64" ], @@ -1241,9 +1322,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", - "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", "cpu": [ "s390x" ], @@ -1258,9 +1339,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", - "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", "cpu": [ "x64" ], @@ -1275,9 +1356,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", - "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", "cpu": [ "arm64" ], @@ -1292,9 +1373,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", - "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", "cpu": [ "x64" ], @@ -1309,9 +1390,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", - "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", "cpu": [ "arm64" ], @@ -1326,9 +1407,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", - "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", "cpu": [ "x64" ], @@ -1343,9 +1424,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", - "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", "cpu": [ "arm64" ], @@ -1360,9 +1441,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", - "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", "cpu": [ "x64" ], @@ -1377,9 +1458,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", - "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", "cpu": [ "arm64" ], @@ -1394,9 +1475,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", - "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", "cpu": [ "ia32" ], @@ -1411,9 +1492,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", - "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", "cpu": [ "x64" ], @@ -1534,6 +1615,23 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -1547,6 +1645,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, "node_modules/@eslint/js": { "version": "9.39.2", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", @@ -1708,9 +1813,9 @@ } }, "node_modules/@hono/node-server": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-2.1.0.tgz", - "integrity": "sha512-XovyyCCnBzW+zKu+z/zq8hwNs4KOR5rEMAOxo2f40Q5xoOI37IMm6MIg2COOUtUApo0i6850MTBKH2u4QLGIqg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-2.1.1.tgz", + "integrity": "sha512-ELuehkj5VCBdgEw9zs+ivkKwyzzUCSQuE96YmiPvn1ECBoZCczbFXJLeEGMTYjphP6gydh4pHMqEYPVMYUVgQg==", "dev": true, "license": "MIT", "engines": { @@ -1720,6 +1825,116 @@ "hono": "^4" } }, + "node_modules/@hookform/resolvers": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.7.1.tgz", + "integrity": "sha512-8wS/P4UDr5sQDe4nFaV51TVyfDPrWgNIXweqG0Bs9Z5LSuzKLb+RQNPvkN2oHM5SRrJyWrVH/F+LOUcFjUyvwQ==", + "license": "MIT", + "dependencies": { + "@standard-schema/utils": "^0.3.0" + }, + "peerDependencies": { + "@sinclair/typebox": ">=0.25.24", + "@standard-schema/spec": "^1.0.0", + "@typeschema/main": ">=0.13.7", + "@vinejs/vine": "^2.0.0 || ^3.0.0 || ^4.0.0", + "ajv": "^8.12.0", + "ajv-errors": "^3.0.0", + "ajv-formats": "^2.1.1", + "arktype": "^2.0.0", + "ata-validator": "^1.2.0", + "class-transformer": ">=0.4.0", + "class-validator": ">=0.12.0", + "computed-types": "^1.0.0", + "effect": "^3.10.3", + "fluentvalidation-ts": "^3.0.0", + "fp-ts": "^2.7.0", + "io-ts": "^2.0.0", + "joi": "^17.0.0", + "nope-validator": ">=0.12.0", + "react-hook-form": "^7.55.0", + "superstruct": ">=0.12.0", + "typanion": "^3.3.2", + "valibot": ">=0.31.0 || ^1.0.0-beta.4 || ^1.0.0-rc", + "vest": ">=3.0.0", + "yup": "^1.0.0", + "zod": "^3.25.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@sinclair/typebox": { + "optional": true + }, + "@standard-schema/spec": { + "optional": true + }, + "@typeschema/main": { + "optional": true + }, + "@vinejs/vine": { + "optional": true + }, + "ajv": { + "optional": true + }, + "ajv-errors": { + "optional": true + }, + "ajv-formats": { + "optional": true + }, + "arktype": { + "optional": true + }, + "ata-validator": { + "optional": true + }, + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + }, + "computed-types": { + "optional": true + }, + "effect": { + "optional": true + }, + "fluentvalidation-ts": { + "optional": true + }, + "fp-ts": { + "optional": true + }, + "io-ts": { + "optional": true + }, + "joi": { + "optional": true + }, + "nope-validator": { + "optional": true + }, + "superstruct": { + "optional": true + }, + "typanion": { + "optional": true + }, + "valibot": { + "optional": true + }, + "vest": { + "optional": true + }, + "yup": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, "node_modules/@humanfs/core": { "version": "0.19.2", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", @@ -1797,13 +2012,13 @@ } }, "node_modules/@inquirer/confirm": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.1.1.tgz", - "integrity": "sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.2.0.tgz", + "integrity": "sha512-SKXarWrYhtpqOEctf9XGCGy29QjsvJAM0Aq9ZR9z4Ns94OmpqudOly+aSEfNqUf9SwsQaUgY9+Z8hyzG0xX8fw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^11.2.1", + "@inquirer/core": "^12.0.0", "@inquirer/type": "^4.0.7" }, "engines": { @@ -1819,14 +2034,14 @@ } }, "node_modules/@inquirer/core": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.2.1.tgz", - "integrity": "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.0.tgz", + "integrity": "sha512-+nnvFEXIB08CZNVXpvW3B+zHW96QXvGUjNKJ8NJIPqAZi5Kd4WhYt2S3C234ReepG1qw2HOlEUbjYVHBowXObA==", "dev": true, "license": "MIT", "dependencies": { "@inquirer/ansi": "^2.0.7", - "@inquirer/figures": "^2.0.7", + "@inquirer/figures": "^2.0.8", "@inquirer/type": "^4.0.7", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", @@ -1846,9 +2061,9 @@ } }, "node_modules/@inquirer/figures": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.7.tgz", - "integrity": "sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.8.tgz", + "integrity": "sha512-tApbon79GM9ry56ja/Ud3SY2CL4TQsao9fIwDQbgTeNY55025GdMzQ2+UdegV/lx51VNGUB59M0v0nMpybYY4Q==", "dev": true, "license": "MIT", "engines": { @@ -2002,30 +2217,24 @@ } } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "ajv": "^8.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, "node_modules/@mswjs/interceptors": { "version": "0.41.9", "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.9.tgz", @@ -2052,9 +2261,9 @@ "license": "MIT" }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.2.tgz", - "integrity": "sha512-JfB4kuJQjaoHuCTseIINHtHWeJnvgEcxjwA5t/Y00ZgaOO1Crz3fjT/p8kT28zA/Caz7oiUMn3d6H2yOVCVwuw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.3.tgz", + "integrity": "sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==", "dev": true, "license": "MIT", "optional": true, @@ -2069,8 +2278,8 @@ "url": "https://github.com/sponsors/Brooooooklyn" }, "peerDependencies": { - "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.3", - "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.3" + "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", + "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" } }, "node_modules/@neoconfetti/react": { @@ -2848,13 +3057,6 @@ "win32" ] }, - "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/@radix-ui/number": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.3.tgz", @@ -4462,10 +4664,27 @@ } } }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", + "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.3.tgz", - "integrity": "sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", + "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", "cpu": [ "arm64" ], @@ -4480,9 +4699,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.3.tgz", - "integrity": "sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", + "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", "cpu": [ "arm64" ], @@ -4497,9 +4716,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.3.tgz", - "integrity": "sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", + "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", "cpu": [ "x64" ], @@ -4514,9 +4733,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.3.tgz", - "integrity": "sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", + "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", "cpu": [ "x64" ], @@ -4531,9 +4750,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.3.tgz", - "integrity": "sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", + "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", "cpu": [ "arm" ], @@ -4548,9 +4767,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.3.tgz", - "integrity": "sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", + "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", "cpu": [ "arm64" ], @@ -4568,9 +4787,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.3.tgz", - "integrity": "sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", + "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", "cpu": [ "arm64" ], @@ -4588,9 +4807,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.3.tgz", - "integrity": "sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", + "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", "cpu": [ "ppc64" ], @@ -4608,9 +4827,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.3.tgz", - "integrity": "sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", + "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", "cpu": [ "s390x" ], @@ -4628,9 +4847,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.3.tgz", - "integrity": "sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", + "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", "cpu": [ "x64" ], @@ -4648,9 +4867,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.3.tgz", - "integrity": "sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", + "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", "cpu": [ "x64" ], @@ -4668,9 +4887,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.3.tgz", - "integrity": "sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", + "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", "cpu": [ "arm64" ], @@ -4685,9 +4904,9 @@ } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.3.tgz", - "integrity": "sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", + "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", "cpu": [ "arm64" ], @@ -4702,9 +4921,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.3.tgz", - "integrity": "sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", + "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", "cpu": [ "x64" ], @@ -4748,13 +4967,6 @@ } } }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, "node_modules/@sec-ant/readable-stream": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", @@ -5405,9 +5617,9 @@ } }, "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==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-7.0.1.tgz", + "integrity": "sha512-oMDTC3oA+6CXSO2JZnvOI7CA6oVub6kij5ggk9ohwye5slmkwxYDXcPOVxgMw/RQlticjtO0C1RZkR97HgrWMw==", "dev": true, "license": "MIT", "dependencies": { @@ -5419,9 +5631,18 @@ "redent": "^3.0.0" }, "engines": { - "node": ">=14", + "node": ">=22", "npm": ">=6", "yarn": ">=1" + }, + "peerDependencies": { + "@testing-library/dom": ">=10 <11", + "vitest": ">= 0.32" + }, + "peerDependenciesMeta": { + "vitest": { + "optional": true + } } }, "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { @@ -5460,9 +5681,9 @@ } }, "node_modules/@testing-library/user-event": { - "version": "14.6.4", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.4.tgz", - "integrity": "sha512-QCGwP6QrjypBLwyj5cuyfVamkaIEy/XGY+1VDehbtbQqOggYmTFpFOdWR5mPz14vX8vXLMVjDHlRNBcClyO9ew==", + "version": "14.6.6", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.6.tgz", + "integrity": "sha512-Jbs9FpkkIDw8FgSc6kOVsOv8JuuqGAL7J4X1oot77JxAoDlkNn2GRkd0aYRVuQ+pVQAiHWVkE4rX/dkF5fBiCw==", "dev": true, "license": "MIT", "engines": { @@ -5641,9 +5862,9 @@ } }, "node_modules/@types/d3-shape": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", - "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-kVd74ta9eof3eJOvbNd1vGKS/XERRyQbT26Og63hIsvDO84cjD5gEOhsXf26w3FSoNlPVz84DOFcKv/oou+fMw==", "license": "MIT", "dependencies": { "@types/d3-path": "*" @@ -6111,6 +6332,32 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", + "integrity": "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, "node_modules/@vitest/coverage-v8": { "version": "4.1.10", "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.10.tgz", @@ -6143,23 +6390,60 @@ } }, "node_modules/@vitest/expect": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz", - "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", "dev": true, "license": "MIT", "dependencies": { - "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.10", - "@vitest/utils": "4.1.10", - "chai": "^6.2.2", - "tinyrainbow": "^3.1.0" + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/expect/node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/expect/node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/expect/node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@vitest/mocker": { "version": "4.1.10", "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz", @@ -6187,6 +6471,26 @@ } } }, + "node_modules/@vitest/mocker/node_modules/@vitest/spy": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", + "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", + "dev": true, + "license": "MIT", + "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", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/@vitest/pretty-format": { "version": "4.1.10", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz", @@ -6231,35 +6535,16 @@ } }, "node_modules/@vitest/spy": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", - "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/ui": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.1.10.tgz", - "integrity": "sha512-EOUqfXHTXtpSHsyLHH40ts3Ue+hRhSGwzwzMlK0dTEOLSDYyOXLyr5JDGmHQWhN2DYI30gw6dVx3cdgM9FZl+Q==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.10", - "fflate": "^0.8.2", - "flatted": "^3.4.2", - "pathe": "^2.0.3", - "sirv": "^3.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.1.0" + "tinyspy": "^4.0.3" }, "funding": { "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.1.10" } }, "node_modules/@vitest/utils": { @@ -6361,16 +6646,16 @@ } }, "node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "devOptional": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -6378,9 +6663,9 @@ } }, "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -6395,30 +6680,6 @@ } } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "devOptional": true, - "license": "MIT" - }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -6519,16 +6780,33 @@ "js-tokens": "^10.0.0" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/atomically": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", - "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", + "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/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/atomically": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", + "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", "dev": true, "license": "MIT", "engines": { @@ -6798,9 +7076,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.11.12", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.12.tgz", - "integrity": "sha512-r7WnVImvVCeFpf2DOXfy41aPWzeNg3H/A2X4dKmy1QL0MSyyk/e7z8ihJ3N6Nn2PsdhkVlqnEfnUE4a05P2aTA==", + "version": "2.11.18", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.18.tgz", + "integrity": "sha512-1iEmLEYSiE1SeBoAfPo/Mnx3PzfzHUkDK61ASkCpuk3YXugYLH5DYK1SzqV55F8FMI6s0F+/tCP7Polz1QRjxw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -6846,9 +7124,9 @@ } }, "node_modules/body-parser/node_modules/content-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", - "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", "dev": true, "license": "MIT", "engines": { @@ -6884,9 +7162,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", - "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", "dev": true, "funding": [ { @@ -6904,11 +7182,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.44", - "caniuse-lite": "^1.0.30001806", - "electron-to-chromium": "^1.5.393", - "node-releases": "^2.0.51", - "update-browserslist-db": "^1.2.3" + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" }, "bin": { "browserslist": "cli.js" @@ -6984,9 +7262,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001807", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001807.tgz", - "integrity": "sha512-daRXJ9EB/rdRgu7kV+TTl1YUKtlsMWblPl2sLnpg9DZae16QCegol6A1SmCE31Lm9mXC1sRWGt/krouH+/dl7Q==", + "version": "1.0.30001809", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", + "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", "dev": true, "funding": [ { @@ -7005,11 +7283,18 @@ "license": "CC-BY-4.0" }, "node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", "dev": true, "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, "engines": { "node": ">=18" } @@ -7072,9 +7357,9 @@ } }, "node_modules/chromatic": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-18.2.0.tgz", - "integrity": "sha512-xyTKDhBQPDd4qrsXhJK7GAJyIStpRoSTs4b7EtPyliSL0luej3DcqkeCZ9osHxbiLXiViNyWfMxo5Xgzejex8A==", + "version": "18.5.0", + "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-18.5.0.tgz", + "integrity": "sha512-3oBcGP4V+6SV0qu2NJnutnPYsrxnPpOHhtQAbzxEtIQrDJNzn1wfXtzwkEiJGQm5eANTW0AvL4WxHtz+BTJbYg==", "dev": true, "license": "MIT", "dependencies": { @@ -7306,48 +7591,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/conf/node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/conf/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/conf/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, "node_modules/conf/node_modules/json-schema-typed": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", @@ -7651,6 +7894,21 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", + "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.11.0", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, "node_modules/dayjs": { "version": "1.11.21", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz", @@ -7673,16 +7931,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/debounce-fn/node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -7769,9 +8017,9 @@ } }, "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==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.1.tgz", + "integrity": "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==", "dev": true, "license": "MIT", "dependencies": { @@ -7937,9 +8185,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.402", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.402.tgz", - "integrity": "sha512-/oOpMaPT6Yg+6/1XQhyIPlzgj7Ye9zf+nNM2Uh6OcE2G2oNptWazFa+qB2Pdqqbsc9KnIDzgAntoYN0dbwOXwA==", + "version": "1.5.413", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.413.tgz", + "integrity": "sha512-F1XPKvt7HVfly5WND90ec16nFsdr4g5x/cVUP3EqjeyXynupabGDqpMa84wwvuYGDnldXLBz6DLXyZXWO9TPvw==", "dev": true, "license": "ISC" }, @@ -8063,9 +8311,9 @@ } }, "node_modules/es-module-lexer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", - "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", "dev": true, "license": "MIT" }, @@ -8097,20 +8345,21 @@ } }, "node_modules/es-toolkit": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.50.0.tgz", - "integrity": "sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w==", + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.51.0.tgz", + "integrity": "sha512-zC2lQGkM7QX+Gm6iM3+WIdZJzthsEd14LvRNJneSO2hzyz/zNBENR8+YXWo1cKxgPBtV6ksPYHELbcwBRzmdCw==", "license": "MIT", "workspaces": [ "docs", "benchmarks", - "tests/types" + "tests/types", + "tests/browser-compat" ] }, "node_modules/esbuild": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", - "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -8121,32 +8370,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.1", - "@esbuild/android-arm": "0.28.1", - "@esbuild/android-arm64": "0.28.1", - "@esbuild/android-x64": "0.28.1", - "@esbuild/darwin-arm64": "0.28.1", - "@esbuild/darwin-x64": "0.28.1", - "@esbuild/freebsd-arm64": "0.28.1", - "@esbuild/freebsd-x64": "0.28.1", - "@esbuild/linux-arm": "0.28.1", - "@esbuild/linux-arm64": "0.28.1", - "@esbuild/linux-ia32": "0.28.1", - "@esbuild/linux-loong64": "0.28.1", - "@esbuild/linux-mips64el": "0.28.1", - "@esbuild/linux-ppc64": "0.28.1", - "@esbuild/linux-riscv64": "0.28.1", - "@esbuild/linux-s390x": "0.28.1", - "@esbuild/linux-x64": "0.28.1", - "@esbuild/netbsd-arm64": "0.28.1", - "@esbuild/netbsd-x64": "0.28.1", - "@esbuild/openbsd-arm64": "0.28.1", - "@esbuild/openbsd-x64": "0.28.1", - "@esbuild/openharmony-arm64": "0.28.1", - "@esbuild/sunos-x64": "0.28.1", - "@esbuild/win32-arm64": "0.28.1", - "@esbuild/win32-ia32": "0.28.1", - "@esbuild/win32-x64": "0.28.1" + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" } }, "node_modules/escalade": { @@ -8183,6 +8432,7 @@ "version": "9.39.2", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", "dependencies": { @@ -8269,6 +8519,30 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, "node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", @@ -8338,14 +8612,11 @@ } }, "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } + "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", @@ -8387,9 +8658,9 @@ } }, "node_modules/eventsource-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz", - "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.1.tgz", + "integrity": "sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==", "dev": true, "license": "MIT", "engines": { @@ -8397,36 +8668,32 @@ } }, "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", "dev": true, "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" }, "engines": { - "node": ">=10" + "node": "^18.19.0 || >=20.5.0" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, "node_modules/expect-type": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", @@ -8579,7 +8846,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { @@ -8607,9 +8874,9 @@ } }, "node_modules/fast-uri": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", - "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.6.tgz", + "integrity": "sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==", "devOptional": true, "funding": [ { @@ -8674,13 +8941,6 @@ } } }, - "node_modules/fflate": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", - "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", - "dev": true, - "license": "MIT" - }, "node_modules/figures": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", @@ -8986,13 +9246,17 @@ } }, "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", "dev": true, "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9216,9 +9480,9 @@ "license": "CC0-1.0" }, "node_modules/hono": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.0.tgz", - "integrity": "sha512-jhunvfHWxd7J5EFfSgH4xsYJzSe/lfqbUCxiyyeaQasUsXeEHXtzVid+7EOGByc5JnFa23SSFL3Y2RV/z1T+eQ==", + "version": "4.13.4", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.4.tgz", + "integrity": "sha512-AGEwKIyRMHRv1t8Wjwa3LHxQ61X5CqrdFT+4BRNTpqS5aJNnpl5WLjADb7vFlJzI/8uK7T5QLVApCMQKNa3LgQ==", "dev": true, "license": "MIT", "engines": { @@ -9289,13 +9553,13 @@ } }, "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", "dev": true, "license": "Apache-2.0", "engines": { - "node": ">=10.17.0" + "node": ">=18.18.0" } }, "node_modules/husky": { @@ -9379,9 +9643,9 @@ } }, "node_modules/immer": { - "version": "11.1.16", - "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.16.tgz", - "integrity": "sha512-Xs7H9rBc+kti1J6RueUvbEBkmOz7jqj11XYgf+YMXAYzu8EeE7hwZ9poLXdVfVnGmJu7QAf41T7H2KuF6QoK6Q==", + "version": "11.1.18", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.18.tgz", + "integrity": "sha512-EQyQtLiYW029lyoczMl/Hh4Xu7cDecSc58JRYpHyL4tIAu3eqd1yJzQX04d2BZHDkzFFvm6qJEJWOtfDSWAXbQ==", "license": "MIT", "funding": { "type": "opencollective", @@ -9442,9 +9706,9 @@ } }, "node_modules/ip-address": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.4.0.tgz", - "integrity": "sha512-oSK96Grm3aP6OrS263xVxbNDGVL7rzBtYdpGqlDG8iQdoenDoTs/nkki+DflYbAEE8Xl6o5YxhxlrKvI3nqKXQ==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.5.0.tgz", + "integrity": "sha512-R5SnVLJmgYYvf2F2ZgwSBnelz5G4q5AxIC277GDfUaNbrZKNANcBC7RHqYYePlszf4kBolVkJauG0ZjHHFh55g==", "dev": true, "license": "MIT", "engines": { @@ -9690,13 +9954,13 @@ } }, "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9788,9 +10052,9 @@ } }, "node_modules/jose": { - "version": "6.2.8", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.8.tgz", - "integrity": "sha512-Bsdjwm3Qsd/P0jR+BHDe3LytDfY7WBq2HmCCLIwuVRHMuEC9ae7/R474GIUdF1NgCyZjzVo/A9DOiOBtXq8ZoQ==", + "version": "6.2.10", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.10.tgz", + "integrity": "sha512-iiW7J9qRFlGxvCOIBDBDxFePQSn7ZMAnrYGhrrOo6siO/MIqwfyilLR27pkfDgUk+raLuzADS8A3S/KLBisc0g==", "dev": true, "license": "MIT", "funding": { @@ -9798,9 +10062,9 @@ } }, "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT" }, @@ -9828,39 +10092,39 @@ } }, "node_modules/jsdom": { - "version": "29.1.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz", - "integrity": "sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==", + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-30.0.1.tgz", + "integrity": "sha512-52v7mUVUfNQVYYqE1lcdaymWL0njO7lTLUog6ZvW2U5KsbiLk/GnZlVJ+qx0xfNJZ6Gn+KSpPNE52vurbxZwrA==", "dev": true, "license": "MIT", "dependencies": { - "@asamuzakjp/css-color": "^5.1.11", - "@asamuzakjp/dom-selector": "^7.1.1", + "@asamuzakjp/css-color": "^6.0.5", + "@asamuzakjp/dom-selector": "^8.3.0", "@bramus/specificity": "^2.4.2", - "@csstools/css-syntax-patches-for-csstree": "^1.1.3", - "@exodus/bytes": "^1.15.0", + "@csstools/css-syntax-patches-for-csstree": "^1.1.7", + "@exodus/bytes": "^1.15.1", "css-tree": "^3.2.1", "data-urls": "^7.0.0", "decimal.js": "^10.6.0", "html-encoding-sniffer": "^6.0.0", "is-potential-custom-element-name": "^1.0.1", - "lru-cache": "^11.3.5", + "lru-cache": "^11.5.2", "parse5": "^8.0.1", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^6.0.1", - "undici": "^7.25.0", + "tough-cookie": "^6.0.2", + "undici": "^8.9.0", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^8.0.1", "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^16.0.1", + "whatwg-url": "^17.1.0", "xml-name-validator": "^5.0.0" }, "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24.0.0" + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" }, "peerDependencies": { - "canvas": "^3.0.0" + "canvas": "^3.2.3" }, "peerDependenciesMeta": { "canvas": { @@ -9896,9 +10160,9 @@ "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", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "devOptional": true, "license": "MIT" }, @@ -10532,13 +10796,13 @@ } }, "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/mimic-function": { @@ -10597,16 +10861,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -10669,9 +10923,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.17", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz", - "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==", + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "dev": true, "funding": [ { @@ -10695,19 +10949,40 @@ "license": "MIT" }, "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.1.0.tgz", + "integrity": "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==", "dev": true, "license": "MIT", + "dependencies": { + "content-type": "^2.1.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/node-releases": { - "version": "2.0.53", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", - "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", + "node_modules/negotiator/node_modules/content-type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/node-releases": { + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", "dev": true, "license": "MIT", "engines": { @@ -10715,16 +10990,33 @@ } }, "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.0.0" + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/object-assign": { @@ -10813,10 +11105,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/onetime/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/open": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", - "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/open/-/open-11.0.1.tgz", + "integrity": "sha512-NzwMUB6C1D0+Kd+9iMS/H4k+Ck3cTX6Ckyfr/gAGlmvSE1LUQZnEZvWBi4PYmMwH/S5SMeTXnE+9uAz8uF+pWw==", "dev": true, "license": "MIT", "dependencies": { @@ -10824,8 +11126,8 @@ "define-lazy-prop": "^3.0.0", "is-in-ssh": "^1.0.0", "is-inside-container": "^1.0.0", - "powershell-utils": "^0.1.0", - "wsl-utils": "^0.3.0" + "powershell-utils": "^0.2.0", + "wsl-utils": "^1.0.0" }, "engines": { "node": ">=20" @@ -11321,9 +11623,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", - "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz", + "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==", "dev": true, "license": "MIT", "dependencies": { @@ -11335,9 +11637,9 @@ } }, "node_modules/powershell-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", - "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.2.0.tgz", + "integrity": "sha512-ZlsFlG7MtSFCoc5xreOvBAozCJ6Pf06opgJjh9ONEv418xpZSAzNjstD36C6+JwOnfSqOW/9uDkqKjezTdxZhw==", "dev": true, "license": "MIT", "engines": { @@ -11573,7 +11875,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -11984,9 +12286,9 @@ } }, "node_modules/recast": { - "version": "0.23.19", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.19.tgz", - "integrity": "sha512-T98lym7kH+pnZmRaD8yDRdaNqyUbwnbEBx0MuchrzMFOEMray4AO3ZJoTUZ5r78Ao78X/OhzW0DL8GB85w/I2w==", + "version": "0.23.21", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.21.tgz", + "integrity": "sha512-mFAyJq9vUbSTARLZUvAEf1z3YxlvAwswbmxMx2mPA/MSm4KmpwvwvhsH/NIrZhyOuwD60Lzyw2qh83uCbgTPYw==", "dev": true, "license": "MIT", "dependencies": { @@ -12218,13 +12520,13 @@ } }, "node_modules/rolldown": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.3.tgz", - "integrity": "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.5.tgz", + "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.143.0", + "@oxc-project/types": "=0.146.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -12234,26 +12536,27 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.2.3", - "@rolldown/binding-darwin-arm64": "1.2.3", - "@rolldown/binding-darwin-x64": "1.2.3", - "@rolldown/binding-freebsd-x64": "1.2.3", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.3", - "@rolldown/binding-linux-arm64-gnu": "1.2.3", - "@rolldown/binding-linux-arm64-musl": "1.2.3", - "@rolldown/binding-linux-ppc64-gnu": "1.2.3", - "@rolldown/binding-linux-s390x-gnu": "1.2.3", - "@rolldown/binding-linux-x64-gnu": "1.2.3", - "@rolldown/binding-linux-x64-musl": "1.2.3", - "@rolldown/binding-openharmony-arm64": "1.2.3", - "@rolldown/binding-win32-arm64-msvc": "1.2.3", - "@rolldown/binding-win32-x64-msvc": "1.2.3" + "@rolldown/binding-android-arm-eabi": "1.2.5", + "@rolldown/binding-android-arm64": "1.2.5", + "@rolldown/binding-darwin-arm64": "1.2.5", + "@rolldown/binding-darwin-x64": "1.2.5", + "@rolldown/binding-freebsd-x64": "1.2.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.5", + "@rolldown/binding-linux-arm64-gnu": "1.2.5", + "@rolldown/binding-linux-arm64-musl": "1.2.5", + "@rolldown/binding-linux-ppc64-gnu": "1.2.5", + "@rolldown/binding-linux-s390x-gnu": "1.2.5", + "@rolldown/binding-linux-x64-gnu": "1.2.5", + "@rolldown/binding-linux-x64-musl": "1.2.5", + "@rolldown/binding-openharmony-arm64": "1.2.5", + "@rolldown/binding-win32-arm64-msvc": "1.2.5", + "@rolldown/binding-win32-x64-msvc": "1.2.5" } }, "node_modules/rolldown/node_modules/@oxc-project/types": { - "version": "0.143.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.143.0.tgz", - "integrity": "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==", + "version": "0.146.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", + "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", "dev": true, "license": "MIT", "funding": { @@ -12500,114 +12803,14 @@ "node": ">=20.18.1" } }, - "node_modules/shadcn/node_modules/execa": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", - "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/merge-streams": "^4.0.0", - "cross-spawn": "^7.0.6", - "figures": "^6.1.0", - "get-stream": "^9.0.0", - "human-signals": "^8.0.1", - "is-plain-obj": "^4.1.0", - "is-stream": "^4.0.1", - "npm-run-path": "^6.0.0", - "pretty-ms": "^9.2.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^4.0.0", - "yoctocolors": "^2.1.1" - }, - "engines": { - "node": "^18.19.0 || >=20.5.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/shadcn/node_modules/get-stream": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", - "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sec-ant/readable-stream": "^0.4.1", - "is-stream": "^4.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/shadcn/node_modules/human-signals": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", - "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/shadcn/node_modules/is-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", - "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/shadcn/node_modules/npm-run-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", - "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/shadcn/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/shadcn/node_modules/strip-final-newline": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", - "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "node_modules/shadcn/node_modules/undici": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", + "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=20.18.1" } }, "node_modules/shadcn/node_modules/zod": { @@ -12739,21 +12942,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "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/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -12903,80 +13091,32 @@ } } }, - "node_modules/storybook/node_modules/@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/storybook/node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/storybook/node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^4.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/storybook/node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "node_modules/storybook/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": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" + "@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" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" } }, - "node_modules/storybook/node_modules/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "node_modules/storybook/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", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=18" - } + "license": "MIT" }, "node_modules/storybook/node_modules/open": { "version": "10.2.0", @@ -12997,16 +13137,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/storybook/node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/storybook/node_modules/wsl-utils": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", @@ -13096,9 +13226,9 @@ } }, "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", "dev": true, "license": "MIT", "engines": { @@ -13108,14 +13238,27 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-indent": { @@ -13309,22 +13452,22 @@ } }, "node_modules/tldts": { - "version": "7.4.10", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.10.tgz", - "integrity": "sha512-GgouD1B+sWwvkaEq8vXC15DjQitxbvs12oIXELpconwm+Tg3zfcEv4jgzq3vtKverDXsg3VI8aRgNL2Nra0Iog==", + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.11.tgz", + "integrity": "sha512-aBiNayCfTQxuIJBm06M+xR14cYaYlDlSXZbgsnKzKNxDKUVq7KFwTjwBSsb7m9Y5xO8WfPnBc63WaYFMTGlvqw==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^7.4.10" + "tldts-core": "^7.4.11" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "7.4.10", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.10.tgz", - "integrity": "sha512-KnQjp53ZekKgm/r3l+u8kJGGzYgrWdP8+Mql7a4vijh2WE0IrZWspQj/TpTxDho/YxO+AnOZnIjQcCD+q6iJsw==", + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.11.tgz", + "integrity": "sha512-CW3WN2rIIE/Of21mulhgnGOwoDyEFNygyIBOONSdyAuSATgMMUCpLeUlB+E8sAwA5xRV9hYPl+kyZ9citHCaKg==", "dev": true, "license": "MIT" }, @@ -13351,16 +13494,6 @@ "node": ">=0.6" } }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/tough-cookie": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.2.tgz", @@ -13436,16 +13569,6 @@ "node": ">=6" } }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -13511,9 +13634,9 @@ } }, "node_modules/type-is/node_modules/content-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", - "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", "dev": true, "license": "MIT", "engines": { @@ -13590,13 +13713,13 @@ } }, "node_modules/undici": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", - "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-8.10.0.tgz", + "integrity": "sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=20.18.1" + "node": ">=22.19.0" } }, "node_modules/undici-types": { @@ -13666,9 +13789,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", + "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", "dev": true, "funding": [ { @@ -13700,7 +13823,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "devOptional": true, + "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -13821,16 +13944,16 @@ } }, "node_modules/vite": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz", - "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.5", - "postcss": "^8.5.25", - "rolldown": "~1.2.1", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", "tinyglobby": "^0.2.17" }, "bin": { @@ -13847,7 +13970,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0", + "@vitejs/devtools": "^0.4.0 || ^0.5.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", @@ -14261,6 +14384,44 @@ } } }, + "node_modules/vitest/node_modules/@vitest/expect": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz", + "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/@vitest/spy": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", + "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", @@ -14302,18 +14463,18 @@ } }, "node_modules/whatwg-url": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", - "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-17.1.0.tgz", + "integrity": "sha512-3GeworPmc2ZfEEHP7lEbUfBX/L75wdEsi0rLNhXcXxnoN5jyq0SL5gCy06SGW2cyTIZdTvWIDQNQoza++vKeaw==", "dev": true, "license": "MIT", "dependencies": { - "@exodus/bytes": "^1.11.0", + "@exodus/bytes": "^1.15.1", "tr46": "^6.0.0", "webidl-conversions": "^8.0.1" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "node": "^22.14.0 || >=24.0.0" } }, "node_modules/which": { @@ -14420,9 +14581,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.21.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.2.tgz", - "integrity": "sha512-54dMVAo4WIe6SKy3vBgN+9bJZqqQ8IMRevAkOLQALhi49qkkQDQfWdAZ8KQlXiEabw88ARXXdUrlvtbKQX+aKw==", + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", "dev": true, "license": "MIT", "engines": { @@ -14442,9 +14603,9 @@ } }, "node_modules/wsl-utils": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz", - "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-1.0.0.tgz", + "integrity": "sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA==", "dev": true, "license": "MIT", "dependencies": { @@ -14458,6 +14619,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/wsl-utils/node_modules/powershell-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "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", @@ -14664,7 +14838,6 @@ "lucide-react": "1.31.0", "react-hook-form": "7.85.0", "react-i18next": "17.0.11", - "react-router-dom": "7.18.2", "react-syntax-highlighter": "16.1.1", "recharts": "3.10.1", "uuid": "14.0.1", @@ -14677,153 +14850,362 @@ "@storybook/addon-themes": "10.5.7", "@storybook/react-vite": "10.5.7", "@tailwindcss/vite": "4.3.3", - "@testing-library/jest-dom": "6.9.1", - "@testing-library/react": "16.3.2", - "@testing-library/user-event": "14.6.4", "@types/eslint__js": "8.42.3", "@types/lodash": "4.17.25", "@types/react-syntax-highlighter": "15.5.13", "@types/uuid": "10.0.0", - "@vitejs/plugin-react": "6.0.5", - "@vitest/ui": "4.1.10", - "jsdom": "29.1.1", "msw": "2.15.0", "storybook": "10.5.7", "vite": "8.2.1" } }, - "packages/web/node_modules/@hookform/resolvers": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.7.1.tgz", - "integrity": "sha512-8wS/P4UDr5sQDe4nFaV51TVyfDPrWgNIXweqG0Bs9Z5LSuzKLb+RQNPvkN2oHM5SRrJyWrVH/F+LOUcFjUyvwQ==", - "license": "MIT", + "packages/web/node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", "dependencies": { - "@standard-schema/utils": "^0.3.0" + "detect-libc": "^2.0.3" }, - "peerDependencies": { - "@sinclair/typebox": ">=0.25.24", - "@standard-schema/spec": "^1.0.0", - "@typeschema/main": ">=0.13.7", - "@vinejs/vine": "^2.0.0 || ^3.0.0 || ^4.0.0", - "ajv": "^8.12.0", - "ajv-errors": "^3.0.0", - "ajv-formats": "^2.1.1", - "arktype": "^2.0.0", - "ata-validator": "^1.2.0", - "class-transformer": ">=0.4.0", - "class-validator": ">=0.12.0", - "computed-types": "^1.0.0", - "effect": "^3.10.3", - "fluentvalidation-ts": "^3.0.0", - "fp-ts": "^2.7.0", - "io-ts": "^2.0.0", - "joi": "^17.0.0", - "nope-validator": ">=0.12.0", - "react-hook-form": "^7.55.0", - "superstruct": ">=0.12.0", - "typanion": "^3.3.2", - "valibot": ">=0.31.0 || ^1.0.0-beta.4 || ^1.0.0-rc", - "vest": ">=3.0.0", - "yup": "^1.0.0", - "zod": "^3.25.0 || ^4.0.0" + "engines": { + "node": ">= 12.0.0" }, - "peerDependenciesMeta": { - "@sinclair/typebox": { - "optional": true - }, - "@standard-schema/spec": { - "optional": true - }, - "@typeschema/main": { - "optional": true - }, - "@vinejs/vine": { - "optional": true - }, - "ajv": { - "optional": true - }, - "ajv-errors": { - "optional": true - }, - "ajv-formats": { - "optional": true - }, - "arktype": { - "optional": true - }, - "ata-validator": { - "optional": true - }, - "class-transformer": { - "optional": true - }, - "class-validator": { - "optional": true - }, - "computed-types": { - "optional": true - }, - "effect": { - "optional": true - }, - "fluentvalidation-ts": { - "optional": true - }, - "fp-ts": { - "optional": true - }, - "io-ts": { - "optional": true - }, - "joi": { - "optional": true - }, - "nope-validator": { - "optional": true - }, - "superstruct": { - "optional": true - }, - "typanion": { - "optional": true - }, - "valibot": { - "optional": true - }, - "vest": { - "optional": true - }, - "yup": { - "optional": true - }, - "zod": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" } }, - "packages/web/node_modules/@vitejs/plugin-react": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", - "integrity": "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==", + "packages/web/node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "^1.0.1" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "packages/web/node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "packages/web/node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "packages/web/node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "packages/web/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "packages/web/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "packages/web/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "packages/web/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "packages/web/node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "packages/web/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "packages/web/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "packages/web/node_modules/vite": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz", + "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.25", + "rolldown": "~1.2.1", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" }, "peerDependencies": { - "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", - "babel-plugin-react-compiler": "^1.0.0", - "vite": "^8.0.0" + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { - "@rolldown/plugin-babel": { + "@types/node": { "optional": true }, - "babel-plugin-react-compiler": { + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { "optional": true } } diff --git a/package.json b/package.json index 9053b9ec..60025721 100644 --- a/package.json +++ b/package.json @@ -39,17 +39,23 @@ "class-variance-authority": "0.7.1", "react": "19.2.8", "react-dom": "19.2.8", + "react-router-dom": "7.18.2", "zod": "4.4.3" }, "devDependencies": { "@eslint/js": "9.39.2", + "@testing-library/jest-dom": "7.0.1", + "@testing-library/react": "16.3.2", + "@testing-library/user-event": "14.6.6", "@types/node": "26.2.0", "@types/react": "19.2.18", "@types/react-dom": "19.2.4", + "@vitejs/plugin-react": "6.0.5", "@vitest/coverage-v8": "4.1.10", "eslint": "9.39.2", "globals": "17.10.0", "husky": "9.1.7", + "jsdom": "30.0.1", "prettier": "3.9.6", "prettier-plugin-tailwindcss": "0.8.1", "rimraf": "6.1.3", diff --git a/packages/shared/src/__fixtures__/charts.ts b/packages/shared/src/__fixtures__/charts.ts new file mode 100644 index 00000000..71c11793 --- /dev/null +++ b/packages/shared/src/__fixtures__/charts.ts @@ -0,0 +1,16 @@ +import colors from 'tailwindcss/colors'; + +import { DonutChartData } from '@react-starter/shared/components/Chart/DonutChart'; + +export const donutChartDataFixture: DonutChartData[] = [ + { + name: 'Apples', + value: 3, + fill: colors.red[700], + }, + { + name: 'Oranges', + value: 7, + fill: colors.orange[300], + }, +]; diff --git a/packages/web/src/common/components/Accordion/Accordion.test.tsx b/packages/shared/src/components/Accordion/Accordion.test.tsx similarity index 98% rename from packages/web/src/common/components/Accordion/Accordion.test.tsx rename to packages/shared/src/components/Accordion/Accordion.test.tsx index fdd78333..391ed680 100644 --- a/packages/web/src/common/components/Accordion/Accordion.test.tsx +++ b/packages/shared/src/components/Accordion/Accordion.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { render, screen, waitFor } from '@/test/test-utils'; +import { render, screen, waitFor } from '@testing-library/react'; import Accordion from './Accordion'; diff --git a/packages/web/src/common/components/Accordion/Accordion.tsx b/packages/shared/src/components/Accordion/Accordion.tsx similarity index 98% rename from packages/web/src/common/components/Accordion/Accordion.tsx rename to packages/shared/src/components/Accordion/Accordion.tsx index 6ff3fc72..3ad7e7f6 100644 --- a/packages/web/src/common/components/Accordion/Accordion.tsx +++ b/packages/shared/src/components/Accordion/Accordion.tsx @@ -3,7 +3,7 @@ import noop from 'lodash/noop'; import { animated, useSpring } from '@react-spring/web'; import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; import FAIcon from '../Icon/FAIcon'; /** diff --git a/packages/web/src/common/components/Alert/ErrorAlert.test.tsx b/packages/shared/src/components/Alert/ErrorAlert.test.tsx similarity index 92% rename from packages/web/src/common/components/Alert/ErrorAlert.test.tsx rename to packages/shared/src/components/Alert/ErrorAlert.test.tsx index 11d6c7d0..b278c50f 100644 --- a/packages/web/src/common/components/Alert/ErrorAlert.test.tsx +++ b/packages/shared/src/components/Alert/ErrorAlert.test.tsx @@ -1,8 +1,8 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; -import { ErrorAlert } from '@/common/components/Alert/ErrorAlert'; +import { ErrorAlert } from '@react-starter/shared/components/Alert/ErrorAlert'; describe('ErrorAlert', () => { const descriptionValue = 'the description text'; diff --git a/packages/web/src/common/components/Alert/ErrorAlert.tsx b/packages/shared/src/components/Alert/ErrorAlert.tsx similarity index 92% rename from packages/web/src/common/components/Alert/ErrorAlert.tsx rename to packages/shared/src/components/Alert/ErrorAlert.tsx index 5de55ab4..f8a83f76 100644 --- a/packages/web/src/common/components/Alert/ErrorAlert.tsx +++ b/packages/shared/src/components/Alert/ErrorAlert.tsx @@ -2,7 +2,7 @@ import { AlertCircleIcon } from 'lucide-react'; import { cn } from '@react-starter/shared/utils/css'; import { Alert, AlertDescription, AlertTitle } from '@react-starter/shared/components/shadcn/alert'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; /** * Properties for the `ErrorAlert` component. diff --git a/packages/web/src/common/components/Backdrop/Backdrop.test.tsx b/packages/shared/src/components/Backdrop/Backdrop.test.tsx similarity index 95% rename from packages/web/src/common/components/Backdrop/Backdrop.test.tsx rename to packages/shared/src/components/Backdrop/Backdrop.test.tsx index a649dfa2..ef78a211 100644 --- a/packages/web/src/common/components/Backdrop/Backdrop.test.tsx +++ b/packages/shared/src/components/Backdrop/Backdrop.test.tsx @@ -1,7 +1,7 @@ import userEvent from '@testing-library/user-event'; import { describe, expect, it, vi } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import Backdrop from './Backdrop'; diff --git a/packages/web/src/common/components/Backdrop/Backdrop.tsx b/packages/shared/src/components/Backdrop/Backdrop.tsx similarity index 89% rename from packages/web/src/common/components/Backdrop/Backdrop.tsx rename to packages/shared/src/components/Backdrop/Backdrop.tsx index 83853038..750dc2f6 100644 --- a/packages/web/src/common/components/Backdrop/Backdrop.tsx +++ b/packages/shared/src/components/Backdrop/Backdrop.tsx @@ -1,6 +1,6 @@ import { PropsWithChildren } from 'react'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; import { cn } from '@react-starter/shared/utils/css'; /** @@ -17,7 +17,7 @@ export interface BackdropProps extends BaseComponentProps, PropsWithChildren { * The `Backdrop` component renders a semi-opaque background for another * component. Usually used to partially mask background content to draw * attention to content in the foreground such as a `Dialog` or `Menu`. - * @param {BackgroundProps} props - Component properties + * @param {BackdropProps} props - Component properties */ const Backdrop = ({ children, className, onClick, testId = 'backdrop' }: BackdropProps) => { const handleClick = (e: React.MouseEvent) => { diff --git a/packages/web/src/common/components/Badge/Badge.test.tsx b/packages/shared/src/components/Badge/Badge.test.tsx similarity index 94% rename from packages/web/src/common/components/Badge/Badge.test.tsx rename to packages/shared/src/components/Badge/Badge.test.tsx index e97cafd5..a6dea820 100644 --- a/packages/web/src/common/components/Badge/Badge.test.tsx +++ b/packages/shared/src/components/Badge/Badge.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import Badge from './Badge'; diff --git a/packages/web/src/common/components/Badge/Badge.tsx b/packages/shared/src/components/Badge/Badge.tsx similarity index 95% rename from packages/web/src/common/components/Badge/Badge.tsx rename to packages/shared/src/components/Badge/Badge.tsx index 1001c93f..dc30e9be 100644 --- a/packages/web/src/common/components/Badge/Badge.tsx +++ b/packages/shared/src/components/Badge/Badge.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren } from 'react'; import { cva, VariantProps } from 'class-variance-authority'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; import { cn } from '@react-starter/shared/utils/css'; /** diff --git a/packages/web/src/common/components/Breadcrumbs/Breadcrumbs.test.tsx b/packages/shared/src/components/Breadcrumbs/Breadcrumbs.test.tsx similarity index 88% rename from packages/web/src/common/components/Breadcrumbs/Breadcrumbs.test.tsx rename to packages/shared/src/components/Breadcrumbs/Breadcrumbs.test.tsx index fcf7aa81..4ed4185c 100644 --- a/packages/web/src/common/components/Breadcrumbs/Breadcrumbs.test.tsx +++ b/packages/shared/src/components/Breadcrumbs/Breadcrumbs.test.tsx @@ -1,10 +1,13 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import Breadcrumbs from './Breadcrumbs'; +import { MemoryRouter } from 'react-router-dom'; describe('Breadcrumbs', () => { + const wrapper = ({ children }: { children: React.ReactNode }) => {children}; + it('should render successfully', async () => { // ARRANGE render( @@ -23,6 +26,7 @@ describe('Breadcrumbs', () => { , + { wrapper }, ); await screen.findByTestId('breadcrumbs'); @@ -48,6 +52,7 @@ describe('Breadcrumbs', () => { , + { wrapper }, ); await screen.findByTestId('breadcrumbs'); diff --git a/packages/web/src/common/components/Breadcrumbs/Breadcrumbs.tsx b/packages/shared/src/components/Breadcrumbs/Breadcrumbs.tsx similarity index 96% rename from packages/web/src/common/components/Breadcrumbs/Breadcrumbs.tsx rename to packages/shared/src/components/Breadcrumbs/Breadcrumbs.tsx index 624cc93e..d4ab42c9 100644 --- a/packages/web/src/common/components/Breadcrumbs/Breadcrumbs.tsx +++ b/packages/shared/src/components/Breadcrumbs/Breadcrumbs.tsx @@ -1,9 +1,9 @@ import { PropsWithChildren } from 'react'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; import { cn } from '@react-starter/shared/utils/css'; -import { default as CommonLink, LinkProps as CommonLinkProps } from '@/common/components/Link/Link'; -import FAIcon, { FAIconProps } from '../Icon/FAIcon'; +import { default as CommonLink, LinkProps as CommonLinkProps } from '@react-starter/shared/components/Link/Link'; +import FAIcon, { FAIconProps } from '@react-starter/shared/components/Icon/FAIcon'; /** * Properties for the `Breadcrumbs` component. diff --git a/packages/web/src/common/components/Button/Button.test.tsx b/packages/shared/src/components/Button/Button.test.tsx similarity index 98% rename from packages/web/src/common/components/Button/Button.test.tsx rename to packages/shared/src/components/Button/Button.test.tsx index 9398a3b1..004b94a7 100644 --- a/packages/web/src/common/components/Button/Button.test.tsx +++ b/packages/shared/src/components/Button/Button.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it, vi } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import Button from './Button'; diff --git a/packages/web/src/common/components/Button/Button.tsx b/packages/shared/src/components/Button/Button.tsx similarity index 95% rename from packages/web/src/common/components/Button/Button.tsx rename to packages/shared/src/components/Button/Button.tsx index 3ad1efd9..09debfc8 100644 --- a/packages/web/src/common/components/Button/Button.tsx +++ b/packages/shared/src/components/Button/Button.tsx @@ -1,7 +1,7 @@ import { ButtonHTMLAttributes } from 'react'; import { cva, type VariantProps } from 'class-variance-authority'; -import { PropsWithTestId } from '@/common/utils/types'; +import { PropsWithTestId } from '@react-starter/shared/types/components'; import { cn } from '@react-starter/shared/utils/css'; /** diff --git a/packages/web/src/common/components/Card/Card.test.tsx b/packages/shared/src/components/Card/Card.test.tsx similarity index 92% rename from packages/web/src/common/components/Card/Card.test.tsx rename to packages/shared/src/components/Card/Card.test.tsx index 9e543ab6..08d421fe 100644 --- a/packages/web/src/common/components/Card/Card.test.tsx +++ b/packages/shared/src/components/Card/Card.test.tsx @@ -1,7 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; - -import logo from '@/assets/img/logo.png'; +import { render, screen } from '@testing-library/react'; import Card from './Card'; @@ -10,7 +8,7 @@ describe('Card', () => { // ARRANGE render( - + Title Subtitle diff --git a/packages/web/src/common/components/Card/Card.tsx b/packages/shared/src/components/Card/Card.tsx similarity index 98% rename from packages/web/src/common/components/Card/Card.tsx rename to packages/shared/src/components/Card/Card.tsx index ea1a0e53..b59e16fe 100644 --- a/packages/web/src/common/components/Card/Card.tsx +++ b/packages/shared/src/components/Card/Card.tsx @@ -1,6 +1,6 @@ import { ImgHTMLAttributes, PropsWithChildren } from 'react'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; import { cn } from '@react-starter/shared/utils/css'; import Divider from '../Divider/Divider'; diff --git a/packages/web/src/common/components/Card/MessageCard.test.tsx b/packages/shared/src/components/Card/MessageCard.test.tsx similarity index 96% rename from packages/web/src/common/components/Card/MessageCard.test.tsx rename to packages/shared/src/components/Card/MessageCard.test.tsx index 3428d434..93b50d18 100644 --- a/packages/web/src/common/components/Card/MessageCard.test.tsx +++ b/packages/shared/src/components/Card/MessageCard.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import MessageCard from './MessageCard'; diff --git a/packages/web/src/common/components/Card/MessageCard.tsx b/packages/shared/src/components/Card/MessageCard.tsx similarity index 94% rename from packages/web/src/common/components/Card/MessageCard.tsx rename to packages/shared/src/components/Card/MessageCard.tsx index 4f2ce2db..b33445e1 100644 --- a/packages/web/src/common/components/Card/MessageCard.tsx +++ b/packages/shared/src/components/Card/MessageCard.tsx @@ -1,6 +1,6 @@ import { cn } from '@react-starter/shared/utils/css'; import Card, { CardProps } from './Card'; -import FAIcon, { FAIconProps } from '@/common/components/Icon/FAIcon'; +import FAIcon, { FAIconProps } from '@react-starter/shared/components/Icon/FAIcon'; /** * Properties for the `MessageCard` React component. diff --git a/packages/web/src/common/components/Chart/DonutChart.test.tsx b/packages/shared/src/components/Chart/DonutChart.test.tsx similarity index 72% rename from packages/web/src/common/components/Chart/DonutChart.test.tsx rename to packages/shared/src/components/Chart/DonutChart.test.tsx index c28d14f8..22cfda63 100644 --- a/packages/web/src/common/components/Chart/DonutChart.test.tsx +++ b/packages/shared/src/components/Chart/DonutChart.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; -import { donutChartDataFixture } from '@/__fixtures__/charts'; +import { donutChartDataFixture } from '@react-starter/shared/__fixtures__/charts'; import DonutChart from './DonutChart'; diff --git a/packages/web/src/common/components/Chart/DonutChart.tsx b/packages/shared/src/components/Chart/DonutChart.tsx similarity index 95% rename from packages/web/src/common/components/Chart/DonutChart.tsx rename to packages/shared/src/components/Chart/DonutChart.tsx index b767593e..6f58bb9b 100644 --- a/packages/web/src/common/components/Chart/DonutChart.tsx +++ b/packages/shared/src/components/Chart/DonutChart.tsx @@ -1,6 +1,6 @@ import { CellProps, Legend, Pie, PieChart, PieProps } from 'recharts'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; /** * Describes a single piece of data for a `DonutChart` used to create a single diff --git a/packages/web/src/common/components/Content/Columns.test.tsx b/packages/shared/src/components/Content/Columns.test.tsx similarity index 89% rename from packages/web/src/common/components/Content/Columns.test.tsx rename to packages/shared/src/components/Content/Columns.test.tsx index b58fbbb1..a23d996c 100644 --- a/packages/web/src/common/components/Content/Columns.test.tsx +++ b/packages/shared/src/components/Content/Columns.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import Columns from './Columns'; diff --git a/packages/web/src/common/components/Content/Columns.tsx b/packages/shared/src/components/Content/Columns.tsx similarity index 96% rename from packages/web/src/common/components/Content/Columns.tsx rename to packages/shared/src/components/Content/Columns.tsx index 92a6fe81..134093d4 100644 --- a/packages/web/src/common/components/Content/Columns.tsx +++ b/packages/shared/src/components/Content/Columns.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren } from 'react'; import { cva, VariantProps } from 'class-variance-authority'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; import { cn } from '@react-starter/shared/utils/css'; /** diff --git a/packages/web/src/common/components/Content/Container.test.tsx b/packages/shared/src/components/Content/Container.test.tsx similarity index 89% rename from packages/web/src/common/components/Content/Container.test.tsx rename to packages/shared/src/components/Content/Container.test.tsx index 8c1bf470..6ddb6c4c 100644 --- a/packages/web/src/common/components/Content/Container.test.tsx +++ b/packages/shared/src/components/Content/Container.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import Container from './Container'; diff --git a/packages/web/src/common/components/Content/Container.tsx b/packages/shared/src/components/Content/Container.tsx similarity index 95% rename from packages/web/src/common/components/Content/Container.tsx rename to packages/shared/src/components/Content/Container.tsx index 63009a82..d57fc40a 100644 --- a/packages/web/src/common/components/Content/Container.tsx +++ b/packages/shared/src/components/Content/Container.tsx @@ -2,7 +2,7 @@ import { PropsWithChildren } from 'react'; import { cva, VariantProps } from 'class-variance-authority'; import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; /** * Defines the `Container` component base and variant styles. diff --git a/packages/web/src/common/components/Content/Page.test.tsx b/packages/shared/src/components/Content/Page.test.tsx similarity index 94% rename from packages/web/src/common/components/Content/Page.test.tsx rename to packages/shared/src/components/Content/Page.test.tsx index 673cbfc2..511573ab 100644 --- a/packages/web/src/common/components/Content/Page.test.tsx +++ b/packages/shared/src/components/Content/Page.test.tsx @@ -1,4 +1,4 @@ -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import { describe, expect, it } from 'vitest'; diff --git a/packages/web/src/common/components/Content/Page.tsx b/packages/shared/src/components/Content/Page.tsx similarity index 88% rename from packages/web/src/common/components/Content/Page.tsx rename to packages/shared/src/components/Content/Page.tsx index 8fb74dc4..c334dbb6 100644 --- a/packages/web/src/common/components/Content/Page.tsx +++ b/packages/shared/src/components/Content/Page.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren } from 'react'; import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; /** * Properties for the `Page` React component. diff --git a/packages/web/src/common/components/Dialog/Dialog.test.tsx b/packages/shared/src/components/Dialog/Dialog.test.tsx similarity index 99% rename from packages/web/src/common/components/Dialog/Dialog.test.tsx rename to packages/shared/src/components/Dialog/Dialog.test.tsx index 16a5d5db..7f516bfc 100644 --- a/packages/web/src/common/components/Dialog/Dialog.test.tsx +++ b/packages/shared/src/components/Dialog/Dialog.test.tsx @@ -1,7 +1,7 @@ import userEvent from '@testing-library/user-event'; import { describe, expect, it } from 'vitest'; -import { render, screen, waitFor } from '@/test/test-utils'; +import { render, screen, waitFor } from '@testing-library/react'; import Dialog from './Dialog'; diff --git a/packages/web/src/common/components/Dialog/Dialog.tsx b/packages/shared/src/components/Dialog/Dialog.tsx similarity index 99% rename from packages/web/src/common/components/Dialog/Dialog.tsx rename to packages/shared/src/components/Dialog/Dialog.tsx index 0523862b..e05a0fbb 100644 --- a/packages/web/src/common/components/Dialog/Dialog.tsx +++ b/packages/shared/src/components/Dialog/Dialog.tsx @@ -2,7 +2,7 @@ import { createContext, PropsWithChildren, ReactNode, useContext, useState } fro import noop from 'lodash/noop'; import { cva, VariantProps } from 'class-variance-authority'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; import { cn } from '@react-starter/shared/utils/css'; import Backdrop from '../Backdrop/Backdrop'; import Divider from '../Divider/Divider'; diff --git a/packages/web/src/common/components/Divider/Divider.test.tsx b/packages/shared/src/components/Divider/Divider.test.tsx similarity index 93% rename from packages/web/src/common/components/Divider/Divider.test.tsx rename to packages/shared/src/components/Divider/Divider.test.tsx index 49f34ba5..e11a038c 100644 --- a/packages/web/src/common/components/Divider/Divider.test.tsx +++ b/packages/shared/src/components/Divider/Divider.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import Divider from './Divider'; diff --git a/packages/web/src/common/components/Divider/Divider.tsx b/packages/shared/src/components/Divider/Divider.tsx similarity index 81% rename from packages/web/src/common/components/Divider/Divider.tsx rename to packages/shared/src/components/Divider/Divider.tsx index abfbfab2..d1d3703e 100644 --- a/packages/web/src/common/components/Divider/Divider.tsx +++ b/packages/shared/src/components/Divider/Divider.tsx @@ -1,5 +1,5 @@ import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; /** * The `Divider` component renders a horizontal line which visually separates diff --git a/packages/web/src/common/components/Dropdown/DropdownMenu.test.tsx b/packages/shared/src/components/Dropdown/DropdownMenu.test.tsx similarity index 98% rename from packages/web/src/common/components/Dropdown/DropdownMenu.test.tsx rename to packages/shared/src/components/Dropdown/DropdownMenu.test.tsx index 9c329089..4d3ffcf9 100644 --- a/packages/web/src/common/components/Dropdown/DropdownMenu.test.tsx +++ b/packages/shared/src/components/Dropdown/DropdownMenu.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it, vi } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { render, screen, waitFor } from '@/test/test-utils'; +import { render, screen, waitFor } from '@testing-library/react'; import DropdownMenu from './DropdownMenu'; diff --git a/packages/web/src/common/components/Dropdown/DropdownMenu.tsx b/packages/shared/src/components/Dropdown/DropdownMenu.tsx similarity index 98% rename from packages/web/src/common/components/Dropdown/DropdownMenu.tsx rename to packages/shared/src/components/Dropdown/DropdownMenu.tsx index 207c84ac..b9af61bf 100644 --- a/packages/web/src/common/components/Dropdown/DropdownMenu.tsx +++ b/packages/shared/src/components/Dropdown/DropdownMenu.tsx @@ -1,7 +1,7 @@ import { createContext, PropsWithChildren, useContext, useState } from 'react'; import noop from 'lodash/noop'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; import { cn } from '@react-starter/shared/utils/css'; import Backdrop from '../Backdrop/Backdrop'; import Divider from '../Divider/Divider'; diff --git a/packages/web/src/common/components/Form/Checkbox.test.tsx b/packages/shared/src/components/Form/Checkbox.test.tsx similarity index 98% rename from packages/web/src/common/components/Form/Checkbox.test.tsx rename to packages/shared/src/components/Form/Checkbox.test.tsx index a4ffb959..3852b9c7 100644 --- a/packages/web/src/common/components/Form/Checkbox.test.tsx +++ b/packages/shared/src/components/Form/Checkbox.test.tsx @@ -4,7 +4,7 @@ import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import Checkbox, { CheckboxProps } from './Checkbox'; diff --git a/packages/web/src/common/components/Form/Checkbox.tsx b/packages/shared/src/components/Form/Checkbox.tsx similarity index 97% rename from packages/web/src/common/components/Form/Checkbox.tsx rename to packages/shared/src/components/Form/Checkbox.tsx index 2b9c629a..7b8ecf8b 100644 --- a/packages/web/src/common/components/Form/Checkbox.tsx +++ b/packages/shared/src/components/Form/Checkbox.tsx @@ -1,7 +1,7 @@ import { Control, FieldValues, Path, useController } from 'react-hook-form'; import { cva } from 'class-variance-authority'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; import { cn } from '@react-starter/shared/utils/css'; import Label from './Label'; import FieldError from './FieldError'; diff --git a/packages/web/src/common/components/Form/FieldError.test.tsx b/packages/shared/src/components/Form/FieldError.test.tsx similarity index 94% rename from packages/web/src/common/components/Form/FieldError.test.tsx rename to packages/shared/src/components/Form/FieldError.test.tsx index 3f7ffdab..9e28363f 100644 --- a/packages/web/src/common/components/Form/FieldError.test.tsx +++ b/packages/shared/src/components/Form/FieldError.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import FieldError from './FieldError'; diff --git a/packages/web/src/common/components/Form/FieldError.tsx b/packages/shared/src/components/Form/FieldError.tsx similarity index 90% rename from packages/web/src/common/components/Form/FieldError.tsx rename to packages/shared/src/components/Form/FieldError.tsx index 41677096..4f5c6d08 100644 --- a/packages/web/src/common/components/Form/FieldError.tsx +++ b/packages/shared/src/components/Form/FieldError.tsx @@ -1,5 +1,5 @@ import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; /** * Properties for the `FieldError` component. diff --git a/packages/web/src/common/components/Form/Input.test.tsx b/packages/shared/src/components/Form/Input.test.tsx similarity index 97% rename from packages/web/src/common/components/Form/Input.test.tsx rename to packages/shared/src/components/Form/Input.test.tsx index 64201246..afa99b80 100644 --- a/packages/web/src/common/components/Form/Input.test.tsx +++ b/packages/shared/src/components/Form/Input.test.tsx @@ -4,7 +4,7 @@ import { useForm } from 'react-hook-form'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import Input, { InputProps } from './Input'; diff --git a/packages/web/src/common/components/Form/Input.tsx b/packages/shared/src/components/Form/Input.tsx similarity index 96% rename from packages/web/src/common/components/Form/Input.tsx rename to packages/shared/src/components/Form/Input.tsx index 091d95cd..d2e3e4a5 100644 --- a/packages/web/src/common/components/Form/Input.tsx +++ b/packages/shared/src/components/Form/Input.tsx @@ -2,7 +2,7 @@ import { InputHTMLAttributes } from 'react'; import { Control, FieldValues, Path, useController } from 'react-hook-form'; import { cn } from '@react-starter/shared/utils/css'; -import { PropsWithTestId } from '@/common/utils/types'; +import { PropsWithTestId } from '@react-starter/shared/types/components'; import Label from './Label'; import FieldError from './FieldError'; import HelpText from '../Text/HelpText'; diff --git a/packages/web/src/common/components/Form/Label.test.tsx b/packages/shared/src/components/Form/Label.test.tsx similarity index 94% rename from packages/web/src/common/components/Form/Label.test.tsx rename to packages/shared/src/components/Form/Label.test.tsx index 4dc47773..1bc7c53c 100644 --- a/packages/web/src/common/components/Form/Label.test.tsx +++ b/packages/shared/src/components/Form/Label.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import Label from './Label'; diff --git a/packages/web/src/common/components/Form/Label.tsx b/packages/shared/src/components/Form/Label.tsx similarity index 93% rename from packages/web/src/common/components/Form/Label.tsx rename to packages/shared/src/components/Form/Label.tsx index 5951a0c1..2621e5ff 100644 --- a/packages/web/src/common/components/Form/Label.tsx +++ b/packages/shared/src/components/Form/Label.tsx @@ -2,7 +2,7 @@ import { LabelHTMLAttributes } from 'react'; import { cva } from 'class-variance-authority'; import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; /** * Define the `Label` component base and variant styles. diff --git a/packages/web/src/common/components/Form/RadioGroup.test.tsx b/packages/shared/src/components/Form/RadioGroup.test.tsx similarity index 98% rename from packages/web/src/common/components/Form/RadioGroup.test.tsx rename to packages/shared/src/components/Form/RadioGroup.test.tsx index b03d26cf..40ba95ad 100644 --- a/packages/web/src/common/components/Form/RadioGroup.test.tsx +++ b/packages/shared/src/components/Form/RadioGroup.test.tsx @@ -4,7 +4,7 @@ import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; import { useForm } from 'react-hook-form'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import RadioGroup, { RadioGroupProps } from './RadioGroup'; diff --git a/packages/web/src/common/components/Form/RadioGroup.tsx b/packages/shared/src/components/Form/RadioGroup.tsx similarity index 98% rename from packages/web/src/common/components/Form/RadioGroup.tsx rename to packages/shared/src/components/Form/RadioGroup.tsx index e3e7214d..3c95a9af 100644 --- a/packages/web/src/common/components/Form/RadioGroup.tsx +++ b/packages/shared/src/components/Form/RadioGroup.tsx @@ -3,7 +3,7 @@ import { Control, FieldValues, Path, useController } from 'react-hook-form'; import { cva } from 'class-variance-authority'; import noop from 'lodash/noop'; -import { PropsWithTestId } from '@/common/utils/types'; +import { PropsWithTestId } from '@react-starter/shared/types/components'; import { cn } from '@react-starter/shared/utils/css'; import Label from './Label'; import FieldError from './FieldError'; diff --git a/packages/web/src/common/components/Form/SearchInput.test.tsx b/packages/shared/src/components/Form/SearchInput.test.tsx similarity index 97% rename from packages/web/src/common/components/Form/SearchInput.test.tsx rename to packages/shared/src/components/Form/SearchInput.test.tsx index 4853925e..75b4ac1f 100644 --- a/packages/web/src/common/components/Form/SearchInput.test.tsx +++ b/packages/shared/src/components/Form/SearchInput.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import SearchResult from './SearchResult'; diff --git a/packages/web/src/common/components/Form/SearchInput.tsx b/packages/shared/src/components/Form/SearchInput.tsx similarity index 96% rename from packages/web/src/common/components/Form/SearchInput.tsx rename to packages/shared/src/components/Form/SearchInput.tsx index f688b0a5..d52ad1c4 100644 --- a/packages/web/src/common/components/Form/SearchInput.tsx +++ b/packages/shared/src/components/Form/SearchInput.tsx @@ -1,8 +1,8 @@ import { ChangeEvent, type JSX, useEffect, useRef } from 'react'; import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@/common/utils/types'; -import FAIcon from '@/common/components/Icon/FAIcon'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; +import FAIcon from '@react-starter/shared/components/Icon/FAIcon'; /** * Properties for the `SearchInput` React component. diff --git a/packages/web/src/common/components/Form/SearchResult.test.tsx b/packages/shared/src/components/Form/SearchResult.test.tsx similarity index 96% rename from packages/web/src/common/components/Form/SearchResult.test.tsx rename to packages/shared/src/components/Form/SearchResult.test.tsx index c6131f8e..c3503b7a 100644 --- a/packages/web/src/common/components/Form/SearchResult.test.tsx +++ b/packages/shared/src/components/Form/SearchResult.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import SearchResult from './SearchResult'; diff --git a/packages/web/src/common/components/Form/SearchResult.tsx b/packages/shared/src/components/Form/SearchResult.tsx similarity index 93% rename from packages/web/src/common/components/Form/SearchResult.tsx rename to packages/shared/src/components/Form/SearchResult.tsx index 5ad0b06b..4eb9ae60 100644 --- a/packages/web/src/common/components/Form/SearchResult.tsx +++ b/packages/shared/src/components/Form/SearchResult.tsx @@ -1,6 +1,6 @@ import { PropsWithChildren } from 'react'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; import { cn } from '@react-starter/shared/utils/css'; /** diff --git a/packages/web/src/common/components/Form/Select.test.tsx b/packages/shared/src/components/Form/Select.test.tsx similarity index 99% rename from packages/web/src/common/components/Form/Select.test.tsx rename to packages/shared/src/components/Form/Select.test.tsx index 184018fd..8199dc9c 100644 --- a/packages/web/src/common/components/Form/Select.test.tsx +++ b/packages/shared/src/components/Form/Select.test.tsx @@ -4,7 +4,7 @@ import { useForm } from 'react-hook-form'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; -import { render, screen, waitFor } from '@/test/test-utils'; +import { render, screen, waitFor } from '@testing-library/react'; import Select, { SelectProps } from './Select'; diff --git a/packages/web/src/common/components/Form/Select.tsx b/packages/shared/src/components/Form/Select.tsx similarity index 99% rename from packages/web/src/common/components/Form/Select.tsx rename to packages/shared/src/components/Form/Select.tsx index ff7d67d4..877bfd8b 100644 --- a/packages/web/src/common/components/Form/Select.tsx +++ b/packages/shared/src/components/Form/Select.tsx @@ -3,7 +3,7 @@ import { Control, FieldValues, Path, useController } from 'react-hook-form'; import noop from 'lodash/noop'; import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; import Label from './Label'; import FieldError from './FieldError'; import HelpText from '../Text/HelpText'; diff --git a/packages/web/src/common/components/Form/Textarea.test.tsx b/packages/shared/src/components/Form/Textarea.test.tsx similarity index 97% rename from packages/web/src/common/components/Form/Textarea.test.tsx rename to packages/shared/src/components/Form/Textarea.test.tsx index 892bca03..d2834281 100644 --- a/packages/web/src/common/components/Form/Textarea.test.tsx +++ b/packages/shared/src/components/Form/Textarea.test.tsx @@ -4,7 +4,7 @@ import { useForm } from 'react-hook-form'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import Textarea, { TextareaProps } from './Textarea'; diff --git a/packages/web/src/common/components/Form/Textarea.tsx b/packages/shared/src/components/Form/Textarea.tsx similarity index 96% rename from packages/web/src/common/components/Form/Textarea.tsx rename to packages/shared/src/components/Form/Textarea.tsx index 0a12c451..c2c35717 100644 --- a/packages/web/src/common/components/Form/Textarea.tsx +++ b/packages/shared/src/components/Form/Textarea.tsx @@ -2,7 +2,7 @@ import { TextareaHTMLAttributes } from 'react'; import { Control, FieldValues, Path, useController } from 'react-hook-form'; import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; import Label from './Label'; import FieldError from './FieldError'; import HelpText from '../Text/HelpText'; diff --git a/packages/web/src/common/components/Form/Toggle.test.tsx b/packages/shared/src/components/Form/Toggle.test.tsx similarity index 97% rename from packages/web/src/common/components/Form/Toggle.test.tsx rename to packages/shared/src/components/Form/Toggle.test.tsx index 44b84376..88d86b18 100644 --- a/packages/web/src/common/components/Form/Toggle.test.tsx +++ b/packages/shared/src/components/Form/Toggle.test.tsx @@ -4,7 +4,7 @@ import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import Toggle, { ToggleProps } from './Toggle'; diff --git a/packages/web/src/common/components/Form/Toggle.tsx b/packages/shared/src/components/Form/Toggle.tsx similarity index 96% rename from packages/web/src/common/components/Form/Toggle.tsx rename to packages/shared/src/components/Form/Toggle.tsx index d7f77384..40f09b2a 100644 --- a/packages/web/src/common/components/Form/Toggle.tsx +++ b/packages/shared/src/components/Form/Toggle.tsx @@ -1,6 +1,6 @@ import { Control, FieldValues, Path, useController } from 'react-hook-form'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; import { cn } from '@react-starter/shared/utils/css'; import FAIcon from '../Icon/FAIcon'; import Label from './Label'; diff --git a/packages/web/src/common/components/Icon/Avatar.test.tsx b/packages/shared/src/components/Icon/Avatar.test.tsx similarity index 96% rename from packages/web/src/common/components/Icon/Avatar.test.tsx rename to packages/shared/src/components/Icon/Avatar.test.tsx index 374a208e..cbf1f61d 100644 --- a/packages/web/src/common/components/Icon/Avatar.test.tsx +++ b/packages/shared/src/components/Icon/Avatar.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import Avatar from './Avatar'; diff --git a/packages/web/src/common/components/Icon/Avatar.tsx b/packages/shared/src/components/Icon/Avatar.tsx similarity index 96% rename from packages/web/src/common/components/Icon/Avatar.tsx rename to packages/shared/src/components/Icon/Avatar.tsx index f75c3927..b8cf1096 100644 --- a/packages/web/src/common/components/Icon/Avatar.tsx +++ b/packages/shared/src/components/Icon/Avatar.tsx @@ -1,5 +1,5 @@ import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; /** * Properties for the `Avatar` component. diff --git a/packages/web/src/common/components/Icon/FAIcon.test.tsx b/packages/shared/src/components/Icon/FAIcon.test.tsx similarity index 87% rename from packages/web/src/common/components/Icon/FAIcon.test.tsx rename to packages/shared/src/components/Icon/FAIcon.test.tsx index 8f588ce5..e4e50b77 100644 --- a/packages/web/src/common/components/Icon/FAIcon.test.tsx +++ b/packages/shared/src/components/Icon/FAIcon.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import FAIcon from './FAIcon'; diff --git a/packages/web/src/common/components/Icon/FAIcon.tsx b/packages/shared/src/components/Icon/FAIcon.tsx similarity index 97% rename from packages/web/src/common/components/Icon/FAIcon.tsx rename to packages/shared/src/components/Icon/FAIcon.tsx index c66775da..7eb64454 100644 --- a/packages/web/src/common/components/Icon/FAIcon.tsx +++ b/packages/shared/src/components/Icon/FAIcon.tsx @@ -41,7 +41,7 @@ import { faXmark, } from '@fortawesome/free-solid-svg-icons'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; import { cn } from '@react-starter/shared/utils/css'; /** diff --git a/packages/web/src/common/components/Link/Link.test.tsx b/packages/shared/src/components/Link/Link.test.tsx similarity index 72% rename from packages/web/src/common/components/Link/Link.test.tsx rename to packages/shared/src/components/Link/Link.test.tsx index 4e0ce847..4b114ede 100644 --- a/packages/web/src/common/components/Link/Link.test.tsx +++ b/packages/shared/src/components/Link/Link.test.tsx @@ -1,15 +1,19 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import Link from './Link'; +import { MemoryRouter } from 'react-router-dom'; describe('Link', () => { + const wrapper = ({ children }: { children: React.ReactNode }) => {children}; + it('should render successfully', async () => { // ARRANGE render( text , + { wrapper }, ); await screen.findByTestId('link'); @@ -23,6 +27,7 @@ describe('Link', () => { text , + { wrapper }, ); await screen.findByTestId('test'); diff --git a/packages/web/src/common/components/Link/Link.tsx b/packages/shared/src/components/Link/Link.tsx similarity index 92% rename from packages/web/src/common/components/Link/Link.tsx rename to packages/shared/src/components/Link/Link.tsx index 31c47685..00dd336e 100644 --- a/packages/web/src/common/components/Link/Link.tsx +++ b/packages/shared/src/components/Link/Link.tsx @@ -1,7 +1,7 @@ import { Link as RouterLink, LinkProps as RouterLinkProps } from 'react-router-dom'; import { cn } from '@react-starter/shared/utils/css'; -import { PropsWithTestId } from '@/common/utils/types'; +import { PropsWithTestId } from '@react-starter/shared/types/components'; /** * Properties for the `Link` component. diff --git a/packages/web/src/common/components/Loader/LoaderSuspense.test.tsx b/packages/shared/src/components/Loader/LoaderSuspense.test.tsx similarity index 78% rename from packages/web/src/common/components/Loader/LoaderSuspense.test.tsx rename to packages/shared/src/components/Loader/LoaderSuspense.test.tsx index 8b14b549..a3622fc0 100644 --- a/packages/web/src/common/components/Loader/LoaderSuspense.test.tsx +++ b/packages/shared/src/components/Loader/LoaderSuspense.test.tsx @@ -1,8 +1,8 @@ import { lazy } from 'react'; import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; -const Text = lazy(() => import('@/common/components/Text/Text')); +import { render, screen } from '@testing-library/react'; +const Text = lazy(() => import('@react-starter/shared/components/Text/Text')); import LoaderSuspense from './LoaderSuspense'; diff --git a/packages/web/src/common/components/Loader/LoaderSuspense.tsx b/packages/shared/src/components/Loader/LoaderSuspense.tsx similarity index 90% rename from packages/web/src/common/components/Loader/LoaderSuspense.tsx rename to packages/shared/src/components/Loader/LoaderSuspense.tsx index 7c22b153..59965d82 100644 --- a/packages/web/src/common/components/Loader/LoaderSuspense.tsx +++ b/packages/shared/src/components/Loader/LoaderSuspense.tsx @@ -1,6 +1,6 @@ import { PropsWithChildren, Suspense } from 'react'; -import Spinner from './Spinner'; +import Spinner from '@react-starter/shared/components/Loader/Spinner'; /** * The `LoaderSuspense` component renders an animated spinning loader. Typically used diff --git a/packages/web/src/common/components/Loader/Skeleton.test.tsx b/packages/shared/src/components/Loader/Skeleton.test.tsx similarity index 93% rename from packages/web/src/common/components/Loader/Skeleton.test.tsx rename to packages/shared/src/components/Loader/Skeleton.test.tsx index 6c5acd5b..83b8737e 100644 --- a/packages/web/src/common/components/Loader/Skeleton.test.tsx +++ b/packages/shared/src/components/Loader/Skeleton.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import Skeleton from './Skeleton'; diff --git a/packages/web/src/common/components/Loader/Skeleton.tsx b/packages/shared/src/components/Loader/Skeleton.tsx similarity index 85% rename from packages/web/src/common/components/Loader/Skeleton.tsx rename to packages/shared/src/components/Loader/Skeleton.tsx index 71d42c03..26fbd7e4 100644 --- a/packages/web/src/common/components/Loader/Skeleton.tsx +++ b/packages/shared/src/components/Loader/Skeleton.tsx @@ -1,5 +1,5 @@ import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; /** * The `Skeleton` component renders an animated loader which pulses diff --git a/packages/web/src/common/components/Loader/Spinner.test.tsx b/packages/shared/src/components/Loader/Spinner.test.tsx similarity index 95% rename from packages/web/src/common/components/Loader/Spinner.test.tsx rename to packages/shared/src/components/Loader/Spinner.test.tsx index 8eb02866..13417bcb 100644 --- a/packages/web/src/common/components/Loader/Spinner.test.tsx +++ b/packages/shared/src/components/Loader/Spinner.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen, waitFor } from '@/test/test-utils'; +import { render, screen, waitFor } from '@testing-library/react'; import Spinner from './Spinner'; diff --git a/packages/web/src/common/components/Loader/Spinner.tsx b/packages/shared/src/components/Loader/Spinner.tsx similarity index 89% rename from packages/web/src/common/components/Loader/Spinner.tsx rename to packages/shared/src/components/Loader/Spinner.tsx index f4387fb4..a9607118 100644 --- a/packages/web/src/common/components/Loader/Spinner.tsx +++ b/packages/shared/src/components/Loader/Spinner.tsx @@ -1,8 +1,8 @@ import { PropsWithChildren } from 'react'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; import { cn } from '@react-starter/shared/utils/css'; -import FAIcon, { FAIconProps } from '@/common/components/Icon/FAIcon'; +import FAIcon, { FAIconProps } from '@react-starter/shared/components/Icon/FAIcon'; /** * Properties for the `Spinner` component. diff --git a/packages/web/src/common/components/Menu/Menu.tsx b/packages/shared/src/components/Menu/Menu.tsx similarity index 100% rename from packages/web/src/common/components/Menu/Menu.tsx rename to packages/shared/src/components/Menu/Menu.tsx diff --git a/packages/web/src/common/components/Menu/MenuButton.test.tsx b/packages/shared/src/components/Menu/MenuButton.test.tsx similarity index 97% rename from packages/web/src/common/components/Menu/MenuButton.test.tsx rename to packages/shared/src/components/Menu/MenuButton.test.tsx index 25752d2d..033797fd 100644 --- a/packages/web/src/common/components/Menu/MenuButton.test.tsx +++ b/packages/shared/src/components/Menu/MenuButton.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import SideMenu from './SideMenu/SideMenu'; diff --git a/packages/web/src/common/components/Menu/MenuButton.tsx b/packages/shared/src/components/Menu/MenuButton.tsx similarity index 85% rename from packages/web/src/common/components/Menu/MenuButton.tsx rename to packages/shared/src/components/Menu/MenuButton.tsx index db3366b1..4d84e44f 100644 --- a/packages/web/src/common/components/Menu/MenuButton.tsx +++ b/packages/shared/src/components/Menu/MenuButton.tsx @@ -1,9 +1,9 @@ import { ComponentType, useState } from 'react'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; import { MenuProps } from './Menu'; -import Button from '@/common/components/Button/Button'; -import FAIcon from '@/common/components/Icon/FAIcon'; +import Button from '@react-starter/shared/components/Button/Button'; +import FAIcon from '@react-starter/shared/components/Icon/FAIcon'; /** * Properties for the `MenuButton` component. diff --git a/packages/web/src/common/components/Menu/MenuCloseButton.test.tsx b/packages/shared/src/components/Menu/MenuCloseButton.test.tsx similarity index 95% rename from packages/web/src/common/components/Menu/MenuCloseButton.test.tsx rename to packages/shared/src/components/Menu/MenuCloseButton.test.tsx index 113b2d81..658ed917 100644 --- a/packages/web/src/common/components/Menu/MenuCloseButton.test.tsx +++ b/packages/shared/src/components/Menu/MenuCloseButton.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import MenuCloseButton from './MenuCloseButton'; diff --git a/packages/web/src/common/components/Menu/MenuCloseButton.tsx b/packages/shared/src/components/Menu/MenuCloseButton.tsx similarity index 82% rename from packages/web/src/common/components/Menu/MenuCloseButton.tsx rename to packages/shared/src/components/Menu/MenuCloseButton.tsx index f37336ba..1880be84 100644 --- a/packages/web/src/common/components/Menu/MenuCloseButton.tsx +++ b/packages/shared/src/components/Menu/MenuCloseButton.tsx @@ -1,7 +1,7 @@ import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@/common/utils/types'; -import Button from '@/common/components/Button/Button'; -import FAIcon from '@/common/components/Icon/FAIcon'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; +import Button from '@react-starter/shared/components/Button/Button'; +import FAIcon from '@react-starter/shared/components/Icon/FAIcon'; /** * Properties for the `MenuCloseButton` component. diff --git a/packages/web/src/common/components/Menu/MenuNavLink.test.tsx b/packages/shared/src/components/Menu/MenuNavLink.test.tsx similarity index 82% rename from packages/web/src/common/components/Menu/MenuNavLink.test.tsx rename to packages/shared/src/components/Menu/MenuNavLink.test.tsx index 4b5ea91c..a93e46b2 100644 --- a/packages/web/src/common/components/Menu/MenuNavLink.test.tsx +++ b/packages/shared/src/components/Menu/MenuNavLink.test.tsx @@ -1,12 +1,15 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import MenuNavLink from './MenuNavLink'; +import { MemoryRouter } from 'react-router-dom'; describe('MenuNavLink', () => { + const wrapper = ({ children }: { children: React.ReactNode }) => {children}; + it('should render successfully', async () => { // ARRANGE - render(LinkText); + render(LinkText, { wrapper }); await screen.findByTestId('menu-navlink'); // ASSERT @@ -17,7 +20,7 @@ describe('MenuNavLink', () => { it('should use custom testId', async () => { // ARRANGE - render(); + render(, { wrapper }); await screen.findByTestId('custom-menu-navlink'); // ASSERT @@ -26,7 +29,7 @@ describe('MenuNavLink', () => { it('should use custom classes when provided', async () => { // ARRANGE - render(); + render(, { wrapper }); await screen.findByTestId('menu-navlink'); // ASSERT @@ -35,7 +38,7 @@ describe('MenuNavLink', () => { it('should render Icon when iconName provided', async () => { // ARRANGE - render(); + render(, { wrapper }); await screen.findByTestId('menu-navlink-icon'); // ASSERT @@ -45,7 +48,7 @@ describe('MenuNavLink', () => { it('should not render Icon when iconName omitted', async () => { // ARRANGE - render(LinkText); + render(LinkText, { wrapper }); await screen.findByTestId('menu-navlink'); // ASSERT @@ -54,7 +57,7 @@ describe('MenuNavLink', () => { it('should use custom icon classes when provided', async () => { // ARRANGE - render(); + render(, { wrapper }); await screen.findByTestId('menu-navlink-icon'); // ASSERT @@ -68,6 +71,7 @@ describe('MenuNavLink', () => { LinkText , + { wrapper }, ); await screen.findByTestId('menu-navlink'); @@ -82,6 +86,7 @@ describe('MenuNavLink', () => { LinkText , + { wrapper }, ); await screen.findByTestId('menu-navlink'); @@ -96,6 +101,7 @@ describe('MenuNavLink', () => { [isActive ? 'some-active-class' : ''].join(' ')}> LinkText , + { wrapper }, ); await screen.findByTestId('menu-navlink'); diff --git a/packages/web/src/common/components/Menu/MenuNavLink.tsx b/packages/shared/src/components/Menu/MenuNavLink.tsx similarity index 93% rename from packages/web/src/common/components/Menu/MenuNavLink.tsx rename to packages/shared/src/components/Menu/MenuNavLink.tsx index f817d46f..96b8667d 100644 --- a/packages/web/src/common/components/Menu/MenuNavLink.tsx +++ b/packages/shared/src/components/Menu/MenuNavLink.tsx @@ -2,8 +2,8 @@ import { PropsWithChildren } from 'react'; import { NavLink, NavLinkProps } from 'react-router-dom'; import { cn } from '@react-starter/shared/utils/css'; -import { PropsWithTestId } from '@/common/utils/types'; -import FAIcon, { FAIconProps } from '@/common/components/Icon/FAIcon'; +import { PropsWithTestId } from '@react-starter/shared/types/components'; +import FAIcon, { FAIconProps } from '@react-starter/shared/components/Icon/FAIcon'; /** * Properties for the `MenuNavLink` component. diff --git a/packages/web/src/common/components/Menu/MenuSeparator.test.tsx b/packages/shared/src/components/Menu/MenuSeparator.test.tsx similarity index 93% rename from packages/web/src/common/components/Menu/MenuSeparator.test.tsx rename to packages/shared/src/components/Menu/MenuSeparator.test.tsx index 4ad0065e..86c18032 100644 --- a/packages/web/src/common/components/Menu/MenuSeparator.test.tsx +++ b/packages/shared/src/components/Menu/MenuSeparator.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import MenuSeparator from './MenuSeparator'; diff --git a/packages/web/src/common/components/Menu/MenuSeparator.tsx b/packages/shared/src/components/Menu/MenuSeparator.tsx similarity index 86% rename from packages/web/src/common/components/Menu/MenuSeparator.tsx rename to packages/shared/src/components/Menu/MenuSeparator.tsx index 1448be1b..9a58350e 100644 --- a/packages/web/src/common/components/Menu/MenuSeparator.tsx +++ b/packages/shared/src/components/Menu/MenuSeparator.tsx @@ -1,5 +1,5 @@ import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; /** * The `MenuSeparator` component renders a separator to delineate the boundary diff --git a/packages/web/src/common/components/Menu/SideMenu/SideMenu.test.tsx b/packages/shared/src/components/Menu/SideMenu/SideMenu.test.tsx similarity index 98% rename from packages/web/src/common/components/Menu/SideMenu/SideMenu.test.tsx rename to packages/shared/src/components/Menu/SideMenu/SideMenu.test.tsx index e07d0516..c05b1a64 100644 --- a/packages/web/src/common/components/Menu/SideMenu/SideMenu.test.tsx +++ b/packages/shared/src/components/Menu/SideMenu/SideMenu.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import SideMenu from './SideMenu'; diff --git a/packages/web/src/common/components/Menu/SideMenu/SideMenu.tsx b/packages/shared/src/components/Menu/SideMenu/SideMenu.tsx similarity index 97% rename from packages/web/src/common/components/Menu/SideMenu/SideMenu.tsx rename to packages/shared/src/components/Menu/SideMenu/SideMenu.tsx index d93f8f7a..2fe13df0 100644 --- a/packages/web/src/common/components/Menu/SideMenu/SideMenu.tsx +++ b/packages/shared/src/components/Menu/SideMenu/SideMenu.tsx @@ -2,7 +2,7 @@ import { PropsWithChildren, ReactNode } from 'react'; import { animated, useSpring } from '@react-spring/web'; import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; import { MenuProps } from '../Menu'; import SideMenuHeader from './SideMenuHeader'; diff --git a/packages/web/src/common/components/Menu/SideMenu/SideMenuHeader.test.tsx b/packages/shared/src/components/Menu/SideMenu/SideMenuHeader.test.tsx similarity index 97% rename from packages/web/src/common/components/Menu/SideMenu/SideMenuHeader.test.tsx rename to packages/shared/src/components/Menu/SideMenu/SideMenuHeader.test.tsx index c4a8a4fe..796af456 100644 --- a/packages/web/src/common/components/Menu/SideMenu/SideMenuHeader.test.tsx +++ b/packages/shared/src/components/Menu/SideMenu/SideMenuHeader.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import SideMenuHeader from './SideMenuHeader'; diff --git a/packages/web/src/common/components/Menu/SideMenu/SideMenuHeader.tsx b/packages/shared/src/components/Menu/SideMenu/SideMenuHeader.tsx similarity index 94% rename from packages/web/src/common/components/Menu/SideMenu/SideMenuHeader.tsx rename to packages/shared/src/components/Menu/SideMenu/SideMenuHeader.tsx index 48cd5170..16449325 100644 --- a/packages/web/src/common/components/Menu/SideMenu/SideMenuHeader.tsx +++ b/packages/shared/src/components/Menu/SideMenu/SideMenuHeader.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren } from 'react'; import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; import MenuCloseButton from '../MenuCloseButton'; /** diff --git a/packages/web/src/common/components/Popover/Popover.test.tsx b/packages/shared/src/components/Popover/Popover.test.tsx similarity index 99% rename from packages/web/src/common/components/Popover/Popover.test.tsx rename to packages/shared/src/components/Popover/Popover.test.tsx index 5959c0f8..0fb487d1 100644 --- a/packages/web/src/common/components/Popover/Popover.test.tsx +++ b/packages/shared/src/components/Popover/Popover.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it, vi } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { render, screen, waitFor } from '@/test/test-utils'; +import { render, screen, waitFor } from '@testing-library/react'; import Popover from './Popover'; diff --git a/packages/web/src/common/components/Popover/Popover.tsx b/packages/shared/src/components/Popover/Popover.tsx similarity index 98% rename from packages/web/src/common/components/Popover/Popover.tsx rename to packages/shared/src/components/Popover/Popover.tsx index 517fbb4f..fdd186cd 100644 --- a/packages/web/src/common/components/Popover/Popover.tsx +++ b/packages/shared/src/components/Popover/Popover.tsx @@ -2,7 +2,7 @@ import { createContext, PropsWithChildren, useContext, useEffect, useMemo, useRe import noop from 'lodash/noop'; import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; import Backdrop from '../Backdrop/Backdrop'; /** diff --git a/packages/web/src/common/components/Table/Table.test.tsx b/packages/shared/src/components/Table/Table.test.tsx similarity index 96% rename from packages/web/src/common/components/Table/Table.test.tsx rename to packages/shared/src/components/Table/Table.test.tsx index 2e8ecc74..7cf881d8 100644 --- a/packages/web/src/common/components/Table/Table.test.tsx +++ b/packages/shared/src/components/Table/Table.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import Table from './Table'; describe('Table', () => { diff --git a/packages/web/src/common/components/Table/Table.tsx b/packages/shared/src/components/Table/Table.tsx similarity index 97% rename from packages/web/src/common/components/Table/Table.tsx rename to packages/shared/src/components/Table/Table.tsx index 82bee30d..41ef93bd 100644 --- a/packages/web/src/common/components/Table/Table.tsx +++ b/packages/shared/src/components/Table/Table.tsx @@ -1,7 +1,7 @@ import { ColumnDef, flexRender, getCoreRowModel, useReactTable } from '@tanstack/react-table'; import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; /** * Properties for the `Table` React component. diff --git a/packages/web/src/common/components/Tabs/Tabs.test.tsx b/packages/shared/src/components/Tabs/Tabs.test.tsx similarity index 99% rename from packages/web/src/common/components/Tabs/Tabs.test.tsx rename to packages/shared/src/components/Tabs/Tabs.test.tsx index 33dd5357..f35b8a42 100644 --- a/packages/web/src/common/components/Tabs/Tabs.test.tsx +++ b/packages/shared/src/components/Tabs/Tabs.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { render, screen, waitFor } from '@/test/test-utils'; +import { render, screen, waitFor } from '@testing-library/react'; import Tabs from './Tabs'; diff --git a/packages/web/src/common/components/Tabs/Tabs.tsx b/packages/shared/src/components/Tabs/Tabs.tsx similarity index 98% rename from packages/web/src/common/components/Tabs/Tabs.tsx rename to packages/shared/src/components/Tabs/Tabs.tsx index 5f2ca80b..fea77032 100644 --- a/packages/web/src/common/components/Tabs/Tabs.tsx +++ b/packages/shared/src/components/Tabs/Tabs.tsx @@ -3,7 +3,7 @@ import { cva, VariantProps } from 'class-variance-authority'; import noop from 'lodash/noop'; import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; import Button from '../Button/Button'; /** diff --git a/packages/web/src/common/components/Text/CodeSnippet.test.tsx b/packages/shared/src/components/Text/CodeSnippet.test.tsx similarity index 77% rename from packages/web/src/common/components/Text/CodeSnippet.test.tsx rename to packages/shared/src/components/Text/CodeSnippet.test.tsx index 1d41fd8f..571fe872 100644 --- a/packages/web/src/common/components/Text/CodeSnippet.test.tsx +++ b/packages/shared/src/components/Text/CodeSnippet.test.tsx @@ -1,17 +1,9 @@ -import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { render, screen } from '@/test/test-utils'; - -import * as UseSettings from '@/common/hooks/useSettings'; +import { describe, expect, it } from 'vitest'; +import { render, screen } from '@testing-library/react'; import CodeSnippet from './CodeSnippet'; describe('CodeSnippet', () => { - const useSettingsSpy = vi.spyOn(UseSettings, 'useSettings'); - - beforeEach(() => { - useSettingsSpy.mockReturnValue({ theme: 'light' }); - }); - it('should render successfully', async () => { // ARRANGE render({`<>`}); @@ -50,8 +42,7 @@ describe('CodeSnippet', () => { it('should use dark theme', async () => { // ARRANGE - useSettingsSpy.mockReturnValue({ theme: 'dark' }); - render({`<>`}); + render({`<>`}); const codeElement = await screen.findByTestId('code-snippet'); // ASSERT diff --git a/packages/web/src/common/components/Text/CodeSnippet.tsx b/packages/shared/src/components/Text/CodeSnippet.tsx similarity index 80% rename from packages/web/src/common/components/Text/CodeSnippet.tsx rename to packages/shared/src/components/Text/CodeSnippet.tsx index c5ffff8b..6b29c48b 100644 --- a/packages/web/src/common/components/Text/CodeSnippet.tsx +++ b/packages/shared/src/components/Text/CodeSnippet.tsx @@ -5,8 +5,7 @@ import tsx from 'react-syntax-highlighter/dist/esm/languages/prism/tsx'; import light from 'react-syntax-highlighter/dist/esm/styles/prism/prism'; import dark from 'react-syntax-highlighter/dist/esm/styles/prism/a11y-dark'; -import { BaseComponentProps } from '@/common/utils/types'; -import { useSettings } from '@/common/hooks/useSettings'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; /** * Register the TSX language for syntax highlighting. @@ -19,16 +18,22 @@ SyntaxHighlighter.registerLanguage('tsx', tsx); * @see {@link BaseComponentProps} * @see {@link SyntaxHighlighterProps} */ -export interface CodeSnippetProps extends BaseComponentProps, SyntaxHighlighterProps {} +export interface CodeSnippetProps extends BaseComponentProps, SyntaxHighlighterProps { + theme?: 'light' | 'dark'; +} /** * The `CodeSnippet` component renders a read only block which highlights * a small amount of application code such as JavaScript, JSX, or CSS. * @param {CodeSnippetProps} props - Component properties. */ -const CodeSnippet = ({ children, className, testId = 'code-snippet', ...highlighterProps }: CodeSnippetProps) => { - const { theme } = useSettings(); - +const CodeSnippet = ({ + children, + className, + testId = 'code-snippet', + theme, + ...highlighterProps +}: CodeSnippetProps) => { const style = theme === 'light' ? light : dark; return ( diff --git a/packages/web/src/common/components/Text/Currency.test.tsx b/packages/shared/src/components/Text/Currency.test.tsx similarity index 94% rename from packages/web/src/common/components/Text/Currency.test.tsx rename to packages/shared/src/components/Text/Currency.test.tsx index 6f4e511a..bb79d3eb 100644 --- a/packages/web/src/common/components/Text/Currency.test.tsx +++ b/packages/shared/src/components/Text/Currency.test.tsx @@ -1,8 +1,8 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import Currency from './Currency'; -import { CurrencyCode, CurrencyDisplay, CurrencySign } from '@/common/utils/constants'; +import { CurrencyCode, CurrencyDisplay, CurrencySign } from '@react-starter/shared/utils/constants'; describe('Currency', () => { it('should render successfully', async () => { diff --git a/packages/web/src/common/components/Text/Currency.tsx b/packages/shared/src/components/Text/Currency.tsx similarity index 85% rename from packages/web/src/common/components/Text/Currency.tsx rename to packages/shared/src/components/Text/Currency.tsx index 1d34feb1..2212b577 100644 --- a/packages/web/src/common/components/Text/Currency.tsx +++ b/packages/shared/src/components/Text/Currency.tsx @@ -1,8 +1,8 @@ import { useMemo } from 'react'; -import { CurrencyCode, CurrencyDisplay, CurrencySign } from '@/common/utils/constants'; -import { formatNumber } from '@/common/utils/numbers'; -import { BaseComponentProps } from '@/common/utils/types'; +import { CurrencyCode, CurrencyDisplay, CurrencySign } from '@react-starter/shared/utils/constants'; +import { formatNumber } from '@react-starter/shared/utils/numbers'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; /** * Properties for the `Currency` component. diff --git a/packages/web/src/common/components/Text/Date.test.tsx b/packages/shared/src/components/Text/Date.test.tsx similarity index 95% rename from packages/web/src/common/components/Text/Date.test.tsx rename to packages/shared/src/components/Text/Date.test.tsx index 15fad2a7..7129473c 100644 --- a/packages/web/src/common/components/Text/Date.test.tsx +++ b/packages/shared/src/components/Text/Date.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; -import { DateFormat } from '@/common/utils/constants'; +import { DateFormat } from '@react-starter/shared/utils/constants'; import Date from './Date'; describe('Date', () => { diff --git a/packages/web/src/common/components/Text/Date.tsx b/packages/shared/src/components/Text/Date.tsx similarity index 86% rename from packages/web/src/common/components/Text/Date.tsx rename to packages/shared/src/components/Text/Date.tsx index c04d1f1a..5b72fde7 100644 --- a/packages/web/src/common/components/Text/Date.tsx +++ b/packages/shared/src/components/Text/Date.tsx @@ -1,7 +1,7 @@ import dayjs from 'dayjs'; -import { BaseComponentProps } from '@/common/utils/types'; -import { DateFormat } from '@/common/utils/constants'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; +import { DateFormat } from '@react-starter/shared/utils/constants'; /** * Properties for the `Date` component. diff --git a/packages/web/src/common/components/Text/DayOfTheWeek.test.tsx b/packages/shared/src/components/Text/DayOfTheWeek.test.tsx similarity index 97% rename from packages/web/src/common/components/Text/DayOfTheWeek.test.tsx rename to packages/shared/src/components/Text/DayOfTheWeek.test.tsx index 7100618d..2ec242ff 100644 --- a/packages/web/src/common/components/Text/DayOfTheWeek.test.tsx +++ b/packages/shared/src/components/Text/DayOfTheWeek.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import dayjs from 'dayjs'; import DayOfTheWeek from './DayOfTheWeek'; diff --git a/packages/web/src/common/components/Text/DayOfTheWeek.tsx b/packages/shared/src/components/Text/DayOfTheWeek.tsx similarity index 89% rename from packages/web/src/common/components/Text/DayOfTheWeek.tsx rename to packages/shared/src/components/Text/DayOfTheWeek.tsx index 5a8cbd1e..48664543 100644 --- a/packages/web/src/common/components/Text/DayOfTheWeek.tsx +++ b/packages/shared/src/components/Text/DayOfTheWeek.tsx @@ -3,9 +3,9 @@ import isToday from 'dayjs/plugin/isToday'; import isTomorrow from 'dayjs/plugin/isTomorrow'; import isYesterday from 'dayjs/plugin/isYesterday'; -import { BaseComponentProps } from '@/common/utils/types'; -import { DateFormat } from '@/common/utils/constants'; -import Date from './Date'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; +import { DateFormat } from '@react-starter/shared/utils/constants'; +import Date from '@react-starter/shared/components/Text/Date'; dayjs.extend(isToday); dayjs.extend(isTomorrow); diff --git a/packages/web/src/common/components/Text/Decimal.test.tsx b/packages/shared/src/components/Text/Decimal.test.tsx similarity index 97% rename from packages/web/src/common/components/Text/Decimal.test.tsx rename to packages/shared/src/components/Text/Decimal.test.tsx index eade6968..46e6eb55 100644 --- a/packages/web/src/common/components/Text/Decimal.test.tsx +++ b/packages/shared/src/components/Text/Decimal.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; -import { SignDisplay, Unit, UnitDisplay } from '@/common/utils/constants'; +import { SignDisplay, Unit, UnitDisplay } from '@react-starter/shared/utils/constants'; import Decimal from './Decimal'; diff --git a/packages/web/src/common/components/Text/Decimal.tsx b/packages/shared/src/components/Text/Decimal.tsx similarity index 89% rename from packages/web/src/common/components/Text/Decimal.tsx rename to packages/shared/src/components/Text/Decimal.tsx index ed357c95..0265b820 100644 --- a/packages/web/src/common/components/Text/Decimal.tsx +++ b/packages/shared/src/components/Text/Decimal.tsx @@ -1,8 +1,8 @@ import { useMemo } from 'react'; -import { formatNumber } from '@/common/utils/numbers'; -import { BaseComponentProps } from '@/common/utils/types'; -import { SignDisplay, Unit, UnitDisplay } from '@/common/utils/constants'; +import { formatNumber } from '@react-starter/shared/utils/numbers'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; +import { SignDisplay, Unit, UnitDisplay } from '@react-starter/shared/utils/constants'; /** * Properties for the `Decimal` component. diff --git a/packages/web/src/common/components/Text/Heading.test.tsx b/packages/shared/src/components/Text/Heading.test.tsx similarity index 93% rename from packages/web/src/common/components/Text/Heading.test.tsx rename to packages/shared/src/components/Text/Heading.test.tsx index 60250ff0..d693317b 100644 --- a/packages/web/src/common/components/Text/Heading.test.tsx +++ b/packages/shared/src/components/Text/Heading.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import Heading from './Heading'; diff --git a/packages/web/src/common/components/Text/Heading.tsx b/packages/shared/src/components/Text/Heading.tsx similarity index 94% rename from packages/web/src/common/components/Text/Heading.tsx rename to packages/shared/src/components/Text/Heading.tsx index 3e784d13..56f16989 100644 --- a/packages/web/src/common/components/Text/Heading.tsx +++ b/packages/shared/src/components/Text/Heading.tsx @@ -1,7 +1,7 @@ import { HTMLAttributes } from 'react'; import { cva, VariantProps } from 'class-variance-authority'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; import { cn } from '@react-starter/shared/utils/css'; /** diff --git a/packages/web/src/common/components/Text/HelpText.test.tsx b/packages/shared/src/components/Text/HelpText.test.tsx similarity index 88% rename from packages/web/src/common/components/Text/HelpText.test.tsx rename to packages/shared/src/components/Text/HelpText.test.tsx index a1fd4de0..865120dd 100644 --- a/packages/web/src/common/components/Text/HelpText.test.tsx +++ b/packages/shared/src/components/Text/HelpText.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import HelpText from './HelpText'; diff --git a/packages/web/src/common/components/Text/HelpText.tsx b/packages/shared/src/components/Text/HelpText.tsx similarity index 90% rename from packages/web/src/common/components/Text/HelpText.tsx rename to packages/shared/src/components/Text/HelpText.tsx index 9f96aedf..e3436763 100644 --- a/packages/web/src/common/components/Text/HelpText.tsx +++ b/packages/shared/src/components/Text/HelpText.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren } from 'react'; import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; /** * Properties for the `HelpText` component. diff --git a/packages/web/src/common/components/Text/Integer.test.tsx b/packages/shared/src/components/Text/Integer.test.tsx similarity index 96% rename from packages/web/src/common/components/Text/Integer.test.tsx rename to packages/shared/src/components/Text/Integer.test.tsx index b8cc8f6c..fe30eb56 100644 --- a/packages/web/src/common/components/Text/Integer.test.tsx +++ b/packages/shared/src/components/Text/Integer.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; -import { SignDisplay, Unit, UnitDisplay } from '@/common/utils/constants'; +import { SignDisplay, Unit, UnitDisplay } from '@react-starter/shared/utils/constants'; import Integer from './Integer'; diff --git a/packages/web/src/common/components/Text/Integer.tsx b/packages/shared/src/components/Text/Integer.tsx similarity index 87% rename from packages/web/src/common/components/Text/Integer.tsx rename to packages/shared/src/components/Text/Integer.tsx index 667d00cc..81a11702 100644 --- a/packages/web/src/common/components/Text/Integer.tsx +++ b/packages/shared/src/components/Text/Integer.tsx @@ -1,8 +1,8 @@ import { useMemo } from 'react'; -import { formatNumber } from '@/common/utils/numbers'; -import { BaseComponentProps } from '@/common/utils/types'; -import { SignDisplay, Unit, UnitDisplay } from '@/common/utils/constants'; +import { formatNumber } from '@react-starter/shared/utils/numbers'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; +import { SignDisplay, Unit, UnitDisplay } from '@react-starter/shared/utils/constants'; /** * Properties for the `Integer` component. diff --git a/packages/web/src/common/components/Text/Percent.test.tsx b/packages/shared/src/components/Text/Percent.test.tsx similarity index 94% rename from packages/web/src/common/components/Text/Percent.test.tsx rename to packages/shared/src/components/Text/Percent.test.tsx index 26a7a261..eeafab15 100644 --- a/packages/web/src/common/components/Text/Percent.test.tsx +++ b/packages/shared/src/components/Text/Percent.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; -import { SignDisplay } from '@/common/utils/constants'; +import { SignDisplay } from '@react-starter/shared/utils/constants'; import Percent from './Percent'; diff --git a/packages/web/src/common/components/Text/Percent.tsx b/packages/shared/src/components/Text/Percent.tsx similarity index 88% rename from packages/web/src/common/components/Text/Percent.tsx rename to packages/shared/src/components/Text/Percent.tsx index 64e6c7d4..3cbba393 100644 --- a/packages/web/src/common/components/Text/Percent.tsx +++ b/packages/shared/src/components/Text/Percent.tsx @@ -1,8 +1,8 @@ import { useMemo } from 'react'; -import { BaseComponentProps } from '@/common/utils/types'; -import { SignDisplay } from '@/common/utils/constants'; -import { formatNumber } from '@/common/utils/numbers'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; +import { SignDisplay } from '@react-starter/shared/utils/constants'; +import { formatNumber } from '@react-starter/shared/utils/numbers'; /** * Properties for the `Percent` component. diff --git a/packages/web/src/common/components/Text/Text.test.tsx b/packages/shared/src/components/Text/Text.test.tsx similarity index 95% rename from packages/web/src/common/components/Text/Text.test.tsx rename to packages/shared/src/components/Text/Text.test.tsx index adcaddee..6a38ac26 100644 --- a/packages/web/src/common/components/Text/Text.test.tsx +++ b/packages/shared/src/components/Text/Text.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; +import { render, screen } from '@testing-library/react'; import Text from './Text'; diff --git a/packages/web/src/common/components/Text/Text.tsx b/packages/shared/src/components/Text/Text.tsx similarity index 92% rename from packages/web/src/common/components/Text/Text.tsx rename to packages/shared/src/components/Text/Text.tsx index f864b688..27cc671c 100644 --- a/packages/web/src/common/components/Text/Text.tsx +++ b/packages/shared/src/components/Text/Text.tsx @@ -2,7 +2,7 @@ import { PropsWithChildren } from 'react'; import { cva, VariantProps } from 'class-variance-authority'; import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@/common/utils/types'; +import { BaseComponentProps } from '@react-starter/shared/types/components'; /** * Define the component base and variant styles. diff --git a/packages/shared/src/components/shadcn/alert.test.tsx b/packages/shared/src/components/shadcn/alert.test.tsx deleted file mode 100644 index 29a8e555..00000000 --- a/packages/shared/src/components/shadcn/alert.test.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import { render, screen } from '@/test/test-utils'; - -import { Alert } from './alert'; - -describe('Alert', () => { - it('should render successfully', async () => { - // ARRANGE - render(); - const alert = await screen.findByRole('alert'); - - // ASSERT - expect(alert).toBeDefined(); - }); - - it('should use custom test ID', async () => { - // ARRANGE - render(); - await screen.findByTestId('custom-testid'); - - expect(screen.queryByTestId('alert')).toBeNull(); - expect(screen.getByTestId('custom-testid')).toBeDefined(); - }); - - it('should use classes from className property', async () => { - // ARRANGE - render(); - const alert = await screen.findByRole('alert'); - - // ASSERT - expect(alert.classList).toContain('custom-class'); - }); - - it('should render the warning variant', async () => { - // ARRANGE - render(); - const alert = await screen.findByRole('alert'); - - // ASSERT - expect(alert.classList).toContain('text-warning'); - }); - - it('should render the destructive variant', async () => { - // ARRANGE - render(); - const alert = await screen.findByRole('alert'); - - // ASSERT - expect(alert.classList).toContain('text-destructive'); - }); - - it('should render the success variant', async () => { - // ARRANGE - render(); - const alert = await screen.findByRole('alert'); - - // ASSERT - expect(alert.classList).toContain('text-success'); - }); - - it('should render the default variant when variant not specified', async () => { - // ARRANGE - render(); - const alert = await screen.findByRole('alert'); - - // ASSERT - expect(alert.classList).toContain('bg-card'); - }); - - it('should have role=alert', async () => { - // ARRANGE - render(); - const alert = await screen.findByRole('alert'); - - // ASSERT - expect(alert.getAttribute('role')).toBe('alert'); - }); -}); diff --git a/packages/shared/src/index.test.ts b/packages/shared/src/index.test.ts deleted file mode 100644 index 93ad1b6b..00000000 --- a/packages/shared/src/index.test.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { describe, it, expect } from 'vitest'; - -describe('Shared package', () => { - it('should have a test', () => { - expect(true).toBe(true); - }); -}); diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts deleted file mode 100644 index 7b1aeceb..00000000 --- a/packages/shared/src/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -// Utilities -export { cn } from './utils/css'; - -// Components -export { Alert, AlertTitle, AlertDescription, AlertAction } from './components/shadcn/alert'; diff --git a/packages/web/src/common/utils/types.ts b/packages/shared/src/types/components.ts similarity index 100% rename from packages/web/src/common/utils/types.ts rename to packages/shared/src/types/components.ts diff --git a/packages/shared/src/utils/constants.ts b/packages/shared/src/utils/constants.ts new file mode 100644 index 00000000..513089f5 --- /dev/null +++ b/packages/shared/src/utils/constants.ts @@ -0,0 +1,85 @@ +/** + * ISO 4217 Currency Codes + * @see {@link https://en.wikipedia.org/wiki/ISO_4217#List_of_ISO_4217_currency_codes | ISO 4217 Currency Codes} + */ +export enum CurrencyCode { + CAD = 'CAD', // Canadian Dollar + EUR = 'EUR', // Euro + GBP = 'GBP', // Pound sterling (Great Britian) + MXN = 'MXN', // Mexican Peso + USD = 'USD', // US Dollar +} + +/** + * Possible `currencyDisplay` values to use with `Intl.NumberFormat`. + * Default: `symbol`. + * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options | NumberFormatOptions} + */ +export enum CurrencyDisplay { + Code = 'code', + Name = 'name', + NarrowSymbol = 'narrowSymbol', + Symbol = 'symbol', +} + +/** + * Possible `currencySign` values to use with `Intl.NumberFormat`. + * Default: `standard`. + * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options | NumberFormatOptions} + */ +export enum CurrencySign { + Accounting = 'accounting', + Standard = 'standard', +} + +/** + * The `DateFormat` enumerates patterns for formatting dates. + */ +export enum DateFormat { + DATE = 'MM/DD/YYYY', + DAY_OF_WEEK = 'dddd', + HOURS_AND_MINUTES = 'H[h] mm[m]', + TIME = 'h:mma', + TIMESTAMP_SHORT = 'h:mma ddd MMM D', + TIMESTAMP = 'dddd MMMM D [at] h:mma', +} + +/** + * Possible `signDisplay` values to use with `Intl.NumberFormat`. By default, + * display sign for negative numbers only, including negative zero. Default: `auto`. + * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options | NumberFormatOptions} + */ +export enum SignDisplay { + Auto = 'auto', + Always = 'always', + ExceptZero = 'exceptZero', + Never = 'never', +} + +/** + * Possible `unit` values to use with "unit" formatting style using `Intl.NumberFormat`. + * @see {@link https://tc39.es/ecma402/#table-sanctioned-single-unit-identifiers | ECMA Units of Measurement } + */ +export enum Unit { + Celsius = 'celsius', + Centimeter = 'centimeter', + Fahrenheit = 'fahrenheit', + Inch = 'inch', + Kilometer = 'kilometer', + KilometerPerHour = 'kilometer-per-hour', + Mile = 'mile', + MilePerHour = 'mile-per-hour', + Millimeter = 'millimeter', + Percent = 'percent', +} + +/** + * Possible `unitDisplay` values to use with "unit" formatting style using + * `Intl.NumberFormat`. Default: `short`, e.g. "10 cm". + * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options | NumberFormatOptions} + */ +export enum UnitDisplay { + Long = 'long', + Narrow = 'narrow', + Short = 'short', +} diff --git a/packages/web/src/common/utils/numbers.test.ts b/packages/shared/src/utils/numbers.test.ts similarity index 96% rename from packages/web/src/common/utils/numbers.test.ts rename to packages/shared/src/utils/numbers.test.ts index dd91dea4..94c119e5 100644 --- a/packages/web/src/common/utils/numbers.test.ts +++ b/packages/shared/src/utils/numbers.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { formatNumber, toNumberBetween } from '@/common/utils/numbers'; +import { formatNumber, toNumberBetween } from '@react-starter/shared/utils/numbers'; describe('numbers', () => { describe('toNumberBetween', () => { diff --git a/packages/web/src/common/utils/numbers.ts b/packages/shared/src/utils/numbers.ts similarity index 100% rename from packages/web/src/common/utils/numbers.ts rename to packages/shared/src/utils/numbers.ts diff --git a/packages/shared/vitest.config.ts b/packages/shared/vitest.config.ts new file mode 100644 index 00000000..4e6e29d5 --- /dev/null +++ b/packages/shared/vitest.config.ts @@ -0,0 +1,32 @@ +import { coverageConfigDefaults, defineConfig, mergeConfig } from 'vitest/config'; +import react from '@vitejs/plugin-react'; +import path from 'path'; + +import baseConfig from '../../vitest.config.ts'; + +/** + * Vitest configuration for the Web package. + * Extends the base configuration with web-specific settings. + */ +export default mergeConfig( + baseConfig, + defineConfig({ + plugins: [react()], + resolve: { + alias: { + '@react-starter/shared': path.resolve(import.meta.dirname, './src'), + }, + }, + test: { + environment: 'jsdom', + globals: true, + mockReset: true, + setupFiles: './vitest.setup.ts', + include: ['src/**/*.test.ts', 'src/**/*.test.tsx'], + coverage: { + include: ['src/**/*.ts', 'src/**/*.tsx'], + exclude: ['src/components/shadcn/**', ...coverageConfigDefaults.exclude], + }, + }, + }), +); diff --git a/packages/shared/vitest.setup.ts b/packages/shared/vitest.setup.ts new file mode 100644 index 00000000..bb02c60c --- /dev/null +++ b/packages/shared/vitest.setup.ts @@ -0,0 +1 @@ +import '@testing-library/jest-dom/vitest'; diff --git a/packages/web/package.json b/packages/web/package.json index acd8b630..c8c4847c 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -33,7 +33,6 @@ "lucide-react": "1.31.0", "react-hook-form": "7.85.0", "react-i18next": "17.0.11", - "react-router-dom": "7.18.2", "react-syntax-highlighter": "16.1.1", "recharts": "3.10.1", "uuid": "14.0.1", @@ -46,16 +45,10 @@ "@storybook/addon-themes": "10.5.7", "@storybook/react-vite": "10.5.7", "@tailwindcss/vite": "4.3.3", - "@testing-library/jest-dom": "6.9.1", - "@testing-library/react": "16.3.2", - "@testing-library/user-event": "14.6.4", "@types/eslint__js": "8.42.3", "@types/lodash": "4.17.25", "@types/react-syntax-highlighter": "15.5.13", "@types/uuid": "10.0.0", - "@vitejs/plugin-react": "6.0.5", - "@vitest/ui": "4.1.10", - "jsdom": "29.1.1", "msw": "2.15.0", "storybook": "10.5.7", "vite": "8.2.1" diff --git a/packages/web/src/common/components/Accordion/__stories__/Accordion.stories.tsx b/packages/web/src/common/components/Accordion/__stories__/Accordion.stories.tsx deleted file mode 100644 index 2cb32e23..00000000 --- a/packages/web/src/common/components/Accordion/__stories__/Accordion.stories.tsx +++ /dev/null @@ -1,137 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import Accordion from '../Accordion'; - -const meta = { - title: 'Common/Accordion', - component: Accordion, - tags: ['autodocs'], - argTypes: { - children: { description: 'The content.' }, - className: { description: 'Additional CSS classes.' }, - defaultValue: { description: 'An array of default (or initial) active items.' }, - multiple: { description: 'Whether or not multiple items can be open at the same time.' }, - testId: { description: 'The test identifier.' }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Basic: Story = { - render: (args) => ( - - - One - I am the content for item one! - - - Two - I am the content for item two! - - - ), -}; - -export const Multiple: Story = { - args: { - multiple: true, - }, - render: (args) => ( - - - One - I am the content for item one! - - - Two - I am the content for item two! - - - ), -}; - -export const DefaultActive: Story = { - args: { - defaultValue: ['two'], - }, - render: (args) => ( - - - One - I am the content for item one! - - - Two - I am the content for item two! - - - ), -}; - -export const MultipleDefaultActive: Story = { - args: { - defaultValue: ['one', 'two'], - multiple: true, - }, - render: (args) => ( - - - One - I am the content for item one! - - - Two - I am the content for item two! - - - ), -}; - -export const RichContent: Story = { - render: (args) => ( - - - Prologue - -
- Ornare occaecat aliquip voluptate esse est occaecat cillum nam. Eiusmod - aliquip magna dapibus ut ut deserunt. Justo nisi mi nunc nunc cras. Ipsum quam officia dapibus et aenean - enim. Bibendum do convallis donec eiusmod elit arcu est. Quam ero ea massa culpa adipiscing. Justo neque - aute qui nisi. Convallis nisi et irure mollit dui aliqua fugait laoreet. -
-
- Mollit urna ut ut pulvinar ullamco. Ero enim eiusmod qui in velit. Posuere dapibus cras culpa ligula magna. - Do neque urna nostrud tempus officia. Consequat condimentum a eiusmod cillum. Pulvinar elit qui pulvinar - donec non aute dolor. Sunt aliquip dapibus mi vitae labore. -
-
- Irure laoreet ligula justo sapien magna ea vel. Proident mollit aenean aliquip magna ullamco ipsum tempus - incididunt. Do aenean eiusmod amet dolor ipsum sunt sit. Irure reprehenderit ad cupidatat labore bibendum - convallis. Tempor deserunt nam lorem cras excepteur a bibendum egestas. Donec labore duis esse quam. Dui - culpa cupidatat cras cillum vel ornare pulvinar dui. Duis donec aenean vel adipiscing ligula. -
-
-
- - Chapter 1 - -
- Egestas justo donec laboris justo id laborum aliqua. Nulla dapibus aute - aenean donec vitae enim pulvinar donec. Neque cupidatat facilisis sint laboris magna ea. Anim ero proident - laboris fugait. Tempus labore dui vel laborum esse donec pariatur. Consequat id laoreet mollit fugait id - cillum anim. -
- Placeholder -
- Pulvinar e nibh veniam arcu at aliqua pariatur. Enim cillum cupidatat elit elit occaecat reprehenderit. Nibh - sed justo quam convallis fermentum e aute. Incididunt ero in ornare anim voluptate incididunt nul. Do - exercitation bibendum nulla lorem est nul. Irure labore ligula dui qos culpa aliquip condimentum. Proin - excepteur incididunt do commodo deserunt egestas. -
-
-
-
- ), -}; diff --git a/packages/web/src/common/components/Alert/__stories__/ErrorAlert.stories.tsx b/packages/web/src/common/components/Alert/__stories__/ErrorAlert.stories.tsx deleted file mode 100644 index 46ec8d8f..00000000 --- a/packages/web/src/common/components/Alert/__stories__/ErrorAlert.stories.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import { ErrorAlert } from '@/common/components/Alert/ErrorAlert'; - -const meta = { - title: 'Common/Alert/ErrorAlert', - component: ErrorAlert, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - description: { description: 'The detailed description.' }, - testId: { description: 'The test identifier.', type: 'string' }, - title: { description: 'The title.' }, - }, - args: {}, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Default: Story = { - args: { - title: 'Oh no!', - description: 'Some problem has occurred. Please check your work and try again.', - }, -}; - -export const DescriptionOnly: Story = { - args: { - description: 'Some problem has occurred. Please check your work and try again.', - }, -}; diff --git a/packages/web/src/common/components/Badge/__stories__/Badge.stories.tsx b/packages/web/src/common/components/Badge/__stories__/Badge.stories.tsx deleted file mode 100644 index 0af3c432..00000000 --- a/packages/web/src/common/components/Badge/__stories__/Badge.stories.tsx +++ /dev/null @@ -1,119 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import Badge from '../Badge'; - -const meta = { - title: 'Common/Badge', - component: Badge, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - children: { description: 'The content.' }, - className: { description: 'Additional CSS classes.' }, - size: { - description: 'The size variant. ', - type: 'string', - control: { type: 'radio' }, - options: ['sm', 'md', 'lg'], - }, - testId: { description: 'The test identifier.' }, - variant: { - description: 'Optional. The style variant. ', - type: 'string', - control: { type: 'radio' }, - options: ['primary', 'info', 'success', 'warning', 'danger'], - }, - uppercase: { description: 'Indicates if the content should be uppercase.', type: 'boolean' }, - }, - args: { - children: 'Badge', - size: 'md', - uppercase: false, - variant: 'danger', - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Default: Story = { - args: { size: undefined, variant: undefined }, -}; - -export const Uppercase: Story = { - args: { - uppercase: true, - }, -}; - -export const Primary: Story = { - args: { - children: 'In Progress', - variant: 'primary', - }, -}; - -export const Info: Story = { - args: { - children: 'On Hold', - variant: 'info', - }, -}; - -export const Danger: Story = { - args: { - children: 'Blocked', - variant: 'danger', - }, -}; - -export const Warning: Story = { - args: { - children: 'Overdue', - variant: 'warning', - }, -}; - -export const Success: Story = { - args: { - children: 'Delivered', - variant: 'success', - }, -}; - -export const Small: Story = { - args: { - children: 'small', - size: 'sm', - variant: 'primary', - uppercase: true, - }, -}; - -export const Medium: Story = { - args: { - children: 'Medium', - size: 'md', - variant: 'primary', - uppercase: true, - }, -}; - -export const Large: Story = { - args: { - children: 'Large', - size: 'lg', - variant: 'primary', - uppercase: true, - }, -}; - -export const ExampleCounter: Story = { - args: { - children: '99+', - size: 'sm', - }, -}; diff --git a/packages/web/src/common/components/Breadcrumbs/__stories__/Breadcrumbs.stories.tsx b/packages/web/src/common/components/Breadcrumbs/__stories__/Breadcrumbs.stories.tsx deleted file mode 100644 index 6b37cfdc..00000000 --- a/packages/web/src/common/components/Breadcrumbs/__stories__/Breadcrumbs.stories.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; -import { MemoryRouter } from 'react-router-dom'; - -import Breadcrumbs from '../Breadcrumbs'; -import DropdownMenu from '@/common/components/Dropdown/DropdownMenu'; - -const meta = { - title: 'Common/Breadcrumbs', - component: Breadcrumbs, - parameters: { - layout: 'centered', - }, - decorators: [ - (Story) => ( - - - - ), - ], - tags: ['autodocs'], - argTypes: { - children: { description: 'The content.' }, - className: { description: 'Additional CSS classes.' }, - testId: { description: 'The test identifier.' }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Basic: Story = { - render: (args) => ( - - - - Home - - - - Tasks - - - - dolorum laboriosam eos qui iure aliquam - - - - Edit - - - - ), - args: { - className: 'w-100', - }, -}; - -export const WithDropdownMenu: Story = { - render: (args) => ( - - - - Home - - - - - - - - - Components - Settings - Tasks - - - - - - dolorum laboriosam eos qui iure aliquam - - - - Edit - - - - ), - args: { - className: 'w-100 h-40', - }, -}; diff --git a/packages/web/src/common/components/Button/LanguageToggle.tsx b/packages/web/src/common/components/Button/LanguageToggle.tsx index de5b5b1e..5952cdbc 100644 --- a/packages/web/src/common/components/Button/LanguageToggle.tsx +++ b/packages/web/src/common/components/Button/LanguageToggle.tsx @@ -1,10 +1,10 @@ import { useTranslation } from 'react-i18next'; -import { PropsWithClassName } from '@/common/utils/types'; +import { PropsWithClassName } from '@react-starter/shared/types/components'; import { StorageKey } from '@/common/utils/constants'; import storage from '@/common/utils/storage'; -import FAIcon from '@/common/components/Icon/FAIcon'; -import DropdownMenu from '../Dropdown/DropdownMenu'; +import FAIcon from '@react-starter/shared/components/Icon/FAIcon'; +import DropdownMenu from '@react-starter/shared/components/Dropdown/DropdownMenu'; /** * The `LanguageToggle` component renders a `Dropdown` which allows users diff --git a/packages/web/src/common/components/Button/ThemeToggle.tsx b/packages/web/src/common/components/Button/ThemeToggle.tsx index 3b54259e..c73c95ab 100644 --- a/packages/web/src/common/components/Button/ThemeToggle.tsx +++ b/packages/web/src/common/components/Button/ThemeToggle.tsx @@ -1,7 +1,7 @@ import { PropsWithClassName } from '@/common/utils/types'; import { useSetSettings } from '@/common/api/useSetSettings'; import { useSettings } from '@/common/hooks/useSettings'; -import Button from './Button'; +import Button from '@react-starter/shared/components/Button/Button.js'; import FAIcon from '@/common/components/Icon/FAIcon'; /** diff --git a/packages/web/src/common/components/Button/__stories__/Button.stories.tsx b/packages/web/src/common/components/Button/__stories__/Button.stories.tsx deleted file mode 100644 index b0a7fde9..00000000 --- a/packages/web/src/common/components/Button/__stories__/Button.stories.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import Button from '../Button'; -import FAIcon from '../../Icon/FAIcon'; - -const meta = { - title: 'Common/Button/Button', - component: Button, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - children: { - description: 'The content.', - control: { type: 'select' }, - options: ['Icon_And_Text', 'No_Icon', 'Icon'], - mapping: { - Icon: , - Icon_And_Text: ( - <> - -
Search
- - ), - No_Icon: <>Submit, - }, - }, - className: { description: 'Additional CSS classes.' }, - size: { description: 'The size variant.' }, - variant: { description: 'The style variant.' }, - testId: { description: 'The test identifier.' }, - }, - args: { - children: 'Icon_And_Text', - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Solid: Story = { - args: { - variant: 'solid', - }, -}; - -export const Outline: Story = { - args: { - variant: 'outline', - }, -}; - -export const Text: Story = { - args: { - variant: 'text', - }, -}; - -export const IconButton: Story = { - args: { - children: 'Icon', - variant: 'text', - size: 'icon', - }, -}; - -export const Small: Story = { - args: { - variant: 'solid', - size: 'sm', - }, -}; - -export const Large: Story = { - args: { - variant: 'solid', - size: 'lg', - }, -}; diff --git a/packages/web/src/common/components/Button/__stories__/LanguageToggle.stories.tsx b/packages/web/src/common/components/Button/__stories__/LanguageToggle.stories.tsx deleted file mode 100644 index 489d1360..00000000 --- a/packages/web/src/common/components/Button/__stories__/LanguageToggle.stories.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import LanguageToggle from '../LanguageToggle'; - -const meta = { - title: 'Common/Button/LanguageToggle', - component: LanguageToggle, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Default: Story = {}; diff --git a/packages/web/src/common/components/Button/__stories__/ThemeToggle.stories.tsx b/packages/web/src/common/components/Button/__stories__/ThemeToggle.stories.tsx deleted file mode 100644 index ce7cae91..00000000 --- a/packages/web/src/common/components/Button/__stories__/ThemeToggle.stories.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import { withProviders } from '../../../../../.storybook/decorators/withProviders'; -import ThemeToggle from '../ThemeToggle'; - -const meta = { - title: 'Common/Button/ThemeToggle', - component: ThemeToggle, - decorators: [withProviders()], - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Default: Story = {}; diff --git a/packages/web/src/common/components/Card/__stories__/Card.stories.tsx b/packages/web/src/common/components/Card/__stories__/Card.stories.tsx deleted file mode 100644 index 485e514a..00000000 --- a/packages/web/src/common/components/Card/__stories__/Card.stories.tsx +++ /dev/null @@ -1,108 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import Card from '../Card'; - -const meta = { - title: 'Common/Card/Card', - component: Card, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - children: { description: 'The content.' }, - className: { description: 'Additional CSS classes.' }, - testId: { description: 'The test identifier.' }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const CardComposition: Story = { - render: (args) => ( - - - Card Title - with a subtitle - - - Nul nostrud non dui elit nul proin. Consectetur magna mi justo dui. Aliquip proin incididunt ero tempor occaecat - consequat ea. Neque esse minim occaecat massa. Reprehenderit consequat reprehenderit ipsum dui excepteur anim. - Irure labore at at urna veniam enim consectetur ea. Et urna aliquip dapibus magna eiusmod commodo officia. - - - Read more... - - ), - args: { - className: 'w-100', - }, -}; - -export const WithTopImage: Story = { - render: (args) => ( - - - - Card Title - with a subtitle - - - Nul nostrud non dui elit nul proin. Consectetur magna mi justo dui. Aliquip proin incididunt ero tempor occaecat - consequat ea. Neque esse minim occaecat massa. Reprehenderit consequat reprehenderit ipsum dui excepteur anim. - Irure labore at at urna veniam enim consectetur ea. Et urna aliquip dapibus magna eiusmod commodo officia. - - - Read more... - - ), - args: { - className: 'w-100', - }, -}; - -export const WithBottomImage: Story = { - render: (args) => ( - - - Card Title - with a subtitle - - - Nul nostrud non dui elit nul proin. Consectetur magna mi justo dui. Aliquip proin incididunt ero tempor occaecat - consequat ea. Neque esse minim occaecat massa. Reprehenderit consequat reprehenderit ipsum dui excepteur anim. - Irure labore at at urna veniam enim consectetur ea. Et urna aliquip dapibus magna eiusmod commodo officia. - - - Read more... - - - ), - args: { - className: 'w-100', - }, -}; - -export const WithMiddleImage: Story = { - render: (args) => ( - - - Card Title - with a subtitle - - - - Nul nostrud non dui elit nul proin. Consectetur magna mi justo dui. Aliquip proin incididunt ero tempor occaecat - consequat ea. Neque esse minim occaecat massa. Reprehenderit consequat reprehenderit ipsum dui excepteur anim. - Irure labore at at urna veniam enim consectetur ea. Et urna aliquip dapibus magna eiusmod commodo officia. - - - Read more... - - ), - args: { - className: 'w-100', - }, -}; diff --git a/packages/web/src/common/components/Card/__stories__/MessageCard.stories.tsx b/packages/web/src/common/components/Card/__stories__/MessageCard.stories.tsx deleted file mode 100644 index c7ee166e..00000000 --- a/packages/web/src/common/components/Card/__stories__/MessageCard.stories.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import MessageCard from '../MessageCard'; - -const meta = { - title: 'Common/Card/MessageCard', - component: MessageCard, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - iconProps: { - description: 'An icon properties object.', - }, - message: { description: 'A message to display.' }, - testId: { description: 'The test identifier.' }, - title: { description: 'A title.' }, - }, - args: { - message: 'This is the card message.', - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const MessageOnly: Story = {}; - -export const WithTitle: Story = { - args: { - title: 'Card Title', - }, -}; - -export const aWithIcon: Story = { - args: { - iconProps: { - icon: 'circleExclamation', - size: '2x', - }, - title: 'Card Title', - }, -}; diff --git a/packages/web/src/common/components/Chart/__stories__/DonutChart.stories.tsx b/packages/web/src/common/components/Chart/__stories__/DonutChart.stories.tsx deleted file mode 100644 index 1c9c9789..00000000 --- a/packages/web/src/common/components/Chart/__stories__/DonutChart.stories.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import { donutChartDataFixture } from '@/__fixtures__/charts'; - -import DonutChart from '../DonutChart'; - -const meta = { - title: 'Common/Chart/DonutChart', - component: DonutChart, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - data: { description: 'A collection of `DonutChartData` objects.' }, - height: { description: 'The chart height in pixels.' }, - width: { description: 'The chart width in pixels.' }, - innerRadius: { description: 'The radius of the inside curve of the donut in pixels.' }, - outerRadius: { description: 'The radius of the outside curve of the donut in pixels.' }, - paddingAngle: { description: 'The padding between wedges in the donut chart in pixels.' }, - testId: { description: 'The test identifier.' }, - }, - args: { - data: donutChartDataFixture, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Simple: Story = {}; - -export const Larger: Story = { - args: { - height: 256, - width: 512, - innerRadius: 96, - outerRadius: 128, - }, -}; - -export const WithPadding: Story = { - args: { - height: 256, - width: 512, - innerRadius: 96, - outerRadius: 128, - paddingAngle: 8, - }, -}; diff --git a/packages/web/src/common/components/Content/__stories__/Columns.stories.tsx b/packages/web/src/common/components/Content/__stories__/Columns.stories.tsx deleted file mode 100644 index 8548f7b9..00000000 --- a/packages/web/src/common/components/Content/__stories__/Columns.stories.tsx +++ /dev/null @@ -1,114 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import Columns from '../Columns'; - -const meta = { - title: 'Common/Content/Columns', - component: Columns, - tags: ['autodocs'], - argTypes: { - children: { description: 'The content.' }, - className: { description: 'Additional CSS classes.' }, - gap: { - description: 'Optional. The gap size between columns.', - control: { type: 'select' }, - options: ['none', 'sm', 'md', 'lg'], - }, - layout: { - description: 'Optional. The column layout.', - control: { type: 'select' }, - options: ['1-1', '1-3', '3-1', '1-1-1', '1-2-1'], - }, - testId: { description: 'The test identifier.' }, - }, -} satisfies Meta; - -export default meta; - -const Block = () =>
; - -type Story = StoryObj; - -export const Default: Story = { - render: (args) => ( - - - - - - - - - ), - args: {}, -}; - -export const SmallLeftSide: Story = { - render: (args) => ( - - - - - - - - - ), - args: { - layout: '1-3', - }, -}; - -export const SmallRightSide: Story = { - render: (args) => ( - - - - - - - - - ), - args: { - layout: '3-1', - }, -}; - -export const ThreeColumns: Story = { - render: (args) => ( - - - - - - - - - - - - ), - args: { - layout: '1-1-1', - }, -}; - -export const WideMiddleColumn: Story = { - render: (args) => ( - - - - - - - - - - - - ), - args: { - layout: '1-2-1', - }, -}; diff --git a/packages/web/src/common/components/Content/__stories__/Container.stories.tsx b/packages/web/src/common/components/Content/__stories__/Container.stories.tsx deleted file mode 100644 index 90cca0dc..00000000 --- a/packages/web/src/common/components/Content/__stories__/Container.stories.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import Container from '../Container'; -import Page from '../Page'; -import { PropsWithChildren } from 'react'; - -const meta = { - title: 'Common/Content/Container', - component: Container, - decorators: [ - (Story) => ( - - - - ), - ], - tags: ['autodocs'], - argTypes: { - children: { description: 'The content.' }, - className: { description: 'Additional CSS classes.' }, - size: { - description: 'Optional. The container size.', - control: { type: 'select' }, - options: ['default', 'sm', 'md', 'lg', 'xl', '2xl'], - }, - testId: { description: 'The test identifier.' }, - }, -} satisfies Meta; - -export default meta; - -const Block = ({ children }: PropsWithChildren) => ( -
{children}
-); - -type Story = StoryObj; - -export const Default: Story = { - render: (args) => ( - - Container - - ), - args: {}, -}; - -export const Small: Story = { - render: (args) => ( - - Container - - ), - args: { - size: 'sm', - }, -}; - -export const Medium: Story = { - render: (args) => ( - - Container - - ), - args: { - size: 'md', - }, -}; - -export const Large: Story = { - render: (args) => ( - - Container - - ), - args: { - size: 'lg', - }, -}; - -export const ExtraLarge: Story = { - render: (args) => ( - - Container - - ), - args: { - size: 'xl', - }, -}; - -export const TwoXL: Story = { - render: (args) => ( - - Container - - ), - args: { - size: '2xl', - }, -}; diff --git a/packages/web/src/common/components/Dialog/__stories__/Dialog.stories.tsx b/packages/web/src/common/components/Dialog/__stories__/Dialog.stories.tsx deleted file mode 100644 index 7d310b0d..00000000 --- a/packages/web/src/common/components/Dialog/__stories__/Dialog.stories.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import Dialog from '../Dialog'; -import Button from '@/common/components/Button/Button'; - -const meta = { - title: 'Common/Dialog', - component: Dialog, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - children: { - description: 'The dialog content. May contain a ReactNode or a render props function.', - }, - className: { description: 'Additional CSS classes.' }, - testId: { description: 'The test identifier.' }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const ConfirmDelete: Story = { - render: (args) => ( - - - - - - - Are you sure? - Deletion cannot be undone. - - - Delete task 18 Use React. - - - - - Cancel - Delete - - - - - ), -}; - -export const LoremIpsum: Story = { - render: (args) => ( - - {({ close }) => ( - <> - - - - - - Amet at duis deserunt ad ad ornare. - - Nam cupidatat duis dolore magna aute posuere. Esse arcu morbi quis consequat facilisis lorem pulvinar. - - - -
- Cupidatat excepteur mi magna nisi sint. Sint officia donec duis egestas cupidatat quam consectetur - fermentum. Egestas incididunt esse magna ex occaecat nunc arcu. Adipiscing sit laborum adipiscing aliqua - tempor amet. Tempus laboris lorem deserunt aute sint ullamco magna pariatur. Ipsum elit justo cupidatat - ea a exercitation pariatur. -
-
- Mi tempor incididunt duis ullamco morbi minim. Proin condimentum adipiscing officia et ipsum nunc. Est - et est quam labore sit velit. Eiusmod laboris facilisis aliquip nulla aliqua occaecat quam mi. Ligula - aute fermentum tempus dolore qui dolore culpa. Quis quam ligula nulla exercitation exercitation nibh. - Bibendum laboris mollit vitae sunt elit aenean a non. Neque dui proident cupidatat proident morbi sunt - sapien. -
-
- - - - close()}>Cancel - close()} variant="primary"> - Accept - - - -
- - )} -
- ), -}; diff --git a/packages/web/src/common/components/Divider/__stories__/Divider.stories.tsx b/packages/web/src/common/components/Divider/__stories__/Divider.stories.tsx deleted file mode 100644 index ef9a5e9b..00000000 --- a/packages/web/src/common/components/Divider/__stories__/Divider.stories.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import Divider from '../Divider'; - -const meta = { - title: 'Common/Divider', - component: Divider, - decorators: [ - (Story) => ( -
- -
- ), - ], - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - testId: { description: 'The test identifier.' }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Simple: Story = {}; - -export const Colored: Story = { - args: { - className: 'bg-blue-600!', - }, -}; - -export const Thick: Story = { - args: { - className: 'h-1', - }, -}; diff --git a/packages/web/src/common/components/Dropdown/__stories__/DropdownMenu.stories.tsx b/packages/web/src/common/components/Dropdown/__stories__/DropdownMenu.stories.tsx deleted file mode 100644 index c08c8e03..00000000 --- a/packages/web/src/common/components/Dropdown/__stories__/DropdownMenu.stories.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import DropdownMenu from '../DropdownMenu'; -import Button from '@/common/components/Button/Button'; -import FAIcon from '@/common/components/Icon/FAIcon'; - -const meta = { - title: 'Common/Dropdown/DropdownMenu', - component: DropdownMenu, - parameters: { - layout: 'centered', - }, - decorators: [ - (Story) => ( -
- -
- ), - ], - tags: ['autodocs'], - argTypes: { - children: { description: 'The content.' }, - className: { description: 'Additional CSS classes.' }, - testId: { description: 'The test identifier.' }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Default: Story = { - render: (args) => ( - - - - - - Heading - - {}} testId="dropdown-item-add"> - - Add - - {}} testId="dropdown-item-edit"> - - Edit - - {}} testId="dropdown-item-delete"> - - Delete - - - - ), -}; diff --git a/packages/web/src/common/components/Form/__stories__/Checkbox.stories.tsx b/packages/web/src/common/components/Form/__stories__/Checkbox.stories.tsx deleted file mode 100644 index 430543b5..00000000 --- a/packages/web/src/common/components/Form/__stories__/Checkbox.stories.tsx +++ /dev/null @@ -1,112 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; -import { useForm } from 'react-hook-form'; -import { z } from 'zod'; -import { zodResolver } from '@hookform/resolvers/zod'; - -import { default as MyCheckbox } from '../Checkbox'; -import { CheckboxProps } from '../Checkbox'; - -const formSchema = z.object({ - isAccepted: z.boolean().refine((val) => val === true, { - message: 'You must accept the terms and conditions. ', - }), - isDisabledChecked: z.boolean(), - isDisabledUnchecked: z.boolean(), - isOptInMarketing: z.boolean(), -}); - -type FormValues = z.infer; - -/** - * A wrapper for the `Checkbox` component. Provides the React Hook Form `control` - * to the `Checkbox` component. - */ -const Checkbox = (props: Omit, 'control'>) => { - const form = useForm({ - defaultValues: { - isAccepted: false, - isDisabledChecked: true, - isDisabledUnchecked: false, - isOptInMarketing: true, - }, - mode: 'all', - resolver: zodResolver(formSchema), - }); - - const onSubmit = () => {}; - - return ( -
- - - ); -}; - -const meta = { - title: 'Common/Form/Checkbox', - component: Checkbox, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.', control: { type: 'text' } }, - control: { - description: 'Object containing methods for registering components into React Hook Form.', - }, - disabled: { - description: 'Indicates if the checkbox is disabled.', - control: { type: 'boolean' }, - }, - label: { description: 'The field label.', control: { type: 'text' } }, - name: { description: 'The form field name.', control: { type: 'text' } }, - required: { - description: 'Indicates if the checkbox is required.', - control: { type: 'boolean' }, - }, - supportingText: { description: 'Additional field instructions.', control: { type: 'text' } }, - testId: { description: 'The test identifier.', control: { type: 'text' } }, - }, - args: { - disabled: false, - testId: 'checkbox', - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const RequiredWithSupportingText: Story = { - args: { - name: 'isAccepted', - label: 'I accept the terms and conditions', - required: true, - supportingText: 'Check this box to continue.', - }, -}; - -export const OptionalWithDefaultChecked: Story = { - args: { - name: 'isOptInMarketing', - label: 'I want to receive marketing emails', - }, -}; - -export const DisabledUnchecked: Story = { - args: { - name: 'isDisabledUnchecked', - label: 'I am disabled and unchecked', - disabled: true, - supportingText: 'You cannot check this box.', - }, -}; - -export const DisabledChecked: Story = { - args: { - name: 'isDisabledChecked', - label: 'I am disabled and checked', - disabled: true, - supportingText: 'You cannot check this box.', - }, -}; diff --git a/packages/web/src/common/components/Form/__stories__/FieldError.stories.tsx b/packages/web/src/common/components/Form/__stories__/FieldError.stories.tsx deleted file mode 100644 index 93685518..00000000 --- a/packages/web/src/common/components/Form/__stories__/FieldError.stories.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import FieldError from '../FieldError'; - -const meta = { - title: 'Common/Form/FieldError', - component: FieldError, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - message: { description: 'The error message.' }, - testId: { description: 'The test identifier.' }, - }, - args: { - message: 'Required. Must be 30 characters or less.', - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Default: Story = {}; - -export const Styled: Story = { - args: { - className: 'uppercase underline', - }, -}; diff --git a/packages/web/src/common/components/Form/__stories__/Input.stories.tsx b/packages/web/src/common/components/Form/__stories__/Input.stories.tsx deleted file mode 100644 index 8b9f008a..00000000 --- a/packages/web/src/common/components/Form/__stories__/Input.stories.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; -import { useForm } from 'react-hook-form'; -import { z } from 'zod'; -import { zodResolver } from '@hookform/resolvers/zod'; - -import { default as MyInput } from '../Input'; -import { InputProps } from '../Input'; - -const formSchema = z.object({ - color: z.string().min(1, { message: 'Required' }), -}); - -type FormValues = z.infer; - -/** - * A wrapper for the `Input` component. Provides the RHF form `control` - * to the `Input` component. - */ -const Input = (props: Omit, 'control'>) => { - const form = useForm({ - defaultValues: { - color: '', - }, - mode: 'all', - resolver: zodResolver(formSchema), - }); - - const onSubmit = () => {}; - - return ( -
- - - ); -}; - -const meta = { - title: 'Common/Form/Input', - component: Input, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - control: { - description: 'Object containing methods for registering components into React Hook Form.', - }, - label: { description: 'The field label.' }, - name: { description: 'The form field name.' }, - supportingText: { description: 'Additional field instructions.' }, - testId: { description: 'The test identifier.' }, - }, - args: {}, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const WithSupportingText: Story = { - args: { - name: 'color', - label: 'Color', - supportingText: 'Enter your favorite color.', - }, -}; - -export const WithLabel: Story = { - args: { - name: 'color', - label: 'Color', - }, -}; - -export const Required: Story = { - args: { - name: 'color', - label: 'Color', - required: true, - }, -}; diff --git a/packages/web/src/common/components/Form/__stories__/Label.stories.tsx b/packages/web/src/common/components/Form/__stories__/Label.stories.tsx deleted file mode 100644 index 6b1f5783..00000000 --- a/packages/web/src/common/components/Form/__stories__/Label.stories.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import FAIcon from '@/common/components/Icon/FAIcon'; - -import Label from '../Label'; - -const meta = { - title: 'Common/Form/Label', - component: Label, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - children: { - description: 'The content.', - }, - className: { description: 'Additional CSS classes.' }, - htmlFor: { description: 'The `id` of the form control to which this label is associated.' }, - testId: { description: 'The test identifier.' }, - }, - args: { - children: 'Label Text', - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Default: Story = {}; - -export const Styled: Story = { - args: { - className: 'uppercase text-cyan-600', - }, -}; - -export const Required: Story = { - args: { - required: true, - }, -}; - -export const WithIcon: Story = { - args: { - children: ( - <> - Label Text - - - ), - }, -}; diff --git a/packages/web/src/common/components/Form/__stories__/RadioGroup.stories.tsx b/packages/web/src/common/components/Form/__stories__/RadioGroup.stories.tsx deleted file mode 100644 index 96a1d343..00000000 --- a/packages/web/src/common/components/Form/__stories__/RadioGroup.stories.tsx +++ /dev/null @@ -1,132 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; -import { useForm } from 'react-hook-form'; -import { z } from 'zod'; -import { zodResolver } from '@hookform/resolvers/zod'; - -import { default as MyRadioGroup } from '../RadioGroup'; -import { RadioGroupProps } from '../RadioGroup'; - -const formSchema = z.object({ - color: z.enum(['blue', 'red', 'yellow'], { message: 'Must be a primary color.' }), -}); - -type FormValues = z.infer; - -/** - * A wrapper for the `RadioGroup` component. Provides the RHF form `control` - * to the `RadioGroup` component. - */ -const RadioGroup = (props: Omit, 'control'>) => { - const form = useForm({ - defaultValues: {}, - mode: 'all', - resolver: zodResolver(formSchema), - }); - - const onSubmit = () => {}; - - return ( -
- -
- ); -}; - -const meta = { - title: 'Common/Form/RadioGroup', - component: RadioGroup, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - control: { - description: 'Object containing methods for registering components into React Hook Form.', - }, - disabled: { - description: 'Optional. Indicates if the field is disabled.', - control: { type: 'boolean' }, - }, - label: { description: 'Optional. The label text.' }, - name: { description: 'Name of the form control.' }, - orientation: { - description: 'Optional. Orientation of the radio group.', - options: ['horizontal', 'vertical'], - control: { type: 'select' }, - }, - required: { - description: 'Optional. Indicates if the field is required.', - control: { type: 'boolean' }, - }, - supportingText: { description: 'Optional. Help text or instructions.' }, - testId: { description: 'The test identifier.' }, - }, - args: {}, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const WithSupportingText: Story = { - args: { - children: ( - <> - - - - - - ), - name: 'color', - label: 'Color', - supportingText: 'Select a primary color.', - }, -}; - -export const WithLabel: Story = { - args: { - children: ( - <> - - - - - - ), - name: 'color', - label: 'Color', - }, -}; - -export const DisabledGroup: Story = { - args: { - children: ( - <> - - - - - - ), - name: 'color', - label: 'Color', - disabled: true, - }, -}; - -export const DisabledItem: Story = { - args: { - children: ( - <> - - - - - - ), - name: 'color', - label: 'Color', - }, -}; diff --git a/packages/web/src/common/components/Form/__stories__/SearchInput.stories.tsx b/packages/web/src/common/components/Form/__stories__/SearchInput.stories.tsx deleted file mode 100644 index 181e9a2a..00000000 --- a/packages/web/src/common/components/Form/__stories__/SearchInput.stories.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import SearchInput from '../SearchInput'; -import SearchResult from '../SearchResult'; - -const meta = { - title: 'Common/Form/SearchInput', - component: SearchInput, - decorators: [ - (Story) => ( -
- -
- ), - ], - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - errorText: { description: 'Optional. Field error message.' }, - isLoading: { description: 'Indicates if the results are loading.' }, - onChange: { description: 'A function called when the value changes.' }, - searchResults: { - description: 'Optional. An array of `SearchResult` components.', - }, - supportingText: { description: 'Additional field instructions.' }, - testId: { description: 'The test identifier.' }, - }, - args: {}, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -// const fruits = ['Apples', 'Bananas', 'Grapes']; - -export const Simple: Story = { - args: { - onChange: () => {}, - searchResults: [ {}}>Apples], - }, -}; - -export const MultipleResults: Story = { - args: { - onChange: () => {}, - searchResults: [ - {}}>Apples, - {}}>Bananas, - {}}>Oranges, - ], - }, -}; - -export const WithSupportingText: Story = { - args: { - onChange: () => {}, - searchResults: [ - {}}>Apples, - {}}>Bananas, - {}}>Oranges, - ], - supportingText: 'I am supporting text.', - }, -}; - -export const WithError: Story = { - args: { - errorText: 'I am error text.', - onChange: () => {}, - searchResults: [ - {}}>Apples, - {}}>Bananas, - {}}>Oranges, - ], - supportingText: 'I am supporting text.', - }, -}; diff --git a/packages/web/src/common/components/Form/__stories__/Select.stories.tsx b/packages/web/src/common/components/Form/__stories__/Select.stories.tsx deleted file mode 100644 index 9bf29bae..00000000 --- a/packages/web/src/common/components/Form/__stories__/Select.stories.tsx +++ /dev/null @@ -1,156 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; -import { useForm } from 'react-hook-form'; -import { z } from 'zod'; -import { zodResolver } from '@hookform/resolvers/zod'; - -import { default as MySelect } from '../Select'; -import { SelectProps } from '../Select'; - -const formSchema = z.object({ - color: z.enum(['blue', 'red'], { message: 'Must be blue or red.' }), -}); - -type FormValues = z.infer; - -/** - * A wrapper for the `Select` component. Provides the RHF form `control` - * to the `Select` component. - */ -const Select = (props: Omit, 'control'>) => { - const form = useForm({ - defaultValues: {}, - mode: 'all', - resolver: zodResolver(formSchema), - }); - - const onSubmit = () => {}; - - return ( -
- -
- ); -}; - -const meta = { - title: 'Common/Form/Select', - component: Select, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - control: { - description: 'Object containing methods for registering components into React Hook Form.', - }, - label: { description: 'The field label.' }, - name: { description: 'The form field name.' }, - supportingText: { description: 'Additional field instructions.' }, - testId: { description: 'The test identifier.' }, - }, - args: {}, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const WithSupportingText: Story = { - args: { - children: ( - <> - - - - - - Primary Colors - Blue - Red - Yellow - - Secondary Colors - Green - Orange - Purple - - - ), - name: 'color', - label: 'Color', - supportingText: 'Choose a color.', - }, -}; - -export const WithLabel: Story = { - args: { - children: ( - <> - - - - - - Primary Colors - Blue - Red - Yellow - - Secondary Colors - Green - Orange - Purple - - - ), - name: 'color', - label: 'Color', - }, -}; - -export const Required: Story = { - args: { - children: ( - <> - - - - - - Primary Colors - Blue - Red - Yellow - - Secondary Colors - Green - Orange - Purple - - - ), - name: 'color', - label: 'Color', - required: true, - }, -}; - -export const Basic: Story = { - args: { - children: ( - <> - - - - - - Blue - Red - Yellow - - - ), - name: 'color', - }, -}; diff --git a/packages/web/src/common/components/Form/__stories__/Textarea.stories.tsx b/packages/web/src/common/components/Form/__stories__/Textarea.stories.tsx deleted file mode 100644 index 6ba69741..00000000 --- a/packages/web/src/common/components/Form/__stories__/Textarea.stories.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; -import { FieldValues, useForm } from 'react-hook-form'; - -import { default as MyTextarea } from '../Textarea'; -import { TextareaProps } from '../Textarea'; - -/** - * A wrapper for the `Textarea` component. Provides the RHF form `control` - * to the `Textarea` component. - */ -const Textarea = (props: Omit, 'control'>) => { - const form = useForm(); - - const onSubmit = () => {}; - - return ( -
- - - ); -}; - -const meta = { - title: 'Common/Form/Textarea', - component: Textarea, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - control: { - description: 'Object containing methods for registering components into React Hook Form.', - }, - label: { description: 'The field label.' }, - name: { description: 'The form field name.' }, - supportingText: { description: 'Additional field instructions.' }, - testId: { description: 'The test identifier.' }, - }, - args: {}, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const WithSupportingText: Story = { - args: { - name: 'bio', - label: 'Bio', - supportingText: 'Tell us a little bit about yourself.', - }, -}; - -export const WithLabel: Story = { - args: { - name: 'bio', - label: 'Bio', - }, -}; - -export const Required: Story = { - args: { - name: 'bio', - label: 'Bio', - required: true, - }, -}; - -export const MoreRows: Story = { - args: { - name: 'bio', - label: 'Bio', - rows: 8, - }, -}; diff --git a/packages/web/src/common/components/Form/__stories__/Toggle.stories.tsx b/packages/web/src/common/components/Form/__stories__/Toggle.stories.tsx deleted file mode 100644 index fd42cfb3..00000000 --- a/packages/web/src/common/components/Form/__stories__/Toggle.stories.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; -import { useForm } from 'react-hook-form'; -import { z } from 'zod'; -import { zodResolver } from '@hookform/resolvers/zod'; - -import { default as MyToggle } from '../Toggle'; -import { ToggleProps } from '../Toggle'; - -const formSchema = z.object({ - isEnabledNotifications: z.boolean(), -}); - -type FormValues = z.infer; - -/** - * A wrapper for the `Toggle` component. Provides the RHF form `control` - * to the `Toggle` component. - */ -const Toggle = (props: Omit, 'control'>) => { - const form = useForm({ - defaultValues: { - isEnabledNotifications: false, - }, - mode: 'all', - resolver: zodResolver(formSchema), - }); - - const onSubmit = () => {}; - - return ( -
- - - ); -}; - -const meta = { - title: 'Common/Form/Toggle', - component: Toggle, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - control: { - description: 'Object containing methods for registering components into React Hook Form.', - }, - label: { description: 'The field label.' }, - name: { description: 'The form field name.' }, - supportingText: { description: 'Additional field instructions.' }, - testId: { description: 'The test identifier.' }, - }, - args: {}, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const WithSupportingText: Story = { - args: { - name: 'isEnabledNotifications', - label: 'Receive Notifications', - supportingText: 'Enable or disable push notifications.', - }, -}; - -export const WithLabel: Story = { - args: { - name: 'isEnabledNotifications', - label: 'Receive Notifications', - }, -}; diff --git a/packages/web/src/common/components/Icon/__stories__/Avatar.stories.tsx b/packages/web/src/common/components/Icon/__stories__/Avatar.stories.tsx deleted file mode 100644 index 82175012..00000000 --- a/packages/web/src/common/components/Icon/__stories__/Avatar.stories.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import image from '@/assets/img/logo.png'; - -import Avatar from '../Avatar'; - -const meta = { - title: 'Common/Icon/Avatar', - component: Avatar, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - picture: { - description: 'Optional. An image soource. When present, this is used as the Avatar image.', - }, - testId: { description: 'The test identifier.' }, - value: { description: 'The value, e.g. a name, title, etc.' }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Simple: Story = { - args: { - value: 'Bob Smith', - }, -}; - -export const Rounded: Story = { - args: { - className: 'rounded-full', - value: 'Bob Smith', - }, -}; - -export const Image: Story = { - args: { - picture: image, - value: 'Bob Smith', - }, -}; diff --git a/packages/web/src/common/components/Icon/__stories__/FAIcon.stories.tsx b/packages/web/src/common/components/Icon/__stories__/FAIcon.stories.tsx deleted file mode 100644 index 5f8f3183..00000000 --- a/packages/web/src/common/components/Icon/__stories__/FAIcon.stories.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import FAIcon from '../FAIcon'; - -const meta = { - title: 'Common/Icon/FAIcon', - component: FAIcon, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - icon: { description: 'The icon name.' }, - testId: { description: 'The test identifier.' }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Simple: Story = { - args: { - icon: 'sliders', - }, -}; - -export const Size: Story = { - args: { - icon: 'sliders', - size: '2x', - }, -}; - -export const Color: Story = { - args: { - icon: 'sliders', - className: 'text-blue-600', - }, -}; - -export const Spin: Story = { - args: { - icon: 'circleNotch', - spin: true, - }, -}; diff --git a/packages/web/src/common/components/Link/__stories__/Link.stories.tsx b/packages/web/src/common/components/Link/__stories__/Link.stories.tsx deleted file mode 100644 index a375539a..00000000 --- a/packages/web/src/common/components/Link/__stories__/Link.stories.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; -import { MemoryRouter } from 'react-router-dom'; - -import Link from '../Link'; -import FAIcon from '../../Icon/FAIcon'; - -const meta = { - title: 'Common/Link', - component: Link, - decorators: [ - (Story) => ( - - - - ), - ], - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - children: { description: 'The displayed content of the link.' }, - className: { description: 'Additional CSS classes.' }, - target: { description: 'Where to display the linked URL.' }, - testId: { description: 'The test identifier.' }, - to: { description: 'The URL to which the link points.' }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Simple: Story = { - args: { - children: 'Regular link', - to: '/', - }, -}; - -export const Target: Story = { - args: { - children: 'Open in new tab', - target: '_blank', - to: '/', - }, -}; - -export const Icon: Story = { - args: { - children: , - to: '/', - }, -}; - -export const Styled: Story = { - args: { - children: 'Styled link', - className: 'decoration-rose-400 text-rose-500 text-2xl', - to: '/', - }, -}; diff --git a/packages/web/src/common/components/Loader/__stories__/Skeleton.stories.tsx b/packages/web/src/common/components/Loader/__stories__/Skeleton.stories.tsx deleted file mode 100644 index ee2c041f..00000000 --- a/packages/web/src/common/components/Loader/__stories__/Skeleton.stories.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import Skeleton from '../Skeleton'; - -const meta = { - title: 'Common/Loader/Skeleton', - component: Skeleton, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - testId: { description: 'The test identifier.' }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Simple: Story = { - args: { - className: 'h-4 w-64', - }, -}; - -export const Height: Story = { - args: { - className: 'h-24 w-64', - }, -}; - -export const Width: Story = { - args: { - className: 'h-4 w-96', - }, -}; - -export const BackgroundColor: Story = { - args: { - className: 'h-4 w-64 bg-sky-200', - }, -}; diff --git a/packages/web/src/common/components/Loader/__stories__/Spinner.stories.tsx b/packages/web/src/common/components/Loader/__stories__/Spinner.stories.tsx deleted file mode 100644 index 6011f1da..00000000 --- a/packages/web/src/common/components/Loader/__stories__/Spinner.stories.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import Spinner from '../Spinner'; - -const meta = { - title: 'Common/Loader/Spinner', - component: Spinner, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - children: { description: 'Optional. The content, e.g. "Spinner.Text".' }, - className: { description: 'Additional CSS classes.' }, - icon: { description: 'Optional. A "FAIconProps" object containing properties for the icon.' }, - testId: { description: 'The test identifier.' }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Simple: Story = { - args: {}, -}; - -export const Larger: Story = { - args: { - icon: { size: '2x' }, - }, -}; - -export const Colored: Story = { - args: { - icon: { className: 'text-blue-600' }, - }, -}; - -export const WithText: Story = { - args: { - children: Engaging warp engines Captain..., - }, -}; - -export const WithAlternativeIcon: Story = { - args: { - icon: { icon: 'circleXmark' }, - }, -}; diff --git a/packages/web/src/common/components/Menu/SideMenu/__stories__/SideMenu.stories.tsx b/packages/web/src/common/components/Menu/SideMenu/__stories__/SideMenu.stories.tsx deleted file mode 100644 index 965057e8..00000000 --- a/packages/web/src/common/components/Menu/SideMenu/__stories__/SideMenu.stories.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; -import { MemoryRouter } from 'react-router-dom'; - -import Avatar from '@/common/components/Icon/Avatar'; -import MenuNavLink from '../../MenuNavLink'; -import MenuSeparator from '../../MenuSeparator'; - -import SideMenu from '../SideMenu'; - -const meta = { - title: 'Common/Menu/SideMenu', - component: SideMenu, - decorators: [ - (Story) => ( -
- - - -
- ), - ], - parameters: { - layout: 'fullscreen', - }, - tags: ['autodocs'], - argTypes: { - children: { description: 'The content.' }, - className: { description: 'Additional CSS classes.' }, - close: { description: 'Optional. Function to close the menu. ' }, - headerContent: { - description: 'Optional. A `ReactNode` containing the content of the menu header.', - }, - side: { - description: 'Optional. The side of the viewport where the menu should display when shown. Default: left', - }, - testId: { description: 'The test identifier.' }, - }, - args: { - children: ( - <> - - Section A - - - Section B - - - Section C - - - - Settings - - - ), - headerContent: ( -
- -
Bob Smith
-
- ), - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const RightSide: Story = { - args: { - side: 'right', - }, - render: (args) => , -}; - -export const LeftSide: Story = { - render: (args) => , -}; diff --git a/packages/web/src/common/components/Table/__stories__/Table.stories.tsx b/packages/web/src/common/components/Table/__stories__/Table.stories.tsx deleted file mode 100644 index 4047fcbe..00000000 --- a/packages/web/src/common/components/Table/__stories__/Table.stories.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; -import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; - -import Table from '../Table'; - -const meta = { - title: 'Common/Table', - component: Table, - decorators: [ - (Story) => ( -
- -
- ), - ], - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - columns: { description: 'An array of `ColumnDef`, column definition, objects.' }, - data: { - description: 'An array of data objects, of type `TData`, which are used to populate the rows of the table.', - }, - testId: { description: 'The test identifier.' }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -// the table data type -type TableData = { - key: string; - value: string; -}; - -// the table column definitions -const columnHelper = createColumnHelper(); -const simpleTableColumns = [columnHelper.accessor('key', {}), columnHelper.accessor('value', {})]; -const decoratedTableColumns = [ - columnHelper.accessor('key', { - cell: (info) => {info.getValue()}, - header: () => 'Key', - }), - columnHelper.accessor('value', { - header: () => 'Value', - }), -] as ColumnDef[]; - -// the data to populate the table -const myTableData: TableData[] = [ - { - key: 'className', - value: 'Optional. Additional CSS class names.', - }, - { - key: 'testId', - value: 'Optional. Identifier for testing.', - }, -]; - -export const Simple: Story = { - args: { - // @ts-expect-error Storybook generics - columns: simpleTableColumns, - data: myTableData, - }, - render: ({ columns, data }) => { - return columns={columns as ColumnDef[]} data={data as TableData[]} />; - }, -}; - -export const DecoratedColumns: Story = { - args: { - // @ts-expect-error Storybook generics - columns: decoratedTableColumns, - data: myTableData, - }, - render: ({ columns, data }) => { - return columns={columns as ColumnDef[]} data={data as TableData[]} />; - }, -}; diff --git a/packages/web/src/common/components/Tabs/__stories__/Tabs.stories.tsx b/packages/web/src/common/components/Tabs/__stories__/Tabs.stories.tsx deleted file mode 100644 index fa04e4b0..00000000 --- a/packages/web/src/common/components/Tabs/__stories__/Tabs.stories.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import Tabs from '../Tabs'; - -const meta = { - title: 'Common/Tabs', - component: Tabs, - tags: ['autodocs'], - argTypes: { - children: { description: 'The content.' }, - className: { description: 'Additional CSS classes.' }, - defaultValue: { description: 'The default (or initial) active tab.' }, - testId: { description: 'The test identifier.' }, - }, - args: { - defaultValue: 'one', - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Default: Story = { - render: (args) => ( - - - One - Two - - -
I am the content for tab one!
-
- -
I am the content for tab two!
-
-
- ), -}; - -export const StretchedTabs: Story = { - render: (args) => ( - - - One - Two - - -
I am the content for tab one!
-
- -
I am the content for tab two!
-
-
- ), -}; diff --git a/packages/web/src/common/components/Text/__stories__/CodeSnippet.stories.tsx b/packages/web/src/common/components/Text/__stories__/CodeSnippet.stories.tsx deleted file mode 100644 index 894c2012..00000000 --- a/packages/web/src/common/components/Text/__stories__/CodeSnippet.stories.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import { withProviders } from '../../../../../.storybook/decorators/withProviders'; - -import CodeSnippet from '../CodeSnippet'; - -const meta = { - title: 'Common/Text/CodeSnippet', - component: CodeSnippet, - decorators: [withProviders()], - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - code: { description: 'The code snippet.' }, - language: { description: 'The programming language of the code snippet for syntax highlighting.' }, - testId: { description: 'The test identifier.' }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -const badge = '3'; - -const text = ` - I am the first line. - - I am another line. - -`; - -export const Simple: Story = { - args: { children: badge, language: 'jsx' }, -}; - -export const MultiLine: Story = { - args: { children: text, language: 'jsx' }, -}; diff --git a/packages/web/src/common/components/Text/__stories__/Currency.stories.tsx b/packages/web/src/common/components/Text/__stories__/Currency.stories.tsx deleted file mode 100644 index 42b2d6b9..00000000 --- a/packages/web/src/common/components/Text/__stories__/Currency.stories.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import { CurrencyCode, CurrencyDisplay, CurrencySign } from '@/common/utils/constants'; - -import Currency from '../Currency'; - -const meta = { - title: 'Common/Text/Currency', - component: Currency, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - currency: { description: 'Optional. The ISO 4217 currency code.' }, - currencyDisplay: { description: 'Optional How the currency is displayed.' }, - currencySign: { description: 'Optional. How negative values are displayed.' }, - testId: { description: 'The test identifier.' }, - value: { description: 'The amount.' }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Simple: Story = { - args: { value: 1.99 }, -}; - -export const WithCurrency: Story = { - args: { currency: CurrencyCode.GBP, value: Simple.args.value }, -}; - -export const WithDisplay: Story = { - args: { currencyDisplay: CurrencyDisplay.Name, value: Simple.args.value }, -}; - -export const WithSign: Story = { - args: { currencySign: CurrencySign.Accounting, value: -Simple.args.value }, -}; diff --git a/packages/web/src/common/components/Text/__stories__/Date.stories.tsx b/packages/web/src/common/components/Text/__stories__/Date.stories.tsx deleted file mode 100644 index 963597ff..00000000 --- a/packages/web/src/common/components/Text/__stories__/Date.stories.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import { DateFormat } from '@/common/utils/constants'; - -import Date from '../Date'; - -const meta = { - title: 'Common/Text/Date', - component: Date, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - date: { - description: 'The date value expressed as an ISO 8601 date string or as a number of milliseconds.', - }, - format: { description: 'Optional. The format of the Date.' }, - testId: { description: 'The test identifier.' }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Simple: Story = { - args: { date: '2024-12-20T18:01:31-05:00' }, -}; - -export const DayOfWeek: Story = { - args: { date: Simple.args.date, format: DateFormat.DAY_OF_WEEK }, -}; - -export const HoursAndMinutes: Story = { - args: { date: Simple.args.date, format: DateFormat.HOURS_AND_MINUTES }, -}; - -export const Time: Story = { - args: { date: Simple.args.date, format: DateFormat.TIME }, -}; - -export const TimestampShort: Story = { - args: { date: Simple.args.date, format: DateFormat.TIMESTAMP_SHORT }, -}; - -export const Timestamp: Story = { - args: { date: Simple.args.date, format: DateFormat.TIMESTAMP }, -}; diff --git a/packages/web/src/common/components/Text/__stories__/DayOfTheWeek.stories.tsx b/packages/web/src/common/components/Text/__stories__/DayOfTheWeek.stories.tsx deleted file mode 100644 index 973ec352..00000000 --- a/packages/web/src/common/components/Text/__stories__/DayOfTheWeek.stories.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; -import dayjs from 'dayjs'; - -import DayOfTheWeek from '../DayOfTheWeek'; - -const meta = { - title: 'Common/Text/DayOfTheWeek', - component: DayOfTheWeek, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - date: { - description: 'The date value expressed as an ISO 8601 date string or as a number of milliseconds.', - }, - relative: { - description: - 'Optional. Indicates if the day of the week should be expressed relative to the current day, i.e. `Yesterday`, `Today`, `Tomorrow`.', - }, - testId: { description: 'The test identifier.' }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -const today = dayjs().toISOString(); - -const tomorrow = dayjs().add(1, 'days').toISOString(); - -const yesterday = dayjs().subtract(1, 'days').toISOString(); - -export const Simple: Story = { - args: { date: '2024-12-20T18:01:31-05:00' }, -}; - -export const Relative: Story = { - args: { date: Simple.args.date, relative: true }, -}; - -export const Today: Story = { - args: { date: today, relative: true }, -}; - -export const Tomorrow: Story = { - args: { date: tomorrow, relative: true }, -}; - -export const Yesterday: Story = { - args: { date: yesterday, relative: true }, -}; diff --git a/packages/web/src/common/components/Text/__stories__/Decimal.stories.tsx b/packages/web/src/common/components/Text/__stories__/Decimal.stories.tsx deleted file mode 100644 index c1d4c663..00000000 --- a/packages/web/src/common/components/Text/__stories__/Decimal.stories.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import { SignDisplay, Unit, UnitDisplay } from '@/common/utils/constants'; - -import Decimal from '../Decimal'; - -const meta = { - title: 'Common/Text/Decimal', - component: Decimal, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - maximumFractionDigits: { - description: 'Optional. The maximum number of fraction digits to use.', - }, - minimumFractionDigits: { - description: 'Optional. The minimum number of fraction digits to use.', - }, - signDisplay: { description: 'Optional. When to display the sign for the number.' }, - testId: { description: 'The test identifier.' }, - unit: { description: 'Optional. When included, formatted value includes unit of measurement.' }, - unitDisplay: { description: 'Optional. Display of the unit of measurement.' }, - value: { description: 'The amount.' }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -const pi = 3.14159265359; - -export const Simple: Story = { - args: { value: pi }, -}; - -export const WithMinMax: Story = { - args: { value: Simple.args.value, minimumFractionDigits: 2, maximumFractionDigits: 6 }, -}; - -export const WithSign: Story = { - args: { value: Simple.args.value, signDisplay: SignDisplay.Always }, -}; - -export const WithUnit: Story = { - args: { value: Simple.args.value, unit: Unit.Centimeter, unitDisplay: UnitDisplay.Long }, -}; diff --git a/packages/web/src/common/components/Text/__stories__/Heading.stories.tsx b/packages/web/src/common/components/Text/__stories__/Heading.stories.tsx deleted file mode 100644 index 89451385..00000000 --- a/packages/web/src/common/components/Text/__stories__/Heading.stories.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import Heading from '../Heading'; - -const meta = { - title: 'Common/Text/Heading', - component: Heading, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - children: { description: 'The content.' }, - className: { description: 'Additional CSS classes.' }, - level: { description: 'Optional. The heading level, 1-6.' }, - testId: { description: 'The test identifier.' }, - }, - args: { - children: 'The small red fox slept in the barn.', - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const HeadingOne: Story = { - args: { level: 1 }, -}; - -export const HeadingTwo: Story = { - args: { level: 2 }, -}; - -export const HeadingThree: Story = { - args: { level: 3 }, -}; - -export const HeadingFour: Story = { - args: { level: 4 }, -}; - -export const HeadingFive: Story = { - args: { level: 5 }, -}; - -export const HeadingSix: Story = { - args: { level: 6 }, -}; - -export const Styled: Story = { - args: { className: 'font-mono text-lime-700 capitalize', level: 3 }, -}; diff --git a/packages/web/src/common/components/Text/__stories__/HelpText.stories.tsx b/packages/web/src/common/components/Text/__stories__/HelpText.stories.tsx deleted file mode 100644 index aa1a2d55..00000000 --- a/packages/web/src/common/components/Text/__stories__/HelpText.stories.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import HelpText from '../HelpText'; - -const meta = { - title: 'Common/Text/HelpText', - component: HelpText, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - children: { description: 'The help text content.' }, - className: { description: 'Additional CSS classes.' }, - testId: { description: 'The test identifier.' }, - }, - args: { - children: 'This is the help text.', - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Default: Story = {}; - -export const Styled: Story = { - args: { - className: 'text-cyan-500 font-bold', - }, -}; diff --git a/packages/web/src/common/components/Text/__stories__/Integer.stories.tsx b/packages/web/src/common/components/Text/__stories__/Integer.stories.tsx deleted file mode 100644 index e7425b13..00000000 --- a/packages/web/src/common/components/Text/__stories__/Integer.stories.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import { SignDisplay, Unit, UnitDisplay } from '@/common/utils/constants'; - -import Integer from '../Integer'; - -const meta = { - title: 'Common/Text/Integer', - component: Integer, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - signDisplay: { description: 'Optional. When to display the sign for the number.' }, - testId: { description: 'The test identifier.' }, - unit: { description: 'Optional. When included, formatted value includes unit of measurement.' }, - unitDisplay: { description: 'Optional. Display of the unit of measurement.' }, - value: { description: 'The amount.' }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -const val = 3.14159265359; - -export const Simple: Story = { - args: { value: val }, -}; - -export const WithSign: Story = { - args: { value: Simple.args.value, signDisplay: SignDisplay.Always }, -}; - -export const WithUnit: Story = { - args: { value: Simple.args.value, unit: Unit.Centimeter, unitDisplay: UnitDisplay.Long }, -}; diff --git a/packages/web/src/common/components/Text/__stories__/Percent.stories.tsx b/packages/web/src/common/components/Text/__stories__/Percent.stories.tsx deleted file mode 100644 index 822b0787..00000000 --- a/packages/web/src/common/components/Text/__stories__/Percent.stories.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import { SignDisplay } from '@/common/utils/constants'; - -import Percent from '../Percent'; - -const meta = { - title: 'Common/Text/Percent', - component: Percent, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - className: { description: 'Additional CSS classes.' }, - maximumFractionDigits: { - description: 'Optional. The maximum number of fraction digits to use.', - }, - minimumFractionDigits: { - description: 'Optional. The minimum number of fraction digits to use.', - }, - signDisplay: { description: 'Optional. When to display the sign for the number.' }, - testId: { description: 'The test identifier.' }, - value: { description: 'The percent as a decimal value, e.g. `0.34` renders 34%.' }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -const val = 0.14159265359; - -export const Simple: Story = { - args: { value: val }, -}; - -export const WithMinMax: Story = { - args: { value: Simple.args.value, minimumFractionDigits: 2, maximumFractionDigits: 6 }, -}; - -export const WithSign: Story = { - args: { value: Simple.args.value, signDisplay: SignDisplay.Always }, -}; diff --git a/packages/web/src/common/components/Text/__stories__/Text.stories.tsx b/packages/web/src/common/components/Text/__stories__/Text.stories.tsx deleted file mode 100644 index 6a0d4331..00000000 --- a/packages/web/src/common/components/Text/__stories__/Text.stories.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react-vite'; - -import Text from '../Text'; - -const meta = { - title: 'Common/Text/Text', - component: Text, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], - argTypes: { - children: { description: 'The content.' }, - className: { description: 'Additional CSS classes.' }, - variant: { description: 'Optional. The style variant.' }, - testId: { description: 'The test identifier.' }, - }, - args: { - children: 'The sly red fix sleeps under the tree.', - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Default: Story = {}; - -export const Danger: Story = { - args: { variant: 'danger' }, -}; - -export const Info: Story = { - args: { variant: 'info' }, -}; - -export const Warning: Story = { - args: { variant: 'warning' }, -}; diff --git a/packages/web/src/common/utils/constants.ts b/packages/web/src/common/utils/constants.ts index cf7e9b53..6790c1fd 100644 --- a/packages/web/src/common/utils/constants.ts +++ b/packages/web/src/common/utils/constants.ts @@ -33,89 +33,3 @@ export const DEFAULT_SETTINGS: Settings = { export enum SearchParam { tab = 'tab', } - -/** - * ISO 4217 Currency Codes - * @see {@link https://en.wikipedia.org/wiki/ISO_4217#List_of_ISO_4217_currency_codes | ISO 4217 Currency Codes} - */ -export enum CurrencyCode { - CAD = 'CAD', // Canadian Dollar - EUR = 'EUR', // Euro - GBP = 'GBP', // Pound sterling (Great Britian) - MXN = 'MXN', // Mexican Peso - USD = 'USD', // US Dollar -} - -/** - * Possible `currencyDisplay` values to use with `Intl.NumberFormat`. - * Default: `symbol`. - * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options | NumberFormatOptions} - */ -export enum CurrencyDisplay { - Code = 'code', - Name = 'name', - NarrowSymbol = 'narrowSymbol', - Symbol = 'symbol', -} - -/** - * Possible `currencySign` values to use with `Intl.NumberFormat`. - * Default: `standard`. - * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options | NumberFormatOptions} - */ -export enum CurrencySign { - Accounting = 'accounting', - Standard = 'standard', -} - -/** - * The `DateFormat` enumerates patterns for formatting dates. - */ -export enum DateFormat { - DATE = 'MM/DD/YYYY', - DAY_OF_WEEK = 'dddd', - HOURS_AND_MINUTES = 'H[h] mm[m]', - TIME = 'h:mma', - TIMESTAMP_SHORT = 'h:mma ddd MMM D', - TIMESTAMP = 'dddd MMMM D [at] h:mma', -} - -/** - * Possible `signDisplay` values to use with `Intl.NumberFormat`. By default, - * display sign for negative numbers only, including negative zero. Default: `auto`. - * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options | NumberFormatOptions} - */ -export enum SignDisplay { - Auto = 'auto', - Always = 'always', - ExceptZero = 'exceptZero', - Never = 'never', -} - -/** - * Possible `unit` values to use with "unit" formatting style using `Intl.NumberFormat`. - * @see {@link https://tc39.es/ecma402/#table-sanctioned-single-unit-identifiers | ECMA Units of Measurement } - */ -export enum Unit { - Celsius = 'celsius', - Centimeter = 'centimeter', - Fahrenheit = 'fahrenheit', - Inch = 'inch', - Kilometer = 'kilometer', - KilometerPerHour = 'kilometer-per-hour', - Mile = 'mile', - MilePerHour = 'mile-per-hour', - Millimeter = 'millimeter', - Percent = 'percent', -} - -/** - * Possible `unitDisplay` values to use with "unit" formatting style using - * `Intl.NumberFormat`. Default: `short`, e.g. "10 cm". - * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options | NumberFormatOptions} - */ -export enum UnitDisplay { - Long = 'long', - Narrow = 'narrow', - Short = 'short', -} From 5377e2da72878b44e0715905b45d7ce5942ae03d Mon Sep 17 00:00:00 2001 From: Matthew Warman Date: Thu, 27 Aug 2026 06:41:00 -0400 Subject: [PATCH 03/41] chore: update deps --- package-lock.json | 3743 +++++++++++++++++++++------------------------ package.json | 16 +- 2 files changed, 1732 insertions(+), 2027 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4cdb6480..54665950 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "class-variance-authority": "0.7.1", "react": "19.2.8", "react-dom": "19.2.8", - "react-router-dom": "^7.18.2", + "react-router-dom": "7.18.2", "zod": "4.4.3" }, "devDependencies": { @@ -25,22 +25,22 @@ "@testing-library/jest-dom": "7.0.1", "@testing-library/react": "16.3.2", "@testing-library/user-event": "14.6.6", - "@types/node": "26.2.0", + "@types/node": "26.4.0", "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", - "@vitejs/plugin-react": "6.0.5", - "@vitest/coverage-v8": "4.1.10", + "@types/react-dom": "19.2.5", + "@vitejs/plugin-react": "6.1.0", + "@vitest/coverage-v8": "4.1.11", "eslint": "9.39.2", - "globals": "17.10.0", + "globals": "17.11.0", "husky": "9.1.7", "jsdom": "30.0.1", "prettier": "3.9.6", "prettier-plugin-tailwindcss": "0.8.1", "rimraf": "6.1.3", - "shadcn": "4.18.0", + "shadcn": "4.19.0", "typescript": "5.9.3", - "typescript-eslint": "8.67.0", - "vitest": "4.1.10" + "typescript-eslint": "8.68.0", + "vitest": "4.1.11" } }, "node_modules/@adobe/css-tools": { @@ -98,9 +98,9 @@ "license": "Apache-2.0" }, "node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "54.20.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-54.20.0.tgz", - "integrity": "sha512-ts2dVBi0VUXOLKcqyLYsHUWYpwGPFd+xm4q+6Y4jjP8orwodjRi2mJrmpy9b0gHnbv8e/hFnmEbqrD0bBJOnPA==", + "version": "54.21.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-54.21.0.tgz", + "integrity": "sha512-URh+k3/xG+e48lF41qBn/J8TzxwBaHt7Wsg5ZF+W4l76yiPhFmW7atV0BMVrWy7jh4SGO+yCuuqJe+CNjSk31w==", "bundleDependencies": [ "jsonschema", "semver" @@ -641,26 +641,6 @@ "specificity": "bin/cli.js" } }, - "node_modules/@chromatic-com/storybook": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-5.3.0.tgz", - "integrity": "sha512-gMAfVYJnF/tjdY8C3Q54KYz/low2NFjPIZMpCqSFuMUiTJ2DNWCTb7mFhuuzZ1iduWFDhewlJyilFmvKcEDYRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@neoconfetti/react": "^1.0.0", - "chromatic": "^18.0.1", - "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/@csstools/color-helpers": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.1.tgz", @@ -706,9 +686,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.2.0.tgz", - "integrity": "sha512-5+5LEmFuY1AjXdYhmgjTJogtQnP1evJ1zrBZGUNZ0thkpwnnmKxcHdAMn/OtFjAb25zA+jKDVYVRl+5G7rjv1A==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.2.1.tgz", + "integrity": "sha512-YpAJZhaHplYQkG8ib+/Fx5Y0eF2lVWi3tIvMJA6i39TLyUNp2439cifzW8VMjhlqrBjHzK5hVGugRRm2zTKI/A==", "dev": true, "funding": [ { @@ -757,9 +737,9 @@ } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.8.tgz", - "integrity": "sha512-CpMLjAvwQg3BL5S0IeqsZNMH7EQrEWi0kLKOC13ZBF0ZwERiLWlibNPJr8G1kdU3Ms/r2KiNrF81pUh2HwAHdg==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.9.tgz", + "integrity": "sha512-iGGw4OsAYsS6pD29MdJ2bX/nJx65a04ZZiw6x+VwWlP2DdXf6f++Zmuv/OzALpdyfVhjbduIIF2cXM7HWBIe9A==", "dev": true, "funding": [ { @@ -1615,23 +1595,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -1645,13 +1608,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, "node_modules/@eslint/js": { "version": "9.39.2", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", @@ -1825,116 +1781,6 @@ "hono": "^4" } }, - "node_modules/@hookform/resolvers": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.7.1.tgz", - "integrity": "sha512-8wS/P4UDr5sQDe4nFaV51TVyfDPrWgNIXweqG0Bs9Z5LSuzKLb+RQNPvkN2oHM5SRrJyWrVH/F+LOUcFjUyvwQ==", - "license": "MIT", - "dependencies": { - "@standard-schema/utils": "^0.3.0" - }, - "peerDependencies": { - "@sinclair/typebox": ">=0.25.24", - "@standard-schema/spec": "^1.0.0", - "@typeschema/main": ">=0.13.7", - "@vinejs/vine": "^2.0.0 || ^3.0.0 || ^4.0.0", - "ajv": "^8.12.0", - "ajv-errors": "^3.0.0", - "ajv-formats": "^2.1.1", - "arktype": "^2.0.0", - "ata-validator": "^1.2.0", - "class-transformer": ">=0.4.0", - "class-validator": ">=0.12.0", - "computed-types": "^1.0.0", - "effect": "^3.10.3", - "fluentvalidation-ts": "^3.0.0", - "fp-ts": "^2.7.0", - "io-ts": "^2.0.0", - "joi": "^17.0.0", - "nope-validator": ">=0.12.0", - "react-hook-form": "^7.55.0", - "superstruct": ">=0.12.0", - "typanion": "^3.3.2", - "valibot": ">=0.31.0 || ^1.0.0-beta.4 || ^1.0.0-rc", - "vest": ">=3.0.0", - "yup": "^1.0.0", - "zod": "^3.25.0 || ^4.0.0" - }, - "peerDependenciesMeta": { - "@sinclair/typebox": { - "optional": true - }, - "@standard-schema/spec": { - "optional": true - }, - "@typeschema/main": { - "optional": true - }, - "@vinejs/vine": { - "optional": true - }, - "ajv": { - "optional": true - }, - "ajv-errors": { - "optional": true - }, - "ajv-formats": { - "optional": true - }, - "arktype": { - "optional": true - }, - "ata-validator": { - "optional": true - }, - "class-transformer": { - "optional": true - }, - "class-validator": { - "optional": true - }, - "computed-types": { - "optional": true - }, - "effect": { - "optional": true - }, - "fluentvalidation-ts": { - "optional": true - }, - "fp-ts": { - "optional": true - }, - "io-ts": { - "optional": true - }, - "joi": { - "optional": true - }, - "nope-validator": { - "optional": true - }, - "superstruct": { - "optional": true - }, - "typanion": { - "optional": true - }, - "valibot": { - "optional": true - }, - "vest": { - "optional": true - }, - "yup": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, "node_modules/@humanfs/core": { "version": "0.19.2", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", @@ -2012,14 +1858,14 @@ } }, "node_modules/@inquirer/confirm": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.2.0.tgz", - "integrity": "sha512-SKXarWrYhtpqOEctf9XGCGy29QjsvJAM0Aq9ZR9z4Ns94OmpqudOly+aSEfNqUf9SwsQaUgY9+Z8hyzG0xX8fw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.3.0.tgz", + "integrity": "sha512-pZHXJImFtERmSNMBHcjwuz8Ck5vEFEYNUZnwbb8aJpjHv/TwGuFErNxF2Hp8+V+pNJs2EYPMlyWscvFEqO9jOQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^12.0.0", - "@inquirer/type": "^4.0.7" + "@inquirer/core": "^12.0.1", + "@inquirer/type": "^4.1.0" }, "engines": { "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" @@ -2034,15 +1880,15 @@ } }, "node_modules/@inquirer/core": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.0.tgz", - "integrity": "sha512-+nnvFEXIB08CZNVXpvW3B+zHW96QXvGUjNKJ8NJIPqAZi5Kd4WhYt2S3C234ReepG1qw2HOlEUbjYVHBowXObA==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.1.tgz", + "integrity": "sha512-JMD5Jy/ScL5TZE18m83Nw25HjqGFLoWXwnEkW7IdwwAhZpB9Bus55/WU7zn3UqR1MOCjjTQOIYpiD4vjWA3LPw==", "dev": true, "license": "MIT", "dependencies": { "@inquirer/ansi": "^2.0.7", "@inquirer/figures": "^2.0.8", - "@inquirer/type": "^4.0.7", + "@inquirer/type": "^4.1.0", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", @@ -2071,9 +1917,9 @@ } }, "node_modules/@inquirer/type": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.0.7.tgz", - "integrity": "sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.1.0.tgz", + "integrity": "sha512-FMiJpuHUG3Dk0ex+UIXkre7i+i4OcwHWk9YdcVtZHFwb/r2rnrU2ipTCNAB7A+QOP0ryzIcqOfy76fRyyvOEAw==", "dev": true, "license": "MIT", "engines": { @@ -2217,24 +2063,30 @@ } } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/@modelcontextprotocol/sdk/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, "node_modules/@mswjs/interceptors": { "version": "0.41.9", "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.9.tgz", @@ -2719,9 +2571,9 @@ } }, "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==", + "version": "0.147.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.147.0.tgz", + "integrity": "sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==", "dev": true, "license": "MIT", "funding": { @@ -4665,9 +4517,9 @@ } }, "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", - "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.6.tgz", + "integrity": "sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ==", "cpu": [ "arm" ], @@ -4682,9 +4534,9 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", - "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.6.tgz", + "integrity": "sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q==", "cpu": [ "arm64" ], @@ -4699,9 +4551,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", - "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.6.tgz", + "integrity": "sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA==", "cpu": [ "arm64" ], @@ -4716,9 +4568,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", - "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.6.tgz", + "integrity": "sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q==", "cpu": [ "x64" ], @@ -4733,9 +4585,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", - "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.6.tgz", + "integrity": "sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==", "cpu": [ "x64" ], @@ -4750,9 +4602,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", - "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.6.tgz", + "integrity": "sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w==", "cpu": [ "arm" ], @@ -4767,9 +4619,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", - "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.6.tgz", + "integrity": "sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==", "cpu": [ "arm64" ], @@ -4787,9 +4639,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", - "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.6.tgz", + "integrity": "sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw==", "cpu": [ "arm64" ], @@ -4807,9 +4659,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", - "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.6.tgz", + "integrity": "sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==", "cpu": [ "ppc64" ], @@ -4827,9 +4679,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", - "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.6.tgz", + "integrity": "sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==", "cpu": [ "s390x" ], @@ -4847,9 +4699,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", - "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.6.tgz", + "integrity": "sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==", "cpu": [ "x64" ], @@ -4867,9 +4719,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", - "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.6.tgz", + "integrity": "sha512-TvtPnfVr+HtyGiDmPK4VWmlNm7QhNNAcK5Q9A7aOXsI8545yCyaoMaicXrFZ72JzeYjaUVk7yT243zT0jzjFKQ==", "cpu": [ "x64" ], @@ -4887,9 +4739,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", - "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.6.tgz", + "integrity": "sha512-iOo0VEay2XFhaCcH0sps5XIimkSuOnNaZrf6+ZkoSOQBJPKNU48RkmJv0/lSpipexu5P+ouFgafe5IGr/DiQfg==", "cpu": [ "arm64" ], @@ -4904,9 +4756,9 @@ } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", - "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.6.tgz", + "integrity": "sha512-y5NTmmasMS455JlOCO4ZM9krIchv3Mvm1crL1iUPGOPgEzSkves9n0SdC5Sjz6+qWDFhd8/JpfWMH8NSWNHe+A==", "cpu": [ "arm64" ], @@ -4921,9 +4773,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", - "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.6.tgz", + "integrity": "sha512-np8iZSLfXlAD4kWhiyq/u0Yt8oZDtRQ8lGhQaCXo2rl37KNjeU0GjJuwr4P3oeZ++ROfofsKNBqR5LTO8aXyWQ==", "cpu": [ "x64" ], @@ -4967,6 +4819,13 @@ } } }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, "node_modules/@sec-ant/readable-stream": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", @@ -4999,231 +4858,21 @@ "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", "license": "MIT" }, - "node_modules/@storybook/addon-docs": { - "version": "10.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-10.5.7.tgz", - "integrity": "sha512-KNARJfjICaizinsR3INMEiipZm1ObYo+xw+E26gteu50Bcy2dIZUtk5uHY5XdtardU3AXX6yRXoBZ2HCY3lbHA==", + "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.1.0", + "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-2.1.0.tgz", + "integrity": "sha512-Fxh9vYpX9bQqFeHRiY8h2ApeRGDzRSMLwJwNZ/AIRqnyOKHxRKL+yFe+ctEkVJmuptRE9u1Hrn8ZZNHyfDKKNg==", "dev": true, "license": "MIT", - "dependencies": { - "@mdx-js/react": "^3.0.0", - "@storybook/csf-plugin": "10.5.7", - "@storybook/icons": "^2.0.2", - "@storybook/react-dom-shim": "10.5.7", - "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.5.7" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@storybook/addon-onboarding": { - "version": "10.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addon-onboarding/-/addon-onboarding-10.5.7.tgz", - "integrity": "sha512-GDssSoWmmGnz6OnUvAofMcrUuTMD53Y2rnbshjXvhtPnjKw4dufXFjo6C7yZQ6vyoNzTS9HyQwCHlxlhyCKJjQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^10.5.7" - } - }, - "node_modules/@storybook/addon-themes": { - "version": "10.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addon-themes/-/addon-themes-10.5.7.tgz", - "integrity": "sha512-A3xMGyvfvPigSGiWiefgEd4MlV/taxeVsF7uj/oUO1DTrTEd9q2lIrwLtLmGvl/rUhpeP7yx33wrGronl8ym7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^10.5.7" - } - }, - "node_modules/@storybook/builder-vite": { - "version": "10.5.7", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.5.7.tgz", - "integrity": "sha512-fShF/aQaITqcJuMCLr42BGNUAbhDi4IboqvlbZqXAwgrrTslnZEUnY8GcEcvpZmjl11VwlmazhMJdH50fIgBPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/csf-plugin": "10.5.7", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^10.5.7", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@storybook/csf-plugin": { - "version": "10.5.7", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.5.7.tgz", - "integrity": "sha512-IaX8FlM0H36HNFhJ2+4L9bCldqfvHGqcLg841SJNyK/DhfMlM7JsvY/GDH2ZFuWrUf8FSOx96GRRnHq6XfRKag==", - "dev": true, - "license": "MIT", - "dependencies": { - "unplugin": "^2.3.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "esbuild": "*", - "rollup": "*", - "storybook": "^10.5.7", - "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.1.0", - "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-2.1.0.tgz", - "integrity": "sha512-Fxh9vYpX9bQqFeHRiY8h2ApeRGDzRSMLwJwNZ/AIRqnyOKHxRKL+yFe+ctEkVJmuptRE9u1Hrn8ZZNHyfDKKNg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@storybook/react": { - "version": "10.5.7", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.5.7.tgz", - "integrity": "sha512-uFvty2MMdFXzW5PcQe1JqDAZkz6cQq7q/9G/cbGVnBEvP6zsOVeL+bmrQ0/WBlFQN0Ko9+ZoCTvaQ9s65zBa5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0", - "@storybook/react-dom-shim": "10.5.7", - "react-docgen": "^8.0.2", - "react-docgen-typescript": "^2.2.2" - }, - "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.5.7", - "typescript": ">= 4.9.x" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/@storybook/react-dom-shim": { - "version": "10.5.7", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.5.7.tgz", - "integrity": "sha512-lxOkyh+wu/MiBXvYQHjZfD+DRKOa4bHBzbuGuiHXnHXmdOcTRdcrQTsoeN2FPtfugmmOG66cZUEgDwNX+k5eRA==", - "dev": true, - "license": "MIT", - "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.5.7" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@storybook/react-vite": { - "version": "10.5.7", - "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-10.5.7.tgz", - "integrity": "sha512-eEo3eVa2pvqrzQukKxAzx7YvswDAA1s6k/y+tdMxmRvWyHX6QEOsb9Tda6wcVaa7c8BeJM7Ggq+289cRMTH6Iw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@joshwooding/vite-plugin-react-docgen-typescript": "^0.7.0", - "@rollup/pluginutils": "^5.0.2", - "@storybook/builder-vite": "10.5.7", - "@storybook/react": "10.5.7", - "empathic": "^2.0.0", - "magic-string": "^0.30.0", - "react-docgen": "^8.0.2", - "resolve": "^1.22.8", - "tsconfig-paths": "^4.2.0" - }, - "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.5.7", - "typescript": ">= 4.9.x", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/@tailwindcss/node": { @@ -5242,56 +4891,329 @@ "tailwindcss": "4.3.3" } }, - "node_modules/@tailwindcss/oxide": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", - "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "node_modules/@tailwindcss/node/node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", "dev": true, - "license": "MIT", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, "engines": { - "node": ">= 20" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.3.3", - "@tailwindcss/oxide-darwin-arm64": "4.3.3", - "@tailwindcss/oxide-darwin-x64": "4.3.3", - "@tailwindcss/oxide-freebsd-x64": "4.3.3", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", - "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", - "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", - "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", - "@tailwindcss/oxide-linux-x64-musl": "4.3.3", - "@tailwindcss/oxide-wasm32-wasi": "4.3.3", - "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", - "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" } }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", - "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", + "node_modules/@tailwindcss/node/node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", + "license": "MPL-2.0", "optional": true, "os": [ "android" ], "engines": { - "node": ">= 20" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", - "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", + "node_modules/@tailwindcss/node/node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -5955,9 +5877,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.2.0.tgz", - "integrity": "sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==", + "version": "26.4.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.4.0.tgz", + "integrity": "sha512-faiGnoIrLH/V8cibOMEAZ8pMw6oXqSukl29ra4mN8GdaB2ZewzeaLj+INpV5N+Z1eKWzY+IzaIZH2EIR6YZRNQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5981,9 +5903,9 @@ } }, "node_modules/@types/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==", "devOptional": true, "license": "MIT", "peerDependencies": { @@ -6051,17 +5973,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.67.0.tgz", - "integrity": "sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.68.0.tgz", + "integrity": "sha512-WASHDpCm6qO5jj9g1a+8NiW5+GCkAyLReR56/4VruYmNgfUmqpxOfZ2Yfb8xGfJPWv5Qi6LSD8sXdces3vbp/Q==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.67.0", - "@typescript-eslint/type-utils": "8.67.0", - "@typescript-eslint/utils": "8.67.0", - "@typescript-eslint/visitor-keys": "8.67.0", + "@typescript-eslint/scope-manager": "8.68.0", + "@typescript-eslint/type-utils": "8.68.0", + "@typescript-eslint/utils": "8.68.0", + "@typescript-eslint/visitor-keys": "8.68.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -6074,7 +5996,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.67.0", + "@typescript-eslint/parser": "^8.68.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } @@ -6090,16 +6012,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.67.0.tgz", - "integrity": "sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.68.0.tgz", + "integrity": "sha512-fHq2VC1kpyYfvEcbiMjOpySY4WS7voEp89yAThrHRX5sm9j2lzYppCb2umFMEed4fWcyeLjHxrz0mpjNBaBxMQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.67.0", - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/typescript-estree": "8.67.0", - "@typescript-eslint/visitor-keys": "8.67.0", + "@typescript-eslint/scope-manager": "8.68.0", + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/typescript-estree": "8.68.0", + "@typescript-eslint/visitor-keys": "8.68.0", "debug": "^4.4.3" }, "engines": { @@ -6115,14 +6037,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.67.0.tgz", - "integrity": "sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.68.0.tgz", + "integrity": "sha512-5GQtWZCXFcFYux955pvoS02WLc49pXNlvIxocKjS0clvwo3in1RdlzVKyiqQH9vE5AKWFLTaUgeQkOrTS+0Qxw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.67.0", - "@typescript-eslint/types": "^8.67.0", + "@typescript-eslint/tsconfig-utils": "^8.68.0", + "@typescript-eslint/types": "^8.68.0", "debug": "^4.4.3" }, "engines": { @@ -6137,14 +6059,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.67.0.tgz", - "integrity": "sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.68.0.tgz", + "integrity": "sha512-T5eXpcaJNg8bhjHJ8Rjp68Vq/QBteYtTKY8TZqVNPaUbuz0f6jI9t6aDkylwvalpAB9XTTFeFOjrjXAZ3YvmVA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/visitor-keys": "8.67.0" + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/visitor-keys": "8.68.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6155,9 +6077,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.67.0.tgz", - "integrity": "sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.68.0.tgz", + "integrity": "sha512-F7zrGQfiJHojPwi8vhxZQC1tWtJzvL74cK/nqri2lk8YUXvYaYwl263xOJ69jDWPUk1hmcdoayFwk9lX09npVw==", "dev": true, "license": "MIT", "engines": { @@ -6172,15 +6094,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.67.0.tgz", - "integrity": "sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.68.0.tgz", + "integrity": "sha512-X77zqoY1EjeWGs/0JNxeaMfp5C5lIz4Tw8y66F1Ne8Faq6g424sBNYM6xBAqElfGZPLpWS+CZAp0DXyKDzWiHg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/typescript-estree": "8.67.0", - "@typescript-eslint/utils": "8.67.0", + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/typescript-estree": "8.68.0", + "@typescript-eslint/utils": "8.68.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -6197,9 +6119,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.67.0.tgz", - "integrity": "sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.68.0.tgz", + "integrity": "sha512-9RnpsGJjrAllCMefGVVsImJM24YurhC0Q1h4UbvivtvOqXmR/vEJge2OoE++z9m6hyg8T1Q8t5SNT6tHSbrxcg==", "dev": true, "license": "MIT", "engines": { @@ -6211,16 +6133,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.67.0.tgz", - "integrity": "sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.68.0.tgz", + "integrity": "sha512-OKKsD0tYmoNiU5PW2zehO1yO56jYOm1ShYlxon/Z0SJNidAkdVg86eg9ruRuoXf8xfnuWZGbwDsStkoXbZtIIA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.67.0", - "@typescript-eslint/tsconfig-utils": "8.67.0", - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/visitor-keys": "8.67.0", + "@typescript-eslint/project-service": "8.68.0", + "@typescript-eslint/tsconfig-utils": "8.68.0", + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/visitor-keys": "8.68.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -6278,16 +6200,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.67.0.tgz", - "integrity": "sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.68.0.tgz", + "integrity": "sha512-PB5gJMMOg0Q5P1tsgWtEAqQacJXq0qEqRHDX/YJ4FaTMLfZPpHB3gjl2EJuiZyPABxmj4ZQYiY9m1bdAJ5y7tQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.67.0", - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/typescript-estree": "8.67.0" + "@typescript-eslint/scope-manager": "8.68.0", + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/typescript-estree": "8.68.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6302,13 +6224,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.67.0.tgz", - "integrity": "sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.68.0.tgz", + "integrity": "sha512-YR65gGdGvTUAWLldC3xLOvOzamdGzB4A5/N8rehEaHs3Zvoe39BhgY+u0SPch1OvrVTfLcc55wsSgK2NcnTS/A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/types": "8.68.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -6333,9 +6255,9 @@ } }, "node_modules/@vitejs/plugin-react": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", - "integrity": "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.0.tgz", + "integrity": "sha512-qd2BzUBehkov86WFhg0JkEFEYyCLG9uPCe6qWTY/kRlss9OvJrOF2UbIWT7p+8IzZHkEu0DNGHc4HSv+JdDLsw==", "dev": true, "license": "MIT", "dependencies": { @@ -6347,6 +6269,7 @@ "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", + "oxc-transform-react": "^0.145.0", "vite": "^8.0.0" }, "peerDependenciesMeta": { @@ -6355,18 +6278,21 @@ }, "babel-plugin-react-compiler": { "optional": true - } + }, + "oxc-transform-react": { + "optional": true + } } }, "node_modules/@vitest/coverage-v8": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.10.tgz", - "integrity": "sha512-IM49HmthevbgAO4anp1hwtoT9wYe59w0LR00gr+eagHE+ZJ5lK4sLPeO0ubgoJcwLk6dehU3R24N+FbEEKDc8g==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.11.tgz", + "integrity": "sha512-8MVGEFnJIcdGjcbfKmeq8z0pZHH0JlVtoVZH9Q/qwUp6wyFnEJUBMrw9DCaj+ra3vShGmhavjalMIhPNxZAUcw==", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^1.0.2", - "@vitest/utils": "4.1.10", + "@vitest/utils": "4.1.11", "ast-v8-to-istanbul": "^1.0.0", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", @@ -6380,8 +6306,8 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "4.1.10", - "vitest": "4.1.10" + "@vitest/browser": "4.1.11", + "vitest": "4.1.11" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -6390,68 +6316,31 @@ } }, "node_modules/@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.11.tgz", + "integrity": "sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==", "dev": true, "license": "MIT", "dependencies": { + "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/expect/node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/expect/node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" + "@vitest/spy": "4.1.11", + "@vitest/utils": "4.1.11", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/expect/node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@vitest/mocker": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz", - "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.11.tgz", + "integrity": "sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.1.10", + "@vitest/spy": "4.1.11", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -6471,30 +6360,10 @@ } } }, - "node_modules/@vitest/mocker/node_modules/@vitest/spy": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", - "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", - "dev": true, - "license": "MIT", - "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", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/@vitest/pretty-format": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz", - "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.11.tgz", + "integrity": "sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==", "dev": true, "license": "MIT", "dependencies": { @@ -6505,13 +6374,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz", - "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.11.tgz", + "integrity": "sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.10", + "@vitest/utils": "4.1.11", "pathe": "^2.0.3" }, "funding": { @@ -6519,14 +6388,14 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz", - "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.11.tgz", + "integrity": "sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.10", - "@vitest/utils": "4.1.10", + "@vitest/pretty-format": "4.1.11", + "@vitest/utils": "4.1.11", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -6535,26 +6404,23 @@ } }, "node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.11.tgz", + "integrity": "sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==", "dev": true, "license": "MIT", - "dependencies": { - "tinyspy": "^4.0.3" - }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz", - "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.11.tgz", + "integrity": "sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.10", + "@vitest/pretty-format": "4.1.11", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" }, @@ -6583,33 +6449,6 @@ "node": ">= 0.6" } }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/acorn": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", @@ -6646,16 +6485,16 @@ } }, "node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "devOptional": true, + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { "type": "github", @@ -6663,10 +6502,10 @@ } }, "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "devOptional": true, + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -6680,6 +6519,30 @@ } } }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -6780,16 +6643,6 @@ "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", @@ -7076,9 +6929,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.11.18", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.18.tgz", - "integrity": "sha512-1iEmLEYSiE1SeBoAfPo/Mnx3PzfzHUkDK61ASkCpuk3YXugYLH5DYK1SzqV55F8FMI6s0F+/tCP7Polz1QRjxw==", + "version": "2.11.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.19.tgz", + "integrity": "sha512-Grytf1xOxOEMTGRwx6rLGKkTabd4vMg3VrKdj/7joCmV0qgh4QwMMO6xh34YEXQqirAuUdgQGa5orJQQ+69RBw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -7262,9 +7115,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001809", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", - "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", "dev": true, "funding": [ { @@ -7283,18 +7136,11 @@ "license": "CC-BY-4.0" }, "node_modules/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, "engines": { "node": ">=18" } @@ -7357,9 +7203,9 @@ } }, "node_modules/chromatic": { - "version": "18.5.0", - "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-18.5.0.tgz", - "integrity": "sha512-3oBcGP4V+6SV0qu2NJnutnPYsrxnPpOHhtQAbzxEtIQrDJNzn1wfXtzwkEiJGQm5eANTW0AvL4WxHtz+BTJbYg==", + "version": "18.6.0", + "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-18.6.0.tgz", + "integrity": "sha512-AfZ/rscek7V5SiBOQ2A5Xkns+URf/YoYXGz4ZLUhEu9aCZXGmUE1TY6P+wkjRYxeqQ7+nq5tpZ0dB9UGEQd8WA==", "dev": true, "license": "MIT", "dependencies": { @@ -7478,19 +7324,6 @@ "node": ">=8" } }, - "node_modules/cliui/node_modules/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" - } - }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -7591,6 +7424,48 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/conf/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/conf/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/conf/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, "node_modules/conf/node_modules/json-schema-typed": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", @@ -8185,9 +8060,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.413", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.413.tgz", - "integrity": "sha512-F1XPKvt7HVfly5WND90ec16nFsdr4g5x/cVUP3EqjeyXynupabGDqpMa84wwvuYGDnldXLBz6DLXyZXWO9TPvw==", + "version": "1.5.415", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.415.tgz", + "integrity": "sha512-958V+Kbhtgz+SxXeEVKBjrlKRBIDAYvUJfwhjxMZ5S6ut9jAl7l9ZKBkBrvjyjZE36PabLUo2L8kEeV5O4vgJg==", "dev": true, "license": "ISC" }, @@ -8246,19 +8121,6 @@ "node": ">=8.6" } }, - "node_modules/enquirer/node_modules/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" - } - }, "node_modules/entities": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", @@ -8519,30 +8381,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, "node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", @@ -8612,13 +8450,16 @@ } }, "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, - "license": "MIT" - }, - "node_modules/esutils": { + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", @@ -8778,33 +8619,6 @@ "node": ">= 0.6" } }, - "node_modules/express/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -9079,6 +8893,27 @@ "node": ">= 6" } }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/format": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", @@ -9333,9 +9168,9 @@ } }, "node_modules/globals": { - "version": "17.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.10.0.tgz", - "integrity": "sha512-V0kztuWST2k8A/VbxAY8+L+7+Rgo3fyA24IHRLrZp7HOzJjV0gHSaZUjK9lpP/IrBSNite2tZ1prhRkinRu1CA==", + "version": "17.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.11.0.tgz", + "integrity": "sha512-Z2I8hM+PbJDXQDq3Icgpzv+mPdwr68iZUU9d5WW4FuXfDUQfkZaZuvjMv42/5crNyw154+9+VWXbYrUgDXbxNw==", "dev": true, "license": "MIT", "engines": { @@ -9464,6 +9299,13 @@ "set-cookie-parser": "^3.0.1" } }, + "node_modules/headers-polyfill/node_modules/set-cookie-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.1.2.tgz", + "integrity": "sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw==", + "dev": true, + "license": "MIT" + }, "node_modules/highlight.js": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", @@ -9480,9 +9322,9 @@ "license": "CC0-1.0" }, "node_modules/hono": { - "version": "4.13.4", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.4.tgz", - "integrity": "sha512-AGEwKIyRMHRv1t8Wjwa3LHxQ61X5CqrdFT+4BRNTpqS5aJNnpl5WLjADb7vFlJzI/8uK7T5QLVApCMQKNa3LgQ==", + "version": "4.13.5", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.5.tgz", + "integrity": "sha512-O6+/eCYRkzzzy0rPWwKLiGBR1nFuUPZynnwjxN1MBA62NNqbT0wQEzQyK2gSO5yDIDB336sXQleAhOHrzlYyKw==", "dev": true, "license": "MIT", "engines": { @@ -10069,9 +9911,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", - "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", "dev": true, "funding": [ { @@ -10160,10 +10002,10 @@ "license": "MIT" }, "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "devOptional": true, + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, "license": "MIT" }, "node_modules/json-schema-typed": { @@ -10248,9 +10090,9 @@ } }, "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", "dev": true, "license": "MPL-2.0", "dependencies": { @@ -10264,23 +10106,23 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" } }, "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", "cpu": [ "arm64" ], @@ -10299,9 +10141,9 @@ } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", "cpu": [ "arm64" ], @@ -10320,9 +10162,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", "cpu": [ "x64" ], @@ -10341,9 +10183,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", "cpu": [ "x64" ], @@ -10362,9 +10204,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", "cpu": [ "arm" ], @@ -10383,9 +10225,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", "cpu": [ "arm64" ], @@ -10407,9 +10249,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", "cpu": [ "arm64" ], @@ -10431,9 +10273,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", "cpu": [ "x64" ], @@ -10455,9 +10297,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", "cpu": [ "x64" ], @@ -10479,9 +10321,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", "cpu": [ "arm64" ], @@ -10500,9 +10342,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", "cpu": [ "x64" ], @@ -10775,24 +10617,30 @@ } }, "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/mimic-fn": { @@ -10912,6 +10760,13 @@ } } }, + "node_modules/msw/node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, "node_modules/mute-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz", @@ -11178,6 +11033,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/ora/node_modules/chalk": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", @@ -11191,6 +11059,22 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/ora/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/outvariant": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", @@ -11236,6 +11120,16 @@ "@oxc-parser/binding-win32-x64-msvc": "0.127.0" } }, + "node_modules/oxc-parser/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": { "version": "11.24.2", "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.24.2.tgz", @@ -11461,11 +11355,15 @@ } }, "node_modules/path-to-regexp": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", "dev": true, - "license": "MIT" + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } }, "node_modules/pathe": { "version": "2.0.3", @@ -11492,9 +11390,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", "engines": { @@ -11782,13 +11680,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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/pretty-ms": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", @@ -12067,6 +11958,19 @@ "typescript": ">= 4.3.x" } }, + "node_modules/react-docgen/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/react-dom": { "version": "19.2.8", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", @@ -12123,11 +12027,10 @@ } }, "node_modules/react-is": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.8.tgz", - "integrity": "sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==", - "license": "MIT", - "peer": true + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" }, "node_modules/react-redux": { "version": "9.3.0", @@ -12237,12 +12140,6 @@ "react-dom": ">=18" } }, - "node_modules/react-router/node_modules/set-cookie-parser": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", - "license": "MIT" - }, "node_modules/react-style-singleton": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", @@ -12346,19 +12243,6 @@ "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/redux": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", @@ -12520,13 +12404,13 @@ } }, "node_modules/rolldown": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.5.tgz", - "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.6.tgz", + "integrity": "sha512-vMM4q3aixf46GiF1Kok8jDPFsEpXgFWGjUHXNkNHNm+Y2adXAG2dbX91jkti3i0ZRsOlcmbuzAz1poObSHCmUA==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.146.0", + "@oxc-project/types": "=0.147.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -12536,31 +12420,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm-eabi": "1.2.5", - "@rolldown/binding-android-arm64": "1.2.5", - "@rolldown/binding-darwin-arm64": "1.2.5", - "@rolldown/binding-darwin-x64": "1.2.5", - "@rolldown/binding-freebsd-x64": "1.2.5", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.5", - "@rolldown/binding-linux-arm64-gnu": "1.2.5", - "@rolldown/binding-linux-arm64-musl": "1.2.5", - "@rolldown/binding-linux-ppc64-gnu": "1.2.5", - "@rolldown/binding-linux-s390x-gnu": "1.2.5", - "@rolldown/binding-linux-x64-gnu": "1.2.5", - "@rolldown/binding-linux-x64-musl": "1.2.5", - "@rolldown/binding-openharmony-arm64": "1.2.5", - "@rolldown/binding-win32-arm64-msvc": "1.2.5", - "@rolldown/binding-win32-x64-msvc": "1.2.5" - } - }, - "node_modules/rolldown/node_modules/@oxc-project/types": { - "version": "0.146.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", - "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" + "@rolldown/binding-android-arm-eabi": "1.2.6", + "@rolldown/binding-android-arm64": "1.2.6", + "@rolldown/binding-darwin-arm64": "1.2.6", + "@rolldown/binding-darwin-x64": "1.2.6", + "@rolldown/binding-freebsd-x64": "1.2.6", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.6", + "@rolldown/binding-linux-arm64-gnu": "1.2.6", + "@rolldown/binding-linux-arm64-musl": "1.2.6", + "@rolldown/binding-linux-ppc64-gnu": "1.2.6", + "@rolldown/binding-linux-s390x-gnu": "1.2.6", + "@rolldown/binding-linux-x64-gnu": "1.2.6", + "@rolldown/binding-linux-x64-musl": "1.2.6", + "@rolldown/binding-openharmony-arm64": "1.2.6", + "@rolldown/binding-win32-arm64-msvc": "1.2.6", + "@rolldown/binding-win32-x64-msvc": "1.2.6" } }, "node_modules/router": { @@ -12580,17 +12454,6 @@ "node": ">= 18" } }, - "node_modules/router/node_modules/path-to-regexp": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", - "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/run-applescript": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", @@ -12694,33 +12557,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/send/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/serve-static": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", @@ -12742,10 +12578,9 @@ } }, "node_modules/set-cookie-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.1.2.tgz", - "integrity": "sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw==", - "dev": true, + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", "license": "MIT" }, "node_modules/setprototypeof": { @@ -12756,9 +12591,9 @@ "license": "ISC" }, "node_modules/shadcn": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/shadcn/-/shadcn-4.18.0.tgz", - "integrity": "sha512-tUFZgkYmfVNQVm3xX7lhSzOvDsp+O14ac5dwgXIr5mIsr79ISueb/Mu+ZtWMz0DH6v77u4eYyvbQ9TTMpSn3aw==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/shadcn/-/shadcn-4.19.0.tgz", + "integrity": "sha512-EQF6R+CUXTsEP2BpyhxrUEAFesrtFD1POvVOf5jM+wkgtA4kG1EW1+1Wlmi9LqiprSL681JJXBcS0u8WkVVVyQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13042,93 +12877,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/storybook": { - "version": "10.5.7", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.5.7.tgz", - "integrity": "sha512-oiKvWIwIoOhFP1i6dASYyMXwPHKEtVZMshqSB7EvIVYjWRh0l9H7gHEt1z4Gh2rLGFMekWdsm4s94rvwpR7gkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0", - "@storybook/icons": "^2.0.2", - "@testing-library/dom": "^10.4.1", - "@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", - "jsonc-parser": "^3.3.1", - "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.21.1" - }, - "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 || ^0.2.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "prettier": { - "optional": true - }, - "vite-plus": { - "optional": true - } - } - }, - "node_modules/storybook/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/storybook/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==", + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", "dev": true, "license": "MIT" }, - "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==", + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { "node": ">=18" @@ -13137,45 +12902,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/storybook/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==", + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", "dev": true, "license": "MIT", - "dependencies": { - "is-wsl": "^3.1.0" - }, "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/strict-event-emitter": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", - "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width": { + "node_modules/string-width/node_modules/strip-ansi": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "ansi-regex": "^6.2.2" }, "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/stringify-object": { @@ -13210,32 +12963,16 @@ } }, "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==", + "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": "^6.2.2" - }, - "engines": { - "node": ">=12" + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", - "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", - "dev": true, - "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=8" } }, "node_modules/strip-bom": { @@ -13262,16 +12999,16 @@ } }, "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==", + "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", - "engines": { - "node": ">=12" + "dependencies": { + "min-indent": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, "node_modules/strip-json-comments": { @@ -13321,9 +13058,9 @@ "license": "MIT" }, "node_modules/systeminformation": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.33.1.tgz", - "integrity": "sha512-DEN6ICHk3Tk0Uf/hrAHh7xlt7iL5CJFBtPZinA0H62DrGG/KPKqq/Nzj6lCXPS4Ay/sf/14zNnk9LpqKzBIc+w==", + "version": "5.33.4", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.33.4.tgz", + "integrity": "sha512-poXpX8M9NBll1NDMW1ho6qRFkjrlttfm8E/YtPmn5x0TQ1z8LoJUHg9kwr/sRDmCjktqfnFRxqsoUNpaRakeMQ==", "dev": true, "license": "MIT", "os": [ @@ -13647,33 +13384,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/type-is/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -13689,16 +13399,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.67.0.tgz", - "integrity": "sha512-S2udFs8tCKEKffuJ4TB1idGUZiXdCPGi3IPBGWXarbLQ5UPXORV8QEVzJ4gCRduURMb5EkpNCdjbk0eDIuI8Yg==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.68.0.tgz", + "integrity": "sha512-MHy0Y0ynqeEbx/S45+i/bBssdy3X6KNBfmJAP35GrgtNxu2TQ5K5xsFDhAnmsq1jvpdoZOPG1LGtJo0HWqYCrQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.67.0", - "@typescript-eslint/parser": "8.67.0", - "@typescript-eslint/typescript-estree": "8.67.0", - "@typescript-eslint/utils": "8.67.0" + "@typescript-eslint/eslint-plugin": "8.68.0", + "@typescript-eslint/parser": "8.68.0", + "@typescript-eslint/typescript-estree": "8.68.0", + "@typescript-eslint/utils": "8.68.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -14021,1121 +13731,1100 @@ } } }, - "node_modules/vite/node_modules/lightningcss": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", - "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "node_modules/vitest": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.11.tgz", + "integrity": "sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "detect-libc": "^2.0.3" + "@vitest/expect": "4.1.11", + "@vitest/mocker": "4.1.11", + "@vitest/pretty-format": "4.1.11", + "@vitest/runner": "4.1.11", + "@vitest/snapshot": "4.1.11", + "@vitest/spy": "4.1.11", + "@vitest/utils": "4.1.11", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" }, "engines": { - "node": ">= 12.0.0" + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/vitest" }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.33.0", - "lightningcss-darwin-arm64": "1.33.0", - "lightningcss-darwin-x64": "1.33.0", - "lightningcss-freebsd-x64": "1.33.0", - "lightningcss-linux-arm-gnueabihf": "1.33.0", - "lightningcss-linux-arm64-gnu": "1.33.0", - "lightningcss-linux-arm64-musl": "1.33.0", - "lightningcss-linux-x64-gnu": "1.33.0", - "lightningcss-linux-x64-musl": "1.33.0", - "lightningcss-win32-arm64-msvc": "1.33.0", - "lightningcss-win32-x64-msvc": "1.33.0" + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.11", + "@vitest/browser-preview": "4.1.11", + "@vitest/browser-webdriverio": "4.1.11", + "@vitest/coverage-istanbul": "4.1.11", + "@vitest/coverage-v8": "4.1.11", + "@vitest/ui": "4.1.11", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } } }, - "node_modules/vite/node_modules/lightningcss-android-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", - "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", - "cpu": [ - "arm64" - ], + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=18" } }, - "node_modules/vite/node_modules/lightningcss-darwin-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", - "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", - "cpu": [ - "arm64" - ], + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], + "license": "BSD-2-Clause", "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=20" } }, - "node_modules/vite/node_modules/lightningcss-darwin-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", - "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", - "cpu": [ - "x64" - ], + "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": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], + "license": "MIT" + }, + "node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=20" } }, - "node_modules/vite/node_modules/lightningcss-freebsd-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", - "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", - "cpu": [ - "x64" - ], + "node_modules/whatwg-url": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-17.1.0.tgz", + "integrity": "sha512-3GeworPmc2ZfEEHP7lEbUfBX/L75wdEsi0rLNhXcXxnoN5jyq0SL5gCy06SGW2cyTIZdTvWIDQNQoza++vKeaw==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.15.1", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": "^22.14.0 || >=24.0.0" } }, - "node_modules/vite/node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", - "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", - "cpu": [ - "arm" - ], + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/vite/node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", - "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", - "cpu": [ - "arm64" - ], + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" } }, - "node_modules/vite/node_modules/lightningcss-linux-arm64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", - "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", - "cpu": [ - "arm64" - ], + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=0.10.0" } }, - "node_modules/vite/node_modules/lightningcss-linux-x64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", - "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", - "cpu": [ - "x64" - ], + "node_modules/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, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">= 12.0.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/vite/node_modules/lightningcss-linux-x64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", - "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", - "cpu": [ - "x64" - ], + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "license": "MIT" }, - "node_modules/vite/node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", - "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", - "cpu": [ - "arm64" - ], + "node_modules/wrap-ansi/node_modules/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": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=8" } }, - "node_modules/vite/node_modules/lightningcss-win32-x64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", - "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", - "cpu": [ - "x64" - ], + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "license": "ISC" }, - "node_modules/vitest": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz", - "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==", + "node_modules/ws": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", "dev": true, "license": "MIT", - "dependencies": { - "@vitest/expect": "4.1.10", - "@vitest/mocker": "4.1.10", - "@vitest/pretty-format": "4.1.10", - "@vitest/runner": "4.1.10", - "@vitest/snapshot": "4.1.10", - "@vitest/spy": "4.1.10", - "@vitest/utils": "4.1.10", - "es-module-lexer": "^2.0.0", - "expect-type": "^1.3.0", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^4.0.0-rc.1", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.1.0", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "node": ">=10.0.0" }, "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.10", - "@vitest/browser-preview": "4.1.10", - "@vitest/browser-webdriverio": "4.1.10", - "@vitest/coverage-istanbul": "4.1.10", - "@vitest/coverage-v8": "4.1.10", - "@vitest/ui": "4.1.10", - "happy-dom": "*", - "jsdom": "*", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/coverage-istanbul": { - "optional": true - }, - "@vitest/coverage-v8": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { + "bufferutil": { "optional": true }, - "jsdom": { + "utf-8-validate": { "optional": true - }, - "vite": { - "optional": false } } }, - "node_modules/vitest/node_modules/@vitest/expect": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz", - "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==", + "node_modules/wsl-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-1.0.0.tgz", + "integrity": "sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA==", "dev": true, "license": "MIT", "dependencies": { - "@standard-schema/spec": "^1.1.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.10", - "@vitest/utils": "4.1.10", - "chai": "^6.2.2", - "tinyrainbow": "^3.1.0" + "is-wsl": "^3.1.0", + "powershell-utils": "^0.1.0" + }, + "engines": { + "node": ">=20" }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vitest/node_modules/@vitest/spy": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", - "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", + "node_modules/wsl-utils/node_modules/powershell-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", "dev": true, "license": "MIT", + "engines": { + "node": ">=20" + }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vitest/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { "node": ">=18" } }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } + "license": "MIT" }, - "node_modules/webidl-conversions": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", - "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "license": "BSD-2-Clause", + "license": "ISC", "engines": { - "node": ">=20" + "node": ">=10" } }, - "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/whatwg-mimetype": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", - "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } + "license": "ISC" }, - "node_modules/whatwg-url": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-17.1.0.tgz", - "integrity": "sha512-3GeworPmc2ZfEEHP7lEbUfBX/L75wdEsi0rLNhXcXxnoN5jyq0SL5gCy06SGW2cyTIZdTvWIDQNQoza++vKeaw==", + "node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", "dev": true, "license": "MIT", "dependencies": { - "@exodus/bytes": "^1.15.1", - "tr46": "^6.0.0", - "webidl-conversions": "^8.0.1" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": "^22.14.0 || >=24.0.0" + "node": ">=12" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/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": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/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==", + "node_modules/yocto-spinner": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-1.2.2.tgz", + "integrity": "sha512-DODGl1wJjA/s5pnJFKau9lIYHT81lnhob1i3e1TjxZRxEhWRKl74nTbWE6H5KlkViQQTo/Z29YFdxzTZAMY3ng==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "yoctocolors": "^2.1.1" }, "engines": { - "node": ">=10" + "node": ">=18.19" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/yoctocolors": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz", + "integrity": "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/wrap-ansi/node_modules/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, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.25.28 || ^4" + } + }, + "packages/infra": { + "name": "@react-starter/infra", + "version": "1.8.0-alpha.1", + "devDependencies": { + "aws-cdk": "2.1135.1", + "aws-cdk-lib": "2.264.0", + "constructs": "10.8.1", + "dotenv": "17.4.2" + } + }, + "packages/shared": { + "name": "@react-starter/shared", + "version": "1.8.0-alpha.1", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@fontsource-variable/inter": "5.3.0", + "class-variance-authority": "0.7.1", + "clsx": "2.1.1", + "radix-ui": "1.6.7", + "tailwind-merge": "3.6.0" }, - "engines": { - "node": ">=8" + "devDependencies": { + "tailwindcss": "4.3.3", + "tw-animate-css": "1.4.0" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "packages/web": { + "name": "@react-starter/web", + "version": "1.8.0-alpha.1", + "dependencies": { + "@fortawesome/fontawesome-svg-core": "7.3.1", + "@fortawesome/free-regular-svg-icons": "7.3.1", + "@fortawesome/free-solid-svg-icons": "7.3.1", + "@fortawesome/react-fontawesome": "3.5.0", + "@hookform/resolvers": "5.7.1", + "@react-spring/web": "10.1.2", + "@react-starter/shared": "*", + "@tanstack/react-query": "5.101.4", + "@tanstack/react-query-devtools": "5.101.4", + "@tanstack/react-table": "8.21.3", + "axios": "1.19.0", + "dayjs": "1.11.21", + "i18next": "26.3.6", + "i18next-browser-languagedetector": "8.2.1", + "lodash": "4.18.1", + "lucide-react": "1.31.0", + "react-hook-form": "7.85.0", + "react-i18next": "17.0.11", + "react-syntax-highlighter": "16.1.1", + "recharts": "3.10.1", + "uuid": "14.0.1", + "zod": "4.4.3" + }, + "devDependencies": { + "@chromatic-com/storybook": "5.3.0", + "@storybook/addon-docs": "10.5.7", + "@storybook/addon-onboarding": "10.5.7", + "@storybook/addon-themes": "10.5.7", + "@storybook/react-vite": "10.5.7", + "@tailwindcss/vite": "4.3.3", + "@types/eslint__js": "8.42.3", + "@types/lodash": "4.17.25", + "@types/react-syntax-highlighter": "15.5.13", + "@types/uuid": "10.0.0", + "msw": "2.15.0", + "storybook": "10.5.7", + "vite": "8.2.1" + } + }, + "packages/web/node_modules/@chromatic-com/storybook": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-5.3.0.tgz", + "integrity": "sha512-gMAfVYJnF/tjdY8C3Q54KYz/low2NFjPIZMpCqSFuMUiTJ2DNWCTb7mFhuuzZ1iduWFDhewlJyilFmvKcEDYRA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "@neoconfetti/react": "^1.0.0", + "chromatic": "^18.0.1", + "jsonfile": "^6.1.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "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" + } + }, + "packages/web/node_modules/@hookform/resolvers": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.7.1.tgz", + "integrity": "sha512-8wS/P4UDr5sQDe4nFaV51TVyfDPrWgNIXweqG0Bs9Z5LSuzKLb+RQNPvkN2oHM5SRrJyWrVH/F+LOUcFjUyvwQ==", + "license": "MIT", + "dependencies": { + "@standard-schema/utils": "^0.3.0" + }, + "peerDependencies": { + "@sinclair/typebox": ">=0.25.24", + "@standard-schema/spec": "^1.0.0", + "@typeschema/main": ">=0.13.7", + "@vinejs/vine": "^2.0.0 || ^3.0.0 || ^4.0.0", + "ajv": "^8.12.0", + "ajv-errors": "^3.0.0", + "ajv-formats": "^2.1.1", + "arktype": "^2.0.0", + "ata-validator": "^1.2.0", + "class-transformer": ">=0.4.0", + "class-validator": ">=0.12.0", + "computed-types": "^1.0.0", + "effect": "^3.10.3", + "fluentvalidation-ts": "^3.0.0", + "fp-ts": "^2.7.0", + "io-ts": "^2.0.0", + "joi": "^17.0.0", + "nope-validator": ">=0.12.0", + "react-hook-form": "^7.55.0", + "superstruct": ">=0.12.0", + "typanion": "^3.3.2", + "valibot": ">=0.31.0 || ^1.0.0-beta.4 || ^1.0.0-rc", + "vest": ">=3.0.0", + "yup": "^1.0.0", + "zod": "^3.25.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@sinclair/typebox": { + "optional": true + }, + "@standard-schema/spec": { + "optional": true + }, + "@typeschema/main": { + "optional": true + }, + "@vinejs/vine": { + "optional": true + }, + "ajv": { + "optional": true + }, + "ajv-errors": { + "optional": true + }, + "ajv-formats": { + "optional": true + }, + "arktype": { + "optional": true + }, + "ata-validator": { + "optional": true + }, + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + }, + "computed-types": { + "optional": true + }, + "effect": { + "optional": true + }, + "fluentvalidation-ts": { + "optional": true + }, + "fp-ts": { + "optional": true + }, + "io-ts": { + "optional": true + }, + "joi": { + "optional": true + }, + "nope-validator": { + "optional": true + }, + "superstruct": { + "optional": true + }, + "typanion": { + "optional": true + }, + "valibot": { + "optional": true + }, + "vest": { + "optional": true + }, + "yup": { + "optional": true + }, + "zod": { + "optional": true + } } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ws": { - "version": "8.21.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", - "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", + "packages/web/node_modules/@storybook/addon-docs": { + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-10.5.7.tgz", + "integrity": "sha512-KNARJfjICaizinsR3INMEiipZm1ObYo+xw+E26gteu50Bcy2dIZUtk5uHY5XdtardU3AXX6yRXoBZ2HCY3lbHA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10.0.0" + "dependencies": { + "@mdx-js/react": "^3.0.0", + "@storybook/csf-plugin": "10.5.7", + "@storybook/icons": "^2.0.2", + "@storybook/react-dom-shim": "10.5.7", + "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": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "storybook": "^10.5.7" }, "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { + "@types/react": { "optional": true } } }, - "node_modules/wsl-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-1.0.0.tgz", - "integrity": "sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA==", + "packages/web/node_modules/@storybook/addon-onboarding": { + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-onboarding/-/addon-onboarding-10.5.7.tgz", + "integrity": "sha512-GDssSoWmmGnz6OnUvAofMcrUuTMD53Y2rnbshjXvhtPnjKw4dufXFjo6C7yZQ6vyoNzTS9HyQwCHlxlhyCKJjQ==", "dev": true, "license": "MIT", - "dependencies": { - "is-wsl": "^3.1.0", - "powershell-utils": "^0.1.0" - }, - "engines": { - "node": ">=20" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^10.5.7" } }, - "node_modules/wsl-utils/node_modules/powershell-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", - "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "packages/web/node_modules/@storybook/addon-themes": { + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-themes/-/addon-themes-10.5.7.tgz", + "integrity": "sha512-A3xMGyvfvPigSGiWiefgEd4MlV/taxeVsF7uj/oUO1DTrTEd9q2lIrwLtLmGvl/rUhpeP7yx33wrGronl8ym7A==", "dev": true, "license": "MIT", - "engines": { - "node": ">=20" + "dependencies": { + "ts-dedent": "^2.0.0" }, "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", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "license": "MIT" - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^10.5.7" } }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", - "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "packages/web/node_modules/@storybook/builder-vite": { + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.5.7.tgz", + "integrity": "sha512-fShF/aQaITqcJuMCLr42BGNUAbhDi4IboqvlbZqXAwgrrTslnZEUnY8GcEcvpZmjl11VwlmazhMJdH50fIgBPg==", "dev": true, "license": "MIT", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "@storybook/csf-plugin": "10.5.7", + "ts-dedent": "^2.0.0" }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^10.5.7", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/yargs/node_modules/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==", + "packages/web/node_modules/@storybook/csf-plugin": { + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.5.7.tgz", + "integrity": "sha512-IaX8FlM0H36HNFhJ2+4L9bCldqfvHGqcLg841SJNyK/DhfMlM7JsvY/GDH2ZFuWrUf8FSOx96GRRnHq6XfRKag==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "unplugin": "^2.3.5" }, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "esbuild": "*", + "rollup": "*", + "storybook": "^10.5.7", + "vite": "*", + "webpack": "*" + }, + "peerDependenciesMeta": { + "esbuild": { + "optional": true + }, + "rollup": { + "optional": true + }, + "vite": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "packages/web/node_modules/@storybook/react": { + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.5.7.tgz", + "integrity": "sha512-uFvty2MMdFXzW5PcQe1JqDAZkz6cQq7q/9G/cbGVnBEvP6zsOVeL+bmrQ0/WBlFQN0Ko9+ZoCTvaQ9s65zBa5g==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "@storybook/global": "^5.0.0", + "@storybook/react-dom-shim": "10.5.7", + "react-docgen": "^8.0.2", + "react-docgen-typescript": "^2.2.2" }, - "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.5.7", + "typescript": ">= 4.9.x" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + }, + "typescript": { + "optional": true + } } }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "packages/web/node_modules/@storybook/react-dom-shim": { + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.5.7.tgz", + "integrity": "sha512-lxOkyh+wu/MiBXvYQHjZfD+DRKOa4bHBzbuGuiHXnHXmdOcTRdcrQTsoeN2FPtfugmmOG66cZUEgDwNX+k5eRA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "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.5.7" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/yocto-spinner": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-1.2.2.tgz", - "integrity": "sha512-DODGl1wJjA/s5pnJFKau9lIYHT81lnhob1i3e1TjxZRxEhWRKl74nTbWE6H5KlkViQQTo/Z29YFdxzTZAMY3ng==", + "packages/web/node_modules/@storybook/react-vite": { + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-10.5.7.tgz", + "integrity": "sha512-eEo3eVa2pvqrzQukKxAzx7YvswDAA1s6k/y+tdMxmRvWyHX6QEOsb9Tda6wcVaa7c8BeJM7Ggq+289cRMTH6Iw==", "dev": true, "license": "MIT", "dependencies": { - "yoctocolors": "^2.1.1" - }, - "engines": { - "node": ">=18.19" + "@joshwooding/vite-plugin-react-docgen-typescript": "^0.7.0", + "@rollup/pluginutils": "^5.0.2", + "@storybook/builder-vite": "10.5.7", + "@storybook/react": "10.5.7", + "empathic": "^2.0.0", + "magic-string": "^0.30.0", + "react-docgen": "^8.0.2", + "resolve": "^1.22.8", + "tsconfig-paths": "^4.2.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yoctocolors": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz", - "integrity": "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "type": "opencollective", + "url": "https://opencollective.com/storybook" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", - "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-to-json-schema": { - "version": "3.25.2", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", - "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", - "dev": true, - "license": "ISC", "peerDependencies": { - "zod": "^3.25.28 || ^4" - } - }, - "packages/infra": { - "name": "@react-starter/infra", - "version": "1.8.0-alpha.1", - "devDependencies": { - "aws-cdk": "2.1135.1", - "aws-cdk-lib": "2.264.0", - "constructs": "10.8.1", - "dotenv": "17.4.2" - } - }, - "packages/shared": { - "name": "@react-starter/shared", - "version": "1.8.0-alpha.1", - "dependencies": { - "@fontsource-variable/inter": "5.3.0", - "class-variance-authority": "0.7.1", - "clsx": "2.1.1", - "radix-ui": "1.6.7", - "tailwind-merge": "3.6.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.5.7", + "typescript": ">= 4.9.x", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, - "devDependencies": { - "tailwindcss": "4.3.3", - "tw-animate-css": "1.4.0" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "packages/web": { - "name": "@react-starter/web", - "version": "1.8.0-alpha.1", + "packages/web/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": { - "@fortawesome/fontawesome-svg-core": "7.3.1", - "@fortawesome/free-regular-svg-icons": "7.3.1", - "@fortawesome/free-solid-svg-icons": "7.3.1", - "@fortawesome/react-fontawesome": "3.5.0", - "@hookform/resolvers": "5.7.1", - "@react-spring/web": "10.1.2", - "@react-starter/shared": "*", - "@tanstack/react-query": "5.101.4", - "@tanstack/react-query-devtools": "5.101.4", - "@tanstack/react-table": "8.21.3", - "axios": "1.19.0", - "dayjs": "1.11.21", - "i18next": "26.3.6", - "i18next-browser-languagedetector": "8.2.1", - "lodash": "4.18.1", - "lucide-react": "1.31.0", - "react-hook-form": "7.85.0", - "react-i18next": "17.0.11", - "react-syntax-highlighter": "16.1.1", - "recharts": "3.10.1", - "uuid": "14.0.1", - "zod": "4.4.3" + "@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" }, - "devDependencies": { - "@chromatic-com/storybook": "5.3.0", - "@storybook/addon-docs": "10.5.7", - "@storybook/addon-onboarding": "10.5.7", - "@storybook/addon-themes": "10.5.7", - "@storybook/react-vite": "10.5.7", - "@tailwindcss/vite": "4.3.3", - "@types/eslint__js": "8.42.3", - "@types/lodash": "4.17.25", - "@types/react-syntax-highlighter": "15.5.13", - "@types/uuid": "10.0.0", - "msw": "2.15.0", - "storybook": "10.5.7", - "vite": "8.2.1" + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" } }, - "packages/web/node_modules/lightningcss": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", - "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "packages/web/node_modules/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.33.0", - "lightningcss-darwin-arm64": "1.33.0", - "lightningcss-darwin-x64": "1.33.0", - "lightningcss-freebsd-x64": "1.33.0", - "lightningcss-linux-arm-gnueabihf": "1.33.0", - "lightningcss-linux-arm64-gnu": "1.33.0", - "lightningcss-linux-arm64-musl": "1.33.0", - "lightningcss-linux-x64-gnu": "1.33.0", - "lightningcss-linux-x64-musl": "1.33.0", - "lightningcss-win32-arm64-msvc": "1.33.0", - "lightningcss-win32-x64-msvc": "1.33.0" + "url": "https://opencollective.com/vitest" } }, - "packages/web/node_modules/lightningcss-android-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", - "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", - "cpu": [ - "arm64" - ], + "packages/web/node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/vitest" } }, - "packages/web/node_modules/lightningcss-darwin-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", - "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", - "cpu": [ - "arm64" - ], + "packages/web/node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/vitest" } }, - "packages/web/node_modules/lightningcss-darwin-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", - "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", - "cpu": [ - "x64" - ], + "packages/web/node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/vitest" } - }, - "packages/web/node_modules/lightningcss-freebsd-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", - "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" + }, + "packages/web/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "extraneous": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "packages/web/node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", - "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" + "packages/web/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "extraneous": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "packages/web/node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", - "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", - "cpu": [ - "arm64" - ], + "packages/web/node_modules/ansi-regex": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", "engines": { - "node": ">= 12.0.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "packages/web/node_modules/lightningcss-linux-arm64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", - "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", - "cpu": [ - "arm64" - ], + "packages/web/node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=18" } }, - "packages/web/node_modules/lightningcss-linux-x64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", - "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", - "cpu": [ - "x64" - ], + "packages/web/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, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], + "license": "MIT" + }, + "packages/web/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "extraneous": true, + "license": "MIT" + }, + "packages/web/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": ">= 12.0.0" + "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/web/node_modules/lightningcss-linux-x64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", - "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", - "cpu": [ - "x64" - ], + "packages/web/node_modules/storybook": { + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.5.7.tgz", + "integrity": "sha512-oiKvWIwIoOhFP1i6dASYyMXwPHKEtVZMshqSB7EvIVYjWRh0l9H7gHEt1z4Gh2rLGFMekWdsm4s94rvwpR7gkg==", "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@storybook/icons": "^2.0.2", + "@testing-library/dom": "^10.4.1", + "@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", + "jsonc-parser": "^3.3.1", + "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.21.1" + }, + "bin": { + "storybook": "dist/bin/dispatcher.js" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/parcel" + "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 || ^0.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "prettier": { + "optional": true + }, + "vite-plus": { + "optional": true + } } }, - "packages/web/node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", - "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", - "cpu": [ - "arm64" - ], + "packages/web/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": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, "engines": { - "node": ">= 12.0.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "packages/web/node_modules/lightningcss-win32-x64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", - "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", - "cpu": [ - "x64" - ], + "packages/web/node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], + "license": "MIT", "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=14.0.0" } }, "packages/web/node_modules/vite": { "version": "8.2.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz", - "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==", "dev": true, "license": "MIT", "dependencies": { @@ -15209,6 +14898,22 @@ "optional": true } } + }, + "packages/web/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" + } } } } diff --git a/package.json b/package.json index 60025721..e882d36f 100644 --- a/package.json +++ b/package.json @@ -47,21 +47,21 @@ "@testing-library/jest-dom": "7.0.1", "@testing-library/react": "16.3.2", "@testing-library/user-event": "14.6.6", - "@types/node": "26.2.0", + "@types/node": "26.4.0", "@types/react": "19.2.18", - "@types/react-dom": "19.2.4", - "@vitejs/plugin-react": "6.0.5", - "@vitest/coverage-v8": "4.1.10", + "@types/react-dom": "19.2.5", + "@vitejs/plugin-react": "6.1.0", + "@vitest/coverage-v8": "4.1.11", "eslint": "9.39.2", - "globals": "17.10.0", + "globals": "17.11.0", "husky": "9.1.7", "jsdom": "30.0.1", "prettier": "3.9.6", "prettier-plugin-tailwindcss": "0.8.1", "rimraf": "6.1.3", - "shadcn": "4.18.0", + "shadcn": "4.19.0", "typescript": "5.9.3", - "typescript-eslint": "8.67.0", - "vitest": "4.1.10" + "typescript-eslint": "8.68.0", + "vitest": "4.1.11" } } From cbcd9c5fa21e3d86ca272108feb76405992e7bf7 Mon Sep 17 00:00:00 2001 From: Matthew Warman Date: Fri, 28 Aug 2026 06:25:06 -0400 Subject: [PATCH 04/41] feat: remove old common components replaced by shadcn components --- package-lock.json | 133 ++-- packages/shared/package.json | 3 + .../components/Accordion/Accordion.test.tsx | 128 ---- .../src/components/Accordion/Accordion.tsx | 262 ------- .../src/components/Badge/Badge.test.tsx | 34 - .../shared/src/components/Badge/Badge.tsx | 54 -- .../Breadcrumbs/Breadcrumbs.test.tsx | 67 -- .../components/Breadcrumbs/Breadcrumbs.tsx | 157 ----- .../src/components/Button/Button.test.tsx | 165 ----- .../shared/src/components/Button/Button.tsx | 68 -- .../shared/src/components/Card/Card.test.tsx | 51 -- packages/shared/src/components/Card/Card.tsx | 134 ---- .../src/components/Card/MessageCard.test.tsx | 54 -- .../src/components/Card/MessageCard.tsx | 39 -- .../src/components/Dialog/Dialog.test.tsx | 240 ------- .../shared/src/components/Dialog/Dialog.tsx | 276 -------- .../src/components/Divider/Divider.test.tsx | 34 - .../shared/src/components/Divider/Divider.tsx | 12 - .../components/Dropdown/DropdownMenu.test.tsx | 173 ----- .../src/components/Dropdown/DropdownMenu.tsx | 175 ----- .../src/components/Form/Checkbox.test.tsx | 120 ---- .../shared/src/components/Form/Checkbox.tsx | 102 --- .../src/components/Form/FieldError.test.tsx | 38 - .../shared/src/components/Form/FieldError.tsx | 29 - .../shared/src/components/Form/Input.test.tsx | 82 --- packages/shared/src/components/Form/Input.tsx | 72 -- .../shared/src/components/Form/Label.test.tsx | 39 -- packages/shared/src/components/Form/Label.tsx | 45 -- .../src/components/Form/RadioGroup.test.tsx | 135 ---- .../shared/src/components/Form/RadioGroup.tsx | 191 ----- .../src/components/Form/SearchInput.test.tsx | 74 -- .../src/components/Form/SearchInput.tsx | 117 ---- .../src/components/Form/SearchResult.test.tsx | 61 -- .../src/components/Form/SearchResult.tsx | 35 - .../src/components/Form/Select.test.tsx | 261 ------- .../shared/src/components/Form/Select.tsx | 295 -------- .../src/components/Form/Textarea.test.tsx | 81 --- .../shared/src/components/Form/Textarea.tsx | 73 -- .../src/components/Form/Toggle.test.tsx | 84 --- .../shared/src/components/Form/Toggle.tsx | 79 --- .../src/components/Icon/Avatar.test.tsx | 52 -- .../shared/src/components/Icon/Avatar.tsx | 88 --- .../shared/src/components/Link/Link.test.tsx | 37 - packages/shared/src/components/Link/Link.tsx | 32 - .../src/components/Loader/LoaderSuspense.tsx | 6 +- .../src/components/Loader/Skeleton.test.tsx | 33 - .../shared/src/components/Loader/Skeleton.tsx | 17 - .../src/components/Loader/Spinner.test.tsx | 47 -- .../shared/src/components/Loader/Spinner.tsx | 43 -- packages/shared/src/components/Menu/Menu.tsx | 7 - .../src/components/Menu/MenuButton.test.tsx | 75 -- .../shared/src/components/Menu/MenuButton.tsx | 45 -- .../components/Menu/MenuCloseButton.test.tsx | 47 -- .../src/components/Menu/MenuCloseButton.tsx | 36 - .../src/components/Menu/MenuNavLink.test.tsx | 112 --- .../src/components/Menu/MenuNavLink.tsx | 72 -- .../components/Menu/MenuSeparator.test.tsx | 33 - .../src/components/Menu/MenuSeparator.tsx | 13 - .../Menu/SideMenu/SideMenu.test.tsx | 120 ---- .../src/components/Menu/SideMenu/SideMenu.tsx | 80 --- .../Menu/SideMenu/SideMenuHeader.test.tsx | 92 --- .../Menu/SideMenu/SideMenuHeader.tsx | 35 - .../src/components/Popover/Popover.test.tsx | 315 --------- .../shared/src/components/Popover/Popover.tsx | 202 ------ .../src/components/Table/Table.test.tsx | 64 -- .../shared/src/components/Table/Table.tsx | 71 -- .../shared/src/components/Tabs/Tabs.test.tsx | 254 ------- packages/shared/src/components/Tabs/Tabs.tsx | 186 ----- .../shared/src/components/shadcn/avatar.tsx | 91 +++ .../shared/src/components/shadcn/badge.tsx | 40 ++ .../src/components/shadcn/breadcrumb.tsx | 89 +++ .../shared/src/components/shadcn/button.tsx | 65 ++ .../shared/src/components/shadcn/card.tsx | 70 ++ .../shared/src/components/shadcn/chart.tsx | 305 ++++++++ .../shared/src/components/shadcn/dialog.tsx | 135 ++++ .../src/components/shadcn/dropdown-menu.tsx | 236 +++++++ .../shared/src/components/shadcn/empty.tsx | 87 +++ .../shared/src/components/shadcn/field.tsx | 216 ++++++ .../shared/src/components/shadcn/input.tsx | 19 + .../shared/src/components/shadcn/item.tsx | 173 +++++ .../shared/src/components/shadcn/label.tsx | 19 + .../src/components/shadcn/separator.tsx | 26 + .../shared/src/components/shadcn/sheet.tsx | 101 +++ .../shared/src/components/shadcn/sidebar.tsx | 660 ++++++++++++++++++ .../shared/src/components/shadcn/skeleton.tsx | 7 + .../shared/src/components/shadcn/sonner.tsx | 37 + .../shared/src/components/shadcn/spinner.tsx | 16 + .../shared/src/components/shadcn/switch.tsx | 31 + .../shared/src/components/shadcn/table.tsx | 73 ++ .../shared/src/components/shadcn/toggle.tsx | 39 ++ .../shared/src/components/shadcn/tooltip.tsx | 44 ++ packages/shared/src/hooks/use-mobile.ts | 19 + 92 files changed, 2686 insertions(+), 6398 deletions(-) delete mode 100644 packages/shared/src/components/Accordion/Accordion.test.tsx delete mode 100644 packages/shared/src/components/Accordion/Accordion.tsx delete mode 100644 packages/shared/src/components/Badge/Badge.test.tsx delete mode 100644 packages/shared/src/components/Badge/Badge.tsx delete mode 100644 packages/shared/src/components/Breadcrumbs/Breadcrumbs.test.tsx delete mode 100644 packages/shared/src/components/Breadcrumbs/Breadcrumbs.tsx delete mode 100644 packages/shared/src/components/Button/Button.test.tsx delete mode 100644 packages/shared/src/components/Button/Button.tsx delete mode 100644 packages/shared/src/components/Card/Card.test.tsx delete mode 100644 packages/shared/src/components/Card/Card.tsx delete mode 100644 packages/shared/src/components/Card/MessageCard.test.tsx delete mode 100644 packages/shared/src/components/Card/MessageCard.tsx delete mode 100644 packages/shared/src/components/Dialog/Dialog.test.tsx delete mode 100644 packages/shared/src/components/Dialog/Dialog.tsx delete mode 100644 packages/shared/src/components/Divider/Divider.test.tsx delete mode 100644 packages/shared/src/components/Divider/Divider.tsx delete mode 100644 packages/shared/src/components/Dropdown/DropdownMenu.test.tsx delete mode 100644 packages/shared/src/components/Dropdown/DropdownMenu.tsx delete mode 100644 packages/shared/src/components/Form/Checkbox.test.tsx delete mode 100644 packages/shared/src/components/Form/Checkbox.tsx delete mode 100644 packages/shared/src/components/Form/FieldError.test.tsx delete mode 100644 packages/shared/src/components/Form/FieldError.tsx delete mode 100644 packages/shared/src/components/Form/Input.test.tsx delete mode 100644 packages/shared/src/components/Form/Input.tsx delete mode 100644 packages/shared/src/components/Form/Label.test.tsx delete mode 100644 packages/shared/src/components/Form/Label.tsx delete mode 100644 packages/shared/src/components/Form/RadioGroup.test.tsx delete mode 100644 packages/shared/src/components/Form/RadioGroup.tsx delete mode 100644 packages/shared/src/components/Form/SearchInput.test.tsx delete mode 100644 packages/shared/src/components/Form/SearchInput.tsx delete mode 100644 packages/shared/src/components/Form/SearchResult.test.tsx delete mode 100644 packages/shared/src/components/Form/SearchResult.tsx delete mode 100644 packages/shared/src/components/Form/Select.test.tsx delete mode 100644 packages/shared/src/components/Form/Select.tsx delete mode 100644 packages/shared/src/components/Form/Textarea.test.tsx delete mode 100644 packages/shared/src/components/Form/Textarea.tsx delete mode 100644 packages/shared/src/components/Form/Toggle.test.tsx delete mode 100644 packages/shared/src/components/Form/Toggle.tsx delete mode 100644 packages/shared/src/components/Icon/Avatar.test.tsx delete mode 100644 packages/shared/src/components/Icon/Avatar.tsx delete mode 100644 packages/shared/src/components/Link/Link.test.tsx delete mode 100644 packages/shared/src/components/Link/Link.tsx delete mode 100644 packages/shared/src/components/Loader/Skeleton.test.tsx delete mode 100644 packages/shared/src/components/Loader/Skeleton.tsx delete mode 100644 packages/shared/src/components/Loader/Spinner.test.tsx delete mode 100644 packages/shared/src/components/Loader/Spinner.tsx delete mode 100644 packages/shared/src/components/Menu/Menu.tsx delete mode 100644 packages/shared/src/components/Menu/MenuButton.test.tsx delete mode 100644 packages/shared/src/components/Menu/MenuButton.tsx delete mode 100644 packages/shared/src/components/Menu/MenuCloseButton.test.tsx delete mode 100644 packages/shared/src/components/Menu/MenuCloseButton.tsx delete mode 100644 packages/shared/src/components/Menu/MenuNavLink.test.tsx delete mode 100644 packages/shared/src/components/Menu/MenuNavLink.tsx delete mode 100644 packages/shared/src/components/Menu/MenuSeparator.test.tsx delete mode 100644 packages/shared/src/components/Menu/MenuSeparator.tsx delete mode 100644 packages/shared/src/components/Menu/SideMenu/SideMenu.test.tsx delete mode 100644 packages/shared/src/components/Menu/SideMenu/SideMenu.tsx delete mode 100644 packages/shared/src/components/Menu/SideMenu/SideMenuHeader.test.tsx delete mode 100644 packages/shared/src/components/Menu/SideMenu/SideMenuHeader.tsx delete mode 100644 packages/shared/src/components/Popover/Popover.test.tsx delete mode 100644 packages/shared/src/components/Popover/Popover.tsx delete mode 100644 packages/shared/src/components/Table/Table.test.tsx delete mode 100644 packages/shared/src/components/Table/Table.tsx delete mode 100644 packages/shared/src/components/Tabs/Tabs.test.tsx delete mode 100644 packages/shared/src/components/Tabs/Tabs.tsx create mode 100644 packages/shared/src/components/shadcn/avatar.tsx create mode 100644 packages/shared/src/components/shadcn/badge.tsx create mode 100644 packages/shared/src/components/shadcn/breadcrumb.tsx create mode 100644 packages/shared/src/components/shadcn/button.tsx create mode 100644 packages/shared/src/components/shadcn/card.tsx create mode 100644 packages/shared/src/components/shadcn/chart.tsx create mode 100644 packages/shared/src/components/shadcn/dialog.tsx create mode 100644 packages/shared/src/components/shadcn/dropdown-menu.tsx create mode 100644 packages/shared/src/components/shadcn/empty.tsx create mode 100644 packages/shared/src/components/shadcn/field.tsx create mode 100644 packages/shared/src/components/shadcn/input.tsx create mode 100644 packages/shared/src/components/shadcn/item.tsx create mode 100644 packages/shared/src/components/shadcn/label.tsx create mode 100644 packages/shared/src/components/shadcn/separator.tsx create mode 100644 packages/shared/src/components/shadcn/sheet.tsx create mode 100644 packages/shared/src/components/shadcn/sidebar.tsx create mode 100644 packages/shared/src/components/shadcn/skeleton.tsx create mode 100644 packages/shared/src/components/shadcn/sonner.tsx create mode 100644 packages/shared/src/components/shadcn/spinner.tsx create mode 100644 packages/shared/src/components/shadcn/switch.tsx create mode 100644 packages/shared/src/components/shadcn/table.tsx create mode 100644 packages/shared/src/components/shadcn/toggle.tsx create mode 100644 packages/shared/src/components/shadcn/tooltip.tsx create mode 100644 packages/shared/src/hooks/use-mobile.ts diff --git a/package-lock.json b/package-lock.json index 54665950..90fd850c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6488,7 +6488,7 @@ "version": "6.15.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -6505,7 +6505,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -6523,7 +6523,7 @@ "version": "8.20.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -6540,7 +6540,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/ansi-colors": { @@ -8660,7 +8660,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/fast-levenshtein": { @@ -10005,7 +10005,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/json-schema-typed": { @@ -10834,6 +10834,16 @@ "url": "https://opencollective.com/express" } }, + "node_modules/next-themes": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", + "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, "node_modules/node-releases": { "version": "2.0.53", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", @@ -11766,7 +11776,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6" @@ -12810,6 +12820,22 @@ "npm": ">= 3.0.0" } }, + "node_modules/sonner": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.8.tgz", + "integrity": "sha512-UM/ByIoFra8yzV75n1o0Puu0bw5U/9UNnDacrJNspekBewIfsQ3D6ez1nvlWpt7aTsO6rujQtifBpycwIivqlg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -13533,7 +13559,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, + "devOptional": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -14181,7 +14207,10 @@ "@fontsource-variable/inter": "5.3.0", "class-variance-authority": "0.7.1", "clsx": "2.1.1", + "next-themes": "^0.4.6", "radix-ui": "1.6.7", + "recharts": "^3.8.0", + "sonner": "^2.0.8", "tailwind-merge": "3.6.0" }, "devDependencies": { @@ -14189,6 +14218,52 @@ "tw-animate-css": "1.4.0" } }, + "packages/shared/node_modules/immer": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", + "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "packages/shared/node_modules/recharts": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.8.0.tgz", + "integrity": "sha512-Z/m38DX3L73ExO4Tpc9/iZWHmHnlzWG4njQbxsF5aSjwqmHNDDIm0rdEBArkwsBvR8U6EirlEHiQNYWCVh9sGQ==", + "license": "MIT", + "workspaces": [ + "www" + ], + "dependencies": { + "@reduxjs/toolkit": "^1.9.0 || 2.x.x", + "clsx": "^2.1.1", + "decimal.js-light": "^2.5.1", + "es-toolkit": "^1.39.3", + "eventemitter3": "^5.0.1", + "immer": "^10.1.1", + "react-redux": "8.x.x || 9.x.x", + "reselect": "5.1.1", + "tiny-invariant": "^1.3.3", + "use-sync-external-store": "^1.2.2", + "victory-vendor": "^37.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "packages/shared/node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" + }, "packages/web": { "name": "@react-starter/web", "version": "1.8.0-alpha.1", @@ -14650,41 +14725,6 @@ "url": "https://opencollective.com/vitest" } }, - "packages/web/node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "packages/web/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, "packages/web/node_modules/ansi-regex": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", @@ -14722,13 +14762,6 @@ "dev": true, "license": "MIT" }, - "packages/web/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "extraneous": true, - "license": "MIT" - }, "packages/web/node_modules/open": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", diff --git a/packages/shared/package.json b/packages/shared/package.json index 4b7a2f92..53efce9c 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -19,7 +19,10 @@ "@fontsource-variable/inter": "5.3.0", "class-variance-authority": "0.7.1", "clsx": "2.1.1", + "next-themes": "0.4.6", "radix-ui": "1.6.7", + "recharts": "3.8.0", + "sonner": "2.0.8", "tailwind-merge": "3.6.0" }, "devDependencies": { diff --git a/packages/shared/src/components/Accordion/Accordion.test.tsx b/packages/shared/src/components/Accordion/Accordion.test.tsx deleted file mode 100644 index 391ed680..00000000 --- a/packages/shared/src/components/Accordion/Accordion.test.tsx +++ /dev/null @@ -1,128 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import userEvent from '@testing-library/user-event'; - -import { render, screen, waitFor } from '@testing-library/react'; - -import Accordion from './Accordion'; - -describe('Accordion', () => { - it('should render correctly', async () => { - // ARRANGE - render( - - - Section 1 - Content for section 1. - - - Section 2 - Content for section 2. - - , - ); - await screen.findByTestId('accordion'); - - // ASSERT - expect(screen.getByTestId('accordion')).toBeDefined(); - }); - - it('should display the default active item', async () => { - // ARRANGE - render( - - - Section 1 - Content for section 1. - - - Section 2 - Content for section 2. - - , - ); - await screen.findByTestId('content-section-1'); - // ASSERT - expect(screen.getByTestId('content-section-1')).toHaveAttribute('data-state', 'open'); - }); - - it('should open item when trigger clicked', async () => { - // ARRANGE - const user = userEvent.setup(); - render( - - - Section 1 - Content for section 1. - - - Section 2 - Content for section 2. - - , - ); - await screen.findByTestId('content-section-1'); - expect(screen.getByTestId('content-section-1')).toHaveAttribute('data-state', 'closed'); - - // ACT - await user.click(screen.getByTestId('trigger-section-1-button')); - await waitFor(() => expect(screen.getByTestId('content-section-1')).toHaveAttribute('data-state', 'open')); - - // ASSERT - expect(screen.getByTestId('content-section-1')).toHaveAttribute('data-state', 'open'); - }); - - it('should close item when trigger clicked', async () => { - // ARRANGE - const user = userEvent.setup(); - render( - - - Section 1 - Content for section 1. - - - Section 2 - Content for section 2. - - , - ); - await screen.findByTestId('content-section-1'); - expect(screen.getByTestId('content-section-1')).toHaveAttribute('data-state', 'open'); - - // ACT - await user.click(screen.getByTestId('trigger-section-1-button')); - await waitFor(() => expect(screen.getByTestId('content-section-1')).toHaveAttribute('data-state', 'closed')); - - // ASSERT - expect(screen.getByTestId('content-section-1')).toHaveAttribute('data-state', 'closed'); - }); - - it('should display multiple active items', async () => { - // ARRANGE - const user = userEvent.setup(); - render( - - - Section 1 - Content for section 1. - - - Section 2 - Content for section 2. - - , - ); - await screen.findByTestId('content-section-1'); - expect(screen.getByTestId('content-section-1')).toHaveAttribute('data-state', 'closed'); - expect(screen.getByTestId('content-section-2')).toHaveAttribute('data-state', 'closed'); - - // ACT - await user.click(screen.getByTestId('trigger-section-1-button')); - await user.click(screen.getByTestId('trigger-section-2-button')); - await waitFor(() => expect(screen.getByTestId('content-section-1')).toHaveAttribute('data-state', 'open')); - - // ASSERT - expect(screen.getByTestId('content-section-1')).toHaveAttribute('data-state', 'open'); - expect(screen.getByTestId('content-section-2')).toHaveAttribute('data-state', 'open'); - }); -}); diff --git a/packages/shared/src/components/Accordion/Accordion.tsx b/packages/shared/src/components/Accordion/Accordion.tsx deleted file mode 100644 index 3ad7e7f6..00000000 --- a/packages/shared/src/components/Accordion/Accordion.tsx +++ /dev/null @@ -1,262 +0,0 @@ -import { createContext, PropsWithChildren, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'; -import noop from 'lodash/noop'; -import { animated, useSpring } from '@react-spring/web'; - -import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@react-starter/shared/types/components'; -import FAIcon from '../Icon/FAIcon'; - -/** - * Defines the shape of the `AccordionContext` value. - */ -type AccordionContextValue = { - items: string[]; - addItem: (item: string) => void; - removeItem: (item: string) => void; - activeItems: string[]; - addActiveItem: (item: string) => void; - removeActiveItem: (item: string) => void; -}; - -/** - * The `AccordionContext` instance. - */ -const AccordionContext = createContext({ - items: [], - addItem: noop, - removeItem: noop, - activeItems: [], - addActiveItem: noop, - removeActiveItem: noop, -}); - -/** - * Properties for the `Accordion` component. - * @param defaultValue - An array of default (or initial) active items. - * @param multiple - Whether or not multiple items can be open at the same time. - */ -export interface AccordionProps extends BaseComponentProps, PropsWithChildren { - defaultValue?: string[]; - multiple?: boolean; -} - -/** - * The `Accordion` component organizes content into vertically stacked sections. - * Each section has a heading which, when clicked, reveals the content. - * - * **Example:** - * ``` - - - Section 1 - Content for section 1. - - - Section 2 - Content for section 2. - - - * ``` - */ -const Accordion = ({ - children, - className, - defaultValue = [], - multiple = false, - testId = 'accordion', -}: AccordionProps) => { - const [activeItems, setActiveItems] = useState(defaultValue); - const addActiveItem = useCallback( - (item: string): void => { - if (!multiple) { - setActiveItems([item]); - } else { - setActiveItems((prev) => (!prev.includes(item) ? [...prev, item] : prev)); - } - }, - [multiple], - ); - - const removeActiveItem = useCallback((item: string): void => { - setActiveItems((prev) => prev.filter((i) => i !== item)); - }, []); - - const [items, setItems] = useState([]); - const addItem = useCallback((item: string): void => { - setItems((prev) => (!prev.includes(item) ? [...prev, item] : prev)); - }, []); - - const removeItem = useCallback((item: string): void => { - setItems((prev) => prev.filter((i) => i !== item)); - }, []); - - const contextValue = useMemo( - () => ({ items, addItem, removeItem, activeItems, addActiveItem, removeActiveItem }), - [items, addItem, removeItem, activeItems, addActiveItem, removeActiveItem], - ); - - return ( -
- {children} -
- ); -}; - -/** - * Defines the shape of the `AccordionItemContext` value. - */ -type AccordionItemContextValue = { - isOpen: boolean; - value: string; -}; - -/** - * The `AccordionItemContext` instance. - */ -const AccordionItemContext = createContext({ - isOpen: false, - value: '', -}); - -/** - * Properties for the `Item` component. - */ -export interface ItemProps extends BaseComponentProps, PropsWithChildren { - value: string; -} - -/** - * The `Item` component represents a single item in the `Accordion`. It contains - * a `Trigger` and `Content`. - */ -const Item = ({ children, className, value, testId = 'accordion-item' }: ItemProps) => { - const [isOpen, setIsOpen] = useState(false); - const { activeItems, addItem, removeItem } = useContext(AccordionContext); - - /** - * When the component mounts, add the item to the list of items. - */ - useEffect(() => { - addItem(value); - return () => { - removeItem(value); - }; - }, [value]); - - /** - * When the active item changes, update the "isOpen" state. - */ - useEffect(() => { - if (activeItems.includes(value)) { - setIsOpen(true); - } else { - setIsOpen(false); - } - }, [activeItems, value]); - - const contextValue = useMemo(() => ({ isOpen, value }), [isOpen, value]); - - return ( -
- {children} -
- ); -}; -Accordion.Item = Item; - -/** - * The `Trigger` component represents the trigger for an `Item`. When clicked, - * it will open or close the `Content`. - */ -const Trigger = ({ children, className, testId = 'accordion-trigger' }: BaseComponentProps & PropsWithChildren) => { - const { addActiveItem, removeActiveItem } = useContext(AccordionContext); - const { isOpen, value } = useContext(AccordionItemContext); - const [springs, api] = useSpring( - () => ({ - rotate: isOpen ? '180deg' : '0deg', - }), - [isOpen], - ); - - /** - * When the "isOpen" state changes, animate the rotation of the chevron. - */ - useEffect(() => { - api.start({ rotate: isOpen ? '180deg' : '0deg' }); - }, [isOpen, api]); - - /** - * When the trigger is clicked, update the active item. - */ - const handleClick = useCallback(() => { - if (isOpen) { - removeActiveItem(value); - } else { - addActiveItem(value); - } - }, [isOpen, value, addActiveItem, removeActiveItem]); - - return ( -
- -
- ); -}; -Accordion.Trigger = Trigger; - -/** - * The `Content` component represents the content of an `Item`. When the `Item` - * is open, the content will be displayed. - */ -const Content = ({ children, className, testId = 'accordion-content' }: BaseComponentProps & PropsWithChildren) => { - const contentRef = useRef(null); - const [contentHeight, setContentHeight] = useState(0); - const [springs, api] = useSpring(() => ({ - height: 0, - })); - const { isOpen } = useContext(AccordionItemContext); - - /** - * When the content changes, update the height of the content. - */ - useEffect(() => { - setContentHeight(contentRef.current?.scrollHeight || 0); - }, [contentRef.current?.scrollHeight]); - - /** - * When the "isOpen" state changes, animate the height of the content. - */ - useEffect(() => { - api.start({ - from: { height: isOpen ? 0 : contentHeight }, - to: { height: isOpen ? contentHeight : 0 }, - }); - }, [isOpen]); - - return ( - -
- {children} -
-
- ); -}; -Accordion.Content = Content; - -export default Accordion; diff --git a/packages/shared/src/components/Badge/Badge.test.tsx b/packages/shared/src/components/Badge/Badge.test.tsx deleted file mode 100644 index a6dea820..00000000 --- a/packages/shared/src/components/Badge/Badge.test.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import { render, screen } from '@testing-library/react'; - -import Badge from './Badge'; - -describe('Badge', () => { - it('should render successfully', async () => { - // ARRANGE - render(0); - await screen.findAllByTestId('badge'); - - // ASSERT - expect(screen.getByTestId('badge')).toBeDefined(); - expect(screen.getByTestId('badge').textContent).toEqual('0'); - }); - - it('should use custom testId', async () => { - // ARRANGE - render(0); - await screen.findAllByTestId('custom-testId'); - - // ASSERT - expect(screen.getByTestId('custom-testId')).toBeDefined(); - }); - - it('should use custom className', async () => { - // ARRANGE - render(0); - await screen.findAllByTestId('badge'); - - // ASSERT - expect(screen.getByTestId('badge').classList).toContain('custom-className'); - }); -}); diff --git a/packages/shared/src/components/Badge/Badge.tsx b/packages/shared/src/components/Badge/Badge.tsx deleted file mode 100644 index dc30e9be..00000000 --- a/packages/shared/src/components/Badge/Badge.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { PropsWithChildren } from 'react'; -import { cva, VariantProps } from 'class-variance-authority'; - -import { BaseComponentProps } from '@react-starter/shared/types/components'; -import { cn } from '@react-starter/shared/utils/css'; - -/** - * Define the component base and variant styles. - */ -const variants = cva('rounded-full font-bold', { - variants: { - size: { - sm: 'px-1 py-0.5 text-[10px] leading-none', - md: 'px-2 py-1 leading-none', - lg: 'px-3 py-1.5 text-lg leading-none', - }, - variant: { - danger: 'bg-red-600 dark:bg-red-700 dark:opacity-75 text-white', - info: 'bg-neutral-200/90 text-slate-900', - primary: 'bg-blue-600/90 text-white', - success: 'bg-green-800/90 text-white', - warning: 'bg-amber-400/90 text-slate-900', - }, - uppercase: { - false: '', - true: 'uppercase', - }, - }, - defaultVariants: { size: 'md', variant: 'danger', uppercase: false }, -}); - -/** - * The variant attributes of the Badge component. - */ -type BadgeVariants = VariantProps; - -/** - * Properties for the `Badge` React component. - */ -export interface BadgeProps extends BaseComponentProps, PropsWithChildren, BadgeVariants {} - -/** - * The `Badge` component highlights a notification, a count, or a piece status - * information. - */ -const Badge = ({ children, className, size, testId = 'badge', variant, uppercase }: BadgeProps) => { - return ( -
- {children} -
- ); -}; - -export default Badge; diff --git a/packages/shared/src/components/Breadcrumbs/Breadcrumbs.test.tsx b/packages/shared/src/components/Breadcrumbs/Breadcrumbs.test.tsx deleted file mode 100644 index 4ed4185c..00000000 --- a/packages/shared/src/components/Breadcrumbs/Breadcrumbs.test.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { describe, expect, it } from 'vitest'; - -import { render, screen } from '@testing-library/react'; - -import Breadcrumbs from './Breadcrumbs'; -import { MemoryRouter } from 'react-router-dom'; - -describe('Breadcrumbs', () => { - const wrapper = ({ children }: { children: React.ReactNode }) => {children}; - - it('should render successfully', async () => { - // ARRANGE - render( - - - - Home - - - - - - - - Page - - - , - { wrapper }, - ); - await screen.findByTestId('breadcrumbs'); - - // ASSERT - expect(screen.getByTestId('breadcrumbs')).toBeDefined(); - }); - - it('should render inner components successfully', async () => { - // ARRANGE - render( - - - - Home - - - - - - - - Page - - - , - { wrapper }, - ); - await screen.findByTestId('breadcrumbs'); - - // ASSERT - expect(screen.getByTestId('breadcrumbs')).toBeDefined(); - expect(screen.getByTestId('breadcrumbs-list')).toBeDefined(); - expect(screen.getAllByTestId('breadcrumbs-item')).toHaveLength(3); - expect(screen.getAllByTestId('breadcrumbs-separator')).toHaveLength(2); - expect(screen.getByTestId('breadcrumbs-ellipsis')).toBeDefined(); - expect(screen.getByTestId('breadcrumbs-page')).toBeDefined(); - }); -}); diff --git a/packages/shared/src/components/Breadcrumbs/Breadcrumbs.tsx b/packages/shared/src/components/Breadcrumbs/Breadcrumbs.tsx deleted file mode 100644 index d4ab42c9..00000000 --- a/packages/shared/src/components/Breadcrumbs/Breadcrumbs.tsx +++ /dev/null @@ -1,157 +0,0 @@ -import { PropsWithChildren } from 'react'; - -import { BaseComponentProps } from '@react-starter/shared/types/components'; -import { cn } from '@react-starter/shared/utils/css'; -import { default as CommonLink, LinkProps as CommonLinkProps } from '@react-starter/shared/components/Link/Link'; -import FAIcon, { FAIconProps } from '@react-starter/shared/components/Icon/FAIcon'; - -/** - * Properties for the `Breadcrumbs` component. - */ -export interface BreadcrumbsProps extends BaseComponentProps, PropsWithChildren {} - -/** - * The `Breadcrumbs` component renders a heirarchy of links as a path to the - * current route. - * - * **Example:** - * ``` - - - - Home - - - - - - - - - Components - Settings - Tasks - - - - - - - dolorum laboriosam eos qui iure aliquam - - - - - Edit - - - - * ``` - */ -const Breadcrumbs = ({ children, className, testId = 'breadcrumbs' }: BreadcrumbsProps) => { - return ( - - ); -}; - -/** - * The `List` contains the list of items in the breadcrumbs. It is located immediately - * within the `Breadcrumbs` component and contains one to many `Item` components. - */ -const List = ({ children, className, testId = 'breadcrumbs-list' }: BaseComponentProps & PropsWithChildren) => { - return ( -
    - {children} -
- ); -}; -Breadcrumbs.List = List; - -/** - * The `Item` represents a single element of the breadcrumbs list. An item typically - * represents a single element of the path to which a user may navigate. - * - * An `Item` may contain any type of child; however, an item typically contains a `Link`, - * `Page`, or a `DropdownMenu`. - */ -const Item = ({ children, className, testId = 'breadcrumbs-item' }: BaseComponentProps & PropsWithChildren) => { - return ( -
  • - {children} -
  • - ); -}; -Breadcrumbs.Item = Item; - -/** - * A `Link` represents a navigation link item within breadcrumbs. A link is - * a child of an `Item`. Use the `to` property to specify the relative path for - * the link. - */ -const Link = ({ children, className, testId = 'breadcrumbs-link', ...props }: CommonLinkProps) => { - return ( - - {children} - - ); -}; -Breadcrumbs.Link = Link; - -/** - * A `Page` represents an item within breadcrumbs with no associated navigation. - * Use the `Page` as an alternative to the `Link` when the breadcrumb item is - * not clickable. A `Page` is commonly used for the current page, i.e. the last - * element in the breadcrumbs. - */ -const Page = ({ children, className, testId = 'breadcrumbs-page' }: BaseComponentProps & PropsWithChildren) => { - return ( - - {children} - - ); -}; -Breadcrumbs.Page = Page; - -/** - * The `Separator` component renders an icon which visually separates two - * breadcrumbs elements. The default icon is a right chevron. - */ -const Separator = ({ - className, - icon = 'chevronRight', - size = 'sm', - testId = 'breadcrumbs-separator', - ...iconProps -}: BaseComponentProps & Omit & Partial>) => { - return ( -
  • - -
  • - ); -}; -Breadcrumbs.Separator = Separator; - -/** - * The `Ellipsis` component renders a horizontal ellipsis icon. This is useful when - * the number of breadcrumbs elements is too great to render all of them. Use the - * ellipsis to represent breadcrumbs items which have been omitted to shorten the - * overall breadcrumbs list. Alternatively, use the ellipsis as the trigger for - * a `DropdownMenu` within the breadcrumbs to allow navigation to those routes - * which have been omitted for brevity. - */ -const Ellipsis = ({ className, testId = 'breadcrumbs-ellipsis' }: BaseComponentProps) => { - return ( - - - More - - ); -}; -Breadcrumbs.Ellipsis = Ellipsis; - -export default Breadcrumbs; diff --git a/packages/shared/src/components/Button/Button.test.tsx b/packages/shared/src/components/Button/Button.test.tsx deleted file mode 100644 index 004b94a7..00000000 --- a/packages/shared/src/components/Button/Button.test.tsx +++ /dev/null @@ -1,165 +0,0 @@ -import { describe, expect, it, vi } from 'vitest'; -import userEvent from '@testing-library/user-event'; - -import { render, screen } from '@testing-library/react'; - -import Button from './Button'; - -describe('Button', () => { - it('should render successfully', async () => { - // ARRANGE - render( - - - - Terms and Conditions - Please review and accept. - - - Sed qos eiusmod eiusmod at consectetur nam veniam exercitation. - - - - - close()}>Cancel - Accept - - - - - )} - - * ``` - */ -const Dialog = ({ children, className, testId = 'dialog' }: DialogProps) => { - const [isHidden, setIsHidden] = useState(true); - - const close = () => { - setIsHidden(true); - }; - - return ( -
    - - {typeof children === 'function' ? children({ close }) : children} - -
    - ); -}; - -/** - * The `Trigger` renders a clickable element used to open a `Dialog`. There - * should be 1 `Trigger` within a `Dialog`. - */ -const Trigger = ({ children, className, testId = 'dialog-trigger' }: BaseComponentProps & PropsWithChildren) => { - const { isHidden, setIsHidden } = useContext(DialogContext); - - return ( -
    setIsHidden(!isHidden)} - data-testid={testId} - > - {children} -
    - ); -}; -Dialog.Trigger = Trigger; - -/** - * The `Content` component wraps the contents of a `Dialog` including the - * header, body, and footer. There should be 1 `Content` within a `Dialog`. - */ -const Content = ({ children, className, testId = 'dialog-content' }: BaseComponentProps & PropsWithChildren) => { - const { isHidden, setIsHidden } = useContext(DialogContext); - - return ( -
    - setIsHidden(true)} - testId={`${testId}-backdrop`} - > -
    e.stopPropagation()} - data-testid={`${testId}-content`} - > - {children} -
    -
    -
    - ); -}; -Dialog.Content = Content; - -/** - * The `Header` is a block within a dialog `Content` and may contain a `Title` - * and `Subtitle`. - */ -const Header = ({ children, className, testId = 'dialog-header' }: BaseComponentProps & PropsWithChildren) => { - return ( -
    - {children} -
    - ); -}; -Dialog.Header = Header; - -/** - * The `Body` is a block which encloses the main content of the `Dialog`. - */ -const Body = ({ children, className, testId = 'dialog-body' }: BaseComponentProps & PropsWithChildren) => { - return ( -
    - {children} -
    - ); -}; -Dialog.Body = Body; - -/** - * The `Footer` is a block within a dialog `Content` and contains values such as - * a `ButtonBar`, `Button`, or any components which are located at the bottom of - * the `Dialog`. - */ -const Footer = ({ children, className, testId = 'dialog-footer' }: BaseComponentProps & PropsWithChildren) => { - return ( -
    - {children} -
    - ); -}; -Dialog.Footer = Footer; - -/** - * A `Title` for the `Dialog`. The title is optional. When present, the `Title` - * is typically located within the dialog `Header`. - */ -const Title = ({ children, className, testId = 'dialog-title' }: BaseComponentProps & PropsWithChildren) => { - return ( -
    - {children} -
    - ); -}; -Dialog.Title = Title; - -/** - * A `Subtitle` for the `Dialog`. The subtitle is optional. When present, the - * `Subtitle` is typically located within the dialog `Header`, immediately after - * the `Title`. - */ -const Subtitle = ({ children, className, testId = 'dialog-subtitle' }: BaseComponentProps & PropsWithChildren) => { - return ( -
    - {children} -
    - ); -}; -Dialog.Subtitle = Subtitle; - -/** - * A `ButtonBar` organizes one to many dialog `Button` components in a horizontal - * row. The buttons are right justified within the bar. - */ -const ButtonBar = ({ children, className, testId = 'dialog-button-bar' }: BaseComponentProps & PropsWithChildren) => { - return ( -
    - {children} -
    - ); -}; -Dialog.ButtonBar = ButtonBar; - -/** - * Define the `Button` component base and variant styles. - */ -const buttonVariants = cva('', { - variants: { - variant: { - danger: 'font-bold text-red-600', - primary: 'font-bold text-blue-600 dark:text-blue-400', - secondary: '', - }, - }, - defaultVariants: { variant: 'secondary' }, -}); - -/** - * The variant attributes of the `Button` component. - */ -type ButtonVariants = VariantProps; - -/** - * Properties for the `Button` component. - */ -export interface ButtonProps extends Omit, ButtonVariants {} - -/** - * A dialog `Button` is a button which is styles for presentation within a - * `Dialog`. - */ -const Button = ({ className, variant = 'secondary', testId = 'dialog-button', ...props }: ButtonProps) => { - return ( - - ); -}; -Dialog.Button = Button; - -/** - * The `Separator` component renders a horizontal divider. - * This is useful to organize and separate content. - */ -const Separator = ({ className, testId = 'dialog-separator' }: BaseComponentProps) => { - return ; -}; -Dialog.Separator = Separator; - -export default Dialog; diff --git a/packages/shared/src/components/Divider/Divider.test.tsx b/packages/shared/src/components/Divider/Divider.test.tsx deleted file mode 100644 index e11a038c..00000000 --- a/packages/shared/src/components/Divider/Divider.test.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { describe, expect, it } from 'vitest'; - -import { render, screen } from '@testing-library/react'; - -import Divider from './Divider'; - -describe('Divider', () => { - it('should render successfully', async () => { - // ARRANGE - render(); - await screen.findByTestId('divider'); - - // ASSERT - expect(screen.getByTestId('divider')).toBeDefined(); - }); - - it('should use testid', async () => { - // ARRANGE - render(); - await screen.findByTestId('my-divider'); - - // ASSERT - expect(screen.getByTestId('my-divider')).toBeDefined(); - }); - - it('should use className', async () => { - // ARRANGE - render(); - await screen.findByTestId('divider'); - - // ASSERT - expect(screen.getByTestId('divider')).toHaveClass('my-className'); - }); -}); diff --git a/packages/shared/src/components/Divider/Divider.tsx b/packages/shared/src/components/Divider/Divider.tsx deleted file mode 100644 index d1d3703e..00000000 --- a/packages/shared/src/components/Divider/Divider.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@react-starter/shared/types/components'; - -/** - * The `Divider` component renders a horizontal line which visually separates - * content. - */ -const Divider = ({ className, testId = 'divider' }: BaseComponentProps) => { - return
    ; -}; - -export default Divider; diff --git a/packages/shared/src/components/Dropdown/DropdownMenu.test.tsx b/packages/shared/src/components/Dropdown/DropdownMenu.test.tsx deleted file mode 100644 index 4d3ffcf9..00000000 --- a/packages/shared/src/components/Dropdown/DropdownMenu.test.tsx +++ /dev/null @@ -1,173 +0,0 @@ -import { describe, expect, it, vi } from 'vitest'; -import userEvent from '@testing-library/user-event'; - -import { render, screen, waitFor } from '@testing-library/react'; - -import DropdownMenu from './DropdownMenu'; - -describe('DropdownMenu', () => { - const mockClickFn = vi.fn(); - - it('should render successfully', async () => { - // ARRANGE - render( - - Open - - Heading - - Item - - , - ); - await screen.findByTestId('dropdown-menu'); - - // ASSERT - expect(screen.getByTestId('dropdown-menu')).toBeDefined(); - }); - - it('should have content hidden by default', async () => { - // ARRANGE - render( - - Open - - Heading - - Item - - , - ); - await screen.findByTestId('dropdown-menu-content'); - - // ASSERT - expect(screen.getByTestId('dropdown-menu-content')).toHaveClass('hidden'); - }); - - it('should display content when trigger clicked', async () => { - // ARRANGE - const user = userEvent.setup(); - render( - - Open - - Heading - - Item - - , - ); - await screen.findByTestId('dropdown-menu-trigger'); - - // ACT - await user.click(screen.getByTestId('dropdown-menu-trigger')); - await waitFor(() => expect(screen.getByTestId('dropdown-menu-content')).not.toHaveClass('hidden')); - - // ASSERT - expect(screen.getByTestId('dropdown-menu-content')).not.toHaveClass('hidden'); - }); - - it('should hide content when backdrop clicked', async () => { - // ARRANGE - const user = userEvent.setup(); - render( - - Open - - Heading - - Item - - , - ); - await screen.findByTestId('dropdown-menu-trigger'); - - // ACT - /* first, open the dropdown menu */ - await user.click(screen.getByTestId('dropdown-menu-trigger')); - await waitFor(() => expect(screen.getByTestId('dropdown-menu-content')).not.toHaveClass('hidden')); - /* then, click the backdrop */ - await user.click(screen.getByTestId('dropdown-menu-content-backdrop')); - await waitFor(() => expect(screen.getByTestId('dropdown-menu-content')).toHaveClass('hidden')); - - // ASSERT - expect(screen.getByTestId('dropdown-menu-content')).toHaveClass('hidden'); - }); - - it('should display heading', async () => { - // ARRANGE - render( - - Open - - Heading - - Item - - , - ); - await screen.findByTestId('dropdown-menu-heading'); - - // ASSERT - expect(screen.getByTestId('dropdown-menu-heading')).toHaveTextContent(/Heading/); - }); - - it('should display separator', async () => { - // ARRANGE - render( - - Open - - Heading - - Item - - , - ); - await screen.findByTestId('dropdown-menu-separator'); - - // ASSERT - expect(screen.getByTestId('dropdown-menu-separator')).toBeDefined(); - }); - - it('should display item', async () => { - // ARRANGE - render( - - Open - - Heading - - Item - - , - ); - await screen.findByTestId('dropdown-menu-item'); - - // ASSERT - expect(screen.getByTestId('dropdown-menu-item')).toHaveTextContent(/Item/); - }); - - it('should call item click function when clicked', async () => { - // ARRANGE - const user = userEvent.setup(); - render( - - Open - - Heading - - Item - - , - ); - await screen.findByTestId('dropdown-menu-item'); - - // ACT - await user.click(screen.getByTestId('dropdown-menu-item')); - await waitFor(() => expect(mockClickFn).toHaveBeenCalledTimes(1)); - - // ASSERT - expect(mockClickFn).toHaveBeenCalledTimes(1); - }); -}); diff --git a/packages/shared/src/components/Dropdown/DropdownMenu.tsx b/packages/shared/src/components/Dropdown/DropdownMenu.tsx deleted file mode 100644 index b9af61bf..00000000 --- a/packages/shared/src/components/Dropdown/DropdownMenu.tsx +++ /dev/null @@ -1,175 +0,0 @@ -import { createContext, PropsWithChildren, useContext, useState } from 'react'; -import noop from 'lodash/noop'; - -import { BaseComponentProps } from '@react-starter/shared/types/components'; -import { cn } from '@react-starter/shared/utils/css'; -import Backdrop from '../Backdrop/Backdrop'; -import Divider from '../Divider/Divider'; - -/** - * Defines the properties of the DropdownMenuContext value. - */ -type DropdownMenuContextValue = { - isHidden: boolean; - setIsHidden: (isHidden: boolean) => void; -}; - -/** - * The DropdownMenuContext instance. - */ -const DropdownMenuContext = createContext({ - isHidden: true, - setIsHidden: noop, -}); - -/** - * Properties for the DropdownMenu component. - */ -export interface DropdownMenuProps extends BaseComponentProps, PropsWithChildren {} - -/** - * The `DropdownMenu` component displays a context menu adjacent to the element - * which triggers the display of the menu. - * - * **Example:** - * ``` - - - - - - Languages - - setLanguage('en')} testId="dropdown-item-en"> - English - - setLanguage('fr')} testId="dropdown-item-fr"> - French - - setLanguage('es')} testId="dropdown-item-es"> - Spanish - - - - * ``` - */ -const DropdownMenu = ({ children, className, testId = 'dropdown-menu' }: DropdownMenuProps) => { - const [isHidden, setIsHidden] = useState(true); - - return ( -
    - {children} -
    - ); -}; - -/** - * The `Trigger` component wraps the element used to open - * a DropdownMenu. There should be 1 `Trigger` within a - * DropdownMenu. - */ -const Trigger = ({ children, className, testId = 'dropdown-menu-trigger' }: BaseComponentProps & PropsWithChildren) => { - const { isHidden, setIsHidden } = useContext(DropdownMenuContext); - - return ( -
    setIsHidden(!isHidden)} - data-testid={testId} - > - {children} -
    - ); -}; -DropdownMenu.Trigger = Trigger; - -/** - * The `Content` component wraps the contents of a DropdownMenu including, - * headings, menu items, etc. There should be 1 `Content` within a - * DropdownMenu. - */ -const Content = ({ children, className, testId = 'dropdown-menu-content' }: BaseComponentProps & PropsWithChildren) => { - const { isHidden, setIsHidden } = useContext(DropdownMenuContext); - - return ( - <> - setIsHidden(true)} - testId={`${testId}-backdrop`} - /> -
    - {children} -
    - - ); -}; -DropdownMenu.Content = Content; - -/** - * Properties for the `Item` component. - */ -export interface ItemProps extends BaseComponentProps, PropsWithChildren { - onClick?: () => void; -} - -/** - * The `Item` component renders a single, clickable menu item within a - * DropdownMenu. - */ -const Item = ({ children, className, onClick, testId = 'dropdown-menu-item' }: ItemProps) => { - const { isHidden, setIsHidden } = useContext(DropdownMenuContext); - - const handleClick = () => { - onClick?.(); - setIsHidden(!isHidden); - }; - - return ( -
    - {children} -
    - ); -}; -DropdownMenu.Item = Item; - -/** - * The `Heading` component renders a heading within a DropdownMenu. This is - * useful for describing a group of related menu items. - */ -const Heading = ({ children, className, testId = 'dropdown-menu-heading' }: BaseComponentProps & PropsWithChildren) => { - return ( -
    - {children} -
    - ); -}; -DropdownMenu.Heading = Heading; - -/** - * The `Separator` component renders a horizontal divider within a DropdownMenu. - * This is useful to organize and separate groups of related menu items. - */ -const Separator = ({ className, testId = 'dropdown-menu-separator' }: BaseComponentProps) => { - return ; -}; -DropdownMenu.Separator = Separator; - -export default DropdownMenu; diff --git a/packages/shared/src/components/Form/Checkbox.test.tsx b/packages/shared/src/components/Form/Checkbox.test.tsx deleted file mode 100644 index 3852b9c7..00000000 --- a/packages/shared/src/components/Form/Checkbox.test.tsx +++ /dev/null @@ -1,120 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import userEvent from '@testing-library/user-event'; -import { useForm } from 'react-hook-form'; -import { zodResolver } from '@hookform/resolvers/zod'; -import { z } from 'zod'; - -import { render, screen } from '@testing-library/react'; - -import Checkbox, { CheckboxProps } from './Checkbox'; - -const formSchema = z.object({ - isEnabled: z.boolean().refine((val) => val === true, { message: 'Required' }), -}); - -type FormValues = z.infer; - -/** - * A wrapper for testing the `Checkbox` component which requires some - * react-hook-form objects passed as props. - */ -const CheckboxWrapper = (props: Omit, 'control'>) => { - const form = useForm({ - defaultValues: { isEnabled: false }, - resolver: zodResolver(formSchema), - }); - - const onSubmit = () => {}; - - return ( -
    - - - - ); -}; - -describe('Checkbox', () => { - it('should render successfully', async () => { - // ARRANGE - render(); - await screen.findByTestId('checkbox'); - - // ASSERT - expect(screen.getByTestId('checkbox')).toBeDefined(); - }); - - it('should show label', async () => { - // ARRANGE - const labelText = 'Enable'; - render(); - await screen.findByTestId('checkbox-label'); - - // ASSERT - const checkboxLabel = screen.getByTestId('checkbox-label'); - expect(checkboxLabel).toHaveTextContent(labelText); - }); - - it('should be checked when clicked', async () => { - // ARRANGE - const user = userEvent.setup(); - render(); - await screen.findByTestId('checkbox'); - - const checkboxButton = screen.getByTestId('checkbox-button'); - expect(checkboxButton).toHaveAttribute('aria-checked', 'false'); - - // ACT - await user.click(checkboxButton); - - // ASSERT - expect(checkboxButton).toHaveAttribute('aria-checked', 'true'); - expect(checkboxButton).toHaveClass('bg-blue-600'); - const checkIcon = screen.queryByTestId('checkbox-icon'); - expect(checkIcon).toBeInTheDocument(); - }); - - it('should display validation error', async () => { - // ARRANGE - const user = userEvent.setup(); - render(); - await screen.findByTestId('checkbox'); - - const checkboxButton = screen.getByTestId('checkbox-button'); - expect(checkboxButton).toHaveAttribute('aria-checked', 'false'); - - // ACT - const submitButton = screen.getByTestId('button-submit'); - await user.click(submitButton); - - // ASSERT - const errorMessage = screen.getByTestId('checkbox-error'); - expect(errorMessage).toHaveTextContent(/required/i); - }); - - it('should be disabled when disabled prop is true', async () => { - // ARRANGE - render(); - await screen.findByTestId('checkbox'); - - // ASSERT - const checkboxButton = screen.getByTestId('checkbox-button'); - expect(checkboxButton).toHaveAttribute('aria-disabled', 'true'); - expect(checkboxButton).toHaveClass('cursor-not-allowed'); - expect(checkboxButton).toHaveClass('opacity-50'); - expect(checkboxButton).toBeDisabled(); - }); - - it('should display supporting text', async () => { - // ARRANGE - const supportingText = 'This is a supporting text'; - render(); - await screen.findByTestId('checkbox'); - - // ASSERT - const checkboxSupportingText = screen.getByTestId('checkbox-supporting-text'); - expect(checkboxSupportingText).toHaveTextContent(supportingText); - }); -}); diff --git a/packages/shared/src/components/Form/Checkbox.tsx b/packages/shared/src/components/Form/Checkbox.tsx deleted file mode 100644 index 7b8ecf8b..00000000 --- a/packages/shared/src/components/Form/Checkbox.tsx +++ /dev/null @@ -1,102 +0,0 @@ -import { Control, FieldValues, Path, useController } from 'react-hook-form'; -import { cva } from 'class-variance-authority'; - -import { BaseComponentProps } from '@react-starter/shared/types/components'; -import { cn } from '@react-starter/shared/utils/css'; -import Label from './Label'; -import FieldError from './FieldError'; -import HelpText from '../Text/HelpText'; -import FAIcon from '../Icon/FAIcon'; - -/** - * Define the `Checkbox` component base and variant styles. - */ -const checkboxVariants = cva('flex size-4 appearance-none items-center justify-center rounded-sm', { - variants: { - checked: { - true: 'bg-blue-600', - false: 'bg-gray-300', - }, - disabled: { - true: 'cursor-not-allowed opacity-50', - false: 'cursor-pointer', - }, - }, - defaultVariants: { - checked: false, - disabled: false, - }, -}); - -/** - * Properties for the `Checkbox` component. - * @param {Control} control - Object containing methods for registering components - * into React Hook Form. - * @param {boolean} [disabled] - Optional. Indicates if the checkbox is disabled. Default: `false` - * @param {string} label - The label text. - * @param {string} name - Name of the form control. - * @param {boolean} [required] - Optional. Indicates if the checkbox is required. Default: `false` - * @param {string} [supportingText] - Optional. Help text or instructions. - */ -export interface CheckboxProps extends BaseComponentProps { - control: Control; - disabled?: boolean; - label: string; - name: string; - required?: boolean; - supportingText?: string; -} - -/** - * The `Checkbox` component renders a button that serves as a checkbox input. - * It is used to capture boolean input from a user. - */ -const Checkbox = ({ - className, - control, - disabled = false, - label, - name, - required = false, - supportingText, - testId = 'checkbox', -}: CheckboxProps) => { - const { field, fieldState } = useController({ control, name: name as Path }); - const isChecked = field.value === true; - - const handleClick = () => { - if (!disabled) { - field.onChange(!isChecked); - } - }; - - return ( -
    -
    - - -
    -
    - - {supportingText && {supportingText}} -
    -
    - ); -}; - -export default Checkbox; diff --git a/packages/shared/src/components/Form/FieldError.test.tsx b/packages/shared/src/components/Form/FieldError.test.tsx deleted file mode 100644 index 9e28363f..00000000 --- a/packages/shared/src/components/Form/FieldError.test.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { describe, expect, it } from 'vitest'; - -import { render, screen } from '@testing-library/react'; - -import FieldError from './FieldError'; - -describe('FieldError', () => { - it('should render successfully', async () => { - // ARRANGE - render(); - await screen.findByTestId('field-error'); - - // ASSERT - expect(screen.getByTestId('field-error')).toBeDefined(); - }); - - it('should display message', async () => { - // ARRANGE - render(); - await screen.findByTestId('field-error'); - - // ASSERT - expect(screen.getByTestId('field-error')).toHaveTextContent('My Message'); - }); - - it('should not render when no message', async () => { - // ARRANGE - render( -
    - -
    , - ); - await screen.findByTestId('wrapper'); - - // ASSERT - expect(screen.queryByTestId('field-error')).toBeNull(); - }); -}); diff --git a/packages/shared/src/components/Form/FieldError.tsx b/packages/shared/src/components/Form/FieldError.tsx deleted file mode 100644 index 4f5c6d08..00000000 --- a/packages/shared/src/components/Form/FieldError.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@react-starter/shared/types/components'; - -/** - * Properties for the `FieldError` component. - * @param {string} [message] - The error message. - * @see {@link BaseComponentProps} - */ -export interface FieldErrorProps extends BaseComponentProps { - message?: string; -} - -/** - * The `FieldError` component renders a styled error message for a form field. - * @param {FieldErrorProps} props - Component properties. - */ -const FieldError = ({ className, message, testId = 'field-error' }: FieldErrorProps) => { - if (message) { - return ( -
    - {message} -
    - ); - } else { - return false; - } -}; - -export default FieldError; diff --git a/packages/shared/src/components/Form/Input.test.tsx b/packages/shared/src/components/Form/Input.test.tsx deleted file mode 100644 index afa99b80..00000000 --- a/packages/shared/src/components/Form/Input.test.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import userEvent from '@testing-library/user-event'; -import { useForm } from 'react-hook-form'; -import { z } from 'zod'; -import { zodResolver } from '@hookform/resolvers/zod'; - -import { render, screen } from '@testing-library/react'; - -import Input, { InputProps } from './Input'; - -const formSchema = z.object({ - color: z.string().min(1, { message: 'Required' }), -}); - -type FormValues = z.infer; - -/** - * A wrapper for testing the `Input` component which requires some - * react-hook-form objects passed as props. - */ -const InputWrapper = (props: Omit, 'control'>) => { - const form = useForm({ - defaultValues: { color: '' }, - resolver: zodResolver(formSchema), - }); - - const onSubmit = () => {}; - - return ( -
    - - -
    - ); -}; - -describe('Input', () => { - it('should render successfully', async () => { - // ARRANGE - render(); - await screen.findByTestId('input'); - - // ASSERT - expect(screen.getByTestId('input')).toBeDefined(); - }); - - it('should show label', async () => { - // ARRANGE - const label = 'Label text'; - render(); - await screen.findByTestId('input-label'); - - // ASSERT - expect(screen.getByTestId('input-label')).toHaveTextContent(label); - }); - - it('should show supporting text', async () => { - // ARRANGE - const supportingText = 'Supporting text'; - render(); - await screen.findByTestId('input-supporting-text'); - - // ASSERT - expect(screen.getByTestId('input-supporting-text')).toHaveTextContent(supportingText); - }); - - it('should show error message', async () => { - // ARRANGE - const user = userEvent.setup(); - render(); - await screen.findByTestId('button-submit'); - - // ACT - await user.click(screen.getByTestId('button-submit')); - await screen.findByTestId('input-error'); - - // ASSERT - expect(screen.getByTestId('input-error')).toHaveTextContent(/required/i); - }); -}); diff --git a/packages/shared/src/components/Form/Input.tsx b/packages/shared/src/components/Form/Input.tsx deleted file mode 100644 index d2e3e4a5..00000000 --- a/packages/shared/src/components/Form/Input.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import { InputHTMLAttributes } from 'react'; -import { Control, FieldValues, Path, useController } from 'react-hook-form'; - -import { cn } from '@react-starter/shared/utils/css'; -import { PropsWithTestId } from '@react-starter/shared/types/components'; -import Label from './Label'; -import FieldError from './FieldError'; -import HelpText from '../Text/HelpText'; - -/** - * Properties for the `Input` component. - * @param {Control} control - Object containing methods for registering components - * into React Hook Form. - * @param {string} [label] - Optional. The label text to display. - * @param {string} name - Name of the form control. - * @param {string} [supportingText] - Optional. Help text or instructions. - * @see {@link PropsWithTestId} - * @see {@link InputHTMLAttributes} - */ -export interface InputProps extends InputHTMLAttributes, PropsWithTestId { - control: Control; - label?: string; - name: string; - supportingText?: string; -} - -/** - * The `Input` component renders an HTML `input` element. It is used to capture - * single line text input from a user. - * @param {InputProps} props - Component properties. - */ -const Input = ({ - className, - control, - label, - name, - supportingText, - testId = 'input', - ...props -}: InputProps) => { - const { field, fieldState } = useController({ control, name: name as Path }); - const isDisabled = props.disabled || props.readOnly; - - return ( -
    - {!!label && ( - - )} - - - {!!supportingText && {supportingText}} -
    - ); -}; - -export default Input; diff --git a/packages/shared/src/components/Form/Label.test.tsx b/packages/shared/src/components/Form/Label.test.tsx deleted file mode 100644 index 1bc7c53c..00000000 --- a/packages/shared/src/components/Form/Label.test.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { describe, expect, it } from 'vitest'; - -import { render, screen } from '@testing-library/react'; - -import Label from './Label'; - -describe('Label', () => { - it('should render successfully', async () => { - // ARRANGE - render(); - await screen.findByTestId('label'); - - // ASSERT - expect(screen.getByTestId('label')).toBeDefined(); - }); - - it('should display label text', async () => { - // ARRANGE - const value = 'Text'; - render(); - await screen.findByTestId('label'); - - // ASSERT - expect(screen.getByTestId('label')).toHaveTextContent(value); - }); - - it('should display required label', async () => { - // ARRANGE - const value = 'Text'; - render(); - await screen.findByTestId('label'); - - // ASSERT - const label = screen.getByTestId('label'); - expect(label).toHaveTextContent(value); - expect(label).toHaveClass('font-bold'); - expect(label).toHaveClass('after:content-["*"]'); - }); -}); diff --git a/packages/shared/src/components/Form/Label.tsx b/packages/shared/src/components/Form/Label.tsx deleted file mode 100644 index 2621e5ff..00000000 --- a/packages/shared/src/components/Form/Label.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { LabelHTMLAttributes } from 'react'; -import { cva } from 'class-variance-authority'; - -import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@react-starter/shared/types/components'; - -/** - * Define the `Label` component base and variant styles. - */ -const labelVariants = cva('mb-1 block text-sm', { - variants: { - required: { - true: 'font-bold after:content-["*"]', - false: 'font-medium', - }, - }, - defaultVariants: { - required: false, - }, -}); - -/** - * Properties for the `Label` component. - * @param {boolean} [required] - Optional. Indicates if the label is for a required field. - * Default: `false` - * @see {@link BaseComponentProps} - * @see {@link LabelHTMLAttributes} - */ -export interface LabelProps extends BaseComponentProps, LabelHTMLAttributes { - required?: boolean; -} - -/** - * The `Label` component renders a HTML `label` element. It is used to describe - * a form control. - */ -const Label = ({ children, className, required = false, testId = 'label', ...props }: LabelProps) => { - return ( - - ); -}; - -export default Label; diff --git a/packages/shared/src/components/Form/RadioGroup.test.tsx b/packages/shared/src/components/Form/RadioGroup.test.tsx deleted file mode 100644 index 40ba95ad..00000000 --- a/packages/shared/src/components/Form/RadioGroup.test.tsx +++ /dev/null @@ -1,135 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import userEvent from '@testing-library/user-event'; -import { z } from 'zod'; -import { zodResolver } from '@hookform/resolvers/zod'; -import { useForm } from 'react-hook-form'; - -import { render, screen } from '@testing-library/react'; - -import RadioGroup, { RadioGroupProps } from './RadioGroup'; - -const formSchema = z.object({ - color: z.string().refine((val) => ['blue', 'red', 'yellow'].includes(val), { - message: 'Must select a primary color.', - }), -}); -type FormValues = z.infer; - -/** - * A wrapper for testing the `RadioGroup` component which requires some - * react-hook-form objects passed as props. - */ -const RadioGroupWrapper = (props: Omit, 'control'>) => { - const form = useForm({ - defaultValues: {}, - resolver: zodResolver(formSchema), - }); - - const onSubmit = () => {}; - - return ( -
    - - - - ); -}; - -describe('RadioGroup', () => { - it('should render successfully', async () => { - // ARRANGE - render( - - - - - - , - ); - await screen.findByTestId('radio-group'); - - // ASSERT - expect(screen.getByTestId('radio-group')).toBeDefined(); - }); - - it('should render label', async () => { - // ARRANGE - render( - - - - - - , - ); - await screen.findByTestId('radio-group-label'); - - // ASSERT - expect(screen.getByTestId('radio-group-label')).toHaveTextContent(/Color/i); - }); - - it('should render supporting text', async () => { - // ARRANGE - render( - - - - - - , - ); - await screen.findByTestId('radio-group-supporting-text'); - - // ASSERT - expect(screen.getByTestId('radio-group-supporting-text')).toHaveTextContent(/Select a color/i); - }); - - it('should select an option', async () => { - // ARRANGE - const user = userEvent.setup(); - render( - - - - - - , - ); - await screen.findByTestId('color-blue'); - - // ACT - const blueItem = screen.getByTestId('color-blue'); - await user.click(blueItem); - - // ASSERT - const blueItemIcon = screen.getByTestId('color-blue-icon'); - expect(blueItemIcon).toHaveAttribute('data-icon', 'circle-dot'); - }); - - it('should display error message', async () => { - // ARRANGE - const user = userEvent.setup(); - render( - - - - - - , - ); - await screen.findByTestId('color-green'); - - // ACT - const greenItem = screen.getByTestId('color-green'); - await user.click(greenItem); - const submitButton = screen.getByTestId('button-submit'); - await user.click(submitButton); - - // ASSERT - const fieldError = screen.getByTestId('radio-group-error'); - expect(fieldError).toBeInTheDocument(); - expect(fieldError).toHaveTextContent(/Must select a primary color/i); - }); -}); diff --git a/packages/shared/src/components/Form/RadioGroup.tsx b/packages/shared/src/components/Form/RadioGroup.tsx deleted file mode 100644 index 3c95a9af..00000000 --- a/packages/shared/src/components/Form/RadioGroup.tsx +++ /dev/null @@ -1,191 +0,0 @@ -import { createContext, InputHTMLAttributes, useContext } from 'react'; -import { Control, FieldValues, Path, useController } from 'react-hook-form'; -import { cva } from 'class-variance-authority'; -import noop from 'lodash/noop'; - -import { PropsWithTestId } from '@react-starter/shared/types/components'; -import { cn } from '@react-starter/shared/utils/css'; -import Label from './Label'; -import FieldError from './FieldError'; -import HelpText from '../Text/HelpText'; -import FAIcon from '../Icon/FAIcon'; - -/** - * Defines the shape of the `RadioGroupContext` value. - * This context is used to share state and methods between the `RadioGroup` - * and its items. - */ -type RadioGroupContextValue = { - disabled?: boolean; - name: string; - setValue: (val: string) => void; - value?: string; -}; - -/** - * The `RadioGroupContext` instance. - */ -const RadioGroupContext = createContext({ - disabled: false, - name: '', - setValue: noop, - value: undefined, -}); - -/** - * Define the `RadioGroup` options list base and variant styles. - */ -const radioGroupOptionsVariants = cva('flex', { - variants: { - orientation: { - horizontal: 'flex-row gap-8', - vertical: 'flex-col gap-2', - }, - }, - defaultVariants: { - orientation: 'vertical', - }, -}); - -/** - * Properties for the `RadioGroup` component. - * @param {Control} control - Object containing methods for registering components - * into React Hook Form. - * @param {string} [label] - Optional. The label text to display. - * @param {string} name - Name of the form control. - * @param {string} [orientation] - Optional. Orientation of the radio group. - * @param {string} [supportingText] - Optional. Help text or instructions. - * @see {@link PropsWithTestId} - * @see {@link InputHTMLAttributes} - */ -export interface RadioGroupProps - extends - Pick, 'children' | 'className' | 'disabled' | 'required'>, - PropsWithTestId { - control: Control; - label?: string; - name: string; - orientation?: 'horizontal' | 'vertical'; - supportingText?: string; -} - -/** - * The `RadioGroup` component renders a group of radio buttons. It is used to - * capture a single choice from a set of options. - */ -const RadioGroup = ({ - children, - className, - control, - disabled = false, - label, - name, - orientation = 'vertical', - required = false, - supportingText, - testId = 'radio-group', -}: RadioGroupProps) => { - const { field, fieldState } = useController({ control, name: name as Path }); - - return ( -
    - {!!label && ( - - )} - -
    {children}
    -
    -
    - - {!!supportingText && {supportingText}} -
    -
    - ); -}; - -/** - * Define the `RadioGroup` item base and variant styles. - */ -const radioGroupItemVariants = cva('flex items-center', { - variants: { - disabled: { - true: 'opacity-50 cursor-not-allowed', - false: 'cursor-pointer', - }, - }, - defaultVariants: { - disabled: false, - }, -}); - -/** - * Properties for the `RadioGroup.Item` component. - * @param {string} [className] - Optional. Additional class names. - * @param {boolean} [disabled] - Optional. Disables the radio button. - * @param {string} id - Required. The unique identifier for the radio button. - * @param {string} label - The label text for the radio button. - * @param {string} [testId] - Optional. The test ID for the radio button. - * @param {string} [value] - The value of the radio button. - * @see {@link PropsWithTestId} - * @see {@link InputHTMLAttributes} - */ -interface RadioGroupItemProps - extends - Pick, 'className' | 'disabled' | 'value'>, - Required, 'id'>>, - PropsWithTestId { - label: string; -} - -/** - * The `Item` component renders a single radio button within - * a `RadioGroup`. It is used to represent an individual option in the group. - */ -const Item = ({ className, disabled = false, id, testId = 'radio-group-item', ...props }: RadioGroupItemProps) => { - const { disabled: groupDisabled, name, setValue, value: currentValue } = useContext(RadioGroupContext); - const isChecked = currentValue === props.value; - const isDisabled = disabled || groupDisabled; - - const handleChange = () => { - if (!isDisabled) { - setValue(props.value as string); - } - }; - - return ( -
    - - - -
    - ); -}; -RadioGroup.Item = Item; - -export default RadioGroup; diff --git a/packages/shared/src/components/Form/SearchInput.test.tsx b/packages/shared/src/components/Form/SearchInput.test.tsx deleted file mode 100644 index 75b4ac1f..00000000 --- a/packages/shared/src/components/Form/SearchInput.test.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import { describe, expect, it, vi } from 'vitest'; -import { render, screen } from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; - -import SearchResult from './SearchResult'; - -import SearchInput from './SearchInput'; - -describe('SearchInput', () => { - const mockOnChange = vi.fn(); - const searchResults = [ - {}} key="1"> - Apples - , - ]; - - it('should render successfully', async () => { - // ARRANGE - render(); - await screen.findByTestId('input-search'); - - // ASSERT - expect(screen.getByTestId('input-search')).toBeDefined(); - }); - - it('should use custom testId', async () => { - // ARRANGE - render(); - await screen.findByTestId('custom-testId'); - - // ASSERT - expect(screen.getByTestId('custom-testId')).toBeDefined(); - }); - - it('should use custom className', async () => { - // ARRANGE - render(); - await screen.findByTestId('input-search'); - - // ASSERT - expect(screen.getByTestId('input-search').classList).toContain('custom-className'); - }); - - it('should display supporting text', async () => { - // ARRANGE - render(); - await screen.findByTestId('input-search-supporting-text'); - - // ASSERT - expect(screen.getByTestId('input-search-supporting-text').textContent).toBe('supporting'); - }); - - it('should display error text', async () => { - // ARRANGE - render(); - await screen.findByTestId('input-search-error'); - - // ASSERT - expect(screen.getByTestId('input-search-error').textContent).toBe('error'); - }); - - it('should call onChange when input changes', async () => { - // ARRANGE - render(); - await screen.findByTestId('input-search'); - - // input - await userEvent.type(screen.getByTestId('input-search-input'), 'test'); - - // ASSERT - expect(screen.getByTestId('input-search-input').value).toBe('test'); - expect(mockOnChange).toHaveBeenCalledWith('test'); - }); -}); diff --git a/packages/shared/src/components/Form/SearchInput.tsx b/packages/shared/src/components/Form/SearchInput.tsx deleted file mode 100644 index d52ad1c4..00000000 --- a/packages/shared/src/components/Form/SearchInput.tsx +++ /dev/null @@ -1,117 +0,0 @@ -import { ChangeEvent, type JSX, useEffect, useRef } from 'react'; - -import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@react-starter/shared/types/components'; -import FAIcon from '@react-starter/shared/components/Icon/FAIcon'; - -/** - * Properties for the `SearchInput` React component. - * @param {string} [errorText] - Optional. Error message. - * @param {boolean} [isLoading] - Optional. Indicates if the results are loading. - * Default: `false` - * @param {function} onChange - Function invoked when the input value changes. - * @param {JSX.Element[]} [searchResults] - Optional. An array of `SearchResult` - * components. - * @param {string} [supportingText] - Optional. Help text. - * @see {@link BaseComponentProps} - */ -export interface SearchInputProps extends BaseComponentProps { - errorText?: string; - isLoading?: boolean; - onChange: (value: string) => void; - searchResults?: JSX.Element[]; - supportingText?: string; -} - -/** - * The `SearchINput` component renders a search input field. The - * component consists of a leading icon, a trailing icon, and an input field. - * - * The component invokes the supplied `onChange` function as the value of - * the input field changes. This allows the parent component to load data - * using the input field value. - * - * The parent component may optioanally set `isLoading` to `true` when - * search results are loaded asynchronously to display a loading state - * indicator. - * - * The parent component supplies the rendered search results in the - * `searchResults` property. It is recommended to use the `SearchResult` - * component. - * - * @param {SearchInputProps} props - Component properties. - */ -const SearchInput = ({ - className, - errorText, - isLoading = false, - onChange, - searchResults, - supportingText, - testId = 'input-search', -}: SearchInputProps) => { - const inputRef = useRef(null); - - /** - * Handle input field value changes. - * @param e - The change event for the input field. - */ - const doOnChange = (e: ChangeEvent) => { - onChange(e.target.value); - }; - - /** - * Focus the cursor within the input field. - */ - const doFocus = () => { - inputRef.current?.focus(); - }; - - /** - * Focus on initial render. - */ - useEffect(() => { - doFocus(); - }, []); - - return ( -
    -
    - - - -
    - -
    - {!!errorText && ( -
    - {errorText} -
    - )} - {!!supportingText && ( -
    - {supportingText} -
    - )} -
    - -
    {searchResults}
    -
    - ); -}; - -export default SearchInput; diff --git a/packages/shared/src/components/Form/SearchResult.test.tsx b/packages/shared/src/components/Form/SearchResult.test.tsx deleted file mode 100644 index c3503b7a..00000000 --- a/packages/shared/src/components/Form/SearchResult.test.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { describe, expect, it, vi } from 'vitest'; -import { render, screen } from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; - -import SearchResult from './SearchResult'; - -describe('SearchResult', () => { - const mockOnClick = vi.fn(); - - it('should render successfully', async () => { - // ARRANGE - render(); - await screen.findByTestId('search-result'); - - // ASSERT - expect(screen.getByTestId('search-result')).toBeDefined(); - }); - - it('should use custom testId', async () => { - // ARRANGE - render(); - await screen.findByTestId('custom-testId'); - - // ASSERT - expect(screen.getByTestId('custom-testId')).toBeDefined(); - }); - - it('should use custom className', async () => { - // ARRANGE - render(); - await screen.findByTestId('search-result'); - - // ASSERT - expect(screen.getByTestId('search-result').classList).toContain('custom-className'); - }); - - it('should render children', async () => { - // ARRANGE - render( - -
    -
    , - ); - await screen.findByTestId('child'); - - // ASSERT - expect(screen.getByTestId('child')).toBeDefined(); - }); - - it('should call onClick when clicked', async () => { - // ARRANGE - render(); - await screen.findByTestId('search-result'); - - // ACT - await userEvent.click(screen.getByTestId('search-result')); - - // ASSERT - expect(mockOnClick).toHaveBeenCalledTimes(1); - }); -}); diff --git a/packages/shared/src/components/Form/SearchResult.tsx b/packages/shared/src/components/Form/SearchResult.tsx deleted file mode 100644 index 4eb9ae60..00000000 --- a/packages/shared/src/components/Form/SearchResult.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { PropsWithChildren } from 'react'; - -import { BaseComponentProps } from '@react-starter/shared/types/components'; -import { cn } from '@react-starter/shared/utils/css'; - -/** - * Properties for the `SearchResult` React component. - * @param {function} onClick - Function invoked when this `SearchResult` is clicked. - * @see {@link PropsWithChildren} - * @see {@link BaseComponentProps} - */ -export interface SearchResultProps extends BaseComponentProps, PropsWithChildren { - onClick: () => void; -} - -/** - * The `SearchResult` component renders a single result item for a `SearchField`. - * - * This component is **always** used in conjunction with a `SearchField`, - * specifically in the `renderSearchResults` render function. - * @param {SearchResultProps} props - Component properties, `SearchResultProps`. - */ -const SearchResult = ({ children, className, onClick, testId = 'search-result' }: SearchResultProps) => { - return ( -
    - {children} -
    - ); -}; - -export default SearchResult; diff --git a/packages/shared/src/components/Form/Select.test.tsx b/packages/shared/src/components/Form/Select.test.tsx deleted file mode 100644 index 8199dc9c..00000000 --- a/packages/shared/src/components/Form/Select.test.tsx +++ /dev/null @@ -1,261 +0,0 @@ -import userEvent from '@testing-library/user-event'; -import { describe, expect, it } from 'vitest'; -import { useForm } from 'react-hook-form'; -import { z } from 'zod'; -import { zodResolver } from '@hookform/resolvers/zod'; - -import { render, screen, waitFor } from '@testing-library/react'; - -import Select, { SelectProps } from './Select'; - -const formSchema = z.object({ - color: z.string().refine((val) => ['blue'].includes(val), { message: 'Must select blue.' }), -}); -type FormValues = z.infer; - -/** - * A wrapper for testing the `Select` component which requires some - * react-hook-form objects passed as props. - */ -const SelectWrapper = (props: Omit, 'control'>) => { - const form = useForm({ - defaultValues: {}, - resolver: zodResolver(formSchema), - }); - - const onSubmit = () => {}; - - return ( -
    - - - {!!supportingText && {supportingText}} -
    - ); -}; - -export default Textarea; diff --git a/packages/shared/src/components/Form/Toggle.test.tsx b/packages/shared/src/components/Form/Toggle.test.tsx deleted file mode 100644 index 88d86b18..00000000 --- a/packages/shared/src/components/Form/Toggle.test.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import userEvent from '@testing-library/user-event'; -import { useForm } from 'react-hook-form'; -import { z } from 'zod'; -import { zodResolver } from '@hookform/resolvers/zod'; - -import { describe, expect, it } from 'vitest'; -import { render, screen } from '@testing-library/react'; - -import Toggle, { ToggleProps } from './Toggle'; - -const formSchema = z.object({ - myField: z.boolean().refine((val) => val === false, { - message: 'Must be false.', - }), -}); -type FormValues = z.infer; - -/** - * A wrapper for testing the `Toggle` component which requires some - * react-hook-form objects passed as props. - */ -const ToggleWrapper = (props: Omit, 'control'>) => { - const form = useForm({ - defaultValues: { myField: false }, - resolver: zodResolver(formSchema), - }); - - const onSubmit = () => {}; - - return ( - - - - - ); -}; - -describe('Toggle', () => { - it('should render successfully', async () => { - // ARRANGE - render(); - await screen.findByTestId('toggle'); - - // ASSERT - expect(screen.getByTestId('toggle')).toBeDefined(); - }); - - it('should show label', async () => { - // ARRANGE - const text = 'my label'; - render(); - await screen.findByTestId('toggle-label'); - - // ASSERT - expect(screen.getByTestId('toggle-label')).toHaveTextContent(text); - }); - - it('should show supporting text', async () => { - // ARRANGE - const text = 'my label'; - render(); - await screen.findByTestId('toggle-supporting-text'); - - // ASSERT - expect(screen.getByTestId('toggle-supporting-text')).toHaveTextContent(text); - }); - - it('should show error message', async () => { - // ARRANGE - const user = userEvent.setup(); - render(); - await screen.findByTestId('button-submit'); - - // ACT - await user.click(screen.getByTestId('toggle-button')); - await user.click(screen.getByTestId('button-submit')); - await screen.findByTestId('toggle-error'); - - // ASSERT - expect(screen.getByTestId('toggle-error')).toHaveTextContent(/must be false/i); - }); -}); diff --git a/packages/shared/src/components/Form/Toggle.tsx b/packages/shared/src/components/Form/Toggle.tsx deleted file mode 100644 index 40f09b2a..00000000 --- a/packages/shared/src/components/Form/Toggle.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import { Control, FieldValues, Path, useController } from 'react-hook-form'; - -import { BaseComponentProps } from '@react-starter/shared/types/components'; -import { cn } from '@react-starter/shared/utils/css'; -import FAIcon from '../Icon/FAIcon'; -import Label from './Label'; -import FieldError from './FieldError'; -import HelpText from '../Text/HelpText'; -import Button from '../Button/Button'; - -/** - * Properties for the `Toggle` component. - * @param {Control} control - Object containing methods for registering components - * into React Hook Form. - * @param {boolean} [disabled] - Indicates if the toggle is disabled. Default: false. - * @param {string} [label] - Optional. The label text to display. - * @param {string} name - Name of the form control. - * @param {boolean} [required] - Indicates if the toggle is required. Default: false. - * @param {string} [supportingText] - Optional. Help text or instructions. - * - * @see {@link BaseComponentProps} - */ -export interface ToggleProps extends BaseComponentProps { - control: Control; - disabled?: boolean; - label?: string; - name: string; - required?: boolean; - supportingText?: string; -} - -/** - * The `Toggle` component renders a button form control which may be used for - * binary (true/false) inputs. - */ -const Toggle = ({ - className, - control, - disabled = false, - label, - name, - required = false, - supportingText, - testId = 'toggle', -}: ToggleProps) => { - const { field, fieldState } = useController({ control, name: name as Path }); - - const handleClick = () => { - field.onChange(!field.value); - }; - - return ( -
    - {!!label && ( - - )} - - - {!!supportingText && {supportingText}} -
    - ); -}; - -export default Toggle; diff --git a/packages/shared/src/components/Icon/Avatar.test.tsx b/packages/shared/src/components/Icon/Avatar.test.tsx deleted file mode 100644 index cbf1f61d..00000000 --- a/packages/shared/src/components/Icon/Avatar.test.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import { render, screen } from '@testing-library/react'; - -import Avatar from './Avatar'; - -describe('Avatar', () => { - it('should render successfully', async () => { - // ARRANGE - render(); - await screen.findByTestId('icon-avatar'); - - // ASSERT - expect(screen.getByTestId('icon-avatar')).toBeDefined(); - }); - - it('should render custom testId', async () => { - // ARRANGE - render(); - await screen.findByTestId('custom-testid'); - - // ASSERT - expect(screen.getByTestId('custom-testid')).toBeDefined(); - }); - - it('should render custom className', async () => { - // ARRANGE - render(); - await screen.findByTestId('icon-avatar'); - - // ASSERT - expect(screen.getByTestId('icon-avatar').classList).toContain('custom-classname'); - }); - - it('should render picture', async () => { - // ARRANGE - const imageSource = 'https://placehold.co/32x32.png'; - render(); - await screen.findByTestId('icon-avatar'); - - // ASSERT - expect(screen.getByTestId('icon-avatar').getAttribute('src')).toBe(imageSource); - }); - - it('should render default initial when no value provided', async () => { - // ARRANGE - render(); - await screen.findByTestId('icon-avatar'); - - // ASSERT - expect(screen.getByTestId('icon-avatar').textContent).toBe('?'); - }); -}); diff --git a/packages/shared/src/components/Icon/Avatar.tsx b/packages/shared/src/components/Icon/Avatar.tsx deleted file mode 100644 index b8cf1096..00000000 --- a/packages/shared/src/components/Icon/Avatar.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@react-starter/shared/types/components'; - -/** - * Properties for the `Avatar` component. - * @param {string} [picture] - Optional. An image source. When present, this is used - * as the Avatar image. - * @param {string} value - The value, e.g. a name, title, etc. - * @see {@link BaseComponentProps} - */ -export interface AvatarProps extends BaseComponentProps { - picture?: string; - value: string; -} - -/** - * List of possible background colors for generated Avatars. - */ -const BACKGROUND_COLORS = [ - 'bg-red-600', - 'bg-orange-600', - 'bg-amber-600', - 'bg-yellow-600', - 'bg-lime-600', - 'bg-green-600', - 'bg-emerald-600', - 'bg-teal-600', - 'bg-cyan-600', - 'bg-sky-600', - 'bg-blue-600', - 'bg-indigo-600', - 'bg-violet-600', - 'bg-purple-600', - 'bg-fuchsia-600', - 'bg-pink-600', - 'bg-rose-600', -]; - -/** - * The `Avatar` React component renders an icon which uniquely represents a person or - * thing (e.g. team, group, etc.). - * - * When `picture` is supplied, it will always be used. The `picture` will be used as the `img` - * source and, therefore, may be a URL or a Base64 encoded value. - * - * When `picture` is undefined, the `value` attribute is used to render an `Avatar`. - * - * *Example:* - * ``` - * - * ``` - * @param {AvatarProps} props - Component properties, `AvatarProps`. - */ -const Avatar = ({ className, picture, testId = 'icon-avatar', value }: AvatarProps) => { - if (picture) { - // 'picture' is available - return ( - {value} - ); - } - - // 'picture' NOT available - const trimmedValue = value.trim(); - const initial = trimmedValue ? trimmedValue.charAt(0) : '?'; - const backgroundColor = BACKGROUND_COLORS[trimmedValue.length % BACKGROUND_COLORS.length]; - return ( -
    - {initial} -
    - ); -}; - -export default Avatar; diff --git a/packages/shared/src/components/Link/Link.test.tsx b/packages/shared/src/components/Link/Link.test.tsx deleted file mode 100644 index 4b114ede..00000000 --- a/packages/shared/src/components/Link/Link.test.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import { render, screen } from '@testing-library/react'; - -import Link from './Link'; -import { MemoryRouter } from 'react-router-dom'; - -describe('Link', () => { - const wrapper = ({ children }: { children: React.ReactNode }) => {children}; - - it('should render successfully', async () => { - // ARRANGE - render( - - text - , - { wrapper }, - ); - await screen.findByTestId('link'); - - // ASSERT - expect(screen.getByTestId('link')).toBeDefined(); - }); - - it('should use test id', async () => { - // ARRANGE - render( - - text - , - { wrapper }, - ); - await screen.findByTestId('test'); - - // ASSERT - expect(screen.getByTestId('test')).toBeDefined(); - }); -}); diff --git a/packages/shared/src/components/Link/Link.tsx b/packages/shared/src/components/Link/Link.tsx deleted file mode 100644 index 00dd336e..00000000 --- a/packages/shared/src/components/Link/Link.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { Link as RouterLink, LinkProps as RouterLinkProps } from 'react-router-dom'; - -import { cn } from '@react-starter/shared/utils/css'; -import { PropsWithTestId } from '@react-starter/shared/types/components'; - -/** - * Properties for the `Link` component. - * @see {@link https://reactrouter.com/en/main/components/link | LinkProps} - * @see {@link PropsWithTestId} - */ -export interface LinkProps extends RouterLinkProps, PropsWithTestId {} - -/** - * The `Link` React component formats and renders an `` anchor HTML element using - * the `Link` component from React Router. - */ -const Link = ({ children, className, testId = 'link', ...props }: LinkProps) => { - return ( - - {children} - - ); -}; - -export default Link; diff --git a/packages/shared/src/components/Loader/LoaderSuspense.tsx b/packages/shared/src/components/Loader/LoaderSuspense.tsx index 59965d82..bd4a72fc 100644 --- a/packages/shared/src/components/Loader/LoaderSuspense.tsx +++ b/packages/shared/src/components/Loader/LoaderSuspense.tsx @@ -1,6 +1,6 @@ import { PropsWithChildren, Suspense } from 'react'; -import Spinner from '@react-starter/shared/components/Loader/Spinner'; +import { Spinner } from '@react-starter/shared/components/shadcn/spinner'; /** * The `LoaderSuspense` component renders an animated spinning loader. Typically used @@ -11,9 +11,7 @@ const LoaderSuspense = ({ children }: PropsWithChildren) => { - - Loading... - + Loading...
    } > diff --git a/packages/shared/src/components/Loader/Skeleton.test.tsx b/packages/shared/src/components/Loader/Skeleton.test.tsx deleted file mode 100644 index 83b8737e..00000000 --- a/packages/shared/src/components/Loader/Skeleton.test.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import { render, screen } from '@testing-library/react'; - -import Skeleton from './Skeleton'; - -describe('Skeleton', () => { - it('should render successfully', async () => { - // ARRANGE - render(); - await screen.findByTestId('skeleton'); - - // ASSERT - expect(screen.getByTestId('skeleton')).toBeDefined(); - }); - - it('should render custom testId', async () => { - // ARRANGE - render(); - await screen.findByTestId('test'); - - // ASSERT - expect(screen.getByTestId('test')).toBeDefined(); - }); - - it('should render custom class name', async () => { - // ARRANGE - render(); - await screen.findByTestId('skeleton'); - - // ASSERT - expect(screen.getByTestId('skeleton').classList).toContain('my-class'); - }); -}); diff --git a/packages/shared/src/components/Loader/Skeleton.tsx b/packages/shared/src/components/Loader/Skeleton.tsx deleted file mode 100644 index 26fbd7e4..00000000 --- a/packages/shared/src/components/Loader/Skeleton.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@react-starter/shared/types/components'; - -/** - * The `Skeleton` component renders an animated loader which pulses - * faintly. Typically used when initially loading some data asynchronously. - */ -const Skeleton = ({ className, testId = 'skeleton' }: BaseComponentProps) => { - return ( -
    - ); -}; - -export default Skeleton; diff --git a/packages/shared/src/components/Loader/Spinner.test.tsx b/packages/shared/src/components/Loader/Spinner.test.tsx deleted file mode 100644 index 13417bcb..00000000 --- a/packages/shared/src/components/Loader/Spinner.test.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { describe, expect, it } from 'vitest'; - -import { render, screen, waitFor } from '@testing-library/react'; - -import Spinner from './Spinner'; - -describe('Spinner', () => { - it('should render successfully', async () => { - // ARRANGE - render(); - await screen.findByTestId('my-spinner'); - - // ASSERT - expect(screen.getByTestId('my-spinner')).toBeDefined(); - }); - - it('should render default icon', async () => { - // ARRANGE - render(); - await screen.findByTestId('my-spinner'); - - // ASSERT - expect(screen.getByTestId('my-spinner-icon')).toHaveAttribute('data-icon', 'circle-notch'); - }); - - it('should render custom icon', async () => { - // ARRANGE - render(); - await waitFor(() => expect(screen.getByTestId('my-spinner-icon')).toHaveAttribute('data-icon', 'bars')); - - // ASSERT - expect(screen.getByTestId('my-spinner-icon')).toHaveAttribute('data-icon', 'bars'); - }); - - it('should render text', async () => { - // ARRANGE - render( - - loader text - , - ); - await screen.findByTestId('my-spinner-text'); - - // ASSERT - expect(screen.getByTestId('my-spinner-text')).toHaveTextContent(/loader text/); - }); -}); diff --git a/packages/shared/src/components/Loader/Spinner.tsx b/packages/shared/src/components/Loader/Spinner.tsx deleted file mode 100644 index a9607118..00000000 --- a/packages/shared/src/components/Loader/Spinner.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { PropsWithChildren } from 'react'; - -import { BaseComponentProps } from '@react-starter/shared/types/components'; -import { cn } from '@react-starter/shared/utils/css'; -import FAIcon, { FAIconProps } from '@react-starter/shared/components/Icon/FAIcon'; - -/** - * Properties for the `Spinner` component. - * @param {string} [icon] - Optional. A `FAIconProps` object containing properties - * for the icon. - * @see {@link FAIconProps} - */ -export interface SpinnerProps extends BaseComponentProps, PropsWithChildren { - icon?: Omit & Partial>; -} - -/** - * The `Spinner` component displays an animated spinning loader icon with - * optional accompanying text. Typically used when some foreground or background - * process is occurring, such as an interaction with an API. - */ -const Spinner = ({ children, className, icon, testId = 'spinner' }: SpinnerProps) => { - return ( -
    - - {children} -
    - ); -}; - -/** - * The Text component displays optional accompanying text for the `Spinner`. - */ -const Text = ({ children, className, testId = 'spinner-text' }: BaseComponentProps & PropsWithChildren) => { - return ( -
    - {children} -
    - ); -}; -Spinner.Text = Text; - -export default Spinner; diff --git a/packages/shared/src/components/Menu/Menu.tsx b/packages/shared/src/components/Menu/Menu.tsx deleted file mode 100644 index 9651ba79..00000000 --- a/packages/shared/src/components/Menu/Menu.tsx +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Generic properties for all `Menu` components, e.g. `SideMenu`. - * @param [close] - Optional. Close the menu. - */ -export interface MenuProps { - close?: () => void; -} diff --git a/packages/shared/src/components/Menu/MenuButton.test.tsx b/packages/shared/src/components/Menu/MenuButton.test.tsx deleted file mode 100644 index 033797fd..00000000 --- a/packages/shared/src/components/Menu/MenuButton.test.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import { render, screen } from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; - -import SideMenu from './SideMenu/SideMenu'; - -import MenuButton from './MenuButton'; - -describe('MenuButton', () => { - it('should render successfully', async () => { - // ARRANGE - render(); - await screen.findByTestId('button-menu'); - - // ASSERT - expect(screen.getByTestId('button-menu')).toBeDefined(); - }); - - it('should use custom testId', async () => { - // ARRANGE - render(); - await screen.findByTestId('custom-testid'); - - // ASSERT - expect(screen.getByTestId('custom-testid')).toBeDefined(); - }); - - it('should use custom className', async () => { - // ARRANGE - render(); - await screen.findByTestId('button-menu'); - - // ASSERT - expect(screen.getByTestId('button-menu').classList).toContain('custom-class'); - }); - - it('should not render Menu until clicked', async () => { - // ARRANGE - render(); - await screen.findByTestId('button-menu'); - - // ASSERT - expect(screen.getByTestId('button-menu')).toBeDefined(); - expect(screen.queryByTestId('menu-side')).toBeNull(); - }); - - it('should not render Menu when clicked', async () => { - // ARRANGE - render(); - await screen.findByTestId('button-menu'); - - // ACT - await userEvent.click(screen.getByTestId('button-menu')); - - // ASSERT - expect(screen.getByTestId('menu-side')).toBeDefined(); - }); - - it('should not render Menu after close function called', async () => { - // ARRANGE - render(); - await screen.findByTestId('button-menu'); - - // ACT - await userEvent.click(screen.getByTestId('button-menu')); - // expect Menu to be rendered after clicking MenuButton - expect(screen.getByTestId('menu-side')).toBeDefined(); - // click the MenuCloseButton on the rendered Menu - await userEvent.click(screen.getByTestId('menu-side-header-close-button')); - - // ASSERT - // expect Menu NOT to be rendered - expect(screen.queryByTestId('menu-side')).toBeNull(); - }); -}); diff --git a/packages/shared/src/components/Menu/MenuButton.tsx b/packages/shared/src/components/Menu/MenuButton.tsx deleted file mode 100644 index 4d84e44f..00000000 --- a/packages/shared/src/components/Menu/MenuButton.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { ComponentType, useState } from 'react'; - -import { BaseComponentProps } from '@react-starter/shared/types/components'; -import { MenuProps } from './Menu'; -import Button from '@react-starter/shared/components/Button/Button'; -import FAIcon from '@react-starter/shared/components/Icon/FAIcon'; - -/** - * Properties for the `MenuButton` component. - * @param {ComponentType} Menu - The Menu component to be rendered - * when the button is clicked. Any component whose properties include `MenuProps`. - * @param {string} [title] - Optional. The button title attribute value. - * @see {@link BaseComponentProps} - */ -export interface MenuButtonProps extends BaseComponentProps { - Menu: ComponentType; - title?: string; -} - -/** - * The `MenuButton` React component renders a `Button` which toggles rendering - * the supplied `Menu` when clicked. - * @param {MenuButtonProps} props - Component properties, `MenuButtonProps`. - */ -const MenuButton = ({ className, Menu, testId = 'button-menu', title = 'Menu' }: MenuButtonProps) => { - const [isMenuOpen, setIsMenuOpen] = useState(false); - - return ( - <> - - {isMenuOpen && setIsMenuOpen(false)} />} - - ); -}; - -export default MenuButton; diff --git a/packages/shared/src/components/Menu/MenuCloseButton.test.tsx b/packages/shared/src/components/Menu/MenuCloseButton.test.tsx deleted file mode 100644 index 658ed917..00000000 --- a/packages/shared/src/components/Menu/MenuCloseButton.test.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { describe, expect, it, vi } from 'vitest'; -import { render, screen } from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; - -import MenuCloseButton from './MenuCloseButton'; - -describe('MenuCloseButton', () => { - it('should render successfully', async () => { - // ARRANGE - render(); - await screen.findByTestId('menu-close-button'); - - // ASSERT - expect(screen.getByTestId('menu-close-button')).toBeDefined(); - }); - - it('should use custom testId', async () => { - // ARRANGE - render(); - await screen.findByTestId('custom-testid'); - - // ASSERT - expect(screen.getByTestId('custom-testid')).toBeDefined(); - }); - - it('should use custom className', async () => { - // ARRANGE - render(); - await screen.findByTestId('menu-close-button'); - - // ASSERT - expect(screen.getByTestId('menu-close-button').classList).toContain('custom-class'); - }); - - it('should call close function when clicked', async () => { - // ARRANGE - const mockClose = vi.fn(); - render(); - await screen.findByTestId('menu-close-button'); - - // ACT - await userEvent.click(screen.getByTestId('menu-close-button')); - - // ASSERT - expect(mockClose).toHaveBeenCalledTimes(1); - }); -}); diff --git a/packages/shared/src/components/Menu/MenuCloseButton.tsx b/packages/shared/src/components/Menu/MenuCloseButton.tsx deleted file mode 100644 index 1880be84..00000000 --- a/packages/shared/src/components/Menu/MenuCloseButton.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@react-starter/shared/types/components'; -import Button from '@react-starter/shared/components/Button/Button'; -import FAIcon from '@react-starter/shared/components/Icon/FAIcon'; - -/** - * Properties for the `MenuCloseButton` component. - * @param {function} [close] - Optional. If provided, invoked when the user - * clicks the close button. - * @see {@link BaseComponentProps} - */ -export interface MenuCloseButtonProps extends BaseComponentProps { - close?: () => void; -} - -/** - * The `MenuCloseButton` component renders a `Button` which closes a Menu by - * invoking the supplied `close` function. - * @param {MenuCloseButtonProps} props - Component properties, `MenuCloseButtonProps`. - */ -const MenuCloseButton = ({ className, close, testId = 'menu-close-button' }: MenuCloseButtonProps) => { - return ( - - ); -}; - -export default MenuCloseButton; diff --git a/packages/shared/src/components/Menu/MenuNavLink.test.tsx b/packages/shared/src/components/Menu/MenuNavLink.test.tsx deleted file mode 100644 index a93e46b2..00000000 --- a/packages/shared/src/components/Menu/MenuNavLink.test.tsx +++ /dev/null @@ -1,112 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import { render, screen } from '@testing-library/react'; - -import MenuNavLink from './MenuNavLink'; -import { MemoryRouter } from 'react-router-dom'; - -describe('MenuNavLink', () => { - const wrapper = ({ children }: { children: React.ReactNode }) => {children}; - - it('should render successfully', async () => { - // ARRANGE - render(LinkText, { wrapper }); - await screen.findByTestId('menu-navlink'); - - // ASSERT - expect(screen.getByTestId('menu-navlink')).toBeDefined(); - expect(screen.getByTestId('menu-navlink').textContent).toBe('LinkText'); - expect(screen.getByTestId('menu-navlink').getAttribute('href')).toBe('/'); - }); - - it('should use custom testId', async () => { - // ARRANGE - render(, { wrapper }); - await screen.findByTestId('custom-menu-navlink'); - - // ASSERT - expect(screen.getByTestId('custom-menu-navlink')).toBeDefined(); - }); - - it('should use custom classes when provided', async () => { - // ARRANGE - render(, { wrapper }); - await screen.findByTestId('menu-navlink'); - - // ASSERT - expect(screen.getByTestId('menu-navlink').classList).toContain('custom-class'); - }); - - it('should render Icon when iconName provided', async () => { - // ARRANGE - render(, { wrapper }); - await screen.findByTestId('menu-navlink-icon'); - - // ASSERT - expect(screen.getByTestId('menu-navlink-icon')).toBeDefined(); - expect(screen.getByTestId('menu-navlink-icon')).toHaveAttribute('data-icon', 'bars'); - }); - - it('should not render Icon when iconName omitted', async () => { - // ARRANGE - render(LinkText, { wrapper }); - await screen.findByTestId('menu-navlink'); - - // ASSERT - expect(screen.queryByTestId('menu-navlink-icon')).toBeNull(); - }); - - it('should use custom icon classes when provided', async () => { - // ARRANGE - render(, { wrapper }); - await screen.findByTestId('menu-navlink-icon'); - - // ASSERT - expect(screen.getByTestId('menu-navlink-icon')).toBeDefined(); - expect(screen.getByTestId('menu-navlink-icon').classList).toContain('custom-class'); - }); - - it('should use active styles', async () => { - // ARRANGE - render( - - LinkText - , - { wrapper }, - ); - await screen.findByTestId('menu-navlink'); - - // ASSERT - expect(screen.getByTestId('menu-navlink')).toBeDefined(); - expect(screen.getByTestId('menu-navlink').classList).toContain('bg-neutral-500/10'); - }); - - it('should only use active styles on active route', async () => { - // ARRANGE - render( - - LinkText - , - { wrapper }, - ); - await screen.findByTestId('menu-navlink'); - - // ASSERT - expect(screen.getByTestId('menu-navlink')).toBeDefined(); - expect(screen.getByTestId('menu-navlink').classList).not.toContain('bg-neutral-500/10'); - }); - - it('should use className function', async () => { - // ARRANGE - render( - [isActive ? 'some-active-class' : ''].join(' ')}> - LinkText - , - { wrapper }, - ); - await screen.findByTestId('menu-navlink'); - - // ASSERT - expect(screen.getByTestId('menu-navlink')).toBeDefined(); - expect(screen.getByTestId('menu-navlink').classList).toContain('some-active-class'); - }); -}); diff --git a/packages/shared/src/components/Menu/MenuNavLink.tsx b/packages/shared/src/components/Menu/MenuNavLink.tsx deleted file mode 100644 index 96b8667d..00000000 --- a/packages/shared/src/components/Menu/MenuNavLink.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import { PropsWithChildren } from 'react'; -import { NavLink, NavLinkProps } from 'react-router-dom'; - -import { cn } from '@react-starter/shared/utils/css'; -import { PropsWithTestId } from '@react-starter/shared/types/components'; -import FAIcon, { FAIconProps } from '@react-starter/shared/components/Icon/FAIcon'; - -/** - * Properties for the `MenuNavLink` component. - * @param {string} [iconClassName] - Optional. Additional CSS classes to apply - * to the `Icon`. - * @param {boolean} [styleActive] - Optional. Indicates if active `NavLink` styles - * should be applied. Default: `false`. - * @see {@link NavLinkProps} - * @see {@link FAIconProps} - * @see {@link PropsWithTestId} - */ -export interface MenuNavLinkProps - extends Omit, Partial>, PropsWithChildren, PropsWithTestId { - iconClassName?: string; - styleActive?: boolean; -} - -/** - * `NavLinkRenderProps` from `react-router-dom`. Not exported. - */ -type NavLinkRenderProps = { - isActive: boolean; - isPending: boolean; - isTransitioning: boolean; -}; - -/** - * The `MenuNavLink` React component renders a `NavLink` with optional `Icon`. - * For use within a `Menu` implementation, e.g. `SideMenu`. - * @param {MenuNavLinkProps} props - Component properties, `MenuNavLinkProps`. - */ -const MenuNavLink = ({ - children, - className, - icon, - iconClassName, - styleActive = false, - testId = 'menu-navlink', - ...props -}: MenuNavLinkProps) => { - /** - * Returns the list of class names to apply to the `NavLink`. - * @param props - A `NavLinkRenderProps` object indicating the current state of the `NavLink`. - * @returns {string | undefined} A string or `undefined` space separated list of class names. - */ - const getClassName = (props: NavLinkRenderProps): string => { - const classNameFromProps = typeof className === 'function' ? className(props) : className; - - return cn( - 'flex items-center rounded-md px-2 py-1.5 text-sm hover:bg-neutral-500/25', - { 'bg-neutral-500/10 hover:bg-neutral-500/10!': styleActive && props.isActive }, - classNameFromProps, - ); - }; - - return ( - - <> - {icon && } - {children} - - - ); -}; - -export default MenuNavLink; diff --git a/packages/shared/src/components/Menu/MenuSeparator.test.tsx b/packages/shared/src/components/Menu/MenuSeparator.test.tsx deleted file mode 100644 index 86c18032..00000000 --- a/packages/shared/src/components/Menu/MenuSeparator.test.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import { render, screen } from '@testing-library/react'; - -import MenuSeparator from './MenuSeparator'; - -describe('MenuSeparator', () => { - it('should render successfully', async () => { - // ARRANGE - render(); - await screen.findByTestId('menu-separator'); - - // ASSERT - expect(screen.getByTestId('menu-separator')).toBeDefined(); - }); - - it('should use custom testId', async () => { - // ARRANGE - render(); - await screen.findByTestId('custom-testid'); - - // ASSERT - expect(screen.getByTestId('custom-testid')).toBeDefined(); - }); - - it('should use custom className', async () => { - // ARRANGE - render(); - await screen.findByTestId('menu-separator'); - - // ASSERT - expect(screen.getByTestId('menu-separator').classList).toContain('custom-class'); - }); -}); diff --git a/packages/shared/src/components/Menu/MenuSeparator.tsx b/packages/shared/src/components/Menu/MenuSeparator.tsx deleted file mode 100644 index 9a58350e..00000000 --- a/packages/shared/src/components/Menu/MenuSeparator.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@react-starter/shared/types/components'; - -/** - * The `MenuSeparator` component renders a separator to delineate the boundary - * between sections of a `Menu`. - * @param {BaseComponentProps} props - Component properties, `BaseComponentProps`. - */ -const MenuSeparator = ({ className, testId = 'menu-separator' }: BaseComponentProps) => { - return
    ; -}; - -export default MenuSeparator; diff --git a/packages/shared/src/components/Menu/SideMenu/SideMenu.test.tsx b/packages/shared/src/components/Menu/SideMenu/SideMenu.test.tsx deleted file mode 100644 index c05b1a64..00000000 --- a/packages/shared/src/components/Menu/SideMenu/SideMenu.test.tsx +++ /dev/null @@ -1,120 +0,0 @@ -import { describe, expect, it, vi } from 'vitest'; -import { render, screen } from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; - -import SideMenu from './SideMenu'; - -describe('SideMenu', () => { - it('should render successfully', async () => { - // ARRANGE - render(); - await screen.findByTestId('menu-side'); - - // ASSERT - expect(screen.getByTestId('menu-side')).toBeDefined(); - }); - - it('should use custom testId', async () => { - // ARRANGE - render(); - await screen.findByTestId('custom-testid'); - - // ASSERT - expect(screen.getByTestId('custom-testid')).toBeDefined(); - }); - - it('should use custom className', async () => { - // ARRANGE - render(); - await screen.findByTestId('menu-side'); - - // ASSERT - expect(screen.getByTestId('menu-side').classList).toContain('custom-class'); - }); - - it('should render headerContent', async () => { - // ARRANGE - render(HeaderContent
    } />); - await screen.findByTestId('custom-header-content'); - - // ASSERT - expect(screen.getByTestId('custom-header-content')).toBeDefined(); - expect(screen.getByText('HeaderContent')).toBeDefined(); - }); - - it('should render menu content', async () => { - // ARRANGE - render( - -
    MenuContent
    -
    , - ); - await screen.findByTestId('custom-menu-content'); - - // ASSERT - expect(screen.getByTestId('custom-menu-content')).toBeDefined(); - expect(screen.getByText('MenuContent')).toBeDefined(); - }); - - it('should render left side by default', async () => { - // ARRANGE - render(); - await screen.findByTestId('menu-side'); - - // ASSERT - expect(screen.getByTestId('menu-side')).toBeDefined(); - expect(screen.getByTestId('menu-side').classList).toContain('justify-start'); - expect(screen.getByTestId('menu-side-content').classList).toContain('rounded-r-lg'); - expect(screen.getByTestId('menu-side-content').classList).toContain('border-r'); - }); - - it('should render left side', async () => { - // ARRANGE - render(); - await screen.findByTestId('menu-side'); - - // ASSERT - expect(screen.getByTestId('menu-side')).toBeDefined(); - expect(screen.getByTestId('menu-side').classList).toContain('justify-start'); - expect(screen.getByTestId('menu-side-content').classList).toContain('rounded-r-lg'); - expect(screen.getByTestId('menu-side-content').classList).toContain('border-r'); - }); - - it('should render right side', async () => { - // ARRANGE - render(); - await screen.findByTestId('menu-side'); - - // ASSERT - expect(screen.getByTestId('menu-side')).toBeDefined(); - expect(screen.getByTestId('menu-side').classList).toContain('justify-end'); - expect(screen.getByTestId('menu-side-content').classList).toContain('rounded-l-lg'); - expect(screen.getByTestId('menu-side-content').classList).toContain('border-l'); - }); - - it('should call close function when backdrop clicked', async () => { - // ARRANGE - const mockClose = vi.fn(); - render(); - await screen.findByTestId('menu-side'); - - // ACT - await userEvent.click(screen.getByTestId('menu-side-backdrop')); - - // ASSERT - expect(mockClose).toHaveBeenCalledTimes(1); - }); - - it('should call close function when body clicked', async () => { - // ARRANGE - const mockClose = vi.fn(); - render(Body); - await screen.findByText('Body'); - - // ACT - await userEvent.click(screen.getByText('Body')); - - // ASSERT - expect(mockClose).toHaveBeenCalledTimes(1); - }); -}); diff --git a/packages/shared/src/components/Menu/SideMenu/SideMenu.tsx b/packages/shared/src/components/Menu/SideMenu/SideMenu.tsx deleted file mode 100644 index 2fe13df0..00000000 --- a/packages/shared/src/components/Menu/SideMenu/SideMenu.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import { PropsWithChildren, ReactNode } from 'react'; -import { animated, useSpring } from '@react-spring/web'; - -import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@react-starter/shared/types/components'; -import { MenuProps } from '../Menu'; -import SideMenuHeader from './SideMenuHeader'; - -/** - * Properties for the `SideMenu` component. - * @param {ReactNode} [headerContent] - Optional. A `ReactNode` containing the content - * of the menu header. - * @param {'left'|'right'} [string] - Optional. The side of the viewport where the - * menu should display when shown. Default: `left`. - * @see {@link MenuProps} - * @see {@link PropsWithChildren} - * @see {@link BaseComponentProps} - */ -export interface SideMenuProps extends BaseComponentProps, MenuProps, PropsWithChildren { - headerContent?: ReactNode; - side?: 'left' | 'right'; -} - -/** - * The `SideMenu` component renders menu which slides out from the side - * of the viewport when rendered. The menu content is provided in the - * `children` attribute. The optional menu header is provided in the - * `headerContent` attribute. - * @param {SideMenuProps} props - Component properties, `SideMenuProps`. - */ -const SideMenu = ({ - children, - className, - close, - headerContent, - side = 'left', - testId = 'menu-side', -}: SideMenuProps) => { - const isLeft = side === 'left'; - const isRight = side === 'right'; - - const springs = useSpring({ - from: { x: isLeft ? -320 : 320 }, - to: { x: 0 }, - }); - - return ( -
    -
    close?.()} data-testid={`${testId}-backdrop`}>
    - - - {headerContent} - -
    -
    close?.()}> - {children} -
    -
    -
    -
    - ); -}; - -export default SideMenu; diff --git a/packages/shared/src/components/Menu/SideMenu/SideMenuHeader.test.tsx b/packages/shared/src/components/Menu/SideMenu/SideMenuHeader.test.tsx deleted file mode 100644 index 796af456..00000000 --- a/packages/shared/src/components/Menu/SideMenu/SideMenuHeader.test.tsx +++ /dev/null @@ -1,92 +0,0 @@ -import { describe, expect, it, vi } from 'vitest'; -import { render, screen } from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; - -import SideMenuHeader from './SideMenuHeader'; - -describe('SideMenuHeader', () => { - it('should render successfully', async () => { - // ARRANGE - render( - -
    Content
    -
    , - ); - await screen.findByTestId('menu-header'); - - // ASSERT - expect(screen.getByTestId('menu-header')).toBeDefined(); - }); - - it('should use custom testId', async () => { - // ARRANGE - render( - -
    Content
    -
    , - ); - await screen.findByTestId('custom-testid'); - - // ASSERT - expect(screen.getByTestId('custom-testid')).toBeDefined(); - }); - - it('should use custom className', async () => { - // ARRANGE - render( - -
    Content
    -
    , - ); - await screen.findByTestId('menu-header'); - - // ASSERT - expect(screen.getByTestId('menu-header').classList).toContain('custom-class'); - }); - - it('should render header content', async () => { - // ARRANGE - render( - -
    Content
    -
    , - ); - await screen.findByTestId('menu-header-content'); - - // ASSERT - expect(screen.getByTestId('menu-header-content')).toBeDefined(); - }); - - it('should call close function when close button clicked', async () => { - // ARRANGE - const mockClose = vi.fn(); - render( - -
    Content
    -
    , - ); - await screen.findByTestId('menu-header'); - - // ACT - await userEvent.click(screen.getByTestId('menu-header-close-button')); - - // ASSERT - expect(mockClose).toHaveBeenCalledTimes(1); - }); - - it('should do nothing when no close function and close button clicked', async () => { - // ARRANGE - render( - -
    Content
    -
    , - ); - await screen.findByTestId('menu-header'); - - // ACT - await userEvent.click(screen.getByTestId('menu-header-close-button')); - - // ASSERT - expect(screen.getByTestId('menu-header-close-button')).toBeDefined(); - }); -}); diff --git a/packages/shared/src/components/Menu/SideMenu/SideMenuHeader.tsx b/packages/shared/src/components/Menu/SideMenu/SideMenuHeader.tsx deleted file mode 100644 index 16449325..00000000 --- a/packages/shared/src/components/Menu/SideMenu/SideMenuHeader.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { PropsWithChildren } from 'react'; - -import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@react-starter/shared/types/components'; -import MenuCloseButton from '../MenuCloseButton'; - -/** - * Properties for the `SideMenuHeader` component. - * @param {function} [close] - Optional. If provided, invoked when the user - * clicks the close button. - * @see {@link PropsWithChildren} - * @see {@link BaseComponentProps} - */ -export interface SideMenuHeaderProps extends BaseComponentProps, PropsWithChildren { - close?: () => void; -} - -/** - * The `SideMenuHeader` React component renders a block which appears at the - * top of a `SideMenu`. - * - * The `children` content are rendered on the left side of the header. A - * `MenuCloseButton` is rendered on the right side. - * @param {SideMenuHeaderProps} props - Component properties, `SideMenuHeaderProps`. - */ -const SideMenuHeader = ({ children, className, close, testId = 'menu-header' }: SideMenuHeaderProps) => { - return ( -
    -
    {children}
    - -
    - ); -}; - -export default SideMenuHeader; diff --git a/packages/shared/src/components/Popover/Popover.test.tsx b/packages/shared/src/components/Popover/Popover.test.tsx deleted file mode 100644 index 0fb487d1..00000000 --- a/packages/shared/src/components/Popover/Popover.test.tsx +++ /dev/null @@ -1,315 +0,0 @@ -import { describe, expect, it, vi } from 'vitest'; -import userEvent from '@testing-library/user-event'; - -import { render, screen, waitFor } from '@testing-library/react'; - -import Popover from './Popover'; - -describe('Popover', () => { - it('should render successfully', async () => { - // ARRANGE - render( - - Open - I am the content. - , - ); - await screen.findByTestId('popover'); - - // ASSERT - expect(screen.getByTestId('popover')).toBeInTheDocument(); - expect(screen.getByTestId('popover-trigger')).toBeInTheDocument(); - expect(screen.getByTestId('popover-trigger')).toHaveTextContent(/Open/); - expect(screen.getByTestId('popover-content')).toBeInTheDocument(); - expect(screen.getByTestId('popover-content')).toHaveTextContent(/I am the content./); - }); - - it('should handle Popover trigger click', async () => { - // ARRANGE - const user = userEvent.setup(); - render( - - Open - I am the content. - , - ); - await screen.findByTestId('popover-trigger'); - - // ACT - await user.click(screen.getByTestId('popover-trigger')); - await screen.findByTestId('popover-content'); - - // ASSERT - expect(screen.getByTestId('popover-content')).toBeVisible(); - }); - - it('should show Popover content when trigger is clicked', async () => { - // ARRANGE - const user = userEvent.setup(); - render( - - Open - I am the content. - , - ); - await screen.findByTestId('popover-trigger'); - - // ACT - await user.click(screen.getByTestId('popover-trigger')); - await waitFor(() => expect(screen.getByTestId('popover-content')).not.toHaveClass('hidden')); - - // ASSERT - expect(screen.getByTestId('popover-content-backdrop')).not.toHaveClass('hidden'); - expect(screen.getByTestId('popover-content')).not.toHaveClass('hidden'); - }); - - it('should hide Popover when backdrop is clicked', async () => { - // ARRANGE - const user = userEvent.setup(); - render( - - Open - I am the content. - , - ); - await screen.findByTestId('popover-trigger'); - - // ACT - await user.click(screen.getByTestId('popover-trigger')); - await waitFor(() => expect(screen.getByTestId('popover-content')).not.toHaveClass('hidden')); - - await user.click(screen.getByTestId('popover-content-backdrop')); - await waitFor(() => expect(screen.getByTestId('popover-content')).toHaveClass('hidden')); - - // ASSERT - expect(screen.getByTestId('popover-content-backdrop')).toHaveClass('hidden'); - expect(screen.getByTestId('popover-content')).toHaveClass('hidden'); - }); - - it('should handle default Popover placement', async () => { - // ARRANGE - const user = userEvent.setup(); - vi.spyOn(HTMLElement.prototype, 'getBoundingClientRect').mockImplementation( - () => - ({ - height: 10, - width: 20, - top: 100, - left: 100, - right: 120, - bottom: 110, - x: 100, - y: 100, - toJSON: () => ({}), - }) as DOMRect, - ); - render( - - Open - I am the content. - , - ); - await screen.findByTestId('popover-content'); - - // ACT - await user.click(screen.getByTestId('popover-trigger')); - await waitFor(() => - expect(screen.getByTestId('popover-content')).toHaveStyle({ - transform: 'translate(100px, 118px)', - }), - ); - - // ASSERT - expect(screen.getByTestId('popover-content')).toHaveStyle({ - transform: 'translate(100px, 118px)', - }); - }); - - it('should handle bottom Popover placement', async () => { - // ARRANGE - const user = userEvent.setup(); - vi.spyOn(HTMLElement.prototype, 'getBoundingClientRect').mockImplementation( - () => - ({ - height: 10, - width: 20, - top: 100, - left: 100, - right: 120, - bottom: 110, - x: 100, - y: 100, - toJSON: () => ({}), - }) as DOMRect, - ); - render( - - Open - I am the content. - , - ); - await screen.findByTestId('popover-content'); - - // ACT - await user.click(screen.getByTestId('popover-trigger')); - await waitFor(() => - expect(screen.getByTestId('popover-content')).toHaveStyle({ - transform: 'translate(100px, 118px)', - }), - ); - - // ASSERT - expect(screen.getByTestId('popover-content')).toHaveStyle({ - transform: 'translate(100px, 118px)', - }); - }); - - it('should handle top Popover placement', async () => { - // ARRANGE - const user = userEvent.setup(); - vi.spyOn(HTMLElement.prototype, 'getBoundingClientRect').mockImplementation( - () => - ({ - height: 10, - width: 20, - top: 100, - left: 100, - right: 120, - bottom: 110, - x: 100, - y: 100, - toJSON: () => ({}), - }) as DOMRect, - ); - render( - - Open - I am the content. - , - ); - await screen.findByTestId('popover-content'); - - // ACT - await user.click(screen.getByTestId('popover-trigger')); - await waitFor(() => - expect(screen.getByTestId('popover-content')).toHaveStyle({ - transform: 'translate(100px, 82px)', - }), - ); - - // ASSERT - expect(screen.getByTestId('popover-content')).toHaveStyle({ - transform: 'translate(100px, 82px)', - }); - }); - - it('should handle left Popover placement', async () => { - // ARRANGE - const user = userEvent.setup(); - vi.spyOn(HTMLElement.prototype, 'getBoundingClientRect').mockImplementation( - () => - ({ - height: 10, - width: 20, - top: 100, - left: 100, - right: 120, - bottom: 110, - x: 100, - y: 100, - toJSON: () => ({}), - }) as DOMRect, - ); - render( - - Open - I am the content. - , - ); - await screen.findByTestId('popover-content'); - - // ACT - await user.click(screen.getByTestId('popover-trigger')); - await waitFor(() => - expect(screen.getByTestId('popover-content')).toHaveStyle({ - transform: 'translate(72px, 100px)', - }), - ); - - // ASSERT - expect(screen.getByTestId('popover-content')).toHaveStyle({ - transform: 'translate(72px, 100px)', - }); - }); - - it('should handle right Popover placement', async () => { - // ARRANGE - const user = userEvent.setup(); - vi.spyOn(HTMLElement.prototype, 'getBoundingClientRect').mockImplementation( - () => - ({ - height: 10, - width: 20, - top: 100, - left: 100, - right: 120, - bottom: 110, - x: 100, - y: 100, - toJSON: () => ({}), - }) as DOMRect, - ); - render( - - Open - I am the content. - , - ); - await screen.findByTestId('popover-content'); - - // ACT - await user.click(screen.getByTestId('popover-trigger')); - await waitFor(() => - expect(screen.getByTestId('popover-content')).toHaveStyle({ - transform: 'translate(128px, 100px)', - }), - ); - - // ASSERT - expect(screen.getByTestId('popover-content')).toHaveStyle({ - transform: 'translate(128px, 100px)', - }); - }); - - it('should use default offset for Popover placement', async () => { - // ARRANGE - render( - - Open - I am the content. - , - ); - await screen.findByTestId('popover-content'); - - // ASSERT - expect(screen.getByTestId('popover-content')).toHaveStyle({ - transform: 'translate(0px, 8px)', - }); - }); - - it('should use specified offset for Popover placement', async () => { - // ARRANGE - render( - - Open - I am the content. - , - ); - await screen.findByTestId('popover-content'); - - // ASSERT - expect(screen.getByTestId('popover-content')).toHaveStyle({ - transform: 'translate(0px, 16px)', - }); - }); -}); diff --git a/packages/shared/src/components/Popover/Popover.tsx b/packages/shared/src/components/Popover/Popover.tsx deleted file mode 100644 index fdd186cd..00000000 --- a/packages/shared/src/components/Popover/Popover.tsx +++ /dev/null @@ -1,202 +0,0 @@ -import { createContext, PropsWithChildren, useContext, useEffect, useMemo, useRef, useState } from 'react'; -import noop from 'lodash/noop'; - -import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@react-starter/shared/types/components'; -import Backdrop from '../Backdrop/Backdrop'; - -/** - * Defines the shape of the `PopoverContext` value. - */ -type PopoverContextValue = { - isOpen: boolean; - setIsOpen: (isOpen: boolean) => void; - triggerRect: Pick; - setTriggerRect: (rect: Pick) => void; -}; - -/** - * The `PopoverContext` instance. - */ -const PopoverContext = createContext({ - isOpen: false, - setIsOpen: noop, - triggerRect: { top: 0, left: 0, height: 0, width: 0 }, - setTriggerRect: noop, -}); - -/** - * Properties for the `Popover` component. - */ -export interface PopoverProps extends BaseComponentProps, PropsWithChildren {} - -/** - * The `Popover` component displays content in a floating container that is anchored to a trigger element. - * It can be used to display tooltips, dropdowns, and other contextual information. - * - * **Example:** - * ``` - * - * Click me - * Content goes here - * - * ``` - */ -const Popover = ({ children, className, testId = 'popover' }: PopoverProps) => { - const [isOpen, setIsOpen] = useState(false); - const [triggerRect, setTriggerRect] = useState>({ - top: 0, - left: 0, - height: 0, - width: 0, - }); - - return ( -
    - - {children} - -
    - ); -}; - -/** - * The `Trigger` component represents the element that triggers the popover to open or close. - * It can be any element, such as a button or a link. - * The `Trigger` component is a child of the `Popover` component. - */ -const Trigger = ({ children, className, testId = 'popover-trigger' }: BaseComponentProps & PropsWithChildren) => { - const { isOpen, setIsOpen, setTriggerRect } = useContext(PopoverContext); - const triggerRef = useRef(null); - - const updateTriggerRect = () => { - if (triggerRef.current) { - const { top, left, height, width } = triggerRef.current.getBoundingClientRect(); - setTriggerRect({ top, left, height, width }); - } - }; - - useEffect(() => { - if (isOpen && triggerRef.current) { - window.addEventListener('resize', updateTriggerRect); - window.addEventListener('scroll', updateTriggerRect); - } else { - window.removeEventListener('resize', updateTriggerRect); - window.removeEventListener('scroll', updateTriggerRect); - } - - return () => { - window.removeEventListener('resize', updateTriggerRect); - window.removeEventListener('scroll', updateTriggerRect); - }; - }, [isOpen, triggerRef.current]); - - const handleClick = () => { - updateTriggerRect(); - setIsOpen(!isOpen); - }; - - return ( - - ); -}; -Popover.Trigger = Trigger; - -/** - * Properties for the `Content` component. - * @param side - The side of the trigger where the content will be displayed. - * @param sideOffset - The offset between the trigger and the content in pixels. - */ -interface ContentProps extends BaseComponentProps, PropsWithChildren { - side?: 'top' | 'right' | 'bottom' | 'left'; - sideOffset?: number; -} - -/** - * The `Content` component represents the content of the popover. - * It is displayed when the popover is open. - * The `Content` component is a child of the `Popover` component. - */ -const Content = ({ - children, - className, - side = 'bottom', - sideOffset = 8, - testId = 'popover-content', -}: ContentProps) => { - const contentRef = useRef(null); - const [contentRect, setContentRect] = useState>({ - height: 0, - width: 0, - }); - const { height: contentHeight, width: contentWidth } = contentRect; - const { isOpen, setIsOpen, triggerRect } = useContext(PopoverContext); - const { top: triggerTop, left: triggerLeft, height: triggerHeight, width: triggerWidth } = triggerRect; - - useEffect(() => { - if (isOpen && contentRef.current) { - const { height, width } = contentRef.current.getBoundingClientRect(); - setContentRect({ height, width }); - } - }, [isOpen, contentRef.current]); - - const { top, left } = useMemo(() => { - switch (side) { - case 'top': - return { - top: triggerTop - contentHeight - sideOffset, - left: triggerLeft + (triggerWidth - contentWidth) / 2, - }; - case 'right': { - return { - top: triggerTop + (triggerHeight - contentHeight) / 2, - left: triggerLeft + triggerWidth + sideOffset, - }; - } - case 'left': { - return { - top: triggerTop + (triggerHeight - contentHeight) / 2, - left: triggerLeft - contentWidth - sideOffset, - }; - } - case 'bottom': - default: { - return { - top: triggerTop + triggerHeight + sideOffset, - left: triggerLeft + (triggerWidth - contentWidth) / 2, - }; - } - } - }, [triggerTop, triggerLeft, triggerHeight, triggerWidth, contentHeight, contentWidth, side, sideOffset]); - - const isHidden = !isOpen; - const isVisible = isOpen && contentHeight > 0 && contentWidth > 0; - - return ( - <> - setIsOpen(false)} - testId={`${testId}-backdrop`} - /> -
    - {children} -
    - - ); -}; -Popover.Content = Content; - -export default Popover; diff --git a/packages/shared/src/components/Table/Table.test.tsx b/packages/shared/src/components/Table/Table.test.tsx deleted file mode 100644 index 7cf881d8..00000000 --- a/packages/shared/src/components/Table/Table.test.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; - -import { render, screen } from '@testing-library/react'; -import Table from './Table'; - -describe('Table', () => { - type Foo = { - bar: string; - baz: number; - max: number; - }; - const data: Foo[] = [ - { - bar: 'one', - baz: 1, - max: 20, - }, - { - bar: 'two', - baz: 2, - max: 40, - }, - ]; - const columnHelper = createColumnHelper(); - const columns = [ - columnHelper.group({ - id: 'grouped', - header: 'Grouped', - columns: [ - columnHelper.accessor('bar', { cell: (info) => info.renderValue(), header: 'Bar' }), - columnHelper.accessor('baz', { cell: (info) => info.renderValue(), header: 'Baz' }), - ], - }), - columnHelper.accessor('max', { cell: (info) => info.renderValue(), header: 'Max' }), - ] as ColumnDef[]; - - it('should render successfully', async () => { - // ARRANGE - render( data={data} columns={columns} />); - await screen.findByTestId('table'); - - // ASSERT - expect(screen.getByTestId('table')).toBeDefined(); - }); - - it('should use custom testId', async () => { - // ARRANGE - render( data={data} columns={columns} testId="custom-testId" />); - await screen.findByTestId('custom-testId'); - - // ASSERT - expect(screen.getByTestId('custom-testId')).toBeDefined(); - }); - - it('should use custom className', async () => { - // ARRANGE - render( data={data} columns={columns} className="custom-className" />); - await screen.findByTestId('table'); - - // ASSERT - expect(screen.getByTestId('table').classList).toContain('custom-className'); - }); -}); diff --git a/packages/shared/src/components/Table/Table.tsx b/packages/shared/src/components/Table/Table.tsx deleted file mode 100644 index 41ef93bd..00000000 --- a/packages/shared/src/components/Table/Table.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import { ColumnDef, flexRender, getCoreRowModel, useReactTable } from '@tanstack/react-table'; - -import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@react-starter/shared/types/components'; - -/** - * Properties for the `Table` React component. - * @template TData - The type of the table data object. - * @param {ColumnDef[]} columns - An array of `ColumnDef`, column definition, objects. - * @param {TData[]} data - An array of data objects, of type `TData`, - * which are used to populate the rows of the table. - * @see {@link BaseComponentProps} - */ -export interface TableProps extends BaseComponentProps { - columns: ColumnDef[]; - data: TData[]; -} - -/** - * The `Table` component renders a `table` element using the column definitions - * and data supplied in the properties. - * This component is built using the `@tanstack/react-table` library. - * It provides a simple and flexible way to display tabular data in a React application. - */ -const Table = ({ className, columns, data, testId = 'table' }: TableProps) => { - const table = useReactTable({ - data, - columns, - getCoreRowModel: getCoreRowModel(), - }); - - return ( - - - {table.getHeaderGroups().map((headerGroup) => ( - - {headerGroup.headers.map((header) => ( - - ))} - - ))} - - - {table.getRowModel().rows.map((row) => ( - - {row.getVisibleCells().map((cell) => ( - - ))} - - ))} - - - {table.getFooterGroups().map((footerGroup) => ( - - {footerGroup.headers.map((header) => ( - - ))} - - ))} - -
    - {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())} -
    - {flexRender(cell.column.columnDef.cell, cell.getContext())} -
    - {header.isPlaceholder ? null : flexRender(header.column.columnDef.footer, header.getContext())} -
    - ); -}; - -export default Table; diff --git a/packages/shared/src/components/Tabs/Tabs.test.tsx b/packages/shared/src/components/Tabs/Tabs.test.tsx deleted file mode 100644 index f35b8a42..00000000 --- a/packages/shared/src/components/Tabs/Tabs.test.tsx +++ /dev/null @@ -1,254 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import userEvent from '@testing-library/user-event'; - -import { render, screen, waitFor } from '@testing-library/react'; - -import Tabs from './Tabs'; - -describe('Tabs', () => { - it('should render successfully', async () => { - // ARRANGE - render( - - - - One - - - Two - - - - Content One - - - Content Two - - , - ); - await screen.findByTestId('tabs'); - - // ASSERT - expect(screen.getByTestId('tabs')).toBeDefined(); - }); - - it('should use align start', async () => { - // ARRANGE - render( - - - - One - - - Two - - - - Content One - - - Content Two - - , - ); - await screen.findByTestId('tabs-list'); - - // ASSERT - expect(screen.getByTestId('tabs-list')).toHaveClass('flex'); - }); - - it('should use align stretch', async () => { - // ARRANGE - render( - - - - One - - - Two - - - - Content One - - - Content Two - - , - ); - await screen.findByTestId('tabs-list'); - - // ASSERT - expect(screen.getByTestId('tabs-list')).toHaveClass('*:grow'); - }); - - it('should use default align value', async () => { - // ARRANGE - render( - - - - One - - - Two - - - - Content One - - - Content Two - - , - ); - await screen.findByTestId('tabs-list'); - - // ASSERT - expect(screen.getByTestId('tabs-list')).toHaveClass('flex'); - }); - - it('should render tab label', async () => { - // ARRANGE - render( - - - - One - - - Two - - - - Content One - - - Content Two - - , - ); - await screen.findByTestId('tab-one'); - - // ASSERT - expect(screen.getByTestId('tab-one')).toHaveTextContent(/One/); - }); - - it('should display active state', async () => { - // ARRANGE - render( - - - - One - - - Two - - - - Content One - - - Content Two - - , - ); - await screen.findByTestId('tab-one'); - - // ASSERT - expect(screen.getByTestId('tab-one')).toHaveClass('border-blue-300'); - }); - - it('should display inactive state', async () => { - // ARRANGE - render( - - - - One - - - Two - - - - Content One - - - Content Two - - , - ); - await screen.findByTestId('tab-two'); - - // ASSERT - expect(screen.getByTestId('tab-two')).toHaveClass('border-transparent'); - }); - - it('should display default tab', async () => { - // ARRANGE - render( - - - - One - - - Two - - - - Content One - - - Content Two - - , - ); - await screen.findByTestId('tab-one'); - - // ASSERT - expect(screen.getByTestId('tab-one')).toHaveClass('border-blue-300'); - expect(screen.getByTestId('tab-two')).toHaveClass('border-transparent'); - expect(screen.getByTestId('content-one')).toHaveClass('block'); - expect(screen.getByTestId('content-two')).toHaveClass('hidden'); - }); - - it('should display tab when clicked', async () => { - // ARRANGE - const user = userEvent.setup(); - render( - - - - One - - - Two - - - - Content One - - - Content Two - - , - ); - await screen.findByTestId('tabs'); - /* assert tab 1 active */ - expect(screen.getByTestId('tab-one')).toHaveClass('border-blue-300'); - - // ACT - /* click tab two */ - await user.click(screen.getByTestId('tab-two')); - /* wait for re-render for tab two to be active */ - await waitFor(() => expect(screen.getByTestId('tab-two')).toHaveClass('border-blue-300')); - - // ASSERT - expect(screen.getByTestId('tab-two')).toHaveClass('border-blue-300'); - }); -}); diff --git a/packages/shared/src/components/Tabs/Tabs.tsx b/packages/shared/src/components/Tabs/Tabs.tsx deleted file mode 100644 index fea77032..00000000 --- a/packages/shared/src/components/Tabs/Tabs.tsx +++ /dev/null @@ -1,186 +0,0 @@ -import { createContext, PropsWithChildren, useContext, useState } from 'react'; -import { cva, VariantProps } from 'class-variance-authority'; -import noop from 'lodash/noop'; - -import { cn } from '@react-starter/shared/utils/css'; -import { BaseComponentProps } from '@react-starter/shared/types/components'; -import Button from '../Button/Button'; - -/** - * Defines the shape of the `TabsContext` value. - */ -type TabsContextValue = { - activeTab: string; - setActiveTab: (tab: string) => void; -}; - -/** - * The `TabsContext` instance. - */ -const TabsContext = createContext({ - activeTab: '', - setActiveTab: noop, -}); - -/** - * Properties for the `Tabs` component. - * @param defaultValue - The default (or initial) active tab. - */ -export interface TabsProps extends BaseComponentProps, PropsWithChildren { - defaultValue: string; -} - -/** - * The `Tabs` component is used to display tabbed content. Compose tabbed - * content using: `List`, `Tab`, and `Content` as illustrated in - * the example. - * - * Note: The `defaultValue` property must match the `value` of one of the Tab - * components. - * - * **Example:** - * ``` - * - * - * List - * Detail - * - * - *
    I am the LIST tab.
    - *
    - * - *
    I am the DETAIL tab.
    - *
    - *
    - * ``` - */ -const Tabs = ({ children, className, defaultValue, testId = 'tabs' }: TabsProps) => { - const [activeTab, setActiveTab] = useState(defaultValue); - - return ( -
    - {children} -
    - ); -}; - -/** - * Defines the `List` component base and variant styles. - */ -const listVariants = cva('flex gap-4 border-b border-b-neutral-500/10', { - variants: { - align: { - start: 'justify-start', - stretch: '*:grow', - }, - }, - defaultVariants: { align: 'start' }, -}); - -/** - * Properties for the `List` component. - */ -export interface ListProps extends BaseComponentProps, PropsWithChildren, VariantProps {} - -/** - * The `List` component is a container for one to many `Tab` components. It - * renders a horizontal bar of clickable tabs. - */ -const List = ({ align = 'start', children, className, testId = 'tabs-list' }: ListProps) => { - return ( -
    - {children} -
    - ); -}; -Tabs.List = List; - -/** - * Defines the `Tab` component base and variant styles. - */ -const tabVariants = cva('rounded-none border-0 border-b-2 px-4 text-sm font-bold uppercase', { - variants: { - active: { - false: 'border-transparent', - true: 'border-blue-300 dark:border-blue-600', - }, - }, - defaultVariants: { - active: false, - }, -}); - -/** - * Properties for the `Tab` component. - */ -export interface TabProps extends BaseComponentProps, PropsWithChildren { - value: string; -} - -/** - * The `Tab` component renders a clickable tab button which, when clicked, - * displays the associated tab content. - * - * Note: The `Tab` and its associated `TabContent` must have the same `value` - * property value. - */ -const Tab = ({ children, className, testId = 'tabs-tab', value }: TabProps) => { - const { activeTab, setActiveTab } = useContext(TabsContext); - - const active = value === activeTab; - - return ( - - ); -}; -Tabs.Tab = Tab; - -/** - * Defines the `Content` component base and variant styles. - */ -const contentVariants = cva('', { - variants: { - active: { - true: 'block', - false: 'hidden', - }, - }, - defaultVariants: { - active: false, - }, -}); - -/** - * Properties for the `Content` component. - */ -export interface TabContentProps extends BaseComponentProps, PropsWithChildren { - value: string; -} - -/** - * The `TabContent` component renders the content for a single tab. - * - * Note: The `TabContent` and its associated `Tab` must have the same `value` - * property value. - */ -const Content = ({ children, className, testId = 'tabs-content', value }: TabContentProps) => { - const { activeTab } = useContext(TabsContext); - - const active = value === activeTab; - - return ( -
    - {children} -
    - ); -}; -Tabs.Content = Content; - -export default Tabs; diff --git a/packages/shared/src/components/shadcn/avatar.tsx b/packages/shared/src/components/shadcn/avatar.tsx new file mode 100644 index 00000000..8691abee --- /dev/null +++ b/packages/shared/src/components/shadcn/avatar.tsx @@ -0,0 +1,91 @@ +import * as React from 'react'; +import { Avatar as AvatarPrimitive } from 'radix-ui'; + +import { cn } from '@react-starter/shared/utils/css'; + +function Avatar({ + className, + size = 'default', + ...props +}: React.ComponentProps & { + size?: 'default' | 'sm' | 'lg'; +}) { + return ( + + ); +} + +function AvatarImage({ className, ...props }: React.ComponentProps) { + return ( + + ); +} + +function AvatarFallback({ className, ...props }: React.ComponentProps) { + return ( + + ); +} + +function AvatarBadge({ className, ...props }: React.ComponentProps<'span'>) { + return ( + svg]:hidden', + 'group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2', + 'group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2', + className, + )} + {...props} + /> + ); +} + +function AvatarGroup({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
    + ); +} + +function AvatarGroupCount({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
    svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3', + className, + )} + {...props} + /> + ); +} + +export { Avatar, AvatarImage, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarBadge }; diff --git a/packages/shared/src/components/shadcn/badge.tsx b/packages/shared/src/components/shadcn/badge.tsx new file mode 100644 index 00000000..c94ed74d --- /dev/null +++ b/packages/shared/src/components/shadcn/badge.tsx @@ -0,0 +1,40 @@ +import * as React from 'react'; +import { cva, type VariantProps } from 'class-variance-authority'; +import { Slot } from 'radix-ui'; + +import { cn } from '@react-starter/shared/utils/css'; + +const badgeVariants = cva( + 'group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!', + { + variants: { + variant: { + default: 'bg-primary text-primary-foreground [a]:hover:bg-primary/80', + secondary: 'bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80', + destructive: + 'bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20', + outline: 'border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground', + ghost: 'hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50', + link: 'text-primary underline-offset-4 hover:underline', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +); + +function Badge({ + className, + variant = 'default', + asChild = false, + ...props +}: React.ComponentProps<'span'> & VariantProps & { asChild?: boolean }) { + const Comp = asChild ? Slot.Root : 'span'; + + return ( + + ); +} + +export { Badge, badgeVariants }; diff --git a/packages/shared/src/components/shadcn/breadcrumb.tsx b/packages/shared/src/components/shadcn/breadcrumb.tsx new file mode 100644 index 00000000..60f95e19 --- /dev/null +++ b/packages/shared/src/components/shadcn/breadcrumb.tsx @@ -0,0 +1,89 @@ +import * as React from 'react'; +import { Slot } from 'radix-ui'; + +import { cn } from '@react-starter/shared/utils/css'; +import { ChevronRightIcon, MoreHorizontalIcon } from 'lucide-react'; + +function Breadcrumb({ className, ...props }: React.ComponentProps<'nav'>) { + return