From 59842d72383bb7ad6801c7d95778e82067fa677b Mon Sep 17 00:00:00 2001 From: Jan Amann Date: Fri, 29 Aug 2025 13:48:27 +0200 Subject: [PATCH 01/55] Set up `example-app-router-patterns` --- .../example-app-router-patterns/.gitignore | 4 + .../example-app-router-patterns/README.md | 9 ++ .../eslint.config.mjs | 22 +++++ .../example-app-router-patterns/next-env.d.ts | 6 ++ .../next.config.mjs | 4 + .../example-app-router-patterns/package.json | 34 ++++++++ .../src/app/favicon.ico | Bin 0 -> 15086 bytes .../src/app/layout.tsx | 7 ++ .../src/app/page.tsx | 3 + .../example-app-router-patterns/tsconfig.json | 30 +++++++ pnpm-lock.yaml | 79 +++++++++++++----- 11 files changed, 178 insertions(+), 20 deletions(-) create mode 100644 examples/example-app-router-patterns/.gitignore create mode 100644 examples/example-app-router-patterns/README.md create mode 100644 examples/example-app-router-patterns/eslint.config.mjs create mode 100644 examples/example-app-router-patterns/next-env.d.ts create mode 100644 examples/example-app-router-patterns/next.config.mjs create mode 100644 examples/example-app-router-patterns/package.json create mode 100644 examples/example-app-router-patterns/src/app/favicon.ico create mode 100644 examples/example-app-router-patterns/src/app/layout.tsx create mode 100644 examples/example-app-router-patterns/src/app/page.tsx create mode 100644 examples/example-app-router-patterns/tsconfig.json diff --git a/examples/example-app-router-patterns/.gitignore b/examples/example-app-router-patterns/.gitignore new file mode 100644 index 000000000..04239e7d0 --- /dev/null +++ b/examples/example-app-router-patterns/.gitignore @@ -0,0 +1,4 @@ +/node_modules +/.next/ +.DS_Store +tsconfig.tsbuildinfo diff --git a/examples/example-app-router-patterns/README.md b/examples/example-app-router-patterns/README.md new file mode 100644 index 000000000..6c3beabe0 --- /dev/null +++ b/examples/example-app-router-patterns/README.md @@ -0,0 +1,9 @@ +# example-app-router-patterns + +This example demonstrates various use cases and patterns for using `next-intl` with the App Router. + +## Deploy your own + +By deploying to [Vercel](https://vercel.com), you can check out the example in action. Note that you'll be prompted to create a new GitHub repository as part of this, allowing you to make subsequent changes. + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/amannn/next-intl/tree/main/examples/example-app-router-patterns) diff --git a/examples/example-app-router-patterns/eslint.config.mjs b/examples/example-app-router-patterns/eslint.config.mjs new file mode 100644 index 000000000..144292198 --- /dev/null +++ b/examples/example-app-router-patterns/eslint.config.mjs @@ -0,0 +1,22 @@ +import {dirname} from 'path'; +import {fileURLToPath} from 'url'; +import {FlatCompat} from '@eslint/eslintrc'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const compat = new FlatCompat({ + baseDirectory: __dirname +}); + +const eslintConfig = [ + ...compat.extends('next/core-web-vitals', 'next/typescript'), + { + rules: { + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/ban-ts-comment': 'off' + } + } +]; + +export default eslintConfig; diff --git a/examples/example-app-router-patterns/next-env.d.ts b/examples/example-app-router-patterns/next-env.d.ts new file mode 100644 index 000000000..830fb594c --- /dev/null +++ b/examples/example-app-router-patterns/next-env.d.ts @@ -0,0 +1,6 @@ +/// +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/examples/example-app-router-patterns/next.config.mjs b/examples/example-app-router-patterns/next.config.mjs new file mode 100644 index 000000000..4678774e6 --- /dev/null +++ b/examples/example-app-router-patterns/next.config.mjs @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {}; + +export default nextConfig; diff --git a/examples/example-app-router-patterns/package.json b/examples/example-app-router-patterns/package.json new file mode 100644 index 000000000..5f4903ddf --- /dev/null +++ b/examples/example-app-router-patterns/package.json @@ -0,0 +1,34 @@ +{ + "name": "example-app-router-patterns", + "private": true, + "scripts": { + "dev": "next dev", + "lint": "eslint src && prettier src --check", + "build": "next build", + "start": "next start" + }, + "dependencies": { + "next": "^15.5.0", + "next-intl": "^4.0.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@eslint/eslintrc": "^3.1.0", + "@types/node": "^20.14.5", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "eslint": "9.11.1", + "eslint-config-next": "^15.5.0", + "prettier": "^3.3.3", + "typescript": "^5.5.3" + }, + "prettier": { + "singleQuote": true, + "bracketSpacing": false, + "trailingComma": "none" + }, + "engines": { + "node": ">=20.0.0" + } +} diff --git a/examples/example-app-router-patterns/src/app/favicon.ico b/examples/example-app-router-patterns/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4ddd8fff7086c240ed21438ca7d96f1b8dae0bc0 GIT binary patch literal 15086 zcmdU$O=uNY6vrnYO%#n9m0G$<)C8)FRuGb41&a%z2%-zOrYkKQ7LVcV8tZ8{r_I(J}2Xwd3WZ$*OwePxifd}IsgB? z@7{AiX5x7@UY)mPi>I{JyV~w~9iHd4w)*$0Jnt9fty0SKPwPGJD;0Q8Wn|)gA|*d3 zZJyV>ZcgVi%JR2KUOJ_pNiRu%l#WaPk^bu|*W~exGL*#z+iFOiKxv{cq~A-QNoSnvZWVz$%y2 z$kB(=jC597D#v2>V1NZC*rkY~fpzbN^>mc9}aM-le$W`3Rbh-!*zlSeaS_(t57xidzf?h9!_wJ6XMpeG;F(2?%@^} zTZz5QCkusdm&t8;0X=2;v z=4NyA=FO7%Pfbmky?gg2#`ihHeJl-sYxshdXBjsq7mY z8_mUw7gO^e8yhp7ot>$$ea>(%X}z;`>sB*5I-05ur%#_Y#Iv;R=W{QKf7*DOB3>4% zC)`u_AKPw8<7vuxS%^Q}Q;%QEpEOB4Eg@cp>j3vu@iWMsYu9*MV!RCVhdXmXI6u|B zOFS(xUWR$WJ@NV>s=meIX&K^WkiT6&bc&Dj`YnpP&5w(xWr&wS{&xM=By8vPv*j6; zM#a-I#mgXnIKv%r-oL19&_}`Ra6BzzybR*m{R{jzNz1x_B%V%BPv_?4GR8~GAFgn= z!d{p?v3*{0N<1AJ8Zs|lyeMUT8O4LM2F@IU!kI)_e}g@H_L#xJL9=w}(kLEj^5Mu? zPa!Gm`4#bW_3G7WI7ZpTonKL(#c+POu291V^0w=Gv7X=BY8=qTLOVb2w&WaA-W4pg z_ZPfVNg|8+{gJIFb*3*>V?2NfcG7m2$vk0h`@i3x4*QtFGv;}uQrr+*nI9_oTi_dv zxOXgioLZQ(?e_y}6iZ{#ZwxL^&=9>|`hvL_vv zayCHQqFj^5GrQ-*#;)IWnNEy;<($6sycVvrp4Uj4(FrcKN zvwpkUcIKIsPTVT}NSgmnYgOv+w20N4r9IMbr9Vq2rL(?rO&-rELs@J}6~-g|aZs9- zPD^QmIHgQhiVe2-NF(pcs9(zWSaEo9&#=V@zLH3X3Xe$n+2j1XJi`aR@aZBuRp=+F zi|-_5@QLp@fnz1GEl+$$wFAG=4^msUQYjeW{!ptt`bniQ!+ya6(@K{v%63*JUtzrP zJy>8OjL&bR;WD}Vy1F`(R_p8QS z3)aiW1e0>+L40 z-*@!(_U7itD4r4d!TA^bRO^q1h6b~2*|K1rT(A3mOt7s~bNyvGRCE1lIqcL$qL`%e zF71v_e7gwkz@DKR`wz>H{y;x@CUvP_p)%OwBfQ>LmXi=0*h5xh{~07$vHiE{t1C-pXV!RjLzkh$YPT0;{WAHuhnKNhJu)lWgTA}x{_V=CVx2>(su;#M@ zA9w|M`q$Xc<8RBbW@GJ!#C#`=ZNB}iEh&4Pk&zMe=+Pt7-riman>=juzhBUvYv%ET z2M) { + return ( + + {children} + + ); +} diff --git a/examples/example-app-router-patterns/src/app/page.tsx b/examples/example-app-router-patterns/src/app/page.tsx new file mode 100644 index 000000000..50ed73181 --- /dev/null +++ b/examples/example-app-router-patterns/src/app/page.tsx @@ -0,0 +1,3 @@ +export default function Home() { + return
Hello World
; +} diff --git a/examples/example-app-router-patterns/tsconfig.json b/examples/example-app-router-patterns/tsconfig.json new file mode 100644 index 000000000..1638156ff --- /dev/null +++ b/examples/example-app-router-patterns/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "allowArbitraryExtensions": true, + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "strict": true, + "allowJs": true, + "skipLibCheck": true, + "noEmit": true, + "esModuleInterop": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + }, + // See https://github.com/amannn/next-intl/pull/1509 + "declaration": true + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8460e530c..dfd89fa80 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -319,6 +319,46 @@ importers: specifier: ^5.5.3 version: 5.8.2 + examples/example-app-router-patterns: + dependencies: + next: + specifier: ^15.5.0 + version: 15.5.0(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next-intl: + specifier: ^4.0.0 + version: link:../../packages/next-intl + react: + specifier: ^19.0.0 + version: 19.0.0 + react-dom: + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) + devDependencies: + '@eslint/eslintrc': + specifier: ^3.1.0 + version: 3.3.0 + '@types/node': + specifier: ^20.14.5 + version: 20.17.24 + '@types/react': + specifier: ^19.0.0 + version: 19.0.10 + '@types/react-dom': + specifier: ^19.0.0 + version: 19.0.4(@types/react@19.0.10) + eslint: + specifier: 9.11.1 + version: 9.11.1(jiti@2.4.2) + eslint-config-next: + specifier: ^15.5.0 + version: 15.5.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + prettier: + specifier: ^3.3.3 + version: 3.5.3 + typescript: + specifier: ^5.5.3 + version: 5.8.2 + examples/example-app-router-playground: dependencies: '@radix-ui/react-dropdown-menu': @@ -17276,7 +17316,7 @@ snapshots: '@formatjs/icu-skeleton-parser@1.8.13': dependencies: '@formatjs/ecma402-abstract': 2.3.3 - tslib: 2.8.0 + tslib: 2.8.1 '@formatjs/intl-localematcher@0.2.25': dependencies: @@ -18344,11 +18384,11 @@ snapshots: '@npmcli/fs@1.1.1': dependencies: '@gar/promisify': 1.1.3 - semver: 7.7.1 + semver: 7.7.2 '@npmcli/fs@3.1.1': dependencies: - semver: 7.6.2 + semver: 7.7.2 '@npmcli/git@4.1.0': dependencies: @@ -18358,7 +18398,7 @@ snapshots: proc-log: 3.0.0 promise-inflight: 1.0.1(bluebird@3.7.2) promise-retry: 2.0.1 - semver: 7.6.2 + semver: 7.7.2 which: 3.0.1 transitivePeerDependencies: - bluebird @@ -18372,7 +18412,7 @@ snapshots: proc-log: 4.2.0 promise-inflight: 1.0.1(bluebird@3.7.2) promise-retry: 2.0.1 - semver: 7.7.1 + semver: 7.7.2 which: 4.0.0 transitivePeerDependencies: - bluebird @@ -18395,7 +18435,7 @@ snapshots: json-parse-even-better-errors: 3.0.2 pacote: 18.0.6 proc-log: 4.2.0 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - bluebird - supports-color @@ -20774,7 +20814,7 @@ snapshots: acorn-globals@7.0.1: dependencies: - acorn: 8.12.0 + acorn: 8.14.1 acorn-walk: 8.3.3 acorn-jsx@5.3.2(acorn@8.13.0): @@ -22165,7 +22205,7 @@ snapshots: handlebars: 4.7.8 json-stringify-safe: 5.0.1 meow: 12.1.1 - semver: 7.7.1 + semver: 7.7.2 split2: 4.2.0 conventional-commits-filter@4.0.0: {} @@ -24932,7 +24972,7 @@ snapshots: git-semver-tags@7.0.1: dependencies: meow: 12.1.1 - semver: 7.7.1 + semver: 7.7.2 git-up@7.0.0: dependencies: @@ -26188,7 +26228,7 @@ snapshots: '@babel/parser': 7.21.9 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -27129,7 +27169,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 make-dir@5.0.0: {} @@ -28977,7 +29017,7 @@ snapshots: make-fetch-happen: 13.0.1 nopt: 7.2.1 proc-log: 4.2.0 - semver: 7.7.1 + semver: 7.7.2 tar: 6.2.1 which: 4.0.0 transitivePeerDependencies: @@ -29067,13 +29107,13 @@ snapshots: dependencies: hosted-git-info: 6.1.1 is-core-module: 2.13.1 - semver: 7.6.2 + semver: 7.7.2 validate-npm-package-license: 3.0.4 normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.7.1 + semver: 7.7.2 validate-npm-package-license: 3.0.4 normalize-path@2.1.1: @@ -29096,7 +29136,7 @@ snapshots: npm-install-checks@6.3.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 npm-normalize-package-bin@2.0.0: {} @@ -29106,7 +29146,7 @@ snapshots: dependencies: hosted-git-info: 6.1.1 proc-log: 3.0.0 - semver: 7.7.1 + semver: 7.7.2 validate-npm-package-name: 5.0.1 npm-package-arg@11.0.3: @@ -29139,14 +29179,14 @@ snapshots: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 10.1.0 - semver: 7.7.1 + semver: 7.7.2 npm-pick-manifest@9.1.0: dependencies: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 11.0.3 - semver: 7.7.1 + semver: 7.7.2 npm-registry-fetch@17.1.0: dependencies: @@ -31355,8 +31395,7 @@ snapshots: semver@7.7.1: {} - semver@7.7.2: - optional: true + semver@7.7.2: {} send@0.18.0: dependencies: From 5b23c2524288a8a91dc90f1b0b59f66697fb049d Mon Sep 17 00:00:00 2001 From: Jan Amann Date: Fri, 29 Aug 2025 15:10:26 +0200 Subject: [PATCH 02/55] Set up design system --- .../example-app-router-patterns/package.json | 14 +- .../postcss.config.mjs | 6 + .../src/app/design/DesignColorSwatch.tsx | 15 + .../src/app/design/DesignSection.tsx | 17 + .../src/app/design/page.tsx | 170 +++ .../src/app/globals.css | 23 + .../src/app/layout.tsx | 11 +- .../src/app/page.tsx | 6 +- pnpm-lock.yaml | 984 ++++++++++++------ 9 files changed, 915 insertions(+), 331 deletions(-) create mode 100644 examples/example-app-router-patterns/postcss.config.mjs create mode 100644 examples/example-app-router-patterns/src/app/design/DesignColorSwatch.tsx create mode 100644 examples/example-app-router-patterns/src/app/design/DesignSection.tsx create mode 100644 examples/example-app-router-patterns/src/app/design/page.tsx create mode 100644 examples/example-app-router-patterns/src/app/globals.css diff --git a/examples/example-app-router-patterns/package.json b/examples/example-app-router-patterns/package.json index 5f4903ddf..f35bd99ba 100644 --- a/examples/example-app-router-patterns/package.json +++ b/examples/example-app-router-patterns/package.json @@ -8,25 +8,35 @@ "start": "next start" }, "dependencies": { + "clsx": "^2.1.1", "next": "^15.5.0", "next-intl": "^4.0.0", "react": "^19.0.0", - "react-dom": "^19.0.0" + "react-dom": "^19.0.0", + "tailwindcss": "^4.1.12" }, "devDependencies": { "@eslint/eslintrc": "^3.1.0", + "@tailwindcss/postcss": "^4.1.12", "@types/node": "^20.14.5", "@types/react": "^19.0.0", "@types/react-dom": "^19.0.0", "eslint": "9.11.1", "eslint-config-next": "^15.5.0", + "postcss": "^8.5.3", "prettier": "^3.3.3", + "prettier-plugin-organize-imports": "^4.2.0", + "prettier-plugin-tailwindcss": "^0.6.14", "typescript": "^5.5.3" }, "prettier": { "singleQuote": true, "bracketSpacing": false, - "trailingComma": "none" + "trailingComma": "none", + "plugins": [ + "prettier-plugin-organize-imports", + "prettier-plugin-tailwindcss" + ] }, "engines": { "node": ">=20.0.0" diff --git a/examples/example-app-router-patterns/postcss.config.mjs b/examples/example-app-router-patterns/postcss.config.mjs new file mode 100644 index 000000000..313840505 --- /dev/null +++ b/examples/example-app-router-patterns/postcss.config.mjs @@ -0,0 +1,6 @@ +const config = { + plugins: { + '@tailwindcss/postcss': {} + } +}; +export default config; diff --git a/examples/example-app-router-patterns/src/app/design/DesignColorSwatch.tsx b/examples/example-app-router-patterns/src/app/design/DesignColorSwatch.tsx new file mode 100644 index 000000000..7f6222457 --- /dev/null +++ b/examples/example-app-router-patterns/src/app/design/DesignColorSwatch.tsx @@ -0,0 +1,15 @@ +import clsx from 'clsx'; + +type Props = { + className: string; + value: string; +}; + +export default function DesignColorSwatch({className, value}: Props) { + return ( +
+
+
{value}
+
+ ); +} diff --git a/examples/example-app-router-patterns/src/app/design/DesignSection.tsx b/examples/example-app-router-patterns/src/app/design/DesignSection.tsx new file mode 100644 index 000000000..433cbf251 --- /dev/null +++ b/examples/example-app-router-patterns/src/app/design/DesignSection.tsx @@ -0,0 +1,17 @@ +import {ReactNode} from 'react'; + +type Props = { + children: ReactNode; + title: string; +}; + +export default function DesignSection({children, title}: Props) { + return ( +
+

+ {title} +

+ {children} +
+ ); +} diff --git a/examples/example-app-router-patterns/src/app/design/page.tsx b/examples/example-app-router-patterns/src/app/design/page.tsx new file mode 100644 index 000000000..1fcd139d5 --- /dev/null +++ b/examples/example-app-router-patterns/src/app/design/page.tsx @@ -0,0 +1,170 @@ +// Documentation page for the next-intl design system + +import DesignColorSwatch from './DesignColorSwatch'; +import DesignSection from './DesignSection'; + +export default function DesignPage() { + return ( +
+
+

+ Design system +

+
+ +
+
+

+ Blue (primary) +

+
+ + + + + + + + + + +
+
+
+

Gray

+
+ + + + + + + + + + +
+
+
+
+ +
+
+
+

+ Title large +

+

+ Title normal +

+

Title description

+

+ Title caption +

+

+ Title small +

+

+ Headline +

+

+ Headline caption +

+

Body large

+

Body large muted

+

+ Body with{' '} + + a link + +

+

Body muted

+

Label

+

+ Label muted +

+

+ Inline code +

+
+
+
+
+

+ Title large +

+

+ Title normal +

+

Title description

+

+ Title caption +

+

+ Title small +

+

Headline

+

+ Headline caption +

+

Body large

+

Body large muted

+

+ Body with{' '} + + a link + +

+

Body muted

+

Label

+

+ Label muted +

+

+ Inline code +

+
+
+
+
+ +
+
+
+

+ Title caption +

+

+ Title normal +

+

+ Title description +

+
+
+
+
+

+ Title caption +

+

+ Title normal +

+

+ Title description +

+
+
+
+
+
+
+
+ ); +} diff --git a/examples/example-app-router-patterns/src/app/globals.css b/examples/example-app-router-patterns/src/app/globals.css new file mode 100644 index 000000000..73bb5b727 --- /dev/null +++ b/examples/example-app-router-patterns/src/app/globals.css @@ -0,0 +1,23 @@ +@import 'tailwindcss'; + +@theme { + --color-white: #ffffff; + + --color-gray-50: #f7f7f8; + --color-gray-100: #ebebef; + --color-gray-200: #d1d1db; + --color-gray-300: #a9a9bc; + --color-gray-400: #8a8aa3; + --color-gray-500: #6c6c89; + --color-gray-600: #55556d; + --color-gray-700: #3f3f50; + --color-gray-800: #282833; + --color-gray-900: #121217; + + --color-blue-300: #70d2ff; + --color-blue-700: #008fd6; + + --font-mono: + Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, Liberation Mono, + Courier New, monospace; +} diff --git a/examples/example-app-router-patterns/src/app/layout.tsx b/examples/example-app-router-patterns/src/app/layout.tsx index 8957311c8..f2c77bbad 100644 --- a/examples/example-app-router-patterns/src/app/layout.tsx +++ b/examples/example-app-router-patterns/src/app/layout.tsx @@ -1,7 +1,16 @@ +import {Inter} from 'next/font/google'; +import './globals.css'; +import {clsx} from 'clsx'; + +const inter = Inter({ + subsets: ['latin'], + variable: '--font-inter' +}); + export default function RootLayout({children}: LayoutProps<'/'>) { return ( - {children} + {children} ); } diff --git a/examples/example-app-router-patterns/src/app/page.tsx b/examples/example-app-router-patterns/src/app/page.tsx index 50ed73181..f5638571b 100644 --- a/examples/example-app-router-patterns/src/app/page.tsx +++ b/examples/example-app-router-patterns/src/app/page.tsx @@ -1,3 +1,5 @@ -export default function Home() { - return
Hello World
; +import {redirect} from 'next/navigation'; + +export default function HomePage() { + redirect('/design'); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dfd89fa80..43b394cbf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -45,10 +45,10 @@ importers: version: 2.2.0(react@18.3.1) '@vercel/analytics': specifier: 1.5.0 - version: 1.5.0(@remix-run/react@2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 1.5.0(@remix-run/react@2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@vercel/speed-insights': specifier: ^1.2.0 - version: 1.2.0(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 1.2.0(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -57,13 +57,13 @@ importers: version: 2.3.0 next: specifier: ^14.2.4 - version: 14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nextra: specifier: ^3.3.1 - version: 3.3.1(@types/react@19.0.10)(acorn@8.14.1)(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + version: 3.3.1(@types/react@19.0.10)(acorn@8.14.1)(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) nextra-theme-docs: specifier: ^3.3.1 - version: 3.3.1(patch_hash=37qjvtnqoj5dxgzxofrrj6xcdq)(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@3.3.1(@types/react@19.0.10)(acorn@8.14.1)(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.3.1(patch_hash=37qjvtnqoj5dxgzxofrrj6xcdq)(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@3.3.1(@types/react@19.0.10)(acorn@8.14.1)(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.3.1 version: 18.3.1 @@ -91,10 +91,10 @@ importers: version: 10.4.21(postcss@8.5.3) eslint: specifier: 9.11.1 - version: 9.11.1(jiti@2.4.2) + version: 9.11.1(jiti@2.5.1) eslint-config-molindo: specifier: ^8.0.0 - version: 8.0.0(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@3.4.17)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + version: 8.0.0(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@3.4.17)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.5.1)(jsdom@26.0.0)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0)) fast-glob: specifier: ^3.3.3 version: 3.3.3 @@ -103,7 +103,7 @@ importers: version: 16.0.0 next-sitemap: specifier: ^4.2.3 - version: 4.2.3(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 4.2.3(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) next-validate-link: specifier: ^1.5.1 version: 1.5.1 @@ -164,10 +164,10 @@ importers: version: 10.4.21(postcss@8.5.3) eslint: specifier: 9.11.1 - version: 9.11.1(jiti@2.4.2) + version: 9.11.1(jiti@2.5.1) eslint-config-next: specifier: ^15.5.0 - version: 15.5.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + version: 15.5.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) jest: specifier: ^29.7.0 version: 29.7.0(@types/node@20.17.24) @@ -213,10 +213,10 @@ importers: version: 19.0.10 eslint: specifier: 9.11.1 - version: 9.11.1(jiti@2.4.2) + version: 9.11.1(jiti@2.5.1) eslint-config-next: specifier: ^15.5.0 - version: 15.5.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + version: 15.5.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) prettier: specifier: ^3.3.3 version: 3.5.3 @@ -259,10 +259,10 @@ importers: version: 10.4.21(postcss@8.5.3) eslint: specifier: 9.11.1 - version: 9.11.1(jiti@2.4.2) + version: 9.11.1(jiti@2.5.1) eslint-config-next: specifier: ^15.5.0 - version: 15.5.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + version: 15.5.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) postcss: specifier: ^8.5.3 version: 8.5.3 @@ -308,10 +308,10 @@ importers: version: 19.0.10 eslint: specifier: 9.11.1 - version: 9.11.1(jiti@2.4.2) + version: 9.11.1(jiti@2.5.1) eslint-config-next: specifier: ^15.5.0 - version: 15.5.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + version: 15.5.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) prettier: specifier: ^3.3.3 version: 3.5.3 @@ -321,6 +321,9 @@ importers: examples/example-app-router-patterns: dependencies: + clsx: + specifier: ^2.1.1 + version: 2.1.1 next: specifier: ^15.5.0 version: 15.5.0(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -333,10 +336,16 @@ importers: react-dom: specifier: ^19.0.0 version: 19.0.0(react@19.0.0) + tailwindcss: + specifier: ^4.1.12 + version: 4.1.12 devDependencies: '@eslint/eslintrc': specifier: ^3.1.0 version: 3.3.0 + '@tailwindcss/postcss': + specifier: ^4.1.12 + version: 4.1.12 '@types/node': specifier: ^20.14.5 version: 20.17.24 @@ -348,13 +357,22 @@ importers: version: 19.0.4(@types/react@19.0.10) eslint: specifier: 9.11.1 - version: 9.11.1(jiti@2.4.2) + version: 9.11.1(jiti@2.5.1) eslint-config-next: specifier: ^15.5.0 - version: 15.5.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + version: 15.5.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) + postcss: + specifier: ^8.5.3 + version: 8.5.3 prettier: specifier: ^3.3.3 version: 3.5.3 + prettier-plugin-organize-imports: + specifier: ^4.2.0 + version: 4.2.0(prettier@3.5.3)(typescript@5.8.2) + prettier-plugin-tailwindcss: + specifier: ^0.6.14 + version: 0.6.14(prettier-plugin-organize-imports@4.2.0(prettier@3.5.3)(typescript@5.8.2))(prettier@3.5.3) typescript: specifier: ^5.5.3 version: 5.8.2 @@ -442,10 +460,10 @@ importers: version: 6.11.0(webpack@5.98.0(esbuild@0.25.1)) eslint: specifier: 9.11.1 - version: 9.11.1(jiti@2.4.2) + version: 9.11.1(jiti@2.5.1) eslint-config-next: specifier: ^15.5.0 - version: 15.5.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + version: 15.5.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) jest: specifier: ^29.7.0 version: 29.7.0(@types/node@20.17.24) @@ -500,10 +518,10 @@ importers: version: 19.0.10 eslint: specifier: 9.11.1 - version: 9.11.1(jiti@2.4.2) + version: 9.11.1(jiti@2.5.1) eslint-config-next: specifier: ^15.5.0 - version: 15.5.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + version: 15.5.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) prettier: specifier: ^3.3.3 version: 3.5.3 @@ -564,10 +582,10 @@ importers: version: 10.4.21(postcss@8.5.3) eslint: specifier: 9.11.1 - version: 9.11.1(jiti@2.4.2) + version: 9.11.1(jiti@2.5.1) eslint-config-next: specifier: ^15.5.0 - version: 15.5.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + version: 15.5.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) postcss: specifier: ^8.5.3 version: 8.5.3 @@ -613,10 +631,10 @@ importers: version: 19.0.10 eslint: specifier: 9.11.1 - version: 9.11.1(jiti@2.4.2) + version: 9.11.1(jiti@2.5.1) eslint-config-next: specifier: ^15.5.0 - version: 15.5.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + version: 15.5.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) prettier: specifier: ^3.3.3 version: 3.5.3 @@ -668,10 +686,10 @@ importers: version: 19.0.10 eslint: specifier: 9.11.1 - version: 9.11.1(jiti@2.4.2) + version: 9.11.1(jiti@2.5.1) eslint-config-next: specifier: ^15.5.0 - version: 15.5.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + version: 15.5.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) jest: specifier: ^29.7.0 version: 29.7.0(@types/node@20.17.24) @@ -708,7 +726,7 @@ importers: dependencies: '@expo/webpack-config': specifier: ^0.17.2 - version: 0.17.4(encoding@0.1.13)(eslint@9.22.0(jiti@2.4.2))(expo@47.0.14(@babel/core@7.26.10)(encoding@0.1.13))(typescript@5.8.2) + version: 0.17.4(encoding@0.1.13)(eslint@9.22.0(jiti@2.5.1))(expo@47.0.14(@babel/core@7.26.10)(encoding@0.1.13))(typescript@5.8.2) expo: specifier: ~47.0.12 version: 47.0.14(@babel/core@7.26.10)(encoding@0.1.13) @@ -764,7 +782,7 @@ importers: devDependencies: '@remix-run/dev': specifier: ^2.9.2 - version: 2.16.0(@remix-run/react@2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@remix-run/serve@2.16.0(typescript@5.8.2))(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(typescript@5.8.2)(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))(yaml@2.7.0) + version: 2.16.0(@remix-run/react@2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@remix-run/serve@2.16.0(typescript@5.8.2))(@types/node@22.13.10)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(typescript@5.8.2)(vite@6.2.1(@types/node@22.13.10)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0))(yaml@2.7.0) '@types/accept-language-parser': specifier: ^1.5.7 version: 1.5.7 @@ -801,7 +819,7 @@ importers: version: 19.0.4(@types/react@19.0.10) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + version: 4.3.4(vite@6.2.1(@types/node@22.13.10)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0)) prettier: specifier: ^3.3.3 version: 3.5.3 @@ -810,7 +828,7 @@ importers: version: 5.8.2 vite: specifier: ^6.2.1 - version: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + version: 6.2.1(@types/node@22.13.10)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0) packages/next-intl: dependencies: @@ -850,13 +868,13 @@ importers: version: 19.0.4(@types/react@19.0.10) eslint: specifier: 9.11.1 - version: 9.11.1(jiti@2.4.2) + version: 9.11.1(jiti@2.5.1) eslint-config-molindo: specifier: ^8.0.0 - version: 8.0.0(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@4.0.13)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + version: 8.0.0(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@4.1.12)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.5.1)(jsdom@26.0.0)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0)) eslint-plugin-react-compiler: specifier: 0.0.0-experimental-8e3b87c-20240822 - version: 0.0.0-experimental-8e3b87c-20240822(eslint@9.11.1(jiti@2.4.2)) + version: 0.0.0-experimental-8e3b87c-20240822(eslint@9.11.1(jiti@2.5.1)) next: specifier: ^15.5.0 version: 15.5.0(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -892,7 +910,7 @@ importers: version: 5.8.2 vitest: specifier: ^3.0.8 - version: 3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + version: 3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.5.1)(jsdom@26.0.0)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0) packages/use-intl: dependencies: @@ -929,13 +947,13 @@ importers: version: 4.1.0 eslint: specifier: 9.11.1 - version: 9.11.1(jiti@2.4.2) + version: 9.11.1(jiti@2.5.1) eslint-config-molindo: specifier: ^8.0.0 - version: 8.0.0(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@4.0.13)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + version: 8.0.0(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@4.1.12)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.5.1)(jsdom@26.0.0)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0)) eslint-plugin-react-compiler: specifier: 0.0.0-experimental-8e3b87c-20240822 - version: 0.0.0-experimental-8e3b87c-20240822(eslint@9.11.1(jiti@2.4.2)) + version: 0.0.0-experimental-8e3b87c-20240822(eslint@9.11.1(jiti@2.5.1)) prettier: specifier: ^3.3.3 version: 3.5.3 @@ -965,7 +983,7 @@ importers: version: 5.8.2 vitest: specifier: ^3.0.8 - version: 3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + version: 3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.5.1)(jsdom@26.0.0)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0) tools: devDependencies: @@ -995,10 +1013,10 @@ importers: version: 0.4.4(rollup@4.35.0) eslint: specifier: 9.11.1 - version: 9.11.1(jiti@2.4.2) + version: 9.11.1(jiti@2.5.1) eslint-config-molindo: specifier: ^8.0.0 - version: 8.0.0(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@22.13.10))(tailwindcss@4.0.13)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + version: 8.0.0(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(jest@29.7.0(@types/node@22.13.10))(tailwindcss@4.1.12)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.5.1)(jsdom@26.0.0)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0)) execa: specifier: ^9.5.2 version: 9.5.2 @@ -2584,7 +2602,7 @@ packages: '@expo/bunyan@4.0.1': resolution: {integrity: sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==} - engines: {'0': node >=0.10.0} + engines: {node: '>=0.10.0'} '@expo/cli@0.4.11': resolution: {integrity: sha512-L9Ci9RBh0aPFEDF1AjDYPk54OgeUJIKzxF3lRgITm+lQpI3IEKjAc9LaYeQeO1mlZMUQmPkHArF8iyz1eOeVoQ==} @@ -3046,6 +3064,10 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@isaacs/string-locale-compare@1.1.0': resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} @@ -3143,6 +3165,9 @@ packages: resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -4604,6 +4629,94 @@ packages: '@swc/helpers@0.5.5': resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + '@tailwindcss/node@4.1.12': + resolution: {integrity: sha512-3hm9brwvQkZFe++SBt+oLjo4OLDtkvlE8q2WalaD/7QWaeM7KEJbAiY/LJZUaCs7Xa8aUu4xy3uoyX4q54UVdQ==} + + '@tailwindcss/oxide-android-arm64@4.1.12': + resolution: {integrity: sha512-oNY5pq+1gc4T6QVTsZKwZaGpBb2N1H1fsc1GD4o7yinFySqIuRZ2E4NvGasWc6PhYJwGK2+5YT1f9Tp80zUQZQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.12': + resolution: {integrity: sha512-cq1qmq2HEtDV9HvZlTtrj671mCdGB93bVY6J29mwCyaMYCP/JaUBXxrQQQm7Qn33AXXASPUb2HFZlWiiHWFytw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.12': + resolution: {integrity: sha512-6UCsIeFUcBfpangqlXay9Ffty9XhFH1QuUFn0WV83W8lGdX8cD5/+2ONLluALJD5+yJ7k8mVtwy3zMZmzEfbLg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.12': + resolution: {integrity: sha512-JOH/f7j6+nYXIrHobRYCtoArJdMJh5zy5lr0FV0Qu47MID/vqJAY3r/OElPzx1C/wdT1uS7cPq+xdYYelny1ww==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.12': + resolution: {integrity: sha512-v4Ghvi9AU1SYgGr3/j38PD8PEe6bRfTnNSUE3YCMIRrrNigCFtHZ2TCm8142X8fcSqHBZBceDx+JlFJEfNg5zQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.12': + resolution: {integrity: sha512-YP5s1LmetL9UsvVAKusHSyPlzSRqYyRB0f+Kl/xcYQSPLEw/BvGfxzbH+ihUciePDjiXwHh+p+qbSP3SlJw+6g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.12': + resolution: {integrity: sha512-V8pAM3s8gsrXcCv6kCHSuwyb/gPsd863iT+v1PGXC4fSL/OJqsKhfK//v8P+w9ThKIoqNbEnsZqNy+WDnwQqCA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.12': + resolution: {integrity: sha512-xYfqYLjvm2UQ3TZggTGrwxjYaLB62b1Wiysw/YE3Yqbh86sOMoTn0feF98PonP7LtjsWOWcXEbGqDL7zv0uW8Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.12': + resolution: {integrity: sha512-ha0pHPamN+fWZY7GCzz5rKunlv9L5R8kdh+YNvP5awe3LtuXb5nRi/H27GeL2U+TdhDOptU7T6Is7mdwh5Ar3A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.12': + resolution: {integrity: sha512-4tSyu3dW+ktzdEpuk6g49KdEangu3eCYoqPhWNsZgUhyegEda3M9rG0/j1GV/JjVVsj+lG7jWAyrTlLzd/WEBg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.12': + resolution: {integrity: sha512-iGLyD/cVP724+FGtMWslhcFyg4xyYyM+5F4hGvKA7eifPkXHRAUDFaimu53fpNg9X8dfP75pXx/zFt/jlNF+lg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.12': + resolution: {integrity: sha512-NKIh5rzw6CpEodv/++r0hGLlfgT/gFN+5WNdZtvh6wpU2BpGNgdjvj6H2oFc8nCM839QM1YOhjpgbAONUb4IxA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.12': + resolution: {integrity: sha512-gM5EoKHW/ukmlEtphNwaGx45fGoEmP10v51t9unv55voWh6WrOL19hfuIdo2FjxIaZzw776/BUQg7Pck++cIVw==} + engines: {node: '>= 10'} + + '@tailwindcss/postcss@4.1.12': + resolution: {integrity: sha512-5PpLYhCAwf9SJEeIsSmCDLgyVfdBhdBpzX1OJ87anT9IVR0Z9pjM0FNixCAUAHGnMBGB8K99SwAheXrT0Kh6QQ==} + '@tanstack/react-virtual@3.13.2': resolution: {integrity: sha512-LceSUgABBKF6HSsHK2ZqHzQ37IKV/jlaWbHm+NyTa3/WNb/JZVcThDuTainf+PixltOOcFCYXwxbLpOX9sCx+g==} peerDependencies: @@ -6256,6 +6369,10 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} @@ -7442,6 +7559,10 @@ packages: resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + engines: {node: '>=10.13.0'} + entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -9773,6 +9894,10 @@ packages: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true + jiti@2.5.1: + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} + hasBin: true + joi@17.13.3: resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} @@ -9994,68 +10119,68 @@ packages: resolution: {integrity: sha512-26zzwoBNAvX9AWOPiqqF6FG4HrSCPsHFkQm7nT+xU1ggAujL/eae81RnCv4CJ2In9q9fh10B88sYSzKCUh/Ghg==} engines: {node: ^16.14.0 || >=18.0.0} - lightningcss-darwin-arm64@1.29.2: - resolution: {integrity: sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==} + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.29.2: - resolution: {integrity: sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==} + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.29.2: - resolution: {integrity: sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==} + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.29.2: - resolution: {integrity: sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==} + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.29.2: - resolution: {integrity: sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==} + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-arm64-musl@1.29.2: - resolution: {integrity: sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==} + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-x64-gnu@1.29.2: - resolution: {integrity: sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==} + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-linux-x64-musl@1.29.2: - resolution: {integrity: sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==} + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-win32-arm64-msvc@1.29.2: - resolution: {integrity: sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==} + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.29.2: - resolution: {integrity: sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==} + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.29.2: - resolution: {integrity: sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==} + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} engines: {node: '>= 12.0.0'} lilconfig@3.1.2: @@ -10869,6 +10994,10 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} + minizlib@3.0.2: + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + engines: {node: '>= 18'} + mississippi@3.0.0: resolution: {integrity: sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==} engines: {node: '>=4.0.0'} @@ -10892,6 +11021,11 @@ packages: engines: {node: '>=10'} hasBin: true + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + mlly@1.7.1: resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} @@ -12157,6 +12291,77 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prettier-plugin-organize-imports@4.2.0: + resolution: {integrity: sha512-Zdy27UhlmyvATZi67BTnLcKTo8fm6Oik59Sz6H64PgZJVs6NJpPD1mT240mmJn62c98/QaL+r3kx9Q3gRpDajg==} + peerDependencies: + prettier: '>=2.0' + typescript: '>=2.9' + vue-tsc: ^2.1.0 || 3 + peerDependenciesMeta: + vue-tsc: + optional: true + + prettier-plugin-tailwindcss@0.6.14: + resolution: {integrity: sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-hermes': '*' + '@prettier/plugin-oxc': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-hermes': + optional: true + '@prettier/plugin-oxc': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} @@ -12315,6 +12520,7 @@ packages: engines: {node: '>=0.6.0', teleport: '>=0.2.0'} deprecated: |- You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. + (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) qrcode-terminal@0.11.0: @@ -13760,8 +13966,8 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - tailwindcss@4.0.13: - resolution: {integrity: sha512-gbvFrB0fOsTv/OugXWi2PtflJ4S6/ctu6Mmn3bCftmLY/6xRsQVEJPgIIpABwpZ52DpONkCA3bEj5b54MHxF2Q==} + tailwindcss@4.1.12: + resolution: {integrity: sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==} tapable@1.1.3: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} @@ -13782,6 +13988,10 @@ packages: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + temp-dir@1.0.0: resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} engines: {node: '>=4'} @@ -15156,6 +15366,10 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -16826,19 +17040,19 @@ snapshots: '@esbuild/win32-x64@0.25.1': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.11.1(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.4.0(eslint@9.11.1(jiti@2.5.1))': dependencies: - eslint: 9.11.1(jiti@2.4.2) + eslint: 9.11.1(jiti@2.5.1) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.5.0(eslint@9.11.1(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.5.0(eslint@9.11.1(jiti@2.5.1))': dependencies: - eslint: 9.11.1(jiti@2.4.2) + eslint: 9.11.1(jiti@2.5.1) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.5.0(eslint@9.22.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.5.0(eslint@9.22.0(jiti@2.5.1))': dependencies: - eslint: 9.22.0(jiti@2.4.2) + eslint: 9.22.0(jiti@2.5.1) eslint-visitor-keys: 3.4.3 optional: true @@ -17187,7 +17401,7 @@ snapshots: '@expo/vector-icons@13.0.0': {} - '@expo/webpack-config@0.17.4(encoding@0.1.13)(eslint@9.22.0(jiti@2.4.2))(expo@47.0.14(@babel/core@7.26.10)(encoding@0.1.13))(typescript@5.8.2)': + '@expo/webpack-config@0.17.4(encoding@0.1.13)(eslint@9.22.0(jiti@2.5.1))(expo@47.0.14(@babel/core@7.26.10)(encoding@0.1.13))(typescript@5.8.2)': dependencies: '@babel/core': 7.9.0 babel-loader: 8.1.0(@babel/core@7.9.0)(webpack@4.43.0) @@ -17209,7 +17423,7 @@ snapshots: optimize-css-assets-webpack-plugin: 5.0.8(webpack@4.43.0) pnp-webpack-plugin: 1.7.0(typescript@5.8.2) postcss-safe-parser: 4.0.2 - react-dev-utils: 11.0.4(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)(webpack@4.43.0) + react-dev-utils: 11.0.4(eslint@9.22.0(jiti@2.5.1))(typescript@5.8.2)(webpack@4.43.0) schema-utils: 3.3.0 semver: 7.3.2 style-loader: 1.2.1(webpack@4.43.0) @@ -17610,6 +17824,10 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + '@isaacs/string-locale-compare@1.1.0': {} '@istanbuljs/load-nyc-config@1.1.0': @@ -17816,6 +18034,11 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} @@ -19085,7 +19308,7 @@ snapshots: dependencies: react: 18.3.1 - '@remix-run/dev@2.16.0(@remix-run/react@2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@remix-run/serve@2.16.0(typescript@5.8.2))(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(typescript@5.8.2)(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))(yaml@2.7.0)': + '@remix-run/dev@2.16.0(@remix-run/react@2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@remix-run/serve@2.16.0(typescript@5.8.2))(@types/node@22.13.10)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(typescript@5.8.2)(vite@6.2.1(@types/node@22.13.10)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0))(yaml@2.7.0)': dependencies: '@babel/core': 7.26.10 '@babel/generator': 7.24.7 @@ -19102,7 +19325,7 @@ snapshots: '@remix-run/router': 1.23.0 '@remix-run/server-runtime': 2.16.0(typescript@5.8.2) '@types/mdx': 2.0.13 - '@vanilla-extract/integration': 6.2.1(@types/node@22.13.10)(lightningcss@1.29.2)(terser@5.39.0) + '@vanilla-extract/integration': 6.2.1(@types/node@22.13.10)(lightningcss@1.30.1)(terser@5.39.0) arg: 5.0.2 cacache: 17.1.4 chalk: 4.1.2 @@ -19142,12 +19365,12 @@ snapshots: tar-fs: 2.1.1 tsconfig-paths: 4.2.0 valibot: 0.41.0(typescript@5.8.2) - vite-node: 3.0.0-beta.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vite-node: 3.0.0-beta.2(@types/node@22.13.10)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0) ws: 7.5.10 optionalDependencies: '@remix-run/serve': 2.16.0(typescript@5.8.2) typescript: 5.8.2 - vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.1(@types/node@22.13.10)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - bluebird @@ -19729,6 +19952,78 @@ snapshots: '@swc/counter': 0.1.3 tslib: 2.8.1 + '@tailwindcss/node@4.1.12': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.3 + jiti: 2.5.1 + lightningcss: 1.30.1 + magic-string: 0.30.17 + source-map-js: 1.2.1 + tailwindcss: 4.1.12 + + '@tailwindcss/oxide-android-arm64@4.1.12': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.12': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.12': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.12': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.12': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.12': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.12': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.12': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.12': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.12': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.12': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.12': + optional: true + + '@tailwindcss/oxide@4.1.12': + dependencies: + detect-libc: 2.0.4 + tar: 7.4.3 + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.12 + '@tailwindcss/oxide-darwin-arm64': 4.1.12 + '@tailwindcss/oxide-darwin-x64': 4.1.12 + '@tailwindcss/oxide-freebsd-x64': 4.1.12 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.12 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.12 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.12 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.12 + '@tailwindcss/oxide-linux-x64-musl': 4.1.12 + '@tailwindcss/oxide-wasm32-wasi': 4.1.12 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.12 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.12 + + '@tailwindcss/postcss@4.1.12': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.1.12 + '@tailwindcss/oxide': 4.1.12 + postcss: 8.5.3 + tailwindcss: 4.1.12 + '@tanstack/react-virtual@3.13.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/virtual-core': 3.13.2 @@ -20240,15 +20535,15 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2)': + '@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/parser': 8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) '@typescript-eslint/scope-manager': 8.26.1 - '@typescript-eslint/type-utils': 8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) - '@typescript-eslint/utils': 8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/type-utils': 8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) + '@typescript-eslint/utils': 8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) '@typescript-eslint/visitor-keys': 8.26.1 - eslint: 9.11.1(jiti@2.4.2) + eslint: 9.11.1(jiti@2.5.1) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -20257,15 +20552,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2)': + '@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/parser': 8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) '@typescript-eslint/scope-manager': 8.26.1 - '@typescript-eslint/type-utils': 8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) - '@typescript-eslint/utils': 8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/type-utils': 8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) + '@typescript-eslint/utils': 8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) '@typescript-eslint/visitor-keys': 8.26.1 - eslint: 9.11.1(jiti@2.4.2) + eslint: 9.11.1(jiti@2.5.1) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -20275,15 +20570,15 @@ snapshots: - supports-color optional: true - '@typescript-eslint/eslint-plugin@8.9.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2)': + '@typescript-eslint/eslint-plugin@8.9.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/parser': 8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) '@typescript-eslint/scope-manager': 8.9.0 - '@typescript-eslint/type-utils': 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) - '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/type-utils': 8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) + '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) '@typescript-eslint/visitor-keys': 8.9.0 - eslint: 9.11.1(jiti@2.4.2) + eslint: 9.11.1(jiti@2.5.1) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -20293,26 +20588,26 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2)': + '@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2)': dependencies: '@typescript-eslint/scope-manager': 8.26.1 '@typescript-eslint/types': 8.26.1 '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) '@typescript-eslint/visitor-keys': 8.26.1 debug: 4.4.0(supports-color@6.1.0) - eslint: 9.11.1(jiti@2.4.2) + eslint: 9.11.1(jiti@2.5.1) typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2)': + '@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2)': dependencies: '@typescript-eslint/scope-manager': 8.9.0 '@typescript-eslint/types': 8.9.0 '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.8.2) '@typescript-eslint/visitor-keys': 8.9.0 debug: 4.4.0(supports-color@6.1.0) - eslint: 9.11.1(jiti@2.4.2) + eslint: 9.11.1(jiti@2.5.1) optionalDependencies: typescript: 5.8.2 transitivePeerDependencies: @@ -20328,21 +20623,21 @@ snapshots: '@typescript-eslint/types': 8.9.0 '@typescript-eslint/visitor-keys': 8.9.0 - '@typescript-eslint/type-utils@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2)': + '@typescript-eslint/type-utils@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2)': dependencies: '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) - '@typescript-eslint/utils': 8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/utils': 8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) debug: 4.4.0(supports-color@6.1.0) - eslint: 9.11.1(jiti@2.4.2) + eslint: 9.11.1(jiti@2.5.1) ts-api-utils: 2.0.1(typescript@5.8.2) typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2)': + '@typescript-eslint/type-utils@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2)': dependencies: '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.8.2) - '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) debug: 4.4.0(supports-color@6.1.0) ts-api-utils: 1.3.0(typescript@5.8.2) optionalDependencies: @@ -20384,24 +20679,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2)': + '@typescript-eslint/utils@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2)': dependencies: - '@eslint-community/eslint-utils': 4.5.0(eslint@9.11.1(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.5.0(eslint@9.11.1(jiti@2.5.1)) '@typescript-eslint/scope-manager': 8.26.1 '@typescript-eslint/types': 8.26.1 '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) - eslint: 9.11.1(jiti@2.4.2) + eslint: 9.11.1(jiti@2.5.1) typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2)': + '@typescript-eslint/utils@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@2.5.1)) '@typescript-eslint/scope-manager': 8.9.0 '@typescript-eslint/types': 8.9.0 '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.8.2) - eslint: 9.11.1(jiti@2.4.2) + eslint: 9.11.1(jiti@2.5.1) transitivePeerDependencies: - supports-color - typescript @@ -20464,7 +20759,7 @@ snapshots: media-query-parser: 2.0.2 outdent: 0.8.0 - '@vanilla-extract/integration@6.2.1(@types/node@22.13.10)(lightningcss@1.29.2)(terser@5.39.0)': + '@vanilla-extract/integration@6.2.1(@types/node@22.13.10)(lightningcss@1.30.1)(terser@5.39.0)': dependencies: '@babel/core': 7.26.10 '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.26.10) @@ -20477,8 +20772,8 @@ snapshots: lodash: 4.17.21 mlly: 1.7.1 outdent: 0.8.0 - vite: 4.5.9(@types/node@22.13.10)(lightningcss@1.29.2)(terser@5.39.0) - vite-node: 0.28.5(@types/node@22.13.10)(lightningcss@1.29.2)(terser@5.39.0) + vite: 4.5.9(@types/node@22.13.10)(lightningcss@1.30.1)(terser@5.39.0) + vite-node: 0.28.5(@types/node@22.13.10)(lightningcss@1.30.1)(terser@5.39.0) transitivePeerDependencies: - '@types/node' - less @@ -20491,43 +20786,43 @@ snapshots: '@vanilla-extract/private@1.0.3': {} - '@vercel/analytics@1.5.0(@remix-run/react@2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@vercel/analytics@1.5.0(@remix-run/react@2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': optionalDependencies: '@remix-run/react': 2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) - next: 14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 - '@vercel/speed-insights@1.2.0(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@vercel/speed-insights@1.2.0(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': optionalDependencies: - next: 14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 - '@vitejs/plugin-react@4.3.4(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))': + '@vitejs/plugin-react@4.3.4(vite@6.2.1(@types/node@22.13.10)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0))': dependencies: '@babel/core': 7.26.10 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.1(@types/node@22.13.10)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0) transitivePeerDependencies: - supports-color - '@vitest/eslint-plugin@1.1.7(@typescript-eslint/utils@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))': + '@vitest/eslint-plugin@1.1.7(@typescript-eslint/utils@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.5.1)(jsdom@26.0.0)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0))': dependencies: - '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) - eslint: 9.11.1(jiti@2.4.2) + '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) + eslint: 9.11.1(jiti@2.5.1) optionalDependencies: typescript: 5.8.2 - vitest: 3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vitest: 3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.5.1)(jsdom@26.0.0)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0) - '@vitest/eslint-plugin@1.1.7(@typescript-eslint/utils@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))': + '@vitest/eslint-plugin@1.1.7(@typescript-eslint/utils@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.5.1)(jsdom@26.0.0)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0))': dependencies: - '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) - eslint: 9.11.1(jiti@2.4.2) + '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) + eslint: 9.11.1(jiti@2.5.1) optionalDependencies: typescript: 5.8.2 - vitest: 3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vitest: 3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.5.1)(jsdom@26.0.0)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0) '@vitest/expect@2.0.5': dependencies: @@ -20543,21 +20838,21 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.8(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))': + '@vitest/mocker@3.0.8(vite@6.2.1(@types/node@20.17.24)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0))': dependencies: '@vitest/spy': 3.0.8 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.1(@types/node@20.17.24)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0) - '@vitest/mocker@3.0.8(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))': + '@vitest/mocker@3.0.8(vite@6.2.1(@types/node@22.13.10)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0))': dependencies: '@vitest/spy': 3.0.8 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.1(@types/node@22.13.10)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0) optional: true '@vitest/pretty-format@2.0.5': @@ -21891,6 +22186,8 @@ snapshots: chownr@2.0.0: {} + chownr@3.0.0: {} + chrome-trace-event@1.0.4: {} ci-info@2.0.0: {} @@ -22996,8 +23293,7 @@ snapshots: detect-libc@2.0.3: {} - detect-libc@2.0.4: - optional: true + detect-libc@2.0.4: {} detect-newline@3.1.0: {} @@ -23217,6 +23513,11 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.1 + enhanced-resolve@5.18.3: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + entities@2.2.0: {} entities@4.5.0: {} @@ -23559,25 +23860,25 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-molindo@8.0.0(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@4.0.13)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)): + eslint-config-molindo@8.0.0(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@4.1.12)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.5.1)(jsdom@26.0.0)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0)): dependencies: '@eslint/js': 9.12.0 - '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) - '@vitest/eslint-plugin': 1.1.7(@typescript-eslint/utils@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) + '@vitest/eslint-plugin': 1.1.7(@typescript-eslint/utils@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.5.1)(jsdom@26.0.0)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0)) confusing-browser-globals: 1.0.11 - eslint: 9.11.1(jiti@2.4.2) - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-css-modules: 2.11.0(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-jest: 28.8.3(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(typescript@5.8.2) - eslint-plugin-jsx-a11y: 6.10.0(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-react: 7.37.1(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-react-hooks: 5.0.0(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-sort-destructure-keys: 2.0.0(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-tailwindcss: 3.13.0(tailwindcss@4.0.13) - eslint-plugin-unicorn: 56.0.0(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2)) - typescript-eslint: 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + eslint: 9.11.1(jiti@2.5.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-css-modules: 2.11.0(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-jest: 28.8.3(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(jest@29.7.0(@types/node@20.17.24))(typescript@5.8.2) + eslint-plugin-jsx-a11y: 6.10.0(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-react: 7.37.1(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-react-hooks: 5.0.0(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-sort-destructure-keys: 2.0.0(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-tailwindcss: 3.13.0(tailwindcss@4.1.12) + eslint-plugin-unicorn: 56.0.0(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)) + typescript-eslint: 8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) transitivePeerDependencies: - '@typescript-eslint/eslint-plugin' - '@typescript-eslint/parser' @@ -23590,25 +23891,25 @@ snapshots: - typescript - vitest - eslint-config-molindo@8.0.0(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@22.13.10))(tailwindcss@4.0.13)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)): + eslint-config-molindo@8.0.0(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(jest@29.7.0(@types/node@22.13.10))(tailwindcss@4.1.12)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.5.1)(jsdom@26.0.0)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0)): dependencies: '@eslint/js': 9.12.0 - '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) - '@vitest/eslint-plugin': 1.1.7(@typescript-eslint/utils@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) + '@vitest/eslint-plugin': 1.1.7(@typescript-eslint/utils@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.5.1)(jsdom@26.0.0)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0)) confusing-browser-globals: 1.0.11 - eslint: 9.11.1(jiti@2.4.2) - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-css-modules: 2.11.0(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-jest: 28.8.3(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@22.13.10))(typescript@5.8.2) - eslint-plugin-jsx-a11y: 6.10.0(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-react: 7.37.1(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-react-hooks: 5.0.0(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-sort-destructure-keys: 2.0.0(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-tailwindcss: 3.13.0(tailwindcss@4.0.13) - eslint-plugin-unicorn: 56.0.0(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2)) - typescript-eslint: 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + eslint: 9.11.1(jiti@2.5.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-css-modules: 2.11.0(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-jest: 28.8.3(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(jest@29.7.0(@types/node@22.13.10))(typescript@5.8.2) + eslint-plugin-jsx-a11y: 6.10.0(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-react: 7.37.1(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-react-hooks: 5.0.0(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-sort-destructure-keys: 2.0.0(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-tailwindcss: 3.13.0(tailwindcss@4.1.12) + eslint-plugin-unicorn: 56.0.0(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)) + typescript-eslint: 8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) transitivePeerDependencies: - '@typescript-eslint/eslint-plugin' - '@typescript-eslint/parser' @@ -23621,25 +23922,25 @@ snapshots: - typescript - vitest - eslint-config-molindo@8.0.0(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@3.4.17)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)): + eslint-config-molindo@8.0.0(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@3.4.17)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.5.1)(jsdom@26.0.0)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0)): dependencies: '@eslint/js': 9.12.0 - '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) - '@vitest/eslint-plugin': 1.1.7(@typescript-eslint/utils@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) + '@vitest/eslint-plugin': 1.1.7(@typescript-eslint/utils@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.5.1)(jsdom@26.0.0)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0)) confusing-browser-globals: 1.0.11 - eslint: 9.11.1(jiti@2.4.2) - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-css-modules: 2.11.0(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-jest: 28.8.3(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(typescript@5.8.2) - eslint-plugin-jsx-a11y: 6.10.0(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-react: 7.37.1(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-react-hooks: 5.0.0(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-sort-destructure-keys: 2.0.0(eslint@9.11.1(jiti@2.4.2)) + eslint: 9.11.1(jiti@2.5.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-css-modules: 2.11.0(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-jest: 28.8.3(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(jest@29.7.0(@types/node@20.17.24))(typescript@5.8.2) + eslint-plugin-jsx-a11y: 6.10.0(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-react: 7.37.1(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-react-hooks: 5.0.0(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-sort-destructure-keys: 2.0.0(eslint@9.11.1(jiti@2.5.1)) eslint-plugin-tailwindcss: 3.13.0(tailwindcss@3.4.17) - eslint-plugin-unicorn: 56.0.0(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2)) - typescript-eslint: 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + eslint-plugin-unicorn: 56.0.0(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)) + typescript-eslint: 8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) transitivePeerDependencies: - '@typescript-eslint/eslint-plugin' - '@typescript-eslint/parser' @@ -23652,19 +23953,19 @@ snapshots: - typescript - vitest - eslint-config-next@15.5.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2): + eslint-config-next@15.5.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2): dependencies: '@next/eslint-plugin-next': 15.5.0 '@rushstack/eslint-patch': 1.10.5 - '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) - '@typescript-eslint/parser': 8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) - eslint: 9.11.1(jiti@2.4.2) + '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) + '@typescript-eslint/parser': 8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) + eslint: 9.11.1(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-jsx-a11y: 6.10.0(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-react: 7.37.1(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-react-hooks: 5.0.0(eslint@9.11.1(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-jsx-a11y: 6.10.0(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-react: 7.37.1(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-react-hooks: 5.0.0(eslint@9.11.1(jiti@2.5.1)) optionalDependencies: typescript: 5.8.2 transitivePeerDependencies: @@ -23680,103 +23981,103 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.4.2)): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.5.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7 enhanced-resolve: 5.17.1 - eslint: 9.11.1(jiti@2.4.2) - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.4.2)))(eslint@9.11.1(jiti@2.4.2)) + eslint: 9.11.1(jiti@2.5.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)) fast-glob: 3.3.3 get-tsconfig: 4.7.5 is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.5.1)) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.4.2)): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.5.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7 enhanced-resolve: 5.17.1 - eslint: 9.11.1(jiti@2.4.2) - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.4.2)))(eslint@9.11.1(jiti@2.4.2)) + eslint: 9.11.1(jiti@2.5.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)) fast-glob: 3.3.3 get-tsconfig: 4.7.5 is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.5.1)) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.4.2)): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7 enhanced-resolve: 5.17.1 - eslint: 9.11.1(jiti@2.4.2) - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.4.2)))(eslint@9.11.1(jiti@2.4.2)) + eslint: 9.11.1(jiti@2.5.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)) fast-glob: 3.3.3 get-tsconfig: 4.7.5 is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.4.2)))(eslint@9.11.1(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)): dependencies: debug: 3.2.7(supports-color@6.1.0) optionalDependencies: - '@typescript-eslint/parser': 8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) - eslint: 9.11.1(jiti@2.4.2) + '@typescript-eslint/parser': 8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) + eslint: 9.11.1(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.5.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.4.2)))(eslint@9.11.1(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)): dependencies: debug: 3.2.7(supports-color@6.1.0) optionalDependencies: - '@typescript-eslint/parser': 8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) - eslint: 9.11.1(jiti@2.4.2) + '@typescript-eslint/parser': 8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) + eslint: 9.11.1(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.5.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.4.2)))(eslint@9.11.1(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)): dependencies: debug: 3.2.7(supports-color@6.1.0) optionalDependencies: - '@typescript-eslint/parser': 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) - eslint: 9.11.1(jiti@2.4.2) + '@typescript-eslint/parser': 8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) + eslint: 9.11.1(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)) transitivePeerDependencies: - supports-color - eslint-plugin-css-modules@2.11.0(eslint@9.11.1(jiti@2.4.2)): + eslint-plugin-css-modules@2.11.0(eslint@9.11.1(jiti@2.5.1)): dependencies: - eslint: 9.11.1(jiti@2.4.2) + eslint: 9.11.1(jiti@2.5.1) gonzales-pe: 4.3.0 lodash: 4.17.21 - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.4.2)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.5.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -23785,9 +24086,9 @@ snapshots: array.prototype.flatmap: 1.3.2 debug: 3.2.7(supports-color@6.1.0) doctrine: 2.1.0 - eslint: 9.11.1(jiti@2.4.2) + eslint: 9.11.1(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.4.2)))(eslint@9.11.1(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -23799,13 +24100,13 @@ snapshots: string.prototype.trimend: 1.0.8 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/parser': 8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.4.2)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -23814,9 +24115,9 @@ snapshots: array.prototype.flatmap: 1.3.2 debug: 3.2.7(supports-color@6.1.0) doctrine: 2.1.0 - eslint: 9.11.1(jiti@2.4.2) + eslint: 9.11.1(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.4.2)))(eslint@9.11.1(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -23828,46 +24129,46 @@ snapshots: string.prototype.trimend: 1.0.8 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/parser': 8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@28.8.3(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(typescript@5.8.2): + eslint-plugin-jest@28.8.3(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(jest@29.7.0(@types/node@20.17.24))(typescript@5.8.2): dependencies: - '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) - eslint: 9.11.1(jiti@2.4.2) + '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) + eslint: 9.11.1(jiti@2.5.1) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) jest: 29.7.0(@types/node@20.17.24) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jest@28.8.3(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@22.13.10))(typescript@5.8.2): + eslint-plugin-jest@28.8.3(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(jest@29.7.0(@types/node@22.13.10))(typescript@5.8.2): dependencies: - '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) - eslint: 9.11.1(jiti@2.4.2) + '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) + eslint: 9.11.1(jiti@2.5.1) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) jest: 29.7.0(@types/node@22.13.10) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jest@28.8.3(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(typescript@5.8.2): + eslint-plugin-jest@28.8.3(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(jest@29.7.0(@types/node@20.17.24))(typescript@5.8.2): dependencies: - '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) - eslint: 9.11.1(jiti@2.4.2) + '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) + eslint: 9.11.1(jiti@2.5.1) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) jest: 29.7.0(@types/node@20.17.24) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jsx-a11y@6.10.0(eslint@9.11.1(jiti@2.4.2)): + eslint-plugin-jsx-a11y@6.10.0(eslint@9.11.1(jiti@2.5.1)): dependencies: aria-query: 5.1.3 array-includes: 3.1.8 @@ -23878,7 +24179,7 @@ snapshots: damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 es-iterator-helpers: 1.0.19 - eslint: 9.11.1(jiti@2.4.2) + eslint: 9.11.1(jiti@2.5.1) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -23887,23 +24188,23 @@ snapshots: safe-regex-test: 1.0.3 string.prototype.includes: 2.0.1 - eslint-plugin-react-compiler@0.0.0-experimental-8e3b87c-20240822(eslint@9.11.1(jiti@2.4.2)): + eslint-plugin-react-compiler@0.0.0-experimental-8e3b87c-20240822(eslint@9.11.1(jiti@2.5.1)): dependencies: '@babel/core': 7.26.10 '@babel/parser': 7.21.9 '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.26.10) - eslint: 9.11.1(jiti@2.4.2) + eslint: 9.11.1(jiti@2.5.1) hermes-parser: 0.20.1 zod: 3.24.2 zod-validation-error: 3.4.0(zod@3.24.2) transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@5.0.0(eslint@9.11.1(jiti@2.4.2)): + eslint-plugin-react-hooks@5.0.0(eslint@9.11.1(jiti@2.5.1)): dependencies: - eslint: 9.11.1(jiti@2.4.2) + eslint: 9.11.1(jiti@2.5.1) - eslint-plugin-react@7.37.1(eslint@9.11.1(jiti@2.4.2)): + eslint-plugin-react@7.37.1(eslint@9.11.1(jiti@2.5.1)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -23911,7 +24212,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.0.19 - eslint: 9.11.1(jiti@2.4.2) + eslint: 9.11.1(jiti@2.5.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -23925,9 +24226,9 @@ snapshots: string.prototype.matchall: 4.0.11 string.prototype.repeat: 1.0.0 - eslint-plugin-sort-destructure-keys@2.0.0(eslint@9.11.1(jiti@2.4.2)): + eslint-plugin-sort-destructure-keys@2.0.0(eslint@9.11.1(jiti@2.5.1)): dependencies: - eslint: 9.11.1(jiti@2.4.2) + eslint: 9.11.1(jiti@2.5.1) natural-compare-lite: 1.4.0 eslint-plugin-tailwindcss@3.13.0(tailwindcss@3.4.17): @@ -23936,20 +24237,20 @@ snapshots: postcss: 8.5.3 tailwindcss: 3.4.17 - eslint-plugin-tailwindcss@3.13.0(tailwindcss@4.0.13): + eslint-plugin-tailwindcss@3.13.0(tailwindcss@4.1.12): dependencies: fast-glob: 3.3.3 postcss: 8.5.3 - tailwindcss: 4.0.13 + tailwindcss: 4.1.12 - eslint-plugin-unicorn@56.0.0(eslint@9.11.1(jiti@2.4.2)): + eslint-plugin-unicorn@56.0.0(eslint@9.11.1(jiti@2.5.1)): dependencies: '@babel/helper-validator-identifier': 7.25.7 - '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@2.5.1)) ci-info: 4.0.0 clean-regexp: 1.0.0 core-js-compat: 3.38.1 - eslint: 9.11.1(jiti@2.4.2) + eslint: 9.11.1(jiti@2.5.1) esquery: 1.6.0 globals: 15.15.0 indent-string: 4.0.0 @@ -23962,17 +24263,17 @@ snapshots: semver: 7.6.3 strip-indent: 3.0.0 - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2)): + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)): dependencies: - eslint: 9.11.1(jiti@2.4.2) + eslint: 9.11.1(jiti@2.5.1) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2)): + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)): dependencies: - eslint: 9.11.1(jiti@2.4.2) + eslint: 9.11.1(jiti@2.5.1) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) eslint-scope@4.0.3: dependencies: @@ -23993,9 +24294,9 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.11.1(jiti@2.4.2): + eslint@9.11.1(jiti@2.5.1): dependencies: - '@eslint-community/eslint-utils': 4.5.0(eslint@9.11.1(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.5.0(eslint@9.11.1(jiti@2.5.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.18.0 '@eslint/core': 0.6.0 @@ -24033,13 +24334,13 @@ snapshots: strip-ansi: 6.0.1 text-table: 0.2.0 optionalDependencies: - jiti: 2.4.2 + jiti: 2.5.1 transitivePeerDependencies: - supports-color - eslint@9.22.0(jiti@2.4.2): + eslint@9.22.0(jiti@2.5.1): dependencies: - '@eslint-community/eslint-utils': 4.5.0(eslint@9.22.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.5.0(eslint@9.22.0(jiti@2.5.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.2 '@eslint/config-helpers': 0.1.0 @@ -24075,7 +24376,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.3 optionalDependencies: - jiti: 2.4.2 + jiti: 2.5.1 transitivePeerDependencies: - supports-color optional: true @@ -24712,7 +25013,7 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@4.1.6(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)(webpack@4.43.0): + fork-ts-checker-webpack-plugin@4.1.6(eslint@9.22.0(jiti@2.5.1))(typescript@5.8.2)(webpack@4.43.0): dependencies: '@babel/code-frame': 7.26.2 chalk: 2.4.2 @@ -24724,7 +25025,7 @@ snapshots: webpack: 4.43.0 worker-rpc: 0.1.1 optionalDependencies: - eslint: 9.22.0(jiti@2.4.2) + eslint: 9.22.0(jiti@2.5.1) transitivePeerDependencies: - supports-color @@ -26705,6 +27006,8 @@ snapshots: jiti@2.4.2: {} + jiti@2.5.1: {} + joi@17.13.3: dependencies: '@hapi/hoek': 9.3.0 @@ -26983,51 +27286,50 @@ snapshots: transitivePeerDependencies: - supports-color - lightningcss-darwin-arm64@1.29.2: + lightningcss-darwin-arm64@1.30.1: optional: true - lightningcss-darwin-x64@1.29.2: + lightningcss-darwin-x64@1.30.1: optional: true - lightningcss-freebsd-x64@1.29.2: + lightningcss-freebsd-x64@1.30.1: optional: true - lightningcss-linux-arm-gnueabihf@1.29.2: + lightningcss-linux-arm-gnueabihf@1.30.1: optional: true - lightningcss-linux-arm64-gnu@1.29.2: + lightningcss-linux-arm64-gnu@1.30.1: optional: true - lightningcss-linux-arm64-musl@1.29.2: + lightningcss-linux-arm64-musl@1.30.1: optional: true - lightningcss-linux-x64-gnu@1.29.2: + lightningcss-linux-x64-gnu@1.30.1: optional: true - lightningcss-linux-x64-musl@1.29.2: + lightningcss-linux-x64-musl@1.30.1: optional: true - lightningcss-win32-arm64-msvc@1.29.2: + lightningcss-win32-arm64-msvc@1.30.1: optional: true - lightningcss-win32-x64-msvc@1.29.2: + lightningcss-win32-x64-msvc@1.30.1: optional: true - lightningcss@1.29.2: + lightningcss@1.30.1: dependencies: detect-libc: 2.0.4 optionalDependencies: - lightningcss-darwin-arm64: 1.29.2 - lightningcss-darwin-x64: 1.29.2 - lightningcss-freebsd-x64: 1.29.2 - lightningcss-linux-arm-gnueabihf: 1.29.2 - lightningcss-linux-arm64-gnu: 1.29.2 - lightningcss-linux-arm64-musl: 1.29.2 - lightningcss-linux-x64-gnu: 1.29.2 - lightningcss-linux-x64-musl: 1.29.2 - lightningcss-win32-arm64-msvc: 1.29.2 - lightningcss-win32-x64-msvc: 1.29.2 - optional: true + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 lilconfig@3.1.2: {} @@ -28630,6 +28932,10 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 + minizlib@3.0.2: + dependencies: + minipass: 7.1.2 + mississippi@3.0.0: dependencies: concat-stream: 1.6.2 @@ -28658,6 +28964,8 @@ snapshots: mkdirp@1.0.4: {} + mkdirp@3.0.1: {} + mlly@1.7.1: dependencies: acorn: 8.14.1 @@ -28792,13 +29100,13 @@ snapshots: react-dom: 19.0.0(react@19.0.0) uuid: 8.3.2 - next-sitemap@4.2.3(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + next-sitemap@4.2.3(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): dependencies: '@corex/deepmerge': 4.0.43 '@next/env': 13.5.6 fast-glob: 3.3.3 minimist: 1.2.8 - next: 14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-themes@0.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -28844,7 +29152,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.24 '@swc/helpers': 0.5.5 @@ -28854,7 +29162,7 @@ snapshots: postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.26.10)(react@18.3.1) optionalDependencies: '@next/swc-darwin-arm64': 14.2.24 '@next/swc-darwin-x64': 14.2.24 @@ -28894,21 +29202,21 @@ snapshots: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@3.3.1(patch_hash=37qjvtnqoj5dxgzxofrrj6xcdq)(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@3.3.1(@types/react@19.0.10)(acorn@8.14.1)(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + nextra-theme-docs@3.3.1(patch_hash=37qjvtnqoj5dxgzxofrrj6xcdq)(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@3.3.1(@types/react@19.0.10)(acorn@8.14.1)(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@headlessui/react': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) clsx: 2.1.1 escape-string-regexp: 5.0.0 flexsearch: 0.7.43 - next: 14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-themes: 0.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - nextra: 3.3.1(@types/react@19.0.10)(acorn@8.14.1)(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + nextra: 3.3.1(@types/react@19.0.10)(acorn@8.14.1)(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) scroll-into-view-if-needed: 3.1.0 zod: 3.24.2 - nextra@3.3.1(@types/react@19.0.10)(acorn@8.14.1)(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2): + nextra@3.3.1(@types/react@19.0.10)(acorn@8.14.1)(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2): dependencies: '@formatjs/intl-localematcher': 0.5.10 '@headlessui/react': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -28931,7 +29239,7 @@ snapshots: mdast-util-gfm: 3.1.0 mdast-util-to-hast: 13.2.0 negotiator: 1.0.0 - next: 14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) p-limit: 6.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -30193,6 +30501,17 @@ snapshots: prelude-ls@1.2.1: {} + prettier-plugin-organize-imports@4.2.0(prettier@3.5.3)(typescript@5.8.2): + dependencies: + prettier: 3.5.3 + typescript: 5.8.2 + + prettier-plugin-tailwindcss@0.6.14(prettier-plugin-organize-imports@4.2.0(prettier@3.5.3)(typescript@5.8.2))(prettier@3.5.3): + dependencies: + prettier: 3.5.3 + optionalDependencies: + prettier-plugin-organize-imports: 4.2.0(prettier@3.5.3)(typescript@5.8.2) + prettier@2.8.8: {} prettier@3.5.3: {} @@ -30391,7 +30710,7 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-dev-utils@11.0.4(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)(webpack@4.43.0): + react-dev-utils@11.0.4(eslint@9.22.0(jiti@2.5.1))(typescript@5.8.2)(webpack@4.43.0): dependencies: '@babel/code-frame': 7.10.4 address: 1.1.2 @@ -30402,7 +30721,7 @@ snapshots: escape-string-regexp: 2.0.0 filesize: 6.1.0 find-up: 4.1.0 - fork-ts-checker-webpack-plugin: 4.1.6(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)(webpack@4.43.0) + fork-ts-checker-webpack-plugin: 4.1.6(eslint@9.22.0(jiti@2.5.1))(typescript@5.8.2)(webpack@4.43.0) global-modules: 2.0.0 globby: 11.0.1 gzip-size: 5.1.1 @@ -32139,10 +32458,12 @@ snapshots: dependencies: react: 17.0.2 - styled-jsx@5.1.1(react@18.3.1): + styled-jsx@5.1.1(@babel/core@7.26.10)(react@18.3.1): dependencies: client-only: 0.0.1 react: 18.3.1 + optionalDependencies: + '@babel/core': 7.26.10 styled-jsx@5.1.6(@babel/core@7.26.10)(react@19.0.0): dependencies: @@ -32258,7 +32579,7 @@ snapshots: transitivePeerDependencies: - ts-node - tailwindcss@4.0.13: {} + tailwindcss@4.1.12: {} tapable@1.1.3: {} @@ -32288,6 +32609,15 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.2 + mkdirp: 3.0.1 + yallist: 5.0.0 + temp-dir@1.0.0: {} temp-dir@2.0.0: {} @@ -32733,11 +33063,11 @@ snapshots: typedarray@0.0.6: {} - typescript-eslint@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2): + typescript-eslint@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.9.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) - '@typescript-eslint/parser': 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) - '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/eslint-plugin': 8.9.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) + '@typescript-eslint/parser': 8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) + '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) optionalDependencies: typescript: 5.8.2 transitivePeerDependencies: @@ -33164,7 +33494,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@0.28.5(@types/node@22.13.10)(lightningcss@1.29.2)(terser@5.39.0): + vite-node@0.28.5(@types/node@22.13.10)(lightningcss@1.30.1)(terser@5.39.0): dependencies: cac: 6.7.14 debug: 4.4.0(supports-color@6.1.0) @@ -33173,7 +33503,7 @@ snapshots: picocolors: 1.1.1 source-map: 0.6.1 source-map-support: 0.5.21 - vite: 4.5.9(@types/node@22.13.10)(lightningcss@1.29.2)(terser@5.39.0) + vite: 4.5.9(@types/node@22.13.10)(lightningcss@1.30.1)(terser@5.39.0) transitivePeerDependencies: - '@types/node' - less @@ -33184,13 +33514,13 @@ snapshots: - supports-color - terser - vite-node@3.0.0-beta.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0): + vite-node@3.0.0-beta.2(@types/node@22.13.10)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0): dependencies: cac: 6.7.14 debug: 4.4.0(supports-color@6.1.0) es-module-lexer: 1.6.0 pathe: 1.1.2 - vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.1(@types/node@22.13.10)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -33205,13 +33535,13 @@ snapshots: - tsx - yaml - vite-node@3.0.8(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0): + vite-node@3.0.8(@types/node@20.17.24)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0): dependencies: cac: 6.7.14 debug: 4.4.0(supports-color@6.1.0) es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.1(@types/node@20.17.24)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -33226,13 +33556,13 @@ snapshots: - tsx - yaml - vite-node@3.0.8(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0): + vite-node@3.0.8(@types/node@22.13.10)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0): dependencies: cac: 6.7.14 debug: 4.4.0(supports-color@6.1.0) es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.1(@types/node@22.13.10)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -33248,7 +33578,7 @@ snapshots: - yaml optional: true - vite@4.5.9(@types/node@22.13.10)(lightningcss@1.29.2)(terser@5.39.0): + vite@4.5.9(@types/node@22.13.10)(lightningcss@1.30.1)(terser@5.39.0): dependencies: esbuild: 0.18.20 postcss: 8.5.3 @@ -33256,10 +33586,10 @@ snapshots: optionalDependencies: '@types/node': 22.13.10 fsevents: 2.3.3 - lightningcss: 1.29.2 + lightningcss: 1.30.1 terser: 5.39.0 - vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0): + vite@6.2.1(@types/node@20.17.24)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0): dependencies: esbuild: 0.25.1 postcss: 8.5.3 @@ -33267,12 +33597,12 @@ snapshots: optionalDependencies: '@types/node': 20.17.24 fsevents: 2.3.3 - jiti: 2.4.2 - lightningcss: 1.29.2 + jiti: 2.5.1 + lightningcss: 1.30.1 terser: 5.39.0 yaml: 2.7.0 - vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0): + vite@6.2.1(@types/node@22.13.10)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0): dependencies: esbuild: 0.25.1 postcss: 8.5.3 @@ -33280,15 +33610,15 @@ snapshots: optionalDependencies: '@types/node': 22.13.10 fsevents: 2.3.3 - jiti: 2.4.2 - lightningcss: 1.29.2 + jiti: 2.5.1 + lightningcss: 1.30.1 terser: 5.39.0 yaml: 2.7.0 - vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0): + vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.5.1)(jsdom@26.0.0)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0): dependencies: '@vitest/expect': 3.0.8 - '@vitest/mocker': 3.0.8(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + '@vitest/mocker': 3.0.8(vite@6.2.1(@types/node@20.17.24)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0)) '@vitest/pretty-format': 3.0.8 '@vitest/runner': 3.0.8 '@vitest/snapshot': 3.0.8 @@ -33304,8 +33634,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) - vite-node: 3.0.8(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.1(@types/node@20.17.24)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0) + vite-node: 3.0.8(@types/node@20.17.24)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: '@edge-runtime/vm': 5.0.0 @@ -33326,10 +33656,10 @@ snapshots: - tsx - yaml - vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0): + vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.5.1)(jsdom@26.0.0)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0): dependencies: '@vitest/expect': 3.0.8 - '@vitest/mocker': 3.0.8(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + '@vitest/mocker': 3.0.8(vite@6.2.1(@types/node@22.13.10)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0)) '@vitest/pretty-format': 3.0.8 '@vitest/runner': 3.0.8 '@vitest/snapshot': 3.0.8 @@ -33345,8 +33675,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) - vite-node: 3.0.8(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.1(@types/node@22.13.10)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0) + vite-node: 3.0.8(@types/node@22.13.10)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: '@edge-runtime/vm': 5.0.0 @@ -33929,6 +34259,8 @@ snapshots: yallist@4.0.0: {} + yallist@5.0.0: {} + yaml@1.10.2: {} yaml@2.4.5: {} From 0f3f97c3072ff010a3c3b6dd2f394be99caab007 Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Mon, 13 Oct 2025 02:08:01 +0100 Subject: [PATCH 03/55] feat: Add Next.js project files and configurations --- playground/.gitignore | 41 +++++++++++ playground/README.md | 36 ++++++++++ playground/components.json | 22 ++++++ playground/eslint.config.mjs | 25 +++++++ playground/next.config.ts | 7 ++ playground/package.json | 32 +++++++++ playground/postcss.config.mjs | 5 ++ playground/public/file.svg | 1 + playground/public/globe.svg | 1 + playground/public/next.svg | 1 + playground/public/vercel.svg | 1 + playground/public/window.svg | 1 + playground/src/app/favicon.ico | Bin 0 -> 25931 bytes playground/src/app/globals.css | 122 +++++++++++++++++++++++++++++++++ playground/src/app/layout.tsx | 34 +++++++++ playground/src/app/page.tsx | 103 ++++++++++++++++++++++++++++ playground/src/lib/utils.ts | 6 ++ playground/tsconfig.json | 27 ++++++++ 18 files changed, 465 insertions(+) create mode 100644 playground/.gitignore create mode 100644 playground/README.md create mode 100644 playground/components.json create mode 100644 playground/eslint.config.mjs create mode 100644 playground/next.config.ts create mode 100644 playground/package.json create mode 100644 playground/postcss.config.mjs create mode 100644 playground/public/file.svg create mode 100644 playground/public/globe.svg create mode 100644 playground/public/next.svg create mode 100644 playground/public/vercel.svg create mode 100644 playground/public/window.svg create mode 100644 playground/src/app/favicon.ico create mode 100644 playground/src/app/globals.css create mode 100644 playground/src/app/layout.tsx create mode 100644 playground/src/app/page.tsx create mode 100644 playground/src/lib/utils.ts create mode 100644 playground/tsconfig.json diff --git a/playground/.gitignore b/playground/.gitignore new file mode 100644 index 000000000..5ef6a5207 --- /dev/null +++ b/playground/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/playground/README.md b/playground/README.md new file mode 100644 index 000000000..e215bc4cc --- /dev/null +++ b/playground/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/playground/components.json b/playground/components.json new file mode 100644 index 000000000..edcaef267 --- /dev/null +++ b/playground/components.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "registries": {} +} diff --git a/playground/eslint.config.mjs b/playground/eslint.config.mjs new file mode 100644 index 000000000..719cea2b5 --- /dev/null +++ b/playground/eslint.config.mjs @@ -0,0 +1,25 @@ +import { dirname } from "path"; +import { fileURLToPath } from "url"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const compat = new FlatCompat({ + baseDirectory: __dirname, +}); + +const eslintConfig = [ + ...compat.extends("next/core-web-vitals", "next/typescript"), + { + ignores: [ + "node_modules/**", + ".next/**", + "out/**", + "build/**", + "next-env.d.ts", + ], + }, +]; + +export default eslintConfig; diff --git a/playground/next.config.ts b/playground/next.config.ts new file mode 100644 index 000000000..e9ffa3083 --- /dev/null +++ b/playground/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ +}; + +export default nextConfig; diff --git a/playground/package.json b/playground/package.json new file mode 100644 index 000000000..143a789be --- /dev/null +++ b/playground/package.json @@ -0,0 +1,32 @@ +{ + "name": "playground", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev --turbopack", + "build": "next build --turbopack", + "start": "next start", + "lint": "eslint" + }, + "dependencies": { + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.545.0", + "next": "15.5.4", + "react": "19.1.0", + "react-dom": "19.1.0", + "tailwind-merge": "^3.3.1" + }, + "devDependencies": { + "@eslint/eslintrc": "^3", + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "eslint": "^9", + "eslint-config-next": "15.5.4", + "tailwindcss": "^4", + "tw-animate-css": "^1.4.0", + "typescript": "^5" + } +} diff --git a/playground/postcss.config.mjs b/playground/postcss.config.mjs new file mode 100644 index 000000000..c7bcb4b1e --- /dev/null +++ b/playground/postcss.config.mjs @@ -0,0 +1,5 @@ +const config = { + plugins: ["@tailwindcss/postcss"], +}; + +export default config; diff --git a/playground/public/file.svg b/playground/public/file.svg new file mode 100644 index 000000000..004145cdd --- /dev/null +++ b/playground/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/playground/public/globe.svg b/playground/public/globe.svg new file mode 100644 index 000000000..567f17b0d --- /dev/null +++ b/playground/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/playground/public/next.svg b/playground/public/next.svg new file mode 100644 index 000000000..5174b28c5 --- /dev/null +++ b/playground/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/playground/public/vercel.svg b/playground/public/vercel.svg new file mode 100644 index 000000000..770539603 --- /dev/null +++ b/playground/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/playground/public/window.svg b/playground/public/window.svg new file mode 100644 index 000000000..b2b2a44f6 --- /dev/null +++ b/playground/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/playground/src/app/favicon.ico b/playground/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 zcmeHv30#a{`}aL_*G&7qml|y<+KVaDM2m#dVr!KsA!#An?kSQM(q<_dDNCpjEux83 zLb9Z^XxbDl(w>%i@8hT6>)&Gu{h#Oeyszu?xtw#Zb1mO{pgX9699l+Qppw7jXaYf~-84xW z)w4x8?=youko|}Vr~(D$UXIbiXABHh`p1?nn8Po~fxRJv}|0e(BPs|G`(TT%kKVJAdg5*Z|x0leQq0 zkdUBvb#>9F()jo|T~kx@OM8$9wzs~t2l;K=woNssA3l6|sx2r3+kdfVW@e^8e*E}v zA1y5{bRi+3Z`uD3{F7LgFJDdvm;nJilkzDku>BwXH(8ItVCXk*-lSJnR?-2UN%hJ){&rlvg`CDTj z)Bzo!3v7Ou#83zEDEFcKt(f1E0~=rqeEbTnMvWR#{+9pg%7G8y>u1OVRUSoox-ovF z2Ydma(;=YuBY(eI|04{hXzZD6_f(v~H;C~y5=DhAC{MMS>2fm~1H_t2$56pc$NH8( z5bH|<)71dV-_oCHIrzrT`2s-5w_+2CM0$95I6X8p^r!gHp+j_gd;9O<1~CEQQGS8) zS9Qh3#p&JM-G8rHekNmKVewU;pJRcTAog68KYo^dRo}(M>36U4Us zfgYWSiHZL3;lpWT=zNAW>Dh#mB!_@Lg%$ms8N-;aPqMn+C2HqZgz&9~Eu z4|Kp<`$q)Uw1R?y(~S>ePdonHxpV1#eSP1B;Ogo+-Pk}6#0GsZZ5!||ev2MGdh}_m z{DeR7?0-1^zVs&`AV6Vt;r3`I`OI_wgs*w=eO%_#7Kepl{B@xiyCANc(l zzIyd4y|c6PXWq9-|KM8(zIk8LPk(>a)zyFWjhT!$HJ$qX1vo@d25W<fvZQ2zUz5WRc(UnFMKHwe1| zWmlB1qdbiA(C0jmnV<}GfbKtmcu^2*P^O?MBLZKt|As~ge8&AAO~2K@zbXelK|4T<{|y4`raF{=72kC2Kn(L4YyenWgrPiv z@^mr$t{#X5VuIMeL!7Ab6_kG$&#&5p*Z{+?5U|TZ`B!7llpVmp@skYz&n^8QfPJzL z0G6K_OJM9x+Wu2gfN45phANGt{7=C>i34CV{Xqlx(fWpeAoj^N0Biu`w+MVcCUyU* zDZuzO0>4Z6fbu^T_arWW5n!E45vX8N=bxTVeFoep_G#VmNlQzAI_KTIc{6>c+04vr zx@W}zE5JNSU>!THJ{J=cqjz+4{L4A{Ob9$ZJ*S1?Ggg3klFp!+Y1@K+pK1DqI|_gq z5ZDXVpge8-cs!o|;K73#YXZ3AShj50wBvuq3NTOZ`M&qtjj#GOFfgExjg8Gn8>Vq5 z`85n+9|!iLCZF5$HJ$Iu($dm?8~-ofu}tEc+-pyke=3!im#6pk_Wo8IA|fJwD&~~F zc16osQ)EBo58U7XDuMexaPRjU@h8tXe%S{fA0NH3vGJFhuyyO!Uyl2^&EOpX{9As0 zWj+P>{@}jxH)8|r;2HdupP!vie{sJ28b&bo!8`D^x}TE$%zXNb^X1p@0PJ86`dZyj z%ce7*{^oo+6%&~I!8hQy-vQ7E)0t0ybH4l%KltWOo~8cO`T=157JqL(oq_rC%ea&4 z2NcTJe-HgFjNg-gZ$6!Y`SMHrlj}Etf7?r!zQTPPSv}{so2e>Fjs1{gzk~LGeesX%r(Lh6rbhSo_n)@@G-FTQy93;l#E)hgP@d_SGvyCp0~o(Y;Ee8{ zdVUDbHm5`2taPUOY^MAGOw*>=s7=Gst=D+p+2yON!0%Hk` zz5mAhyT4lS*T3LS^WSxUy86q&GnoHxzQ6vm8)VS}_zuqG?+3td68_x;etQAdu@sc6 zQJ&5|4(I?~3d-QOAODHpZ=hlSg(lBZ!JZWCtHHSj`0Wh93-Uk)_S%zsJ~aD>{`A0~ z9{AG(e|q3g5B%wYKRxiL2Y$8(4w6bzchKuloQW#e&S3n+P- z8!ds-%f;TJ1>)v)##>gd{PdS2Oc3VaR`fr=`O8QIO(6(N!A?pr5C#6fc~Ge@N%Vvu zaoAX2&(a6eWy_q&UwOhU)|P3J0Qc%OdhzW=F4D|pt0E4osw;%<%Dn58hAWD^XnZD= z>9~H(3bmLtxpF?a7su6J7M*x1By7YSUbxGi)Ot0P77`}P3{)&5Un{KD?`-e?r21!4vTTnN(4Y6Lin?UkSM z`MXCTC1@4A4~mvz%Rh2&EwY))LeoT=*`tMoqcEXI>TZU9WTP#l?uFv+@Dn~b(>xh2 z;>B?;Tz2SR&KVb>vGiBSB`@U7VIWFSo=LDSb9F{GF^DbmWAfpms8Sx9OX4CnBJca3 zlj9(x!dIjN?OG1X4l*imJNvRCk}F%!?SOfiOq5y^mZW)jFL@a|r-@d#f7 z2gmU8L3IZq0ynIws=}~m^#@&C%J6QFo~Mo4V`>v7MI-_!EBMMtb%_M&kvAaN)@ZVw z+`toz&WG#HkWDjnZE!6nk{e-oFdL^$YnbOCN}JC&{$#$O27@|Tn-skXr)2ml2~O!5 zX+gYoxhoc7qoU?C^3~&!U?kRFtnSEecWuH0B0OvLodgUAi}8p1 zrO6RSXHH}DMc$&|?D004DiOVMHV8kXCP@7NKB zgaZq^^O<7PoKEp72kby@W0Z!Y*Ay{&vfg#C&gG@YVR9g?FEocMUi1gSN$+V+ayF45{a zuDZDTN}mS|;BO%gEf}pjBfN2-gIrU#G5~cucA;dokXW89%>AyXJJI z9X4UlIWA|ZYHgbI z5?oFk@A=Ik7lrEQPDH!H+b`7_Y~aDb_qa=B2^Y&Ow41cU=4WDd40dp5(QS-WMN-=Y z9g;6_-JdNU;|6cPwf$ak*aJIcwL@1n$#l~zi{c{EW?T;DaW*E8DYq?Umtz{nJ&w-M zEMyTDrC&9K$d|kZe2#ws6)L=7K+{ zQw{XnV6UC$6-rW0emqm8wJoeZK)wJIcV?dST}Z;G0Arq{dVDu0&4kd%N!3F1*;*pW zR&qUiFzK=@44#QGw7k1`3t_d8&*kBV->O##t|tonFc2YWrL7_eqg+=+k;!F-`^b8> z#KWCE8%u4k@EprxqiV$VmmtiWxDLgnGu$Vs<8rppV5EajBXL4nyyZM$SWVm!wnCj-B!Wjqj5-5dNXukI2$$|Bu3Lrw}z65Lc=1G z^-#WuQOj$hwNGG?*CM_TO8Bg-1+qc>J7k5c51U8g?ZU5n?HYor;~JIjoWH-G>AoUP ztrWWLbRNqIjW#RT*WqZgPJXU7C)VaW5}MiijYbABmzoru6EmQ*N8cVK7a3|aOB#O& zBl8JY2WKfmj;h#Q!pN%9o@VNLv{OUL?rixHwOZuvX7{IJ{(EdPpuVFoQqIOa7giLVkBOKL@^smUA!tZ1CKRK}#SSM)iQHk)*R~?M!qkCruaS!#oIL1c z?J;U~&FfH#*98^G?i}pA{ z9Jg36t4=%6mhY(quYq*vSxptes9qy|7xSlH?G=S@>u>Ebe;|LVhs~@+06N<4CViBk zUiY$thvX;>Tby6z9Y1edAMQaiH zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V zG#-?gKlr}Eeqifb{|So?HM&g91P8|av8hQoCmQXkd?7wIJwb z_^v8bbg`SAn{I*4bH$u(RZ6*xUhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq36!pV6Az&m{O8$wGFD? zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH( zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x z);_{lY<;);XzT`dBFpRmGrr}z5u1=pC^S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a( z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F= zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk($?Qw({erA$^bC;q33hv!d!>%wRhj# zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?- zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvhCL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ zy|Qn`hxx(58c70$E;L(X0uZZ72M1!6oeg)(cdKO ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC> z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl z8H5(Q?l#wzazujH!8o>1xtn8#_w+397*_cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111aH}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+ z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{ z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^ zb&uBN!Ja3UzYHK-CTyA5=L zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*IcmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$ z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G; zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8 zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU&68iRikRrHRW|ZxzRR^`eIGt zIeiDgVS>IeExKVRWW8-=A=yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_ zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v#ix45EVrcEhr>!NMhprl$InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~&^=4?PL&nd8)`OfG#n zwAMN$1&>K++c{^|7<4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C zI@}scZlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7 zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc- zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E( zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/playground/src/app/globals.css b/playground/src/app/globals.css new file mode 100644 index 000000000..dc98be74c --- /dev/null +++ b/playground/src/app/globals.css @@ -0,0 +1,122 @@ +@import "tailwindcss"; +@import "tw-animate-css"; + +@custom-variant dark (&:is(.dark *)); + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); + --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-popover-foreground: var(--popover-foreground); + --color-popover: var(--popover); + --color-card-foreground: var(--card-foreground); + --color-card: var(--card); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); +} + +:root { + --radius: 0.625rem; + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); +} + +.dark { + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.205 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.205 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.922 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.556 0 0); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.556 0 0); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/playground/src/app/layout.tsx b/playground/src/app/layout.tsx new file mode 100644 index 000000000..f7fa87eb8 --- /dev/null +++ b/playground/src/app/layout.tsx @@ -0,0 +1,34 @@ +import type { Metadata } from "next"; +import { Geist, Geist_Mono } from "next/font/google"; +import "./globals.css"; + +const geistSans = Geist({ + variable: "--font-geist-sans", + subsets: ["latin"], +}); + +const geistMono = Geist_Mono({ + variable: "--font-geist-mono", + subsets: ["latin"], +}); + +export const metadata: Metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} diff --git a/playground/src/app/page.tsx b/playground/src/app/page.tsx new file mode 100644 index 000000000..a93289420 --- /dev/null +++ b/playground/src/app/page.tsx @@ -0,0 +1,103 @@ +import Image from "next/image"; + +export default function Home() { + return ( +
+
+ Next.js logo +
    +
  1. + Get started by editing{" "} + + src/app/page.tsx + + . +
  2. +
  3. + Save and see your changes instantly. +
  4. +
+ + +
+ +
+ ); +} diff --git a/playground/src/lib/utils.ts b/playground/src/lib/utils.ts new file mode 100644 index 000000000..bd0c391dd --- /dev/null +++ b/playground/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/playground/tsconfig.json b/playground/tsconfig.json new file mode 100644 index 000000000..c1334095f --- /dev/null +++ b/playground/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} From e16db8a81e7d6fa06cf1cf6e494599af015a69a0 Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Mon, 13 Oct 2025 02:08:38 +0100 Subject: [PATCH 04/55] feat: Add 'playground' to packages list --- pnpm-lock.yaml | 583 +++++++++++++++++++++++++++----------------- pnpm-workspace.yaml | 1 + 2 files changed, 357 insertions(+), 227 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 43b394cbf..5ad298acf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -985,6 +985,61 @@ importers: specifier: ^3.0.8 version: 3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.5.1)(jsdom@26.0.0)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0) + playground: + dependencies: + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + lucide-react: + specifier: ^0.545.0 + version: 0.545.0(react@19.1.0) + next: + specifier: 15.5.4 + version: 15.5.4(@playwright/test@1.55.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: + specifier: 19.1.0 + version: 19.1.0 + react-dom: + specifier: 19.1.0 + version: 19.1.0(react@19.1.0) + tailwind-merge: + specifier: ^3.3.1 + version: 3.3.1 + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.0 + '@tailwindcss/postcss': + specifier: ^4 + version: 4.1.12 + '@types/node': + specifier: ^20 + version: 20.17.24 + '@types/react': + specifier: ^19 + version: 19.0.10 + '@types/react-dom': + specifier: ^19 + version: 19.0.4(@types/react@19.0.10) + eslint: + specifier: ^9 + version: 9.11.1(jiti@2.5.1) + eslint-config-next: + specifier: 15.5.4 + version: 15.5.4(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) + tailwindcss: + specifier: ^4 + version: 4.1.12 + tw-animate-css: + specifier: ^1.4.0 + version: 1.4.0 + typescript: + specifier: ^5 + version: 5.8.2 + tools: devDependencies: '@babel/core': @@ -3393,9 +3448,15 @@ packages: '@next/env@15.5.0': resolution: {integrity: sha512-sDaprBAfzCQiOgo2pO+LhnV0Wt2wBgartjrr+dpcTORYVnnXD0gwhHhiiyIih9hQbq+JnbqH4odgcFWhqCGidw==} + '@next/env@15.5.4': + resolution: {integrity: sha512-27SQhYp5QryzIT5uO8hq99C69eLQ7qkzkDPsk3N+GuS2XgOgoYEeOav7Pf8Tn4drECOVDsDg8oj+/DVy8qQL2A==} + '@next/eslint-plugin-next@15.5.0': resolution: {integrity: sha512-+k83U/fST66eQBjTltX2T9qUYd43ntAe+NZ5qeZVTQyTiFiHvTLtkpLKug4AnZAtuI/lwz5tl/4QDJymjVkybg==} + '@next/eslint-plugin-next@15.5.4': + resolution: {integrity: sha512-SR1vhXNNg16T4zffhJ4TS7Xn7eq4NfKfcOsRwea7RIAHrjRpI9ALYbamqIJqkAhowLlERffiwk0FMvTLNdnVtw==} + '@next/mdx@15.5.0': resolution: {integrity: sha512-TxfWpIDHx9Xy/GgZwegrl+HxjzeQml0bTclxX72SqJLi83IhJaFiglQbfMTotB2hDRbxCGKpPYh0X20+r1Trtw==} peerDependencies: @@ -3437,6 +3498,12 @@ packages: cpu: [arm64] os: [darwin] + '@next/swc-darwin-arm64@15.5.4': + resolution: {integrity: sha512-nopqz+Ov6uvorej8ndRX6HlxCYWCO3AHLfKK2TYvxoSB2scETOcfm/HSS3piPqc3A+MUgyHoqE6je4wnkjfrOA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@next/swc-darwin-x64@12.3.4': resolution: {integrity: sha512-PPF7tbWD4k0dJ2EcUSnOsaOJ5rhT3rlEt/3LhZUGiYNL8KvoqczFrETlUx0cUYaXe11dRA3F80Hpt727QIwByQ==} engines: {node: '>= 10'} @@ -3455,6 +3522,12 @@ packages: cpu: [x64] os: [darwin] + '@next/swc-darwin-x64@15.5.4': + resolution: {integrity: sha512-QOTCFq8b09ghfjRJKfb68kU9k2K+2wsC4A67psOiMn849K9ZXgCSRQr0oVHfmKnoqCbEmQWG1f2h1T2vtJJ9mA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@next/swc-freebsd-x64@12.3.4': resolution: {integrity: sha512-KM9JXRXi/U2PUM928z7l4tnfQ9u8bTco/jb939pdFUHqc28V43Ohd31MmZD1QzEK4aFlMRaIBQOWQZh4D/E5lQ==} engines: {node: '>= 10'} @@ -3485,6 +3558,12 @@ packages: cpu: [arm64] os: [linux] + '@next/swc-linux-arm64-gnu@15.5.4': + resolution: {integrity: sha512-eRD5zkts6jS3VfE/J0Kt1VxdFqTnMc3QgO5lFE5GKN3KDI/uUpSyK3CjQHmfEkYR4wCOl0R0XrsjpxfWEA++XA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@next/swc-linux-arm64-musl@12.3.4': resolution: {integrity: sha512-EETZPa1juczrKLWk5okoW2hv7D7WvonU+Cf2CgsSoxgsYbUCZ1voOpL4JZTOb6IbKMDo6ja+SbY0vzXZBUMvkQ==} engines: {node: '>= 10'} @@ -3503,6 +3582,12 @@ packages: cpu: [arm64] os: [linux] + '@next/swc-linux-arm64-musl@15.5.4': + resolution: {integrity: sha512-TOK7iTxmXFc45UrtKqWdZ1shfxuL4tnVAOuuJK4S88rX3oyVV4ZkLjtMT85wQkfBrOOvU55aLty+MV8xmcJR8A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@next/swc-linux-x64-gnu@12.3.4': resolution: {integrity: sha512-4csPbRbfZbuWOk3ATyWcvVFdD9/Rsdq5YHKvRuEni68OCLkfy4f+4I9OBpyK1SKJ00Cih16NJbHE+k+ljPPpag==} engines: {node: '>= 10'} @@ -3521,6 +3606,12 @@ packages: cpu: [x64] os: [linux] + '@next/swc-linux-x64-gnu@15.5.4': + resolution: {integrity: sha512-7HKolaj+481FSW/5lL0BcTkA4Ueam9SPYWyN/ib/WGAFZf0DGAN8frNpNZYFHtM4ZstrHZS3LY3vrwlIQfsiMA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@next/swc-linux-x64-musl@12.3.4': resolution: {integrity: sha512-YeBmI+63Ro75SUiL/QXEVXQ19T++58aI/IINOyhpsRL1LKdyfK/35iilraZEFz9bLQrwy1LYAR5lK200A9Gjbg==} engines: {node: '>= 10'} @@ -3539,6 +3630,12 @@ packages: cpu: [x64] os: [linux] + '@next/swc-linux-x64-musl@15.5.4': + resolution: {integrity: sha512-nlQQ6nfgN0nCO/KuyEUwwOdwQIGjOs4WNMjEUtpIQJPR2NUfmGpW2wkJln1d4nJ7oUzd1g4GivH5GoEPBgfsdw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@next/swc-win32-arm64-msvc@12.3.4': resolution: {integrity: sha512-Sd0qFUJv8Tj0PukAYbCCDbmXcMkbIuhnTeHm9m4ZGjCf6kt7E/RMs55Pd3R5ePjOkN7dJEuxYBehawTR/aPDSQ==} engines: {node: '>= 10'} @@ -3557,6 +3654,12 @@ packages: cpu: [arm64] os: [win32] + '@next/swc-win32-arm64-msvc@15.5.4': + resolution: {integrity: sha512-PcR2bN7FlM32XM6eumklmyWLLbu2vs+D7nJX8OAIoWy69Kef8mfiN4e8TUv2KohprwifdpFKPzIP1njuCjD0YA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@next/swc-win32-ia32-msvc@12.3.4': resolution: {integrity: sha512-rt/vv/vg/ZGGkrkKcuJ0LyliRdbskQU+91bje+PgoYmxTZf/tYs6IfbmgudBJk6gH3QnjHWbkphDdRQrseRefQ==} engines: {node: '>= 10'} @@ -3587,6 +3690,12 @@ packages: cpu: [x64] os: [win32] + '@next/swc-win32-x64-msvc@15.5.4': + resolution: {integrity: sha512-1ur2tSHZj8Px/KMAthmuI9FMp/YFusMMGoRNJaRZMOlSkgvLjzosSdQI0cJAKogdHl3qXUQKL9MGaYvKwA7DXg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -5554,11 +5663,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@8.13.0: - resolution: {integrity: sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==} - engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.14.0: resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} @@ -6405,6 +6509,9 @@ packages: resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} engines: {node: '>=0.10.0'} + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + clean-css@4.2.4: resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} engines: {node: '>= 4.0'} @@ -7284,10 +7391,6 @@ packages: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} - define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} - engines: {node: '>= 0.4'} - define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -7744,6 +7847,15 @@ packages: typescript: optional: true + eslint-config-next@15.5.4: + resolution: {integrity: sha512-BzgVVuT3kfJes8i2GHenC1SRJ+W3BTML11lAOYFOOPzrk2xp66jBOAGEFRw+3LkYCln5UzvFsLhojrshb5Zfaw==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} @@ -7905,10 +8017,6 @@ packages: resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} engines: {node: '>=6'} - espree@10.2.0: - resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@10.3.0: resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -8734,9 +8842,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} - has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -9238,10 +9343,6 @@ packages: is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - is-arguments@1.2.0: resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} engines: {node: '>= 0.4'} @@ -9387,9 +9488,6 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} - is-finalizationregistry@1.1.1: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} @@ -9445,9 +9543,6 @@ packages: is-lambda@1.0.1: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -9540,9 +9635,6 @@ packages: resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==} engines: {node: '>=6'} - is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} - is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -9614,9 +9706,6 @@ packages: resolution: {integrity: sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==} engines: {node: '>=0.10.0'} - is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -9628,9 +9717,6 @@ packages: resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} engines: {node: '>= 0.4'} - is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} - is-weakset@2.0.4: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} @@ -10317,6 +10403,11 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} + lucide-react@0.545.0: + resolution: {integrity: sha512-7r1/yUuflQDSt4f1bpn5ZAocyIxcTyVyBBChSVtBKn5M+392cPmI5YJMWOJKk/HUWGm5wg83chlAZtCcGbEZtw==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -10584,11 +10675,13 @@ packages: metro-react-native-babel-preset@0.72.3: resolution: {integrity: sha512-uJx9y/1NIqoYTp6ZW1osJ7U5ZrXGAJbOQ/Qzl05BdGYvN1S7Qmbzid6xOirgK0EIT0pJKEEh1s8qbassYZe4cw==} + deprecated: Use @react-native/babel-preset instead peerDependencies: '@babel/core': '*' metro-react-native-babel-preset@0.72.4: resolution: {integrity: sha512-YGCVaYe1H5fOFktdDdL9IwAyiXjPh1t2eZZFp3KFJak6fxKpN+q5PPhe1kzMa77dbCAqgImv43zkfGa6i27eyA==} + deprecated: Use @react-native/babel-preset instead peerDependencies: '@babel/core': '*' @@ -11219,6 +11312,27 @@ packages: sass: optional: true + next@15.5.4: + resolution: {integrity: sha512-xH4Yjhb82sFYQfY3vbkJfgSDgXvBB6a8xPs9i35k6oZJRoQRihZH+4s9Yo2qsWpzBmZ3lPXaJ2KPXLfkvW4LnA==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.51.1 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + nextra-theme-docs@3.3.1: resolution: {integrity: sha512-P305m2UcW2IDyQhjrcAu0qpdPArikofinABslUCAyixYShsmcdDRUhIMd4QBHYru4gQuVjGWX9PhWZZCbNvzDQ==} peerDependencies: @@ -11258,6 +11372,7 @@ packages: node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead node-emoji@2.2.0: resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} @@ -11471,10 +11586,6 @@ packages: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} - object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} - object-is@1.1.6: resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} engines: {node: '>= 0.4'} @@ -12607,6 +12718,11 @@ packages: peerDependencies: react: ^19.0.0 + react-dom@19.1.0: + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + peerDependencies: + react: ^19.1.0 + react-error-overlay@6.1.0: resolution: {integrity: sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ==} @@ -12722,6 +12838,10 @@ packages: resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} engines: {node: '>=0.10.0'} + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + engines: {node: '>=0.10.0'} + read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} @@ -12814,10 +12934,6 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} - engines: {node: '>= 0.4'} - regenerate-unicode-properties@10.2.0: resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} engines: {node: '>=4'} @@ -13240,6 +13356,9 @@ packages: scheduler@0.25.0: resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + schema-utils@1.0.0: resolution: {integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==} engines: {node: '>= 4'} @@ -13424,10 +13543,6 @@ packages: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - side-channel@1.1.0: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} @@ -13961,6 +14076,9 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + tailwind-merge@3.3.1: + resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==} + tailwindcss@3.4.17: resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} engines: {node: '>=14.0.0'} @@ -14325,6 +14443,9 @@ packages: resolution: {integrity: sha512-N9FDOVaY3yz0YCOhYIgOGYad7+m2ptvinXygw27WPLQvcZDl3+0Sa77KGVlLSiuPDChOUEnTKE9VJwLSi9BPGQ==} hasBin: true + tw-animate-css@1.4.0: + resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + twoslash-protocol@0.2.12: resolution: {integrity: sha512-5qZLXVYfZ9ABdjqbvPc4RWMr7PrpPaaDSeaYY55vl/w1j6H6kzsWK/urAEIXlzYlyrFmyz1UbwIt+AA0ck+wbg==} @@ -15158,17 +15279,10 @@ packages: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} - which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} - which-builtin-type@1.2.1: resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} engines: {node: '>= 0.4'} - which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} - which-collection@1.0.2: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} @@ -17088,10 +17202,10 @@ snapshots: dependencies: ajv: 6.12.6 debug: 4.4.0(supports-color@6.1.0) - espree: 10.2.0 + espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 @@ -18055,7 +18169,7 @@ snapshots: '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': dependencies: @@ -18438,10 +18552,16 @@ snapshots: '@next/env@15.5.0': {} + '@next/env@15.5.4': {} + '@next/eslint-plugin-next@15.5.0': dependencies: fast-glob: 3.3.1 + '@next/eslint-plugin-next@15.5.4': + dependencies: + fast-glob: 3.3.1 + '@next/mdx@15.5.0(@mdx-js/loader@3.1.0(webpack@5.98.0(esbuild@0.25.1)))(@mdx-js/react@3.1.0(@types/react@19.0.10)(react@19.0.0))': dependencies: source-map: 0.7.4 @@ -18464,6 +18584,9 @@ snapshots: '@next/swc-darwin-arm64@15.5.0': optional: true + '@next/swc-darwin-arm64@15.5.4': + optional: true + '@next/swc-darwin-x64@12.3.4': optional: true @@ -18473,6 +18596,9 @@ snapshots: '@next/swc-darwin-x64@15.5.0': optional: true + '@next/swc-darwin-x64@15.5.4': + optional: true + '@next/swc-freebsd-x64@12.3.4': optional: true @@ -18488,6 +18614,9 @@ snapshots: '@next/swc-linux-arm64-gnu@15.5.0': optional: true + '@next/swc-linux-arm64-gnu@15.5.4': + optional: true + '@next/swc-linux-arm64-musl@12.3.4': optional: true @@ -18497,6 +18626,9 @@ snapshots: '@next/swc-linux-arm64-musl@15.5.0': optional: true + '@next/swc-linux-arm64-musl@15.5.4': + optional: true + '@next/swc-linux-x64-gnu@12.3.4': optional: true @@ -18506,6 +18638,9 @@ snapshots: '@next/swc-linux-x64-gnu@15.5.0': optional: true + '@next/swc-linux-x64-gnu@15.5.4': + optional: true + '@next/swc-linux-x64-musl@12.3.4': optional: true @@ -18515,6 +18650,9 @@ snapshots: '@next/swc-linux-x64-musl@15.5.0': optional: true + '@next/swc-linux-x64-musl@15.5.4': + optional: true + '@next/swc-win32-arm64-msvc@12.3.4': optional: true @@ -18524,6 +18662,9 @@ snapshots: '@next/swc-win32-arm64-msvc@15.5.0': optional: true + '@next/swc-win32-arm64-msvc@15.5.4': + optional: true + '@next/swc-win32-ia32-msvc@12.3.4': optional: true @@ -18539,6 +18680,9 @@ snapshots: '@next/swc-win32-x64-msvc@15.5.0': optional: true + '@next/swc-win32-x64-msvc@15.5.4': + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -20658,7 +20802,7 @@ snapshots: fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.2 ts-api-utils: 2.0.1(typescript@5.8.2) typescript: 5.8.2 transitivePeerDependencies: @@ -21112,10 +21256,6 @@ snapshots: acorn: 8.14.1 acorn-walk: 8.3.3 - acorn-jsx@5.3.2(acorn@8.13.0): - dependencies: - acorn: 8.13.0 - acorn-jsx@5.3.2(acorn@8.14.1): dependencies: acorn: 8.14.1 @@ -21132,8 +21272,6 @@ snapshots: acorn@8.12.0: {} - acorn@8.13.0: {} - acorn@8.14.0: {} acorn@8.14.1: {} @@ -21325,12 +21463,12 @@ snapshots: array-includes@3.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 array-iterate@2.0.1: {} @@ -21346,34 +21484,34 @@ snapshots: array.prototype.findlast@1.2.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 es-shim-unscopables: 1.0.2 array.prototype.findlastindex@1.2.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 es-shim-unscopables: 1.0.2 array.prototype.flat@1.3.2: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-shim-unscopables: 1.0.2 array.prototype.flatmap@1.3.2: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-shim-unscopables: 1.0.2 array.prototype.reduce@1.0.7: @@ -21388,9 +21526,9 @@ snapshots: array.prototype.tosorted@1.1.4: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 @@ -22214,6 +22352,10 @@ snapshots: isobject: 3.0.1 static-extend: 0.1.2 + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + clean-css@4.2.4: dependencies: source-map: 0.6.1 @@ -23163,24 +23305,24 @@ snapshots: deep-equal@2.2.3: dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 - is-arguments: 1.1.1 - is-array-buffer: 3.0.4 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 + get-intrinsic: 1.3.0 + is-arguments: 1.2.0 + is-array-buffer: 3.0.5 + is-date-object: 1.1.0 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 isarray: 2.0.5 - object-is: 1.1.5 + object-is: 1.1.6 object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 + object.assign: 4.1.7 + regexp.prototype.flags: 1.5.4 side-channel: 1.1.0 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.15 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.18 deep-extend@0.6.0: {} @@ -23223,11 +23365,6 @@ snapshots: define-lazy-prop@3.0.0: optional: true - define-properties@1.2.0: - dependencies: - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 - define-properties@1.2.1: dependencies: define-data-property: 1.1.4 @@ -23666,32 +23803,32 @@ snapshots: es-get-iterator@1.1.3: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.8 + get-intrinsic: 1.3.0 has-symbols: 1.1.0 - is-arguments: 1.1.1 - is-map: 2.0.2 - is-set: 2.0.2 - is-string: 1.0.7 + is-arguments: 1.2.0 + is-map: 2.0.3 + is-set: 2.0.3 + is-string: 1.1.1 isarray: 2.0.5 stop-iteration-iterator: 1.0.0 es-iterator-helpers@1.0.19: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 + es-set-tostringtag: 2.1.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 globalthis: 1.0.4 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - internal-slot: 1.0.7 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 iterator.prototype: 1.1.2 - safe-array-concat: 1.1.2 + safe-array-concat: 1.1.3 es-module-lexer@1.5.3: {} @@ -23731,8 +23868,8 @@ snapshots: es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 + is-date-object: 1.1.0 + is-symbol: 1.1.1 esast-util-from-estree@2.0.0: dependencies: @@ -23973,6 +24110,26 @@ snapshots: - eslint-plugin-import-x - supports-color + eslint-config-next@15.5.4(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2): + dependencies: + '@next/eslint-plugin-next': 15.5.4 + '@rushstack/eslint-patch': 1.10.5 + '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) + '@typescript-eslint/parser': 8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) + eslint: 9.11.1(jiti@2.5.1) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.26.1(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-jsx-a11y: 6.10.0(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-react: 7.37.1(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-react-hooks: 5.0.0(eslint@9.11.1(jiti@2.5.1)) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7(supports-color@6.1.0) @@ -24383,12 +24540,6 @@ snapshots: esm@3.2.25: {} - espree@10.2.0: - dependencies: - acorn: 8.13.0 - acorn-jsx: 5.3.2(acorn@8.13.0) - eslint-visitor-keys: 4.2.0 - espree@10.3.0: dependencies: acorn: 8.14.1 @@ -25375,7 +25526,7 @@ snapshots: globalthis@1.0.4: dependencies: define-properties: 1.2.1 - gopd: 1.0.1 + gopd: 1.2.0 globby@11.0.1: dependencies: @@ -25477,13 +25628,9 @@ snapshots: has-flag@4.0.0: {} - has-property-descriptors@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - has-property-descriptors@1.0.2: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 has-proto@1.0.1: {} @@ -25503,7 +25650,7 @@ snapshots: has-tostringtag@1.0.2: dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 has-unicode@2.0.1: {} @@ -26121,11 +26268,6 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - is-arguments@1.1.1: - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - is-arguments@1.2.0: dependencies: call-bound: 1.0.4 @@ -26186,7 +26328,7 @@ snapshots: is-bun-module@1.2.1: dependencies: - semver: 7.7.1 + semver: 7.7.2 is-callable@1.2.7: {} @@ -26268,10 +26410,6 @@ snapshots: is-extglob@2.1.1: {} - is-finalizationregistry@1.0.2: - dependencies: - call-bind: 1.0.7 - is-finalizationregistry@1.1.1: dependencies: call-bound: 1.0.4 @@ -26317,8 +26455,6 @@ snapshots: is-lambda@1.0.1: {} - is-map@2.0.2: {} - is-map@2.0.3: {} is-module@1.0.0: {} @@ -26394,8 +26530,6 @@ snapshots: is-root@2.1.0: {} - is-set@2.0.2: {} - is-set@2.0.3: {} is-shared-array-buffer@1.0.3: @@ -26457,8 +26591,6 @@ snapshots: dependencies: is-invalid-path: 0.1.0 - is-weakmap@2.0.1: {} - is-weakmap@2.0.2: {} is-weakref@1.0.2: @@ -26469,11 +26601,6 @@ snapshots: dependencies: call-bound: 1.0.4 - is-weakset@2.0.2: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - is-weakset@2.0.4: dependencies: call-bound: 1.0.4 @@ -26555,9 +26682,9 @@ snapshots: iterator.prototype@1.1.2: dependencies: define-properties: 1.2.1 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.6 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + reflect.getprototypeof: 1.0.10 set-function-name: 2.0.2 jackspeak@3.4.0: @@ -27191,7 +27318,7 @@ snapshots: dependencies: array-includes: 3.1.8 array.prototype.flat: 1.3.2 - object.assign: 4.1.5 + object.assign: 4.1.7 object.values: 1.2.0 just-diff-apply@5.5.0: {} @@ -27450,6 +27577,10 @@ snapshots: lru-cache@7.18.3: {} + lucide-react@0.545.0(react@19.1.0): + dependencies: + react: 19.1.0 + lz-string@1.5.0: {} magic-string@0.30.10: @@ -29202,6 +29333,30 @@ snapshots: - '@babel/core' - babel-plugin-macros + next@15.5.4(@playwright/test@1.55.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + '@next/env': 15.5.4 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001704 + postcss: 8.4.31 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + styled-jsx: 5.1.6(react@19.1.0) + optionalDependencies: + '@next/swc-darwin-arm64': 15.5.4 + '@next/swc-darwin-x64': 15.5.4 + '@next/swc-linux-arm64-gnu': 15.5.4 + '@next/swc-linux-arm64-musl': 15.5.4 + '@next/swc-linux-x64-gnu': 15.5.4 + '@next/swc-linux-x64-musl': 15.5.4 + '@next/swc-win32-arm64-msvc': 15.5.4 + '@next/swc-win32-x64-msvc': 15.5.4 + '@playwright/test': 1.55.0 + sharp: 0.34.3 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + nextra-theme-docs@3.3.1(patch_hash=37qjvtnqoj5dxgzxofrrj6xcdq)(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@3.3.1(@types/react@19.0.10)(acorn@8.14.1)(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@headlessui/react': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -29561,11 +29716,6 @@ snapshots: object-inspect@1.13.4: {} - object-is@1.1.5: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - object-is@1.1.6: dependencies: call-bind: 1.0.8 @@ -29595,16 +29745,16 @@ snapshots: object.entries@1.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 object.fromentries@2.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 object.getownpropertydescriptors@2.1.8: dependencies: @@ -29618,9 +29768,9 @@ snapshots: object.groupby@1.0.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 object.pick@1.3.0: dependencies: @@ -29628,9 +29778,9 @@ snapshots: object.values@1.2.0: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 objectorarray@1.0.5: {} @@ -30795,6 +30945,11 @@ snapshots: react: 19.0.0 scheduler: 0.25.0 + react-dom@19.1.0(react@19.1.0): + dependencies: + react: 19.1.0 + scheduler: 0.26.0 + react-error-overlay@6.1.0: {} react-is@16.13.1: {} @@ -30949,6 +31104,8 @@ snapshots: react@19.0.0: {} + react@19.1.0: {} + read-cache@1.0.0: dependencies: pify: 2.3.0 @@ -31101,16 +31258,6 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 - reflect.getprototypeof@1.0.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - globalthis: 1.0.4 - which-builtin-type: 1.1.3 - regenerate-unicode-properties@10.2.0: dependencies: regenerate: 1.4.2 @@ -31440,7 +31587,7 @@ snapshots: resolve@2.0.0-next.5: dependencies: - is-core-module: 2.15.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -31654,6 +31801,8 @@ snapshots: scheduler@0.25.0: {} + scheduler@0.26.0: {} + schema-utils@1.0.0: dependencies: ajv: 6.12.6 @@ -31796,7 +31945,7 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -31938,13 +32087,6 @@ snapshots: object-inspect: 1.13.4 side-channel-map: 1.0.1 - side-channel@1.0.6: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.4 - side-channel@1.1.0: dependencies: es-errors: 1.3.0 @@ -32219,7 +32361,7 @@ snapshots: stop-iteration-iterator@1.0.0: dependencies: - internal-slot: 1.0.7 + internal-slot: 1.1.0 storybook-i18n@3.1.1: {} @@ -32309,29 +32451,29 @@ snapshots: string.prototype.includes@2.0.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 string.prototype.matchall@4.0.11: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - regexp.prototype.flags: 1.5.2 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 set-function-name: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 string.prototype.trim@1.2.10: dependencies: @@ -32365,9 +32507,9 @@ snapshots: string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 string_decoder@1.1.1: dependencies: @@ -32472,6 +32614,11 @@ snapshots: optionalDependencies: '@babel/core': 7.26.10 + styled-jsx@5.1.6(react@19.1.0): + dependencies: + client-only: 0.0.1 + react: 19.1.0 + stylehacks@4.0.3: dependencies: browserslist: 4.24.4 @@ -32552,6 +32699,8 @@ snapshots: tabbable@6.2.0: {} + tailwind-merge@3.3.1: {} + tailwindcss@3.4.17: dependencies: '@alloc/quick-lru': 5.2.0 @@ -32944,6 +33093,8 @@ snapshots: turbo-windows-64: 2.4.4 turbo-windows-arm64: 2.4.4 + tw-animate-css@1.4.0: {} + twoslash-protocol@0.2.12: {} twoslash@0.2.12(typescript@5.8.2): @@ -33048,7 +33199,7 @@ snapshots: gopd: 1.2.0 is-typed-array: 1.1.15 possible-typed-array-names: 1.0.0 - reflect.getprototypeof: 1.0.6 + reflect.getprototypeof: 1.0.10 typedarray.prototype.slice@1.0.5: dependencies: @@ -34052,44 +34203,22 @@ snapshots: is-string: 1.1.1 is-symbol: 1.1.1 - which-builtin-type@1.1.3: - dependencies: - function.prototype.name: 1.1.6 - has-tostringtag: 1.0.2 - is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.0.2 - is-generator-function: 1.1.0 - is-regex: 1.1.4 - is-weakref: 1.0.2 - isarray: 2.0.5 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.18 - which-builtin-type@1.2.1: dependencies: call-bound: 1.0.4 - function.prototype.name: 1.1.6 + function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 is-async-function: 2.0.0 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 is-generator-function: 1.1.0 is-regex: 1.2.1 - is-weakref: 1.0.2 + is-weakref: 1.1.1 isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 which-typed-array: 1.1.18 - which-collection@1.0.1: - dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 - which-collection@1.0.2: dependencies: is-map: 2.0.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 10da0f192..fd2a127f1 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,3 +3,4 @@ packages: - 'examples/*' - 'docs' - 'tools' + - 'playground' \ No newline at end of file From 3ce39579b32a41d89ba11e27a4394cf66ba0fc68 Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Sat, 18 Oct 2025 12:22:45 +0100 Subject: [PATCH 05/55] feat: Add new components and update dependencies --- playground/package.json | 3 + .../src/app/_components/client-providers.tsx | 17 ++ .../src/app/_components/link-status.tsx | 10 + .../app/_components/playground-boundary.tsx | 36 +++ .../src/app/_components/playground-byline.tsx | 37 +++ .../app/_components/playground-sidebar.tsx | 155 ++++++++++++ .../src/app/_components/theme-toggle.tsx | 20 ++ playground/src/app/assets/logo.tsx | 70 ++++++ playground/src/app/assets/navigations.ts | 94 +++++++ playground/src/app/globals.css | 230 ++++++++++-------- playground/src/app/layout.tsx | 26 +- playground/src/app/page.tsx | 144 ++++------- playground/src/components/ui/button.tsx | 60 +++++ playground/src/components/ui/scroll-area.tsx | 58 +++++ pnpm-lock.yaml | 190 +++++++++++++++ 15 files changed, 942 insertions(+), 208 deletions(-) create mode 100644 playground/src/app/_components/client-providers.tsx create mode 100644 playground/src/app/_components/link-status.tsx create mode 100644 playground/src/app/_components/playground-boundary.tsx create mode 100644 playground/src/app/_components/playground-byline.tsx create mode 100644 playground/src/app/_components/playground-sidebar.tsx create mode 100644 playground/src/app/_components/theme-toggle.tsx create mode 100644 playground/src/app/assets/logo.tsx create mode 100644 playground/src/app/assets/navigations.ts create mode 100644 playground/src/components/ui/button.tsx create mode 100644 playground/src/components/ui/scroll-area.tsx diff --git a/playground/package.json b/playground/package.json index 143a789be..df3c36087 100644 --- a/playground/package.json +++ b/playground/package.json @@ -9,10 +9,13 @@ "lint": "eslint" }, "dependencies": { + "@radix-ui/react-scroll-area": "^1.2.10", + "@radix-ui/react-slot": "^1.2.3", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^0.545.0", "next": "15.5.4", + "next-themes": "^0.4.6", "react": "19.1.0", "react-dom": "19.1.0", "tailwind-merge": "^3.3.1" diff --git a/playground/src/app/_components/client-providers.tsx b/playground/src/app/_components/client-providers.tsx new file mode 100644 index 000000000..87863386e --- /dev/null +++ b/playground/src/app/_components/client-providers.tsx @@ -0,0 +1,17 @@ +"use client"; + +import { ThemeProvider } from "next-themes"; +import React from "react"; + +export const ClientProviders = ({ children }: { children: React.ReactNode }) => { + return ( + + {children} + + ); +}; diff --git a/playground/src/app/_components/link-status.tsx b/playground/src/app/_components/link-status.tsx new file mode 100644 index 000000000..439c04e34 --- /dev/null +++ b/playground/src/app/_components/link-status.tsx @@ -0,0 +1,10 @@ +'use client'; + +import { useLinkStatus } from 'next/link'; + +export function LinkStatus() { + const { pending } = useLinkStatus(); + return pending ? ( +
+ ) : null; +} \ No newline at end of file diff --git a/playground/src/app/_components/playground-boundary.tsx b/playground/src/app/_components/playground-boundary.tsx new file mode 100644 index 000000000..b9e3fcbcc --- /dev/null +++ b/playground/src/app/_components/playground-boundary.tsx @@ -0,0 +1,36 @@ +import clsx from "clsx"; +import type React from "react"; + +export const PlaygroundBoundary = ({ + children, + label, + className, +}: { + children: React.ReactNode; + label?: string | string[]; + className?: string; +}) => { + return ( +
+ {label && ( +
+ {(typeof label === "string" ? [label] : label).map((text) => ( + + {text} + + ))} +
+ )} + + {children} +
+ ); +}; diff --git a/playground/src/app/_components/playground-byline.tsx b/playground/src/app/_components/playground-byline.tsx new file mode 100644 index 000000000..c7383c877 --- /dev/null +++ b/playground/src/app/_components/playground-byline.tsx @@ -0,0 +1,37 @@ +import { PlaygroundBoundary } from "./playground-boundary"; + + +export default function PlaygroundByline() { + return ( + + + + ); +} diff --git a/playground/src/app/_components/playground-sidebar.tsx b/playground/src/app/_components/playground-sidebar.tsx new file mode 100644 index 000000000..8dbe8c6f1 --- /dev/null +++ b/playground/src/app/_components/playground-sidebar.tsx @@ -0,0 +1,155 @@ +"use client"; + +import clsx from "clsx"; +import { Menu, X } from "lucide-react"; +import Link from "next/link"; +import { usePathname } from "next/navigation"; +import { Suspense, useState } from "react"; +import { ScrollArea } from "@/components/ui/scroll-area"; +import { Button } from "@/components/ui/button"; +import { ThemeToggle } from "./theme-toggle"; +import { LinkStatus } from "./link-status"; +import { Logo } from "../assets/logo"; + + +const sections = [ + { + title: "Translations", + items: [ + { title: "Basic usage", slug: "/translations/basic" }, + { title: "Async server components", slug: "/translations/async" }, + { title: "ICU features", slug: "/translations/icu" }, + ], + }, + { + title: "Formatting", + items: [ + { title: "Numbers", slug: "/formatting/numbers" }, + { title: "Dates", slug: "/formatting/dates" }, + { title: "Lists", slug: "/formatting/lists" }, + ], + }, + { + title: "Routing", + items: [ + { title: "Basic routing", slug: "/routing/basic" }, + { title: "Locale-based routing", slug: "/routing/locale" }, + ], + }, + { + title: "Patterns", + items: [ + { title: "Locale switcher", slug: "/patterns/locale-switcher" }, + { title: "Server Actions", slug: "/patterns/server-actions" }, + { title: "Metadata", slug: "/patterns/metadata" }, + { title: "Error files", slug: "/patterns/error-files" }, + ], + }, +]; + +export function PlaygroundSidebar() { + const [isOpen, setIsOpen] = useState(false); + const pathname = usePathname(); + const close = () => setIsOpen(false); + + return ( +
+
+ +

+ Playground +

+ +
+ + +
+
+ +
+ + + +
+
+ ); +} + +function NavItem({ + item, + isActive, + close, +}: { + item: { title: string; slug: string }; + isActive: boolean; + close: () => void; +}) { + return ( + + {item.title} + + + ); +} diff --git a/playground/src/app/_components/theme-toggle.tsx b/playground/src/app/_components/theme-toggle.tsx new file mode 100644 index 000000000..a9764f7f1 --- /dev/null +++ b/playground/src/app/_components/theme-toggle.tsx @@ -0,0 +1,20 @@ +import { Button } from "@/components/ui/button"; +import { Moon, Sun } from "lucide-react"; +import { useTheme } from "next-themes"; + +export function ThemeToggle() { + const { theme, setTheme } = useTheme(); + const isDark = theme === "dark"; + + return ( + + ); +} diff --git a/playground/src/app/assets/logo.tsx b/playground/src/app/assets/logo.tsx new file mode 100644 index 000000000..167cf1bca --- /dev/null +++ b/playground/src/app/assets/logo.tsx @@ -0,0 +1,70 @@ + +export function Logo({ className = "w-12 h-12" }: { className?: string }) { + return ( + + + + + + + + + + + {/* Dark mode version */} + + + + + + + + + + ); +} diff --git a/playground/src/app/assets/navigations.ts b/playground/src/app/assets/navigations.ts new file mode 100644 index 000000000..3815c9608 --- /dev/null +++ b/playground/src/app/assets/navigations.ts @@ -0,0 +1,94 @@ +export const sections = [ + { + title: "Translations", + items: [ + { + title: "Basic usage", + slug: "/translations/basic", + description: + "Learn how to render simple translations using next-intl in your components.", + }, + { + title: "Async server components", + slug: "/translations/async", + description: + "Use translations inside async server components and fetch locale-specific messages.", + }, + { + title: "ICU features", + slug: "/translations/icu", + description: + "Advanced translations using ICU syntax for plurals, gender, and more.", + }, + ], + }, + { + title: "Formatting", + items: [ + { + title: "Numbers", + slug: "/formatting/numbers", + description: + "Format numbers based on locale, including currency and percentages.", + }, + { + title: "Dates", + slug: "/formatting/dates", + description: + "Format dates and times according to the user’s locale and preferences.", + }, + { + title: "Lists", + slug: "/formatting/lists", + description: + "Display lists with proper conjunctions, commas, and locale-specific formatting.", + }, + ], + }, + { + title: "Routing", + items: [ + { + title: "Basic routing", + slug: "/routing/basic", + description: + "Learn how to set up pages without locale-based routing.", + }, + { + title: "Locale-based routing", + slug: "/routing/locale", + description: + "Configure locale-specific routes so users see URLs in their language.", + }, + ], + }, + { + title: "Patterns", + items: [ + { + title: "Locale switcher", + slug: "/patterns/locale-switcher", + description: + "Implement a UI component that allows users to switch between locales.", + }, + { + title: "Server Actions", + slug: "/patterns/server-actions", + description: + "Handle locale-aware actions on the server for better i18n support.", + }, + { + title: "Metadata", + slug: "/patterns/metadata", + description: + "Set dynamic metadata (title, description) per locale for SEO.", + }, + { + title: "Error files", + slug: "/patterns/error-files", + description: + "Use localized error pages for different routes and languages.", + }, + ], + }, +]; \ No newline at end of file diff --git a/playground/src/app/globals.css b/playground/src/app/globals.css index dc98be74c..56c22a039 100644 --- a/playground/src/app/globals.css +++ b/playground/src/app/globals.css @@ -1,115 +1,141 @@ -@import "tailwindcss"; -@import "tw-animate-css"; +@import 'tailwindcss'; +@import 'tw-animate-css'; @custom-variant dark (&:is(.dark *)); - @theme inline { + /* System base */ --color-background: var(--background); - --color-foreground: var(--foreground); - --font-sans: var(--font-geist-sans); - --font-mono: var(--font-geist-mono); - --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-foreground: var(--foreground); /* Semantic colors */ --color-border: var(--border); - --color-destructive: var(--destructive); - --color-accent-foreground: var(--accent-foreground); + --color-input: var(--input); + --color-ring: var(--ring); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); --color-accent: var(--accent); - --color-muted-foreground: var(--muted-foreground); + --color-accent-foreground: var(--accent-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-popover-foreground: var(--popover-foreground); - --color-popover: var(--popover); - --color-card-foreground: var(--card-foreground); + --color-muted-foreground: var(--muted-foreground); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); --color-card: var(--card); - --radius-sm: calc(var(--radius) - 4px); - --radius-md: calc(var(--radius) - 2px); - --radius-lg: var(--radius); - --radius-xl: calc(var(--radius) + 4px); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); /* Sidebar */ + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); /* Charts */ + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); /* Gray scale */ + --color-gray-50: var(--gray-50); + --color-gray-100: var(--gray-100); + --color-gray-200: var(--gray-200); + --color-gray-300: var(--gray-300); + --color-gray-400: var(--gray-400); + --color-gray-500: var(--gray-500); + --color-gray-600: var(--gray-600); + --color-gray-700: var(--gray-700); + --color-gray-800: var(--gray-800); + --color-gray-900: var(--gray-900); /* Blues */ + --color-blue-300: var(--blue-300); + --color-blue-700: var(--blue-700); /* White */ + --color-white: var(--white); /* Font */ + --font-mono: + Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, Liberation Mono, + Courier New, monospace; } :root { - --radius: 0.625rem; - --background: oklch(1 0 0); - --foreground: oklch(0.145 0 0); - --card: oklch(1 0 0); - --card-foreground: oklch(0.145 0 0); - --popover: oklch(1 0 0); - --popover-foreground: oklch(0.145 0 0); - --primary: oklch(0.205 0 0); - --primary-foreground: oklch(0.985 0 0); - --secondary: oklch(0.97 0 0); - --secondary-foreground: oklch(0.205 0 0); - --muted: oklch(0.97 0 0); - --muted-foreground: oklch(0.556 0 0); - --accent: oklch(0.97 0 0); - --accent-foreground: oklch(0.205 0 0); - --destructive: oklch(0.577 0.245 27.325); - --border: oklch(0.922 0 0); - --input: oklch(0.922 0 0); - --ring: oklch(0.708 0 0); - --chart-1: oklch(0.646 0.222 41.116); - --chart-2: oklch(0.6 0.118 184.704); - --chart-3: oklch(0.398 0.07 227.392); - --chart-4: oklch(0.828 0.189 84.429); - --chart-5: oklch(0.769 0.188 70.08); - --sidebar: oklch(0.985 0 0); - --sidebar-foreground: oklch(0.145 0 0); - --sidebar-primary: oklch(0.205 0 0); - --sidebar-primary-foreground: oklch(0.985 0 0); - --sidebar-accent: oklch(0.97 0 0); - --sidebar-accent-foreground: oklch(0.205 0 0); - --sidebar-border: oklch(0.922 0 0); - --sidebar-ring: oklch(0.708 0 0); + /* Gray scale */ + --gray-50: oklch(0.984 0.001 264.5); + --gray-100: oklch(0.956 0.001 264.5); + --gray-200: oklch(0.89 0.002 264.5); + --gray-300: oklch(0.78 0.007 264.5); + --gray-400: oklch(0.69 0.013 264.5); + --gray-500: oklch(0.59 0.016 264.5); + --gray-600: oklch(0.51 0.019 264.5); + --gray-700: oklch(0.41 0.019 264.5); + --gray-800: oklch(0.31 0.018 264.5); + --gray-900: oklch(0.19 0.015 264.5); /* Blues */ + --blue-300: oklch(0.85 0.15 228); + --blue-700: oklch(0.56 0.14 228); /* White */ + --white: oklch(1 0 0); /* Default light theme values */ + --background: var(--gray-50); + --foreground: var(--gray-900); + --card: var(--white); + --card-foreground: var(--gray-900); + --popover: var(--white); + --popover-foreground: var(--gray-900); + --primary: var(--blue-700); + --primary-foreground: var(--white); + --secondary: var(--gray-200); + --secondary-foreground: var(--gray-900); + --muted: var(--gray-200); + --muted-foreground: var(--gray-600); + --accent: var(--blue-300); + --accent-foreground: var(--gray-900); + --destructive: oklch(0.62 0.25 25); + --destructive-foreground: var(--white); + --border: var(--gray-200); + --input: var(--gray-200); + --ring: var(--blue-700); + --chart-1: var(--blue-700); + --chart-2: oklch(0.7 0.17 162.48); + --chart-3: oklch(0.76 0.19 70.08); + --chart-4: oklch(0.63 0.26 303.9); + --chart-5: oklch(0.65 0.25 16.4); + --sidebar: var(--gray-50); + --sidebar-foreground: var(--gray-900); + --sidebar-primary: var(--blue-700); + --sidebar-primary-foreground: var(--white); + --sidebar-accent: var(--gray-200); + --sidebar-accent-foreground: var(--gray-900); + --sidebar-border: var(--gray-200); + --sidebar-ring: var(--blue-700); } - .dark { - --background: oklch(0.145 0 0); - --foreground: oklch(0.985 0 0); - --card: oklch(0.205 0 0); - --card-foreground: oklch(0.985 0 0); - --popover: oklch(0.205 0 0); - --popover-foreground: oklch(0.985 0 0); - --primary: oklch(0.922 0 0); - --primary-foreground: oklch(0.205 0 0); - --secondary: oklch(0.269 0 0); - --secondary-foreground: oklch(0.985 0 0); - --muted: oklch(0.269 0 0); - --muted-foreground: oklch(0.708 0 0); - --accent: oklch(0.269 0 0); - --accent-foreground: oklch(0.985 0 0); - --destructive: oklch(0.704 0.191 22.216); - --border: oklch(1 0 0 / 10%); - --input: oklch(1 0 0 / 15%); - --ring: oklch(0.556 0 0); - --chart-1: oklch(0.488 0.243 264.376); - --chart-2: oklch(0.696 0.17 162.48); - --chart-3: oklch(0.769 0.188 70.08); - --chart-4: oklch(0.627 0.265 303.9); - --chart-5: oklch(0.645 0.246 16.439); - --sidebar: oklch(0.205 0 0); - --sidebar-foreground: oklch(0.985 0 0); - --sidebar-primary: oklch(0.488 0.243 264.376); - --sidebar-primary-foreground: oklch(0.985 0 0); - --sidebar-accent: oklch(0.269 0 0); - --sidebar-accent-foreground: oklch(0.985 0 0); - --sidebar-border: oklch(1 0 0 / 10%); - --sidebar-ring: oklch(0.556 0 0); + /* Surfaces */ + --background: var(--gray-900); + --foreground: var(--gray-50); + --card: var(--gray-800); + --card-foreground: var(--gray-50); + --popover: var(--gray-800); + --popover-foreground: var(--gray-50); /* Brand */ + --primary: var(--blue-300); + --primary-foreground: var(--gray-900); + --secondary: var(--gray-700); + --secondary-foreground: var(--gray-50); /* Semantic */ + --muted: var(--gray-700); + --muted-foreground: var(--gray-300); + --accent: var(--blue-700); + --accent-foreground: var(--gray-50); + --destructive: oklch(0.58 0.2 30); + --destructive-foreground: var(--gray-50); /* Borders & inputs */ + --border: var(--gray-700); + --input: var(--gray-700); + --ring: var(--blue-300); /* Charts (reversed for contrast) */ + --chart-1: var(--blue-300); + --chart-2: oklch(0.7 0.17 162.48); + --chart-3: oklch(0.76 0.19 70.08); + --chart-4: oklch(0.63 0.26 303.9); + --chart-5: oklch(0.65 0.25 16.4); /* Sidebar */ + --sidebar: var(--gray-900); + --sidebar-foreground: var(--gray-50); + --sidebar-primary: var(--blue-300); + --sidebar-primary-foreground: var(--gray-900); + --sidebar-accent: var(--gray-700); + --sidebar-accent-foreground: var(--gray-50); + --sidebar-border: var(--gray-700); + --sidebar-ring: var(--blue-300); } @layer base { @@ -120,3 +146,9 @@ @apply bg-background text-foreground; } } +@layer base { + button:not([disabled]), + [role='button']:not([disabled]) { + cursor: pointer; + } +} diff --git a/playground/src/app/layout.tsx b/playground/src/app/layout.tsx index f7fa87eb8..8366493e0 100644 --- a/playground/src/app/layout.tsx +++ b/playground/src/app/layout.tsx @@ -1,6 +1,9 @@ import type { Metadata } from "next"; import { Geist, Geist_Mono } from "next/font/google"; import "./globals.css"; +import { PlaygroundSidebar } from "./_components/playground-sidebar"; +import PlaygroundByline from "./_components/playground-byline"; +import { ClientProviders } from "./_components/client-providers"; const geistSans = Geist({ variable: "--font-geist-sans", @@ -17,18 +20,21 @@ export const metadata: Metadata = { description: "Generated by create next app", }; -export default function RootLayout({ - children, -}: Readonly<{ - children: React.ReactNode; -}>) { +export default function RootLayout({ children }: { children: React.ReactNode }) { return ( - - - {children} + + + + +
+
+ {children} + +
+
+
); } + diff --git a/playground/src/app/page.tsx b/playground/src/app/page.tsx index a93289420..1e784a1df 100644 --- a/playground/src/app/page.tsx +++ b/playground/src/app/page.tsx @@ -1,103 +1,49 @@ -import Image from "next/image"; +import Link from "next/link"; +import { PlaygroundBoundary } from "./_components/playground-boundary"; +import { sections } from "./assets/navigations"; +import { LinkStatus } from "./_components/link-status"; export default function Home() { - return ( -
-
- Next.js logo -
    -
  1. - Get started by editing{" "} - - src/app/page.tsx - - . -
  2. -
  3. - Save and see your changes instantly. -
  4. -
+ return ( +
+
+

+ Welcome to the next-intl Playground +

+

+ Explore translations, formatting, routing, and patterns using Next.js + and next-intl. +

+
+ + {sections.map((section) => ( +
+
+ {section.title} +
- -
- -
- ); +
+ {section.items.map((item) => ( + +
+ {item.title} +
+ + {item.description && ( +
+ {item.description} +
+ )} + + ))} +
+
+ ))} + +
+ ); } diff --git a/playground/src/components/ui/button.tsx b/playground/src/components/ui/button.tsx new file mode 100644 index 000000000..21409a066 --- /dev/null +++ b/playground/src/components/ui/button.tsx @@ -0,0 +1,60 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground hover:bg-primary/90", + destructive: + "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + outline: + "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: + "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2 has-[>svg]:px-3", + sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5", + lg: "h-10 rounded-md px-6 has-[>svg]:px-4", + icon: "size-9", + "icon-sm": "size-8", + "icon-lg": "size-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +function Button({ + className, + variant, + size, + asChild = false, + ...props +}: React.ComponentProps<"button"> & + VariantProps & { + asChild?: boolean + }) { + const Comp = asChild ? Slot : "button" + + return ( + + ) +} + +export { Button, buttonVariants } diff --git a/playground/src/components/ui/scroll-area.tsx b/playground/src/components/ui/scroll-area.tsx new file mode 100644 index 000000000..8e4fa13f6 --- /dev/null +++ b/playground/src/components/ui/scroll-area.tsx @@ -0,0 +1,58 @@ +"use client" + +import * as React from "react" +import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area" + +import { cn } from "@/lib/utils" + +function ScrollArea({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + + {children} + + + + + ) +} + +function ScrollBar({ + className, + orientation = "vertical", + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +export { ScrollArea, ScrollBar } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5ad298acf..ec3e3e9e4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -987,6 +987,12 @@ importers: playground: dependencies: + '@radix-ui/react-scroll-area': + specifier: ^1.2.10 + version: 1.2.10(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': + specifier: ^1.2.3 + version: 1.2.3(@types/react@19.0.10)(react@19.1.0) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -999,6 +1005,9 @@ importers: next: specifier: 15.5.4 version: 15.5.4(@playwright/test@1.55.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next-themes: + specifier: ^0.4.6 + version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: specifier: 19.1.0 version: 19.1.0 @@ -3889,9 +3898,15 @@ packages: '@radix-ui/number@1.1.0': resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} + '@radix-ui/primitive@1.1.1': resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==} + '@radix-ui/primitive@1.1.3': + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + '@radix-ui/react-arrow@1.1.2': resolution: {integrity: sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg==} peerDependencies: @@ -3927,6 +3942,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-context@1.1.1': resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} peerDependencies: @@ -3936,6 +3960,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-direction@1.1.0': resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} peerDependencies: @@ -3945,6 +3978,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-dismissable-layer@1.1.5': resolution: {integrity: sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==} peerDependencies: @@ -4054,6 +4096,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-presence@1.1.5': + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-primitive@2.0.2': resolution: {integrity: sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==} peerDependencies: @@ -4067,6 +4122,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-roving-focus@1.1.2': resolution: {integrity: sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw==} peerDependencies: @@ -4080,6 +4148,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-scroll-area@1.2.10': + resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-select@2.1.6': resolution: {integrity: sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg==} peerDependencies: @@ -4102,6 +4183,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-callback-ref@1.1.0': resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} peerDependencies: @@ -4111,6 +4201,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-controllable-state@1.1.0': resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} peerDependencies: @@ -4138,6 +4237,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-previous@1.1.0': resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==} peerDependencies: @@ -18961,8 +19069,12 @@ snapshots: '@radix-ui/number@1.1.0': {} + '@radix-ui/number@1.1.1': {} + '@radix-ui/primitive@1.1.1': {} + '@radix-ui/primitive@1.1.3': {} + '@radix-ui/react-arrow@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -18990,18 +19102,36 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.0.10)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.0.10 + '@radix-ui/react-context@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: '@types/react': 19.0.10 + '@radix-ui/react-context@1.1.2(@types/react@19.0.10)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.0.10 + '@radix-ui/react-direction@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: '@types/react': 19.0.10 + '@radix-ui/react-direction@1.1.1(@types/react@19.0.10)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.0.10 + '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -19118,6 +19248,16 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.10)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.0.10)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-primitive@2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/react-slot': 1.1.2(@types/react@19.0.10)(react@19.0.0) @@ -19127,6 +19267,15 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.0.10)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-roving-focus@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -19144,6 +19293,23 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.10)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.0.10)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.0.10)(react@19.1.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.0.10)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.0.10)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-select@2.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/number': 1.1.0 @@ -19180,12 +19346,25 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 + '@radix-ui/react-slot@1.2.3(@types/react@19.0.10)(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.10)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.0.10 + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: '@types/react': 19.0.10 + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.0.10)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.0.10 + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) @@ -19206,6 +19385,12 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.0.10)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.0.10 + '@radix-ui/react-use-previous@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: react: 19.0.0 @@ -29244,6 +29429,11 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + next-themes@0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + next-validate-link@1.5.1: dependencies: fast-glob: 3.3.3 From 675e533714a5c9c750f32acb3a5580cb208bb8ea Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Sat, 18 Oct 2025 12:29:45 +0100 Subject: [PATCH 06/55] style: Update styling in Home component --- playground/src/app/page.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/playground/src/app/page.tsx b/playground/src/app/page.tsx index 1e784a1df..d07f2b626 100644 --- a/playground/src/app/page.tsx +++ b/playground/src/app/page.tsx @@ -6,9 +6,9 @@ import { LinkStatus } from "./_components/link-status"; export default function Home() { return (
-
+

- Welcome to the next-intl Playground + Welcome to the next-intl Playground

Explore translations, formatting, routing, and patterns using Next.js From 37201bdb2b3124dd9e5645b770204beb9a42e6f5 Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Sat, 8 Nov 2025 11:35:40 +0100 Subject: [PATCH 07/55] feat: Add Client Components and Server Components pages and components --- playground/package.json | 1 + .../src/app/_components/demo-content.tsx | 51 +++++++++++ .../src/app/_components/github-link.tsx | 24 +++++ .../app/_components/playground-sidebar.tsx | 37 +------- playground/src/app/assets/navigations.ts | 89 ++----------------- .../translations/client-components/README.md | 31 +++++++ .../client-components/[locale]/page.tsx | 0 .../client-components/client-example.tsx | 59 ++++++++++++ .../translations/client-components/page.tsx | 68 ++++++++++++++ .../translations/server-components/README.md | 24 +++++ .../server-components/[locale]/page.tsx | 0 .../translations/server-components/page.tsx | 68 ++++++++++++++ .../server-components/server-example.tsx | 36 ++++++++ pnpm-lock.yaml | 30 ++++++- 14 files changed, 399 insertions(+), 119 deletions(-) create mode 100644 playground/src/app/_components/demo-content.tsx create mode 100644 playground/src/app/_components/github-link.tsx create mode 100644 playground/src/app/translations/client-components/README.md create mode 100644 playground/src/app/translations/client-components/[locale]/page.tsx create mode 100644 playground/src/app/translations/client-components/client-example.tsx create mode 100644 playground/src/app/translations/client-components/page.tsx create mode 100644 playground/src/app/translations/server-components/README.md create mode 100644 playground/src/app/translations/server-components/[locale]/page.tsx create mode 100644 playground/src/app/translations/server-components/page.tsx create mode 100644 playground/src/app/translations/server-components/server-example.tsx diff --git a/playground/package.json b/playground/package.json index df3c36087..d9cbfed95 100644 --- a/playground/package.json +++ b/playground/package.json @@ -13,6 +13,7 @@ "@radix-ui/react-slot": "^1.2.3", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", + "codehike": "^1.0.7", "lucide-react": "^0.545.0", "next": "15.5.4", "next-themes": "^0.4.6", diff --git a/playground/src/app/_components/demo-content.tsx b/playground/src/app/_components/demo-content.tsx new file mode 100644 index 000000000..73acde7e8 --- /dev/null +++ b/playground/src/app/_components/demo-content.tsx @@ -0,0 +1,51 @@ +import { ReactNode } from "react"; + +export function DemoContent({ + title, + children, +}: { + title: string; + children: ReactNode; +}) { + return ( +

+

{title}

+
+ {children} +
+
+ ); +} + +export function CodeBlock({ + children, + language = "tsx", +}: { + children: string; + language?: string; +}) { + return ( +
+      
+        {children}
+      
+    
+ ); +} + +export function Example({ + title, + children, +}: { + title: string; + children: ReactNode; +}) { + return ( +
+

{title}

+
+ {children} +
+
+ ); +} diff --git a/playground/src/app/_components/github-link.tsx b/playground/src/app/_components/github-link.tsx new file mode 100644 index 000000000..1f41aad24 --- /dev/null +++ b/playground/src/app/_components/github-link.tsx @@ -0,0 +1,24 @@ +"use client"; + +import { Github } from "lucide-react"; +import Link from "next/link"; + +export function GitHubLink({ + path = "playground/src/app", +}: { + path?: string; +} = {}) { + const url = `https://github.com/amannn/next-intl/tree/main/${path}`; + + return ( + + + View on GitHub + + ); +} diff --git a/playground/src/app/_components/playground-sidebar.tsx b/playground/src/app/_components/playground-sidebar.tsx index 8dbe8c6f1..e6bca74f3 100644 --- a/playground/src/app/_components/playground-sidebar.tsx +++ b/playground/src/app/_components/playground-sidebar.tsx @@ -10,42 +10,7 @@ import { Button } from "@/components/ui/button"; import { ThemeToggle } from "./theme-toggle"; import { LinkStatus } from "./link-status"; import { Logo } from "../assets/logo"; - - -const sections = [ - { - title: "Translations", - items: [ - { title: "Basic usage", slug: "/translations/basic" }, - { title: "Async server components", slug: "/translations/async" }, - { title: "ICU features", slug: "/translations/icu" }, - ], - }, - { - title: "Formatting", - items: [ - { title: "Numbers", slug: "/formatting/numbers" }, - { title: "Dates", slug: "/formatting/dates" }, - { title: "Lists", slug: "/formatting/lists" }, - ], - }, - { - title: "Routing", - items: [ - { title: "Basic routing", slug: "/routing/basic" }, - { title: "Locale-based routing", slug: "/routing/locale" }, - ], - }, - { - title: "Patterns", - items: [ - { title: "Locale switcher", slug: "/patterns/locale-switcher" }, - { title: "Server Actions", slug: "/patterns/server-actions" }, - { title: "Metadata", slug: "/patterns/metadata" }, - { title: "Error files", slug: "/patterns/error-files" }, - ], - }, -]; +import { sections } from "../assets/navigations"; export function PlaygroundSidebar() { const [isOpen, setIsOpen] = useState(false); diff --git a/playground/src/app/assets/navigations.ts b/playground/src/app/assets/navigations.ts index 3815c9608..ffbab8068 100644 --- a/playground/src/app/assets/navigations.ts +++ b/playground/src/app/assets/navigations.ts @@ -3,92 +3,17 @@ export const sections = [ title: "Translations", items: [ { - title: "Basic usage", - slug: "/translations/basic", + title: "Server components", + slug: "/translations/server-components", description: - "Learn how to render simple translations using next-intl in your components.", + "Use translations in Server Components to fetch and render locale-specific messages.", }, { - title: "Async server components", - slug: "/translations/async", + title: "Client components", + slug: "/translations/client-components", description: - "Use translations inside async server components and fetch locale-specific messages.", - }, - { - title: "ICU features", - slug: "/translations/icu", - description: - "Advanced translations using ICU syntax for plurals, gender, and more.", - }, - ], - }, - { - title: "Formatting", - items: [ - { - title: "Numbers", - slug: "/formatting/numbers", - description: - "Format numbers based on locale, including currency and percentages.", - }, - { - title: "Dates", - slug: "/formatting/dates", - description: - "Format dates and times according to the user’s locale and preferences.", - }, - { - title: "Lists", - slug: "/formatting/lists", - description: - "Display lists with proper conjunctions, commas, and locale-specific formatting.", - }, - ], - }, - { - title: "Routing", - items: [ - { - title: "Basic routing", - slug: "/routing/basic", - description: - "Learn how to set up pages without locale-based routing.", - }, - { - title: "Locale-based routing", - slug: "/routing/locale", - description: - "Configure locale-specific routes so users see URLs in their language.", - }, - ], - }, - { - title: "Patterns", - items: [ - { - title: "Locale switcher", - slug: "/patterns/locale-switcher", - description: - "Implement a UI component that allows users to switch between locales.", - }, - { - title: "Server Actions", - slug: "/patterns/server-actions", - description: - "Handle locale-aware actions on the server for better i18n support.", - }, - { - title: "Metadata", - slug: "/patterns/metadata", - description: - "Set dynamic metadata (title, description) per locale for SEO.", - }, - { - title: "Error files", - slug: "/patterns/error-files", - description: - "Use localized error pages for different routes and languages.", + "Implement translations in Client Components for interactive, dynamic content.", }, ], }, -]; \ No newline at end of file +]; diff --git a/playground/src/app/translations/client-components/README.md b/playground/src/app/translations/client-components/README.md new file mode 100644 index 000000000..dca8f50d4 --- /dev/null +++ b/playground/src/app/translations/client-components/README.md @@ -0,0 +1,31 @@ +# Client Components + +Client Components are interactive components that run in the browser. With next-intl, you can use the `useTranslations()` hook to access translations in your Client Components. + +## How it works + +In Client Components, you can: +- Use the `useTranslations()` hook to get translated strings +- Access locale information with `useLocale()` +- Provide interactivity while maintaining full i18n support +- Dynamically update content based on user interactions + +## Example usage + +```tsx +'use client'; + +import { useTranslations } from 'next-intl'; + +export default function ClientComponent() { + const t = useTranslations(); + + return ( + + ); +} +``` + +Learn more in the [next-intl documentation](https://next-intl-docs.vercel.app). diff --git a/playground/src/app/translations/client-components/[locale]/page.tsx b/playground/src/app/translations/client-components/[locale]/page.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/playground/src/app/translations/client-components/client-example.tsx b/playground/src/app/translations/client-components/client-example.tsx new file mode 100644 index 000000000..ca255d7df --- /dev/null +++ b/playground/src/app/translations/client-components/client-example.tsx @@ -0,0 +1,59 @@ +"use client"; + +import { useState } from "react"; + +export function ClientExample() { + const [count, setCount] = useState(0); + + // This simulates using translations in a client component + // In a real scenario with next-intl configured, you would use: + // const t = useTranslations(); + + const messages: Record = { + greeting: "Welcome to Client Components!", + description: "This is an interactive example", + button: "Click me", + count: `You've clicked the button ${count} times`, + reset: "Reset", + }; + + return ( +
+
+

+ {messages.greeting} +

+

+ {messages.description} +

+
+ +
+ + +
+

{messages.count}

+ {count > 0 && ( + + )} +
+
+ +
+ ℹ️ This component uses React hooks like{" "} + useState which only + work in Client Components. +
+
+ ); +} diff --git a/playground/src/app/translations/client-components/page.tsx b/playground/src/app/translations/client-components/page.tsx new file mode 100644 index 000000000..c61b46fe3 --- /dev/null +++ b/playground/src/app/translations/client-components/page.tsx @@ -0,0 +1,68 @@ +import { DemoContent, Example } from "@/app/_components/demo-content"; +import { GitHubLink } from "@/app/_components/github-link"; +import { PlaygroundBoundary } from "@/app/_components/playground-boundary"; +import { ClientExample } from "./client-example"; + +export const metadata = { + title: "Client Components - Translations", + description: "Learn how to use translations in Client Components", +}; + +export default function ClientComponentsPage() { + return ( + +
+ +
+

+ Client Components run in the browser and can use interactive + features like hooks. With next-intl, you can use the{" "} + + useTranslations() + {" "} + hook to access translated strings in your interactive components. +

+ +
+

When to use:

+
    +
  • Components with interactivity (buttons, forms, etc.)
  • +
  • Components using React hooks (useState, useEffect, etc.)
  • +
  • Event handlers and user interactions
  • +
  • Real-time updates and dynamic content
  • +
+
+ +
+

Usage example:

+ + {`'use client';\n\nimport { useTranslations } from 'next-intl';\n\nexport default function Button() {\n const t = useTranslations();\n \n return ;\n}`} + +
+ +

+ Learn more in the{" "} + + next-intl documentation + + . +

+
+
+ + + + + +
+ +
+
+
+ ); +} diff --git a/playground/src/app/translations/server-components/README.md b/playground/src/app/translations/server-components/README.md new file mode 100644 index 000000000..ac29a8581 --- /dev/null +++ b/playground/src/app/translations/server-components/README.md @@ -0,0 +1,24 @@ +# Server Components + +Server Components are components that render on the server. With next-intl, you can use the `useTranslations()` hook to get translated strings in your Server Components. + +## How it works + +In Server Components, you can: +- Import messages from your i18n configuration +- Use translations directly without client-side hydration +- Benefit from better performance as rendering happens on the server + +## Example usage + +```tsx +import { useTranslations } from 'next-intl'; + +export default function ServerPage() { + const t = useTranslations(); + + return

{t('welcome.title')}

; +} +``` + +Learn more in the [next-intl documentation](https://next-intl-docs.vercel.app). diff --git a/playground/src/app/translations/server-components/[locale]/page.tsx b/playground/src/app/translations/server-components/[locale]/page.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/playground/src/app/translations/server-components/page.tsx b/playground/src/app/translations/server-components/page.tsx new file mode 100644 index 000000000..b9982d925 --- /dev/null +++ b/playground/src/app/translations/server-components/page.tsx @@ -0,0 +1,68 @@ +import { DemoContent, Example } from "@/app/_components/demo-content"; +import { GitHubLink } from "@/app/_components/github-link"; +import { PlaygroundBoundary } from "@/app/_components/playground-boundary"; +import { ServerExample } from "./server-example"; + +export const metadata = { + title: "Server Components - Translations", + description: "Learn how to use translations in Server Components", +}; + +export default function ServerComponentsPage() { + return ( + +
+ +
+

+ Server Components are components that render exclusively on the + server. With next-intl, you can seamlessly use the{" "} + + useTranslations() + {" "} + hook to access translated strings. +

+ +
+

Benefits:

+
    +
  • Messages are only sent to the server, reducing bundle size
  • +
  • No client-side hydration overhead
  • +
  • Better performance and faster page loads
  • +
  • Ideal for static content and page layouts
  • +
+
+ +
+

Usage example:

+ + {`import { useTranslations } from 'next-intl';\n\nexport default function Page() {\n const t = useTranslations();\n return

{t('welcome.title')}

;\n}`} +
+
+ +

+ Learn more in the{" "} + + next-intl documentation + + . +

+
+
+ + + + + +
+ +
+
+
+ ); +} diff --git a/playground/src/app/translations/server-components/server-example.tsx b/playground/src/app/translations/server-components/server-example.tsx new file mode 100644 index 000000000..353d64043 --- /dev/null +++ b/playground/src/app/translations/server-components/server-example.tsx @@ -0,0 +1,36 @@ +export function ServerExample() { + // This simulates using translations in a server component + // In a real scenario with next-intl configured, you would use: + // const t = useTranslations(); + + const exampleMessages = { + welcome: "Welcome to next-intl", + description: "This page demonstrates translations in Server Components", + feature1: "✓ Server-side rendering", + feature2: "✓ No client-side hydration needed", + feature3: "✓ Better performance", + }; + + return ( +
+
+

+ {exampleMessages.welcome} +

+

+ {exampleMessages.description} +

+
+ +
    + {[exampleMessages.feature1, exampleMessages.feature2, exampleMessages.feature3].map( + (feature, idx) => ( +
  • + {feature} +
  • + ) + )} +
+
+ ); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ec3e3e9e4..260f9972f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -999,6 +999,9 @@ importers: clsx: specifier: ^2.1.1 version: 2.1.1 + codehike: + specifier: ^1.0.7 + version: 1.0.7 lucide-react: specifier: ^0.545.0 version: 0.545.0(react@19.1.0) @@ -2110,6 +2113,9 @@ packages: '@chevrotain/utils@11.0.3': resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + '@code-hike/lighter@1.0.1': + resolution: {integrity: sha512-mccvcsk5UTScRrE02oBz1/qzckyhD8YE3VQlQv++2bSVVZgNuCUX8MpokSCi5OmfRAAxbj6kmNiqq1Um8eXPrw==} + '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} @@ -5892,6 +5898,9 @@ packages: resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} + ansi-sequence-parser@1.1.1: + resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} + ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -6719,6 +6728,9 @@ packages: resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==} engines: {node: '>= 4.0'} + codehike@1.0.7: + resolution: {integrity: sha512-m4YOQv1l06qoGBLCgXRNT45MKAudXjir9v+WTs7Xb0gfze6LN3ZiUp08+WRA1N/QGT1SHbzvck8txvPq+C2EPg==} + collapse-white-space@2.1.0: resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} @@ -16989,6 +17001,10 @@ snapshots: '@chevrotain/utils@11.0.3': {} + '@code-hike/lighter@1.0.1': + dependencies: + ansi-sequence-parser: 1.1.1 + '@colors/colors@1.5.0': optional: true @@ -21566,6 +21582,8 @@ snapshots: ansi-regex@6.1.0: {} + ansi-sequence-parser@1.1.1: {} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 @@ -22644,6 +22662,16 @@ snapshots: chalk: 2.4.2 q: 1.5.1 + codehike@1.0.7: + dependencies: + '@code-hike/lighter': 1.0.1 + diff: 5.1.0 + estree-util-visit: 2.0.0 + mdast-util-mdx-jsx: 3.1.3 + unist-util-visit: 5.0.0 + transitivePeerDependencies: + - supports-color + collapse-white-space@2.1.0: {} collect-v8-coverage@1.0.2: {} @@ -28052,7 +28080,7 @@ snapshots: ccount: 2.0.1 devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 parse-entities: 4.0.1 stringify-entities: 4.0.4 unist-util-stringify-position: 4.0.0 From adae65c15f187aa32a0f4d9e21c605c7d642285e Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Sat, 8 Nov 2025 21:05:49 +0100 Subject: [PATCH 08/55] fix: lockfile --- pnpm-lock.yaml | 183 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 150 insertions(+), 33 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bc147abc5..cdc34b278 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -45,10 +45,10 @@ importers: version: 2.2.0(react@18.3.1) '@vercel/analytics': specifier: 1.5.0 - version: 1.5.0(@remix-run/react@2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 1.5.0(@remix-run/react@2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@vercel/speed-insights': specifier: ^1.2.0 - version: 1.2.0(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 1.2.0(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -57,7 +57,7 @@ importers: version: 2.3.0 next: specifier: ^14.2.4 - version: 14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nextra: specifier: ^3.3.1 version: 3.3.1(@types/react@19.2.2)(acorn@8.14.1)(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) @@ -103,7 +103,7 @@ importers: version: 16.0.0 next-sitemap: specifier: ^4.2.3 - version: 4.2.3(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 4.2.3(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) next-validate-link: specifier: ^1.5.1 version: 1.5.1 @@ -351,10 +351,10 @@ importers: version: 20.17.24 '@types/react': specifier: ^19.0.0 - version: 19.0.10 + version: 19.2.2 '@types/react-dom': specifier: ^19.0.0 - version: 19.0.4(@types/react@19.0.10) + version: 19.2.1(@types/react@19.2.2) eslint: specifier: 9.11.1 version: 9.11.1(jiti@2.5.1) @@ -986,10 +986,10 @@ importers: dependencies: '@radix-ui/react-scroll-area': specifier: ^1.2.10 - version: 1.2.10(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 1.2.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-slot': specifier: ^1.2.3 - version: 1.2.3(@types/react@19.0.10)(react@19.1.0) + version: 1.2.4(@types/react@19.2.2)(react@19.1.0) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -1029,10 +1029,10 @@ importers: version: 20.17.24 '@types/react': specifier: ^19 - version: 19.0.10 + version: 19.2.2 '@types/react-dom': specifier: ^19 - version: 19.0.4(@types/react@19.0.10) + version: 19.2.1(@types/react@19.2.2) eslint: specifier: ^9 version: 9.11.1(jiti@2.5.1) @@ -2669,7 +2669,7 @@ packages: '@expo/bunyan@4.0.1': resolution: {integrity: sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==} - engines: {node: '>=0.10.0'} + engines: {'0': node >=0.10.0} '@expo/cli@0.4.11': resolution: {integrity: sha512-L9Ci9RBh0aPFEDF1AjDYPk54OgeUJIKzxF3lRgITm+lQpI3IEKjAc9LaYeQeO1mlZMUQmPkHArF8iyz1eOeVoQ==} @@ -4195,6 +4195,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-slot@1.2.4': + resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-callback-ref@1.1.0': resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} peerDependencies: @@ -18679,6 +18688,10 @@ snapshots: dependencies: fast-glob: 3.3.1 + '@next/eslint-plugin-next@15.5.4': + dependencies: + fast-glob: 3.3.1 + '@next/mdx@15.5.0(@mdx-js/loader@3.1.0(webpack@5.98.0(esbuild@0.25.1)))(@mdx-js/react@3.1.0(@types/react@19.2.2)(react@19.0.0))': dependencies: source-map: 0.7.4 @@ -19082,6 +19095,8 @@ snapshots: '@radix-ui/primitive@1.1.1': {} + '@radix-ui/primitive@1.1.3': {} + '@radix-ui/react-arrow@1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -19109,18 +19124,36 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.2)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-context@1.1.1(@types/react@19.2.2)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: '@types/react': 19.2.2 + '@radix-ui/react-context@1.1.2(@types/react@19.2.2)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-direction@1.1.0(@types/react@19.2.2)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: '@types/react': 19.2.2 + '@radix-ui/react-direction@1.1.1(@types/react@19.2.2)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -19237,6 +19270,16 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-primitive@2.0.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/react-slot': 1.1.2(@types/react@19.2.2)(react@19.0.0) @@ -19246,6 +19289,15 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-roving-focus@1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -19263,6 +19315,23 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-select@2.1.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/number': 1.1.0 @@ -19299,12 +19368,32 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 + '@radix-ui/react-slot@1.2.3(@types/react@19.2.2)(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.2.2 + + '@radix-ui/react-slot@1.2.4(@types/react@19.2.2)(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.2.2)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: '@types/react': 19.2.2 + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.2)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.2.2)(react@19.0.0)': dependencies: '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.2.2)(react@19.0.0) @@ -19325,6 +19414,12 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.2)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-use-previous@1.1.0(@types/react@19.2.2)(react@19.0.0)': dependencies: react: 19.0.0 @@ -21049,15 +21144,15 @@ snapshots: '@vanilla-extract/private@1.0.3': {} - '@vercel/analytics@1.5.0(@remix-run/react@2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@vercel/analytics@1.5.0(@remix-run/react@2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': optionalDependencies: '@remix-run/react': 2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) - next: 14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 - '@vercel/speed-insights@1.2.0(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@vercel/speed-insights@1.2.0(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': optionalDependencies: - next: 14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 '@vitejs/plugin-react@4.3.4(vite@6.2.1(@types/node@22.13.10)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0))': @@ -24197,9 +24292,9 @@ snapshots: '@vitest/eslint-plugin': 1.1.7(@typescript-eslint/utils@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.5.1)(jsdom@26.0.0)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.7.0)) confusing-browser-globals: 1.0.11 eslint: 9.11.1(jiti@2.5.1) - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.5.1)) eslint-plugin-css-modules: 2.11.0(eslint@9.11.1(jiti@2.5.1)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.5.1)) eslint-plugin-jest: 28.8.3(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1))(jest@29.7.0(@types/node@20.17.24))(typescript@5.8.2) eslint-plugin-jsx-a11y: 6.10.0(eslint@9.11.1(jiti@2.5.1)) eslint-plugin-react: 7.37.1(eslint@9.11.1(jiti@2.5.1)) @@ -24307,19 +24402,19 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.5.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7 enhanced-resolve: 5.17.1 eslint: 9.11.1(jiti@2.5.1) - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)) fast-glob: 3.3.3 get-tsconfig: 4.7.5 is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.5.1)) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node @@ -24348,14 +24443,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)): dependencies: debug: 3.2.7(supports-color@6.1.0) optionalDependencies: '@typescript-eslint/parser': 8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2) eslint: 9.11.1(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.5.1)) transitivePeerDependencies: - supports-color @@ -24394,7 +24489,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.5.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -24405,7 +24500,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.11.1(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.5.1))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.5.1)))(eslint@9.11.1(jiti@2.5.1)) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -29362,13 +29457,13 @@ snapshots: react-dom: 19.0.0(react@19.0.0) uuid: 8.3.2 - next-sitemap@4.2.3(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + next-sitemap@4.2.3(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): dependencies: '@corex/deepmerge': 4.0.43 '@next/env': 13.5.6 fast-glob: 3.3.3 minimist: 1.2.8 - next: 14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-themes@0.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -29419,7 +29514,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.24 '@swc/helpers': 0.5.5 @@ -29429,7 +29524,7 @@ snapshots: postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(@babel/core@7.26.10)(react@18.3.1) + styled-jsx: 5.1.1(react@18.3.1) optionalDependencies: '@next/swc-darwin-arm64': 14.2.24 '@next/swc-darwin-x64': 14.2.24 @@ -29469,13 +29564,37 @@ snapshots: - '@babel/core' - babel-plugin-macros + next@15.5.4(@playwright/test@1.55.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + '@next/env': 15.5.4 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001704 + postcss: 8.4.31 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + styled-jsx: 5.1.6(react@19.1.0) + optionalDependencies: + '@next/swc-darwin-arm64': 15.5.4 + '@next/swc-darwin-x64': 15.5.4 + '@next/swc-linux-arm64-gnu': 15.5.4 + '@next/swc-linux-arm64-musl': 15.5.4 + '@next/swc-linux-x64-gnu': 15.5.4 + '@next/swc-linux-x64-musl': 15.5.4 + '@next/swc-win32-arm64-msvc': 15.5.4 + '@next/swc-win32-x64-msvc': 15.5.4 + '@playwright/test': 1.55.0 + sharp: 0.34.3 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + nextra-theme-docs@3.3.1(patch_hash=37qjvtnqoj5dxgzxofrrj6xcdq)(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@3.3.1(@types/react@19.2.2)(acorn@8.14.1)(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@headlessui/react': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) clsx: 2.1.1 escape-string-regexp: 5.0.0 flexsearch: 0.7.43 - next: 14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-themes: 0.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nextra: 3.3.1(@types/react@19.2.2)(acorn@8.14.1)(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) react: 18.3.1 @@ -29506,7 +29625,7 @@ snapshots: mdast-util-gfm: 3.1.0 mdast-util-to-hast: 13.2.0 negotiator: 1.0.0 - next: 14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) p-limit: 6.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -32712,12 +32831,10 @@ snapshots: dependencies: react: 17.0.2 - styled-jsx@5.1.1(@babel/core@7.26.10)(react@18.3.1): + styled-jsx@5.1.1(react@18.3.1): dependencies: client-only: 0.0.1 react: 18.3.1 - optionalDependencies: - '@babel/core': 7.26.10 styled-jsx@5.1.6(@babel/core@7.26.10)(react@19.0.0): dependencies: From b4fb489f542ef265ab6d68d2a4cd52ea52d52adc Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Fri, 8 May 2026 11:26:27 +0100 Subject: [PATCH 09/55] docs: Add v1 implementation plan for playground refactor --- .../2026-05-08-next-intl-playground-v1.md | 2250 +++++++++++++++++ 1 file changed, 2250 insertions(+) create mode 100644 docs/superpowers/plans/2026-05-08-next-intl-playground-v1.md diff --git a/docs/superpowers/plans/2026-05-08-next-intl-playground-v1.md b/docs/superpowers/plans/2026-05-08-next-intl-playground-v1.md new file mode 100644 index 000000000..af3f693ad --- /dev/null +++ b/docs/superpowers/plans/2026-05-08-next-intl-playground-v1.md @@ -0,0 +1,2250 @@ +# next-intl Playground v1 Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Land the v1 of the new `playground/` app on PR #2084 — Translations category with Server Components and Client Components detail pages, MDX content rendered through Code Hike, locale-prefixed routing, and the Vercel-app-router-playground-style chrome polished against amannn's design system. + +**Architecture:** Next.js 15 App Router app under `playground/`, locale-prefixed routes (`/[locale]/...`) with `next-intl/middleware`. Each detail page is a TSX shell that imports a sibling `content.mdx` (rich prose + Code Hike-annotated code samples) plus a live demo component. Code Hike runs at build time via `remarkCodeHike` + `recmaCodeHike`; fenced code blocks resolve to a custom `` RSC that calls `highlight()` and renders `
`.
+
+**Tech Stack:** Next.js 15, React 19, `next-intl@latest`, `codehike@1`, `@next/mdx`, Tailwind v4 (already wired), `next-themes`, Lucide icons, shadcn/ui primitives.
+
+**Working branch:** `docs/refactor-playground` (already exists; current state has chrome but no MDX/Code Hike/i18n).
+
+**Verification model:** UI-heavy work doesn't get traditional unit tests. We rely on:
+1. `pnpm --filter playground tsc --noEmit` after each task (typecheck)
+2. `pnpm --filter playground build` after each phase (build)
+3. `pnpm --filter playground lint` after each phase (lint)
+4. Manual browser walkthrough at the end of each phase
+5. A small Playwright smoke test added in the final phase
+
+---
+
+## File Structure
+
+This plan produces (or modifies) the following layout. Square brackets indicate files that already exist on the branch and will be modified or replaced:
+
+```
+playground/
+├── next.config.ts                     [modify]      # add MDX + Code Hike plugins
+├── package.json                        [modify]      # add deps
+├── mdx-components.tsx                  [create]
+├── messages/
+│   ├── en.json                         [create]
+│   └── de.json                         [create]
+├── src/
+│   ├── middleware.ts                   [create]
+│   ├── i18n/
+│   │   ├── routing.ts                  [create]
+│   │   ├── request.ts                  [create]
+│   │   └── navigation.ts               [create]
+│   ├── app/
+│   │   ├── globals.css                 [modify]      # add code-theme CSS vars
+│   │   ├── [locale]/
+│   │   │   ├── layout.tsx              [move+modify] # adds NextIntlClientProvider, setRequestLocale
+│   │   │   ├── page.tsx                [move+modify] # landing
+│   │   │   └── translations/
+│   │   │       ├── server-components/
+│   │   │       │   ├── page.tsx        [replace]     # TSX shell only
+│   │   │       │   ├── content.mdx     [create]
+│   │   │       │   ├── server-example.tsx [modify]
+│   │   │       │   └── README.md       [keep]
+│   │   │       └── client-components/
+│   │   │           ├── page.tsx        [replace]
+│   │   │           ├── content.mdx     [create]
+│   │   │           ├── client-example.tsx [modify]
+│   │   │           └── README.md       [keep]
+│   ├── components/
+│   │   ├── code/
+│   │   │   ├── code.tsx                [create]      #  RSC
+│   │   │   └── annotations/
+│   │   │       ├── index.ts            [create]
+│   │   │       ├── filename.tsx        [create]
+│   │   │       ├── mark.tsx            [create]
+│   │   │       ├── callout.tsx         [create]
+│   │   │       ├── focus.tsx           [create]
+│   │   │       ├── focus.client.tsx    [create]
+│   │   │       ├── link.tsx            [create]
+│   │   │       ├── fold.tsx            [create]
+│   │   │       └── line-numbers.tsx    [create]
+│   │   ├── playground/
+│   │   │   ├── sidebar.tsx             [move+modify] # from app/_components/playground-sidebar.tsx
+│   │   │   ├── byline.tsx              [move]
+│   │   │   ├── boundary.tsx            [move]
+│   │   │   ├── client-providers.tsx    [move+modify] # add NextIntlClientProvider
+│   │   │   ├── github-link.tsx         [move+modify]
+│   │   │   ├── link-status.tsx         [move]
+│   │   │   ├── locale-switcher.tsx     [create]
+│   │   │   ├── theme-toggle.tsx        [move]
+│   │   │   ├── two-column.tsx          [create]
+│   │   │   └── demo-card.tsx           [create]      # replaces ad-hoc demo-content
+│   │   └── ui/
+│   │       ├── button.tsx              [keep]
+│   │       ├── scroll-area.tsx         [keep]
+│   │       ├── badge.tsx               [create]
+│   │       └── dropdown-menu.tsx       [create]      # for locale switcher
+│   ├── lib/
+│   │   ├── nav.ts                      [move+modify] # was app/assets/navigations.ts
+│   │   └── utils.ts                    [keep]
+│   └── assets/
+│       └── logo.tsx                    [move]
+├── tests/
+│   └── playground.spec.ts              [create]      # Playwright smoke
+└── playwright.config.ts                [create]
+```
+
+Files under the existing `playground/src/app/_components/` and `playground/src/app/assets/` get **moved** into `src/components/playground/` and `src/lib/` respectively, so layout chrome and content code live in canonical locations.
+
+---
+
+## Phase A — Foundation (deps, MDX, i18n, restructure)
+
+### Task A1: Install dependencies
+
+**Files:**
+- Modify: `playground/package.json`
+- Modify: `pnpm-lock.yaml` (auto)
+
+- [ ] **Step 1: Add runtime deps**
+
+In `playground/package.json`, add to `dependencies`:
+```json
+"@next/mdx": "^15.5.4",
+"@mdx-js/loader": "^3.1.0",
+"@mdx-js/react": "^3.1.0",
+"@radix-ui/react-dropdown-menu": "^2.1.6",
+"next-intl": "^4.9.1",
+"zod": "^3.24.1"
+```
+
+And to `devDependencies`:
+```json
+"@types/mdx": "^2.0.13",
+"@playwright/test": "^1.50.0"
+```
+
+- [ ] **Step 2: Install**
+
+Run from repo root:
+```bash
+pnpm install
+```
+
+Expected: lockfile updates, no peer-dep errors.
+
+- [ ] **Step 3: Verify**
+
+```bash
+pnpm --filter playground tsc --noEmit
+```
+Expected: PASS (no compile errors yet — nothing changed in code).
+
+- [ ] **Step 4: Commit**
+
+```bash
+git add playground/package.json pnpm-lock.yaml
+git commit -m "chore(playground): add MDX, Code Hike consumers, next-intl deps"
+```
+
+---
+
+### Task A2: Wire `@next/mdx` + Code Hike in `next.config.ts`
+
+**Files:**
+- Modify: `playground/next.config.ts`
+
+- [ ] **Step 1: Replace config**
+
+```ts
+// playground/next.config.ts
+import type { NextConfig } from 'next';
+import createMDX from '@next/mdx';
+import { remarkCodeHike, recmaCodeHike, type CodeHikeConfig } from 'codehike/mdx';
+import createNextIntlPlugin from 'next-intl/plugin';
+
+const chConfig: CodeHikeConfig = {
+  components: { code: 'Code' },
+};
+
+const withMDX = createMDX({
+  extension: /\.mdx?$/,
+  options: {
+    remarkPlugins: [[remarkCodeHike, chConfig]],
+    recmaPlugins: [[recmaCodeHike, chConfig]],
+    jsx: true,
+  },
+});
+
+const withNextIntl = createNextIntlPlugin('./src/i18n/request.ts');
+
+const nextConfig: NextConfig = {
+  pageExtensions: ['ts', 'tsx', 'mdx'],
+};
+
+export default withNextIntl(withMDX(nextConfig));
+```
+
+- [ ] **Step 2: Build**
+
+```bash
+pnpm --filter playground build
+```
+Expected: build succeeds (request.ts doesn't exist yet, but `createNextIntlPlugin` doesn't validate at config load — only at runtime). If it fails citing missing `request.ts`, comment out the `withNextIntl` wrapper and re-add it in Task A4.
+
+- [ ] **Step 3: Commit**
+
+```bash
+git add playground/next.config.ts
+git commit -m "feat(playground): configure @next/mdx and Code Hike plugins"
+```
+
+---
+
+### Task A3: Create `mdx-components.tsx`
+
+**Files:**
+- Create: `playground/mdx-components.tsx`
+
+- [ ] **Step 1: Write the file**
+
+```tsx
+// playground/mdx-components.tsx
+import type { MDXComponents } from 'mdx/types';
+import { Code } from '@/components/code/code';
+
+export function useMDXComponents(components: MDXComponents): MDXComponents {
+  return { Code, ...components };
+}
+```
+
+- [ ] **Step 2: Stub ``**
+
+To unblock typecheck before Phase B builds the real ``, create a stub:
+
+```tsx
+// playground/src/components/code/code.tsx
+import type { RawCode } from 'codehike/code';
+
+export function Code({ codeblock }: { codeblock: RawCode }) {
+  return 
{codeblock.value}
; +} +``` + +- [ ] **Step 3: Typecheck** + +```bash +pnpm --filter playground tsc --noEmit +``` +Expected: PASS. + +- [ ] **Step 4: Commit** + +```bash +git add playground/mdx-components.tsx playground/src/components/code/code.tsx +git commit -m "feat(playground): wire MDX components map with stub " +``` + +--- + +### Task A4: i18n routing primitives + +**Files:** +- Create: `playground/src/i18n/routing.ts` +- Create: `playground/src/i18n/request.ts` +- Create: `playground/src/i18n/navigation.ts` +- Create: `playground/src/middleware.ts` +- Create: `playground/messages/en.json` +- Create: `playground/messages/de.json` + +- [ ] **Step 1: routing.ts** + +```ts +// playground/src/i18n/routing.ts +import { defineRouting } from 'next-intl/routing'; + +export const routing = defineRouting({ + locales: ['en', 'de'], + defaultLocale: 'en', +}); +``` + +- [ ] **Step 2: request.ts** + +```ts +// playground/src/i18n/request.ts +import { getRequestConfig } from 'next-intl/server'; +import { hasLocale } from 'next-intl'; +import { routing } from './routing'; + +export default getRequestConfig(async ({ requestLocale }) => { + const requested = await requestLocale; + const locale = hasLocale(routing.locales, requested) + ? requested + : routing.defaultLocale; + + return { + locale, + messages: (await import(`../../messages/${locale}.json`)).default, + }; +}); +``` + +- [ ] **Step 3: navigation.ts** + +```ts +// playground/src/i18n/navigation.ts +import { createNavigation } from 'next-intl/navigation'; +import { routing } from './routing'; + +export const { Link, redirect, usePathname, useRouter, getPathname } = + createNavigation(routing); +``` + +- [ ] **Step 4: middleware.ts** + +```ts +// playground/src/middleware.ts +import createMiddleware from 'next-intl/middleware'; +import { routing } from './i18n/routing'; + +export default createMiddleware(routing); + +export const config = { + // Match all paths except API, _next, files with extensions + matcher: ['/((?!api|_next|.*\\..*).*)'], +}; +``` + +- [ ] **Step 5: messages** + +```json +// playground/messages/en.json +{ + "Layout": { + "title": "next-intl Playground", + "tagline": "Translations, formatting, routing, and patterns with Next.js." + }, + "Nav": { + "translations": "Translations", + "serverComponents": "Server components", + "clientComponents": "Client components" + }, + "ServerDemo": { + "title": "Server Components", + "greeting": "Hello, world!" + }, + "ClientDemo": { + "title": "Client Components", + "label": "Your name", + "placeholder": "Frodo", + "greeting": "Hello, {name}!" + } +} +``` + +```json +// playground/messages/de.json +{ + "Layout": { + "title": "next-intl Playground", + "tagline": "Übersetzungen, Formatierung, Routing und Patterns mit Next.js." + }, + "Nav": { + "translations": "Übersetzungen", + "serverComponents": "Server-Komponenten", + "clientComponents": "Client-Komponenten" + }, + "ServerDemo": { + "title": "Server-Komponenten", + "greeting": "Hallo, Welt!" + }, + "ClientDemo": { + "title": "Client-Komponenten", + "label": "Dein Name", + "placeholder": "Frodo", + "greeting": "Hallo, {name}!" + } +} +``` + +- [ ] **Step 6: Typecheck** + +```bash +pnpm --filter playground tsc --noEmit +``` +Expected: PASS. + +- [ ] **Step 7: Commit** + +```bash +git add playground/src/i18n playground/src/middleware.ts playground/messages +git commit -m "feat(playground): set up next-intl routing and message catalogs" +``` + +--- + +### Task A5: Restructure `app/` to `app/[locale]/` + +**Files:** +- Move: `playground/src/app/layout.tsx` → `playground/src/app/[locale]/layout.tsx` +- Move: `playground/src/app/page.tsx` → `playground/src/app/[locale]/page.tsx` +- Move: `playground/src/app/translations/` → `playground/src/app/[locale]/translations/` +- Delete: `playground/src/app/translations/server-components/[locale]/` (empty leftover) +- Delete: `playground/src/app/translations/client-components/[locale]/` (empty leftover) +- Create: `playground/src/app/layout.tsx` (root, minimal) +- Modify: `playground/src/app/[locale]/layout.tsx` (add `setRequestLocale`, provider) + +- [ ] **Step 1: Move files** + +```bash +cd playground/src/app +git mv layout.tsx [locale]/layout.tsx +git mv page.tsx [locale]/page.tsx +git mv translations [locale]/translations +git rm -r [locale]/translations/server-components/\[locale\] +git rm -r [locale]/translations/client-components/\[locale\] +cd - +``` + +- [ ] **Step 2: Add minimal root layout** + +`@next/mdx` requires a root `app/layout.tsx`. Create: + +```tsx +// playground/src/app/layout.tsx +import type { ReactNode } from 'react'; + +export default function RootLayout({ children }: { children: ReactNode }) { + return children; +} +``` + +(The HTML/body wrapper lives in `[locale]/layout.tsx`.) + +- [ ] **Step 3: Update `[locale]/layout.tsx`** + +```tsx +// playground/src/app/[locale]/layout.tsx +import type { Metadata } from 'next'; +import { Geist, Geist_Mono } from 'next/font/google'; +import { NextIntlClientProvider, hasLocale } from 'next-intl'; +import { setRequestLocale, getMessages } from 'next-intl/server'; +import { notFound } from 'next/navigation'; +import { routing } from '@/i18n/routing'; +import { ClientProviders } from '@/components/playground/client-providers'; +import { PlaygroundSidebar } from '@/components/playground/sidebar'; +import { PlaygroundByline } from '@/components/playground/byline'; +import '../globals.css'; + +const geistSans = Geist({ variable: '--font-geist-sans', subsets: ['latin'] }); +const geistMono = Geist_Mono({ variable: '--font-geist-mono', subsets: ['latin'] }); + +export const metadata: Metadata = { + title: 'next-intl Playground', + description: + 'Explore translations, formatting, routing, and patterns with next-intl.', +}; + +export function generateStaticParams() { + return routing.locales.map((locale) => ({ locale })); +} + +export default async function LocaleLayout({ + children, + params, +}: { + children: React.ReactNode; + params: Promise<{ locale: string }>; +}) { + const { locale } = await params; + if (!hasLocale(routing.locales, locale)) notFound(); + + setRequestLocale(locale); + const messages = await getMessages(); + + return ( + + + + + +
+
+ {children} + +
+
+
+
+ + + ); +} +``` + +This task imports from `@/components/playground/...` — those paths don't yet exist. Phase C moves them. Until then, `tsc --noEmit` will report missing modules. That's expected; Step 4 commits the WIP and we resolve in Phase C. + +- [ ] **Step 4: Commit (WIP)** + +```bash +git add playground +git commit -m "refactor(playground): move app routes under [locale] segment" +``` + +--- + +### Task A6: Move chrome components into canonical locations + +**Files:** +- Move: `playground/src/app/_components/playground-sidebar.tsx` → `playground/src/components/playground/sidebar.tsx` +- Move: `playground/src/app/_components/playground-byline.tsx` → `playground/src/components/playground/byline.tsx` +- Move: `playground/src/app/_components/playground-boundary.tsx` → `playground/src/components/playground/boundary.tsx` +- Move: `playground/src/app/_components/client-providers.tsx` → `playground/src/components/playground/client-providers.tsx` +- Move: `playground/src/app/_components/github-link.tsx` → `playground/src/components/playground/github-link.tsx` +- Move: `playground/src/app/_components/link-status.tsx` → `playground/src/components/playground/link-status.tsx` +- Move: `playground/src/app/_components/theme-toggle.tsx` → `playground/src/components/playground/theme-toggle.tsx` +- Move: `playground/src/app/_components/demo-content.tsx` → delete (replaced by `demo-card.tsx` later) +- Move: `playground/src/app/assets/navigations.ts` → `playground/src/lib/nav.ts` +- Move: `playground/src/app/assets/logo.tsx` → `playground/src/assets/logo.tsx` + +- [ ] **Step 1: git mv each file** + +```bash +cd playground +git mv src/app/_components/playground-sidebar.tsx src/components/playground/sidebar.tsx +git mv src/app/_components/playground-byline.tsx src/components/playground/byline.tsx +git mv src/app/_components/playground-boundary.tsx src/components/playground/boundary.tsx +git mv src/app/_components/client-providers.tsx src/components/playground/client-providers.tsx +git mv src/app/_components/github-link.tsx src/components/playground/github-link.tsx +git mv src/app/_components/link-status.tsx src/components/playground/link-status.tsx +git mv src/app/_components/theme-toggle.tsx src/components/playground/theme-toggle.tsx +git rm src/app/_components/demo-content.tsx +git mv src/app/assets/navigations.ts src/lib/nav.ts +git mv src/app/assets/logo.tsx src/assets/logo.tsx +rmdir src/app/_components src/app/assets +cd - +``` + +- [ ] **Step 2: Fix imports inside the moved files** + +Each moved file used relative imports like `../assets/logo`, `./theme-toggle`, etc. Open each and rewrite imports to use the `@/...` alias. Specifically: + +- `sidebar.tsx`: `import { Logo } from '@/assets/logo'`, `import { sections } from '@/lib/nav'`, `import { ThemeToggle } from './theme-toggle'`, `import { LinkStatus } from './link-status'` +- `byline.tsx`: typically self-contained — open and verify +- `boundary.tsx`: self-contained — verify +- `github-link.tsx`: self-contained — verify +- `client-providers.tsx`: self-contained — verify + +For each file, replace `from '../...'` with the `@/...` form. The `@` alias already maps to `playground/src/` per `tsconfig.json`. + +- [ ] **Step 3: Add export name correction** + +`byline.tsx` currently exports default; the new layout (`[locale]/layout.tsx`) imports `{ PlaygroundByline }`. Change the existing default export to a named export: + +```tsx +// at the top of the function: +export function PlaygroundByline() { /* ... existing body ... */ } +``` + +Remove the `export default ...` line at the bottom. + +- [ ] **Step 4: Typecheck** + +```bash +pnpm --filter playground tsc --noEmit +``` +Expected: PASS, modulo the not-yet-created components used by sidebar (locale switcher etc.) and the ones referenced from MDX. If errors mention a module that's planned later in this plan, leave them — they'll resolve. Anything else, fix now. + +- [ ] **Step 5: Commit** + +```bash +git add playground +git commit -m "refactor(playground): move chrome components to src/components/playground" +``` + +--- + +### Task A7: Update `client-providers.tsx` to be locale-agnostic + +**Files:** +- Modify: `playground/src/components/playground/client-providers.tsx` + +The existing file wraps with `next-themes`. We want to keep it client-only and *not* duplicate `NextIntlClientProvider` (which we mounted in the locale layout). + +- [ ] **Step 1: Open the file and confirm it's already just a `next-themes` wrapper.** + +If it includes any locale logic, remove it. Final form: + +```tsx +'use client'; + +import { ThemeProvider } from 'next-themes'; +import type { ReactNode } from 'react'; + +export function ClientProviders({ children }: { children: ReactNode }) { + return ( + + {children} + + ); +} +``` + +- [ ] **Step 2: Typecheck + Commit** + +```bash +pnpm --filter playground tsc --noEmit +git add playground/src/components/playground/client-providers.tsx +git commit -m "refactor(playground): keep client providers as a pure theme wrapper" +``` + +--- + +### Task A8: Phase A verification + +- [ ] **Step 1: Lint** + +```bash +pnpm --filter playground lint +``` +Expected: PASS (or only warnings on yet-unwritten files). + +- [ ] **Step 2: Typecheck** + +```bash +pnpm --filter playground tsc --noEmit +``` +Expected: errors only on Code Hike `` (still stubbed) and Phase C files. No errors related to MDX/i18n/restructure. + +- [ ] **Step 3: Dev server smoke** + +```bash +pnpm --filter playground dev +``` +Open `http://localhost:3000/en` — should redirect (via middleware) and render the existing landing page. `http://localhost:3000/de` likewise. Stop the server. + +- [ ] **Step 4: Commit if any fixups** + +--- + +## Phase B — Code Hike `` and annotation handlers + +### Task B1: `filename` annotation + +**Files:** +- Create: `playground/src/components/code/annotations/filename.tsx` + +- [ ] **Step 1: Write handler** + +```tsx +// playground/src/components/code/annotations/filename.tsx +import type { AnnotationHandler } from 'codehike/code'; + +export const filename: AnnotationHandler = { + name: 'filename', + Pre: ({ annotation, ...rest }) => { + // Filename comes from the codeblock's meta string, not an annotation. + return null; + }, +}; +``` + +This file ends up unused at runtime — filename rendering happens directly in `` from `codeblock.meta`. Skip the handler entirely; track filename in `code.tsx` itself instead. + +Replace the file with: + +```tsx +// playground/src/components/code/annotations/filename.tsx +// Filename is rendered as a header strip in Code.tsx using codeblock.meta. +// This file exists only as a placeholder so importers stay consistent. +export {}; +``` + +- [ ] **Step 2: Commit** + +```bash +git add playground/src/components/code/annotations/filename.tsx +git commit -m "feat(playground): scaffold filename header" +``` + +--- + +### Task B2: `mark` annotation + +**Files:** +- Create: `playground/src/components/code/annotations/mark.tsx` + +- [ ] **Step 1: Write handler** + +```tsx +// playground/src/components/code/annotations/mark.tsx +import type { AnnotationHandler } from 'codehike/code'; +import { InnerLine } from 'codehike/code'; + +export const mark: AnnotationHandler = { + name: 'mark', + Line: ({ annotation, ...props }) => { + const color = annotation?.query || 'rgb(14 165 233)'; + return ( +
+ +
+ ); + }, + Inline: ({ annotation, children }) => { + const color = annotation?.query || 'rgb(14 165 233)'; + return ( + + {children} + + ); + }, +}; +``` + +- [ ] **Step 2: Typecheck + Commit** + +```bash +pnpm --filter playground tsc --noEmit +git add playground/src/components/code/annotations/mark.tsx +git commit -m "feat(playground): add mark annotation handler" +``` + +--- + +### Task B3: `callout` annotation + +**Files:** +- Create: `playground/src/components/code/annotations/callout.tsx` + +- [ ] **Step 1: Write handler** + +```tsx +// playground/src/components/code/annotations/callout.tsx +import type { AnnotationHandler, InlineAnnotation } from 'codehike/code'; + +export const callout: AnnotationHandler = { + name: 'callout', + transform: (annotation: InlineAnnotation) => { + const { name, query, lineNumber, fromColumn, toColumn, data } = annotation; + return { + name, + query, + fromLineNumber: lineNumber, + toLineNumber: lineNumber, + data: { ...data, column: (fromColumn + toColumn) / 2 }, + }; + }, + Block: ({ annotation, children }) => { + const { column } = annotation.data as { column: number }; + return ( + <> + {children} +
+
+ {annotation.query} +
+ + ); + }, +}; +``` + +- [ ] **Step 2: Typecheck + Commit** + +```bash +pnpm --filter playground tsc --noEmit +git add playground/src/components/code/annotations/callout.tsx +git commit -m "feat(playground): add callout annotation handler" +``` + +--- + +### Task B4: `focus` annotation (server + client split) + +**Files:** +- Create: `playground/src/components/code/annotations/focus.tsx` +- Create: `playground/src/components/code/annotations/focus.client.tsx` + +- [ ] **Step 1: Server file** + +```tsx +// playground/src/components/code/annotations/focus.tsx +import type { AnnotationHandler } from 'codehike/code'; +import { InnerLine } from 'codehike/code'; +import { PreWithFocus } from './focus.client'; + +export const focus: AnnotationHandler = { + name: 'focus', + onlyIfAnnotated: true, + PreWithRef: PreWithFocus, + Line: (props) => ( + + ), + AnnotatedLine: ({ annotation, ...props }) => ( + + ), +}; +``` + +- [ ] **Step 2: Client file** + +```tsx +// playground/src/components/code/annotations/focus.client.tsx +'use client'; + +import React, { useLayoutEffect, useRef } from 'react'; +import type { AnnotationHandler } from 'codehike/code'; +import { InnerPre, getPreRef } from 'codehike/code'; + +export const PreWithFocus: AnnotationHandler['PreWithRef'] = (props) => { + const ref = getPreRef(props); + useScrollToFocus(ref); + return ; +}; + +function useScrollToFocus(ref: React.RefObject) { + const firstRender = useRef(true); + useLayoutEffect(() => { + if (!ref.current) return; + const focused = ref.current.querySelectorAll( + '[data-focus=true]', + ); + const containerRect = ref.current.getBoundingClientRect(); + let top = Infinity; + let bottom = -Infinity; + focused.forEach((el) => { + const rect = el.getBoundingClientRect(); + top = Math.min(top, rect.top - containerRect.top); + bottom = Math.max(bottom, rect.bottom - containerRect.top); + }); + if (bottom > containerRect.height || top < 0) { + ref.current.scrollTo({ + top: ref.current.scrollTop + top - 10, + behavior: firstRender.current ? 'instant' : 'smooth', + }); + } + firstRender.current = false; + }, [ref]); +} +``` + +- [ ] **Step 3: Typecheck + Commit** + +```bash +pnpm --filter playground tsc --noEmit +git add playground/src/components/code/annotations/focus.tsx playground/src/components/code/annotations/focus.client.tsx +git commit -m "feat(playground): add focus annotation handler" +``` + +--- + +### Task B5: `link` annotation + +**Files:** +- Create: `playground/src/components/code/annotations/link.tsx` + +- [ ] **Step 1: Write handler** + +```tsx +// playground/src/components/code/annotations/link.tsx +import type { AnnotationHandler } from 'codehike/code'; + +export const link: AnnotationHandler = { + name: 'link', + Inline: ({ annotation, children }) => ( + + {children} + + ), +}; +``` + +- [ ] **Step 2: Typecheck + Commit** + +```bash +pnpm --filter playground tsc --noEmit +git add playground/src/components/code/annotations/link.tsx +git commit -m "feat(playground): add link annotation handler" +``` + +--- + +### Task B6: `fold` annotation + +**Files:** +- Create: `playground/src/components/code/annotations/fold.tsx` + +Code Hike's `!fold` annotation collapses regex-matched substrings. Keep it minimal — render an ellipsis span for inline matches. + +- [ ] **Step 1: Write handler** + +```tsx +// playground/src/components/code/annotations/fold.tsx +import type { AnnotationHandler } from 'codehike/code'; + +export const fold: AnnotationHandler = { + name: 'fold', + Inline: () => ( + + ), +}; +``` + +- [ ] **Step 2: Typecheck + Commit** + +```bash +pnpm --filter playground tsc --noEmit +git add playground/src/components/code/annotations/fold.tsx +git commit -m "feat(playground): add fold annotation handler" +``` + +--- + +### Task B7: `lineNumbers` annotation + +**Files:** +- Create: `playground/src/components/code/annotations/line-numbers.tsx` + +- [ ] **Step 1: Write handler** + +```tsx +// playground/src/components/code/annotations/line-numbers.tsx +import type { AnnotationHandler } from 'codehike/code'; +import { InnerLine } from 'codehike/code'; + +export const lineNumbers: AnnotationHandler = { + name: 'line-numbers', + Line: (props) => { + const { lineNumber, totalLines } = props; + const width = String(totalLines).length; + return ( +
+ + {lineNumber} + + +
+ ); + }, +}; +``` + +- [ ] **Step 2: Typecheck + Commit** + +```bash +pnpm --filter playground tsc --noEmit +git add playground/src/components/code/annotations/line-numbers.tsx +git commit -m "feat(playground): add line-numbers annotation handler" +``` + +--- + +### Task B8: Annotation index + +**Files:** +- Create: `playground/src/components/code/annotations/index.ts` + +- [ ] **Step 1: Write the barrel** + +```ts +// playground/src/components/code/annotations/index.ts +export { mark } from './mark'; +export { callout } from './callout'; +export { focus } from './focus'; +export { link } from './link'; +export { fold } from './fold'; +export { lineNumbers } from './line-numbers'; +``` + +- [ ] **Step 2: Commit** + +```bash +git add playground/src/components/code/annotations/index.ts +git commit -m "feat(playground): export annotation handlers from barrel" +``` + +--- + +### Task B9: Real `` RSC + +**Files:** +- Modify: `playground/src/components/code/code.tsx` +- Modify: `playground/src/app/globals.css` (add `github-from-css` theme variables) + +- [ ] **Step 1: Replace stub with real implementation** + +```tsx +// playground/src/components/code/code.tsx +import { Pre, type RawCode, highlight } from 'codehike/code'; +import { mark, callout, focus, link, fold, lineNumbers } from './annotations'; + +const handlers = [mark, callout, focus, link, fold, lineNumbers]; + +export async function Code({ codeblock }: { codeblock: RawCode }) { + const highlighted = await highlight(codeblock, 'github-from-css'); + + const filename = codeblock.meta; + return ( +
+ {filename ? ( +
+ {filename} +
+ ) : null} +
+    
+ ); +} +``` + +- [ ] **Step 2: Add theme CSS variables** + +Append to `playground/src/app/globals.css`: + +```css +/* Code Hike — github-from-css theme variables */ +:root { + --ch-0: light; + --ch-1: #6e7781; + --ch-2: #0550ae; + --ch-3: #953800; + --ch-4: #24292f; + --ch-5: #8250df; + --ch-6: #116329; + --ch-7: #cf222e; + --ch-8: #0a3069; + --ch-9: #82071e; + --ch-10: #f6f8fa; + --ch-11: #ffebe9; + --ch-12: #ffd8b5; + --ch-13: #eaeef2; + --ch-14: #57606a; + --ch-15: #ffffff; + --ch-16: #eaeef2; + --ch-17: #fdf2f8; + --ch-18: #1f883d; + --ch-19: #cf222e; + --ch-20: #8250df; + --ch-21: #fff8c5; + --ch-22: #fbf0a4; + --ch-23: #6e7781; + --ch-24: #ffffffe6; +} + +.dark { + --ch-0: dark; + --ch-1: #8b949e; + --ch-2: #79c0ff; + --ch-3: #ffa657; + --ch-4: #c9d1d9; + --ch-5: #d2a8ff; + --ch-6: #7ee787; + --ch-7: #ff7b72; + --ch-8: #a5d6ff; + --ch-9: #ffa198; + --ch-10: #f0f6fc; + --ch-11: #490202; + --ch-12: #5a1e02; + --ch-13: #161b22; + --ch-14: #8b949e; + --ch-15: #0d1117; + --ch-16: #30363d; + --ch-17: #261d2d; + --ch-18: #56d364; + --ch-19: #f85149; + --ch-20: #d2a8ff; + --ch-21: #5a1e02; + --ch-22: #693e00; + --ch-23: #8b949e; + --ch-24: #1f6feb1a; +} +``` + +(These variable names match `lighter`'s `github-from-css` theme. If a future Code Hike version drifts, copy fresh values from `https://github.com/code-hike/lighter/blob/main/lib/themes/github-from-css.css`.) + +- [ ] **Step 3: Build** + +```bash +pnpm --filter playground build +``` +Expected: PASS. Code Hike's `highlight` runs at request time; build will not exercise it unless a page already imports MDX. That's fine. + +- [ ] **Step 4: Commit** + +```bash +git add playground/src/components/code/code.tsx playground/src/app/globals.css +git commit -m "feat(playground): wire RSC with Code Hike highlight + theme" +``` + +--- + +## Phase C — Playground chrome + +### Task C1: Sidebar nav refactor + +**Files:** +- Modify: `playground/src/lib/nav.ts` +- Modify: `playground/src/components/playground/sidebar.tsx` + +- [ ] **Step 1: Update `nav.ts` with categories that grow** + +```ts +// playground/src/lib/nav.ts +import type { LucideIcon } from 'lucide-react'; +import { Languages, Calculator, Route, Wrench } from 'lucide-react'; + +export type NavItem = { + title: string; + slug: string; + description?: string; + status?: 'available' | 'coming-soon'; +}; + +export type NavSection = { + title: string; + icon: LucideIcon; + items: NavItem[]; +}; + +export const sections: NavSection[] = [ + { + title: 'Translations', + icon: Languages, + items: [ + { + title: 'Server components', + slug: '/translations/server-components', + description: + 'Read translated strings inside async Server Components — zero client JS.', + status: 'available', + }, + { + title: 'Client components', + slug: '/translations/client-components', + description: + 'Use translations from Client Components for interactive content.', + status: 'available', + }, + ], + }, + { + title: 'Formatting', + icon: Calculator, + items: [], + }, + { + title: 'Routing', + icon: Route, + items: [], + }, + { + title: 'Patterns', + icon: Wrench, + items: [], + }, +]; +``` + +(Empty categories appear in the sidebar dimmed; they reserve the future structure.) + +- [ ] **Step 2: Update `sidebar.tsx`** + +Open the current file and apply these changes: +1. Import sections from `@/lib/nav` (already done in Task A6). +2. Use `useTranslations` from `next-intl` for the "Playground" title and tagline. +3. Render empty categories with reduced opacity. +4. Apply the Oct 21 nits — left-aligned items, "Playground" beside the logo, dim section headings (gray-500 in dark / gray-400 in light), blue-300 logo on dark. +5. Wire active-state styling using `usePathname()` from `@/i18n/navigation` (so locale-prefix is stripped automatically). + +```tsx +'use client'; + +import clsx from 'clsx'; +import { Menu, X } from 'lucide-react'; +import { useState } from 'react'; +import { useTranslations } from 'next-intl'; +import { Link, usePathname } from '@/i18n/navigation'; +import { ScrollArea } from '@/components/ui/scroll-area'; +import { Button } from '@/components/ui/button'; +import { Logo } from '@/assets/logo'; +import { sections } from '@/lib/nav'; +import { ThemeToggle } from './theme-toggle'; +import { LinkStatus } from './link-status'; +import { LocaleSwitcher } from './locale-switcher'; + +export function PlaygroundSidebar() { + const [isOpen, setIsOpen] = useState(false); + const pathname = usePathname(); + const t = useTranslations('Layout'); + const close = () => setIsOpen(false); + + return ( +
+
+ +

+ Playground +

+ +
+ + + +
+
+ +
+ + + +
+
+ ); +} +``` + +- [ ] **Step 3: Typecheck** + +```bash +pnpm --filter playground tsc --noEmit +``` +Expected: error pointing to `./locale-switcher` (created in next task). All other errors should be resolved. + +- [ ] **Step 4: Commit** + +```bash +git add playground/src/lib/nav.ts playground/src/components/playground/sidebar.tsx +git commit -m "refactor(playground): restructure sidebar nav and apply design nits" +``` + +--- + +### Task C2: shadcn `dropdown-menu` primitive + +**Files:** +- Create: `playground/src/components/ui/dropdown-menu.tsx` +- Modify: `playground/components.json` (already exists) + +- [ ] **Step 1: Generate via shadcn CLI** + +```bash +pnpm --filter playground dlx shadcn@latest add dropdown-menu +``` + +If interactive prompts appear, accept defaults. + +- [ ] **Step 2: Verify file appeared and types resolve** + +```bash +pnpm --filter playground tsc --noEmit +``` + +- [ ] **Step 3: Commit** + +```bash +git add playground/src/components/ui/dropdown-menu.tsx playground/components.json +git commit -m "feat(playground): add shadcn dropdown-menu primitive" +``` + +--- + +### Task C3: `LocaleSwitcher` + +**Files:** +- Create: `playground/src/components/playground/locale-switcher.tsx` + +- [ ] **Step 1: Write component** + +```tsx +'use client'; + +import { useLocale } from 'next-intl'; +import { useParams } from 'next/navigation'; +import { useTransition } from 'react'; +import { Globe } from 'lucide-react'; +import { routing } from '@/i18n/routing'; +import { usePathname, useRouter } from '@/i18n/navigation'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; +import { Button } from '@/components/ui/button'; + +const labels: Record = { en: 'English', de: 'Deutsch' }; + +export function LocaleSwitcher() { + const locale = useLocale(); + const pathname = usePathname(); + const params = useParams(); + const router = useRouter(); + const [, startTransition] = useTransition(); + + function onSelect(next: string) { + if (next === locale) return; + startTransition(() => { + // @ts-expect-error: params type is generic + router.replace({ pathname, params }, { locale: next }); + }); + } + + return ( + + + + + + {routing.locales.map((loc) => ( + onSelect(loc)} + className={loc === locale ? 'font-semibold' : undefined} + > + {labels[loc] ?? loc} + + ))} + + + ); +} +``` + +- [ ] **Step 2: Typecheck + Commit** + +```bash +pnpm --filter playground tsc --noEmit +git add playground/src/components/playground/locale-switcher.tsx +git commit -m "feat(playground): add locale switcher" +``` + +--- + +### Task C4: shadcn `badge` primitive + +**Files:** +- Create: `playground/src/components/ui/badge.tsx` + +- [ ] **Step 1: Add via CLI** + +```bash +pnpm --filter playground dlx shadcn@latest add badge +``` + +- [ ] **Step 2: Commit** + +```bash +git add playground/src/components/ui/badge.tsx playground/components.json +git commit -m "feat(playground): add shadcn badge primitive" +``` + +--- + +### Task C5: `TwoColumn` MDX layout component + +**Files:** +- Create: `playground/src/components/playground/two-column.tsx` + +- [ ] **Step 1: Write component** + +```tsx +import type { ReactNode } from 'react'; +import { Children, isValidElement } from 'react'; + +/** + * Splits MDX children into prose (left) and the first
/code element (right).
+ * Anything after the first code block lands back in the prose column.
+ */
+export function TwoColumn({ children }: { children: ReactNode }) {
+  const prose: ReactNode[] = [];
+  const code: ReactNode[] = [];
+
+  Children.forEach(children, (child) => {
+    if (isCodeBlock(child) && code.length === 0) {
+      code.push(child);
+    } else {
+      prose.push(child);
+    }
+  });
+
+  return (
+    
+
+ {prose} +
+
{code}
+
+ ); +} + +function isCodeBlock(node: unknown): boolean { + if (!isValidElement(node)) return false; + const t = node.type; + // The Code Hike RSC shows up as a function component reference. + if (typeof t === 'function' && (t as { name?: string }).name === 'Code') { + return true; + } + // Default Markdown rendering may produce
.
+  return t === 'pre';
+}
+```
+
+- [ ] **Step 2: Typecheck + Commit**
+
+```bash
+pnpm --filter playground tsc --noEmit
+git add playground/src/components/playground/two-column.tsx
+git commit -m "feat(playground): add TwoColumn MDX layout"
+```
+
+---
+
+### Task C6: `DemoCard` component
+
+**Files:**
+- Create: `playground/src/components/playground/demo-card.tsx`
+
+- [ ] **Step 1: Write component**
+
+```tsx
+import type { ReactNode } from 'react';
+import { Badge } from '@/components/ui/badge';
+
+export function DemoCard({
+  label = 'Live demo',
+  children,
+}: {
+  label?: string;
+  children: ReactNode;
+}) {
+  return (
+    
+ + {label} + +
{children}
+
+ ); +} +``` + +- [ ] **Step 2: Commit** + +```bash +git add playground/src/components/playground/demo-card.tsx +git commit -m "feat(playground): add DemoCard wrapper" +``` + +--- + +### Task C7: Update `GitHubLink` + +**Files:** +- Modify: `playground/src/components/playground/github-link.tsx` + +- [ ] **Step 1: Confirm/normalize** + +Open the file. It should accept a `path` prop (relative to repo root) and link to `https://github.com/amannn/next-intl/tree/main/`. Ensure it renders a Lucide `Github` icon and reads label "View on GitHub". If the existing implementation differs, replace with: + +```tsx +import { Github, ArrowUpRight } from 'lucide-react'; + +export function GitHubLink({ path }: { path: string }) { + return ( + + + View on GitHub + + + ); +} +``` + +- [ ] **Step 2: Commit** + +```bash +git add playground/src/components/playground/github-link.tsx +git commit -m "refactor(playground): tighten GitHubLink markup" +``` + +--- + +### Task C8: Update `Byline` + +**Files:** +- Modify: `playground/src/components/playground/byline.tsx` + +- [ ] **Step 1: Localize** + +Open the file. Replace any hard-coded copy with `useTranslations('Layout')` reads where appropriate. Keep the export named (per Task A6 step 3). + +- [ ] **Step 2: Typecheck + Commit** + +```bash +pnpm --filter playground tsc --noEmit +git add playground/src/components/playground/byline.tsx +git commit -m "refactor(playground): localize byline strings" +``` + +--- + +### Task C9: Phase C verification + +- [ ] **Step 1: Lint, typecheck, build** + +```bash +pnpm --filter playground lint && \ +pnpm --filter playground tsc --noEmit && \ +pnpm --filter playground build +``` +Expected: all pass. + +- [ ] **Step 2: Dev server** + +```bash +pnpm --filter playground dev +``` +Verify in the browser: +- `http://localhost:3000/en` renders the landing page with the polished sidebar +- Locale switcher swaps to `/de` and German strings appear in the sidebar +- Theme toggle still works +- The two existing detail pages still render (still using their old hardcoded TSX content; replaced in Phase D) + +--- + +## Phase D — Detail pages (MDX content + live demos) + +### Task D1: Server Components — `content.mdx` + +**Files:** +- Create: `playground/src/app/[locale]/translations/server-components/content.mdx` + +- [ ] **Step 1: Write content** + +```mdx +import { TwoColumn } from '@/components/playground/two-column'; + +# Server Components + + + +- Mark a Server Component as cacheable simply by not using any client APIs. +- Read translated strings with `useTranslations()` directly inside async server components — messages stay on the server, so no client JavaScript is shipped. +- Pair with [`getTranslations()`](https://next-intl.dev/docs/environments/server-client-components#async-components) when you need it inside helpers that aren't components. + +```tsx app/page.tsx +import {useTranslations} from 'next-intl'; + +export default function Page() { + // !mark + const t = useTranslations('ServerDemo'); + return

{t('greeting')}

; +} +``` + +
+``` + +- [ ] **Step 2: Commit** + +```bash +git add playground/src/app/[locale]/translations/server-components/content.mdx +git commit -m "feat(playground): add MDX content for Server Components page" +``` + +--- + +### Task D2: Server Components — `server-example.tsx` + +**Files:** +- Modify: `playground/src/app/[locale]/translations/server-components/server-example.tsx` + +- [ ] **Step 1: Replace body** + +```tsx +import { useTranslations } from 'next-intl'; + +export function ServerExample() { + const t = useTranslations('ServerDemo'); + return ( +

{t('greeting')}

+ ); +} +``` + +- [ ] **Step 2: Commit** + +```bash +git add playground/src/app/[locale]/translations/server-components/server-example.tsx +git commit -m "feat(playground): rewrite Server Components live demo" +``` + +--- + +### Task D3: Server Components — `page.tsx` shell + +**Files:** +- Modify: `playground/src/app/[locale]/translations/server-components/page.tsx` + +- [ ] **Step 1: Replace body** + +```tsx +import { setRequestLocale } from 'next-intl/server'; +import { Badge } from '@/components/ui/badge'; +import { DemoCard } from '@/components/playground/demo-card'; +import { GitHubLink } from '@/components/playground/github-link'; +import Content from './content.mdx'; +import { ServerExample } from './server-example'; + +export const metadata = { + title: 'Server Components — next-intl Playground', + description: 'Use translations inside async Server Components.', +}; + +export default async function ServerComponentsPage({ + params, +}: { + params: Promise<{ locale: string }>; +}) { + const { locale } = await params; + setRequestLocale(locale); + + return ( +
+ + Demo + + + + + +
+ +
+
+ ); +} +``` + +- [ ] **Step 2: Build** + +```bash +pnpm --filter playground build +``` +Expected: PASS. The MDX file is compiled by `@next/mdx`; the fenced code block is processed by Code Hike and rendered through ``. + +- [ ] **Step 3: Visual smoke** + +```bash +pnpm --filter playground dev +``` +Open `http://localhost:3000/en/translations/server-components`. Confirm: +- Title `Server Components` from MDX +- Two-column layout with bullets left, code block right +- Code has filename header `app/page.tsx` and the `useTranslations` line is highlighted (mark) +- Live demo card shows `Hello, world!` (`Hallo, Welt!` in `/de/...`) +- GitHub link in footer points at the right path + +- [ ] **Step 4: Commit** + +```bash +git add playground/src/app/[locale]/translations/server-components/page.tsx +git commit -m "feat(playground): wire Server Components page shell" +``` + +--- + +### Task D4: Server Components — refresh `README.md` + +**Files:** +- Modify: `playground/src/app/[locale]/translations/server-components/README.md` + +- [ ] **Step 1: Trim to a short summary** + +```md +# Server Components + +Demonstrates reading translated strings inside async Server Components with `useTranslations()`. + +See the live demo at `/[locale]/translations/server-components` and the rich content in [`content.mdx`](./content.mdx). +``` + +- [ ] **Step 2: Commit** + +```bash +git add playground/src/app/[locale]/translations/server-components/README.md +git commit -m "docs(playground): slim Server Components README to a pointer" +``` + +--- + +### Task D5: Client Components — `content.mdx` + +**Files:** +- Create: `playground/src/app/[locale]/translations/client-components/content.mdx` + +- [ ] **Step 1: Write content** + +```mdx +import { TwoColumn } from '@/components/playground/two-column'; + +# Client Components + + + +- Use `useTranslations()` inside [Client Components](https://next-intl.dev/docs/environments/server-client-components) for any UI that reacts to user input. +- Messages for client-side namespaces are sent to the browser — only the keys you actually call. +- ICU placeholders (`{name}`) interpolate at render time and stay locale-aware. + +```tsx app/greet.tsx +'use client'; +import {useState} from 'react'; +import {useTranslations} from 'next-intl'; + +export function Greet() { + const t = useTranslations('ClientDemo'); + const [name, setName] = useState('Frodo'); + return ( + <> + setName(e.target.value)} /> + // !mark +

{t('greeting', {name})}

+ + ); +} +``` + +
+``` + +- [ ] **Step 2: Commit** + +```bash +git add playground/src/app/[locale]/translations/client-components/content.mdx +git commit -m "feat(playground): add MDX content for Client Components page" +``` + +--- + +### Task D6: Client Components — `client-example.tsx` + +**Files:** +- Modify: `playground/src/app/[locale]/translations/client-components/client-example.tsx` + +- [ ] **Step 1: Replace body** + +```tsx +'use client'; + +import { useState } from 'react'; +import { useTranslations } from 'next-intl'; + +export function ClientExample() { + const t = useTranslations('ClientDemo'); + const [name, setName] = useState(''); + + return ( +
+ + setName(e.target.value)} + placeholder={t('placeholder')} + className="w-full max-w-xs rounded-md border border-border bg-background px-3 py-2 text-sm" + /> +

+ {t('greeting', { name: name || t('placeholder') })} +

+
+ ); +} +``` + +- [ ] **Step 2: Commit** + +```bash +git add playground/src/app/[locale]/translations/client-components/client-example.tsx +git commit -m "feat(playground): rewrite Client Components live demo" +``` + +--- + +### Task D7: Client Components — `page.tsx` shell + +**Files:** +- Modify: `playground/src/app/[locale]/translations/client-components/page.tsx` + +- [ ] **Step 1: Replace body** + +```tsx +import { setRequestLocale } from 'next-intl/server'; +import { Badge } from '@/components/ui/badge'; +import { DemoCard } from '@/components/playground/demo-card'; +import { GitHubLink } from '@/components/playground/github-link'; +import Content from './content.mdx'; +import { ClientExample } from './client-example'; + +export const metadata = { + title: 'Client Components — next-intl Playground', + description: 'Use translations inside Client Components.', +}; + +export default async function ClientComponentsPage({ + params, +}: { + params: Promise<{ locale: string }>; +}) { + const { locale } = await params; + setRequestLocale(locale); + + return ( +
+ + Demo + + + + + +
+ +
+
+ ); +} +``` + +- [ ] **Step 2: Build + visual** + +```bash +pnpm --filter playground build && pnpm --filter playground dev +``` +Open `http://localhost:3000/en/translations/client-components`, type a name into the input, and confirm the greeting updates and the German locale flips it. + +- [ ] **Step 3: Commit** + +```bash +git add playground/src/app/[locale]/translations/client-components/page.tsx +git commit -m "feat(playground): wire Client Components page shell" +``` + +--- + +### Task D8: Client Components — refresh `README.md` + +**Files:** +- Modify: `playground/src/app/[locale]/translations/client-components/README.md` + +- [ ] **Step 1: Replace** + +```md +# Client Components + +Demonstrates reading translated strings inside Client Components with `useTranslations()` and ICU interpolation. + +See the live demo at `/[locale]/translations/client-components` and the rich content in [`content.mdx`](./content.mdx). +``` + +- [ ] **Step 2: Commit** + +```bash +git add playground/src/app/[locale]/translations/client-components/README.md +git commit -m "docs(playground): slim Client Components README to a pointer" +``` + +--- + +### Task D9: Localize landing page + +**Files:** +- Modify: `playground/src/app/[locale]/page.tsx` + +- [ ] **Step 1: Open the existing landing page** + +Replace the existing hardcoded copy with `useTranslations('Layout')` for `title` + `tagline`. Iterate over `sections` from `@/lib/nav`, hiding `items.length === 0` sections (so empty future categories don't show as cards). + +```tsx +import { setRequestLocale } from 'next-intl/server'; +import { useTranslations } from 'next-intl'; +import { Link } from '@/i18n/navigation'; +import { sections } from '@/lib/nav'; +import { LinkStatus } from '@/components/playground/link-status'; +import { PlaygroundBoundary } from '@/components/playground/boundary'; + +export default async function HomePage({ + params, +}: { + params: Promise<{ locale: string }>; +}) { + const { locale } = await params; + setRequestLocale(locale); + return ; +} + +function Home() { + const t = useTranslations('Layout'); + return ( +
+
+

+ {t('title')} +

+

+ {t('tagline')} +

+
+ + {sections + .filter((s) => s.items.length > 0) + .map((section) => ( +
+
+ {section.title} +
+
+ {section.items.map((item) => ( + +
+ {item.title} +
+ {item.description && ( +
+ {item.description} +
+ )} + + ))} +
+
+ ))} +
+
+ ); +} +``` + +- [ ] **Step 2: Build + Commit** + +```bash +pnpm --filter playground build +git add playground/src/app/[locale]/page.tsx +git commit -m "feat(playground): localize landing page and hide empty categories" +``` + +--- + +## Phase E — Polish, tests, docs + +### Task E1: Add Playwright smoke tests + +**Files:** +- Create: `playground/playwright.config.ts` +- Create: `playground/tests/playground.spec.ts` +- Modify: `playground/package.json` (add `e2e` script) + +- [ ] **Step 1: Config** + +```ts +// playground/playwright.config.ts +import { defineConfig } from '@playwright/test'; + +export default defineConfig({ + testDir: './tests', + use: { baseURL: 'http://localhost:3000' }, + webServer: { + command: 'pnpm dev', + port: 3000, + reuseExistingServer: !process.env.CI, + }, +}); +``` + +- [ ] **Step 2: Smoke spec** + +```ts +// playground/tests/playground.spec.ts +import { test, expect } from '@playwright/test'; + +test('landing renders in en and de', async ({ page }) => { + await page.goto('/en'); + await expect(page.getByRole('heading', { name: /Playground/i })).toBeVisible(); + + await page.goto('/de'); + await expect(page.getByRole('heading', { name: /Playground/i })).toBeVisible(); +}); + +test('Server Components page shows the live demo greeting', async ({ page }) => { + await page.goto('/en/translations/server-components'); + await expect(page.getByText('Hello, world!')).toBeVisible(); + + await page.goto('/de/translations/server-components'); + await expect(page.getByText('Hallo, Welt!')).toBeVisible(); +}); + +test('Client Components page renders demo and reacts to input', async ({ page }) => { + await page.goto('/en/translations/client-components'); + const input = page.getByPlaceholder('Frodo'); + await input.fill('Sam'); + await expect(page.getByText('Hello, Sam!')).toBeVisible(); +}); +``` + +- [ ] **Step 3: Add npm script** + +In `playground/package.json` `scripts`, add: +```json +"e2e": "playwright test" +``` + +- [ ] **Step 4: Install browsers + run** + +```bash +pnpm --filter playground exec playwright install chromium +pnpm --filter playground build +pnpm --filter playground exec playwright test +``` +Expected: all three tests pass. + +- [ ] **Step 5: Commit** + +```bash +git add playground/playwright.config.ts playground/tests playground/package.json +git commit -m "test(playground): add smoke tests for landing and detail pages" +``` + +--- + +### Task E2: Update root `playground/README.md` + +**Files:** +- Modify: `playground/README.md` + +- [ ] **Step 1: Rewrite** + +```md +# next-intl Playground + +A demo site that documents `next-intl` patterns. Built on Next.js 15, locale-prefixed routes (`/[locale]/...`), and Code Hike for code samples. + +## Develop + +```bash +pnpm --filter playground dev +``` + +Open http://localhost:3000. + +## Test + +```bash +pnpm --filter playground e2e +``` + +## Add a new page + +1. Create `src/app/[locale]///page.tsx`, `content.mdx`, and a live demo component. +2. Add an entry to `src/lib/nav.ts`. +3. Add string keys to `messages/{en,de}.json`. + +See existing examples under `src/app/[locale]/translations/`. +``` + +- [ ] **Step 2: Commit** + +```bash +git add playground/README.md +git commit -m "docs(playground): document setup and contribution flow" +``` + +--- + +### Task E3: Add `playground/` to monorepo lint matrix + +**Files:** +- Verify: `pnpm-workspace.yaml` includes `playground` (Task A1 step 1 should already cover this; just confirm) +- Verify: `turbo.json` runs lint/typecheck for the `playground` package + +- [ ] **Step 1: Confirm `pnpm-workspace.yaml`** + +Open it. If `playground` is not present, add it to the `packages:` array. + +- [ ] **Step 2: Confirm `turbo.json` does not exclude `playground`** + +Open it; `playground` should pick up the existing `lint`, `build`, `test` pipeline tasks. No changes if its `package.json` already declares `lint`, `build`, `test` scripts. + +- [ ] **Step 3: Run repo-wide checks** + +```bash +pnpm lint +pnpm build +``` +Expected: PASS. If `pnpm test` runs the new e2e suite under turbo, ensure it isn't required for default CI yet (e2e is optional for v1 review). If turbo wants to run it, mark it as `cache: false` and remove from default pipeline: + +In `turbo.json`, ensure `e2e` is its own task or excluded from `test`. Adjust as needed. + +- [ ] **Step 4: Commit if any changes** + +```bash +git add turbo.json pnpm-workspace.yaml +git commit -m "chore: ensure playground participates in monorepo tasks" +``` + +--- + +### Task E4: Final manual walkthrough + +- [ ] **Step 1: Dev server** + +```bash +pnpm --filter playground dev +``` + +- [ ] **Step 2: Walkthrough checklist** + +For both `/en` and `/de`, in both light and dark themes: +- Landing renders, sidebar shows Translations with both items and dimmed empty future categories +- Sidebar logo uses blue-300 in dark, blue-700 in light +- "Playground" left-aligned next to the logo +- Click "Server components" — page renders with two-column layout, code block has filename header, `useTranslations` line is highlighted, live demo greeting matches locale, GitHub link target works +- Click "Client components" — same checks; typing into the input updates the greeting in the active locale +- Locale switcher swaps the URL segment and re-renders all of the above +- Theme toggle still persists across navigation + +- [ ] **Step 3: If issues found, fix and commit per task; else proceed** + +--- + +### Task E5: Push and update PR description + +- [ ] **Step 1: Push** + +```bash +git push origin docs/refactor-playground +``` + +- [ ] **Step 2: Update PR #2084 description** + +Use `gh pr edit 2084 --body` (or via the GitHub UI) to reflect v1 scope: "Translations category with Server / Client Components pages, MDX + Code Hike content, locale-prefixed routing." Note future categories as out-of-scope. Leave the PR open for maintainer review. + +--- + +## Self-review + +**Spec coverage:** Each spec section maps to tasks: +- Scope (Translations + 2 pages) → D1–D8 +- Architecture / split `page.tsx` + `content.mdx` → D1, D3, D5, D7 +- Optional README → D4, D8 (kept as short pointer files) +- Page anatomy / TwoColumn → C5, D1, D5 +- Code Hike configuration → A2, A3, B9 +- Annotation handlers → B1–B8 +- i18n routing → A4, A5 +- Demo modules → D2, D6, A4 (messages) +- Design system / Oct 21 nits → C1 (sidebar) +- E2e tests untouched → no task removes the existing example; nothing references it +- Out of scope (tabs, CodeWithNotes) → not present in plan + +**Placeholder scan:** All steps include concrete code or commands. The only deferred work is intentional: empty future categories in `nav.ts`, optional README content. + +**Type consistency:** `` signature `{ codeblock: RawCode }` consistent across A3 stub, B9 real impl, and `mdx-components.tsx`. Annotation handler imports use `'codehike/code'` consistently. Locale switcher uses `routing.locales` for iteration; matches `routing.ts`. From 2542c8a04e293a76d6b11d10c3185c41b681df5c Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Fri, 8 May 2026 11:38:10 +0100 Subject: [PATCH 10/55] chore(playground): add MDX, Code Hike consumers, next-intl deps --- playground/package.json | 10 +- pnpm-lock.yaml | 772 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 774 insertions(+), 8 deletions(-) diff --git a/playground/package.json b/playground/package.json index d9cbfed95..7c8807dbb 100644 --- a/playground/package.json +++ b/playground/package.json @@ -9,6 +9,10 @@ "lint": "eslint" }, "dependencies": { + "@mdx-js/loader": "^3.1.0", + "@mdx-js/react": "^3.1.0", + "@next/mdx": "^15.5.4", + "@radix-ui/react-dropdown-menu": "^2.1.6", "@radix-ui/react-scroll-area": "^1.2.10", "@radix-ui/react-slot": "^1.2.3", "class-variance-authority": "^0.7.1", @@ -16,14 +20,18 @@ "codehike": "^1.0.7", "lucide-react": "^0.545.0", "next": "15.5.4", + "next-intl": "^4.9.1", "next-themes": "^0.4.6", "react": "19.1.0", "react-dom": "19.1.0", - "tailwind-merge": "^3.3.1" + "tailwind-merge": "^3.3.1", + "zod": "^3.24.1" }, "devDependencies": { "@eslint/eslintrc": "^3", + "@playwright/test": "^1.50.0", "@tailwindcss/postcss": "^4", + "@types/mdx": "^2.0.13", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d1fdaf2e6..2ce853fb7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -323,7 +323,7 @@ importers: version: 16.0.1(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) next-auth: specifier: ^4.24.11 - version: 4.24.11(next@16.0.1(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 4.24.11(next@16.0.1(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) next-intl: specifier: ^4.0.0 version: link:../../packages/next-intl @@ -1033,6 +1033,18 @@ importers: playground: dependencies: + '@mdx-js/loader': + specifier: ^3.1.0 + version: 3.1.0(webpack@5.98.0) + '@mdx-js/react': + specifier: ^3.1.0 + version: 3.1.0(@types/react@19.2.2)(react@19.1.0) + '@next/mdx': + specifier: ^15.5.4 + version: 15.5.18(@mdx-js/loader@3.1.0(webpack@5.98.0))(@mdx-js/react@3.1.0(@types/react@19.2.2)(react@19.1.0)) + '@radix-ui/react-dropdown-menu': + specifier: ^2.1.6 + version: 2.1.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-scroll-area': specifier: ^1.2.10 version: 1.2.10(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -1054,6 +1066,9 @@ importers: next: specifier: 15.5.4 version: 15.5.4(@playwright/test@1.55.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next-intl: + specifier: ^4.9.1 + version: 4.11.1(next@15.5.4(@playwright/test@1.55.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(typescript@5.8.2) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -1066,13 +1081,22 @@ importers: tailwind-merge: specifier: ^3.3.1 version: 3.3.1 + zod: + specifier: ^3.24.1 + version: 3.25.76 devDependencies: '@eslint/eslintrc': specifier: ^3 version: 3.3.0 + '@playwright/test': + specifier: ^1.50.0 + version: 1.55.0 '@tailwindcss/postcss': specifier: ^4 version: 4.1.12 + '@types/mdx': + specifier: ^2.0.13 + version: 2.0.13 '@types/node': specifier: ^20 version: 20.17.24 @@ -2866,18 +2890,27 @@ packages: '@formatjs/fast-memoize@2.2.6': resolution: {integrity: sha512-luIXeE2LJbQnnzotY1f2U2m7xuQNj2DA8Vq4ce1BY9ebRZaoPB1+8eZ6nXpLzsxuW5spQxr7LdCg+CApZwkqkw==} + '@formatjs/fast-memoize@3.1.4': + resolution: {integrity: sha512-Lbke1aOrsygKKR09Ux0NrZgbTqpDmiwXOgzyDOJ8Owr1zd5qOKTauf62hH+Seeku3ju77rHWH9I5SfX2CN0vuA==} + '@formatjs/icu-messageformat-parser@2.1.0': resolution: {integrity: sha512-Qxv/lmCN6hKpBSss2uQ8IROVnta2r9jd3ymUEIjm2UyIkUCHVcbUVRGL/KS/wv7876edvsPe+hjHVJ4z8YuVaw==} '@formatjs/icu-messageformat-parser@2.11.1': resolution: {integrity: sha512-o0AhSNaOfKoic0Sn1GkFCK4MxdRsw7mPJ5/rBpIqdvcC7MIuyUSW8WChUEvrK78HhNpYOgqCQbINxCTumJLzZA==} + '@formatjs/icu-messageformat-parser@3.5.7': + resolution: {integrity: sha512-wJxRZ+SiUCIMTL86bQlZU9bEKDQqqvgk2ezQ1BySUdWRfHqOzj4IKUVFeUZKS9w58M4e7wMSG0Sl86LAPb7Qww==} + '@formatjs/icu-skeleton-parser@1.3.6': resolution: {integrity: sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg==} '@formatjs/icu-skeleton-parser@1.8.13': resolution: {integrity: sha512-N/LIdTvVc1TpJmMt2jVg0Fr1F7Q1qJPdZSCs19unMskCmVQ/sa0H9L8PWt13vq+gLdLg1+pPsvBLydL1Apahjg==} + '@formatjs/icu-skeleton-parser@2.1.7': + resolution: {integrity: sha512-cIw1SFP0bi0CUBiJ2jzp99ws3OJNQDfStcHq9Z0iHWzItmiIikihFO+npR8C80yDlp7ZuBCLXCcKjgWjHicksA==} + '@formatjs/intl-localematcher@0.2.25': resolution: {integrity: sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==} @@ -2890,6 +2923,9 @@ packages: '@formatjs/intl-localematcher@0.6.0': resolution: {integrity: sha512-4rB4g+3hESy1bHSBG3tDFaMY2CH67iT7yne1e+0CLTsGLDcmoEWWpJjjpWVaYgYfYuohIRuo0E+N536gd2ZHZA==} + '@formatjs/intl-localematcher@0.8.6': + resolution: {integrity: sha512-AZRgUxj0q93lyF7Z5lFS85bLINXuBLX4R3tCKicO6fSWo6cvh9GQfoR3B1WlsqQwefZ1QORTivhInx7gM6HUzQ==} + '@gar/promisify@1.1.3': resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} @@ -3686,6 +3722,17 @@ packages: '@next/eslint-plugin-next@16.0.1': resolution: {integrity: sha512-g4Cqmv/gyFEXNeVB2HkqDlYKfy+YrlM2k8AVIO/YQVEPfhVruH1VA99uT1zELLnPLIeOnx8IZ6Ddso0asfTIdw==} + '@next/mdx@15.5.18': + resolution: {integrity: sha512-vslfcoGsX330qhcFMfksM2xPE1zCd5OGG4E47EBHH4asCG9l39CNoKv6X906kAgzvACHBKGcTxv1wlLVnagUjA==} + peerDependencies: + '@mdx-js/loader': '>=0.15.0' + '@mdx-js/react': '>=0.15.0' + peerDependenciesMeta: + '@mdx-js/loader': + optional: true + '@mdx-js/react': + optional: true + '@next/mdx@16.0.1': resolution: {integrity: sha512-YxcrY9Ig5agm5zekW7ta37OQ9P9dHueNRWLJLiYdE42wYrlfZ0KdjiQ3J5AHMPNq8tjiBxNOwkP4omTsVmb+9g==} peerDependencies: @@ -4125,6 +4172,88 @@ packages: '@panva/hkdf@1.2.0': resolution: {integrity: sha512-97ZQvZJ4gJhi24Io6zI+W7B67I82q1I8i3BSzQ4OyZj1z4OW87/ruF26lrMES58inTKLy2KgVIDcx8PU4AaANQ==} + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.6': + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.6': + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.6': + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.5.6': + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.6': + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.6': + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.6': + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} + engines: {node: '>= 10.0.0'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -5117,60 +5246,132 @@ packages: cpu: [arm64] os: [darwin] + '@swc/core-darwin-arm64@1.15.33': + resolution: {integrity: sha512-N+L0uXhuO7FIfzqwgxmzv0zIpV0qEp8wPX3QQs2p4atjMoywup2JTeDlXPw+z9pWJGCae3JjM+tZ6myclI+2gA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + '@swc/core-darwin-x64@1.15.1': resolution: {integrity: sha512-z9QguKxE3aldvwKHHDg5OlKehasbJBF1lacn5CnN6SlrHbdwokXHFA3nIoO3Bh1Tw7bCgFtdIR4jKlTTn3kBZA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] + '@swc/core-darwin-x64@1.15.33': + resolution: {integrity: sha512-/Il4QHSOhV4FekbsDtkrNmKbsX26oSysvgrRswa/RYOHXAkwXDbB4jaeKq6PsJLSPkzJ2KzQ061gtBnk0vNHfA==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + '@swc/core-linux-arm-gnueabihf@1.15.1': resolution: {integrity: sha512-yS2FHA8E4YeiPG9YeYk/6mKiCWuXR5RdYlCmtlGzKcjWbI4GXUVe7+p9C0M6myRt3zdj3M1knmJxk52MQA9EZQ==} engines: {node: '>=10'} cpu: [arm] os: [linux] + '@swc/core-linux-arm-gnueabihf@1.15.33': + resolution: {integrity: sha512-C64hBnBxq4viOPQ8hlx+2lJ23bzZBGnjw7ryALmS+0Q3zHmwO8lw1/DArLENw4Q18/0w5wdEO1k3m1wWNtKGqQ==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + '@swc/core-linux-arm64-gnu@1.15.1': resolution: {integrity: sha512-IFrjDu7+5Y61jLsUqBVXlXutDoPBX10eEeNTjW6C1yzm+cSTE7ayiKXMIFri4gEZ4VpXS6MUgkwjxtDpIXTh+w==} engines: {node: '>=10'} cpu: [arm64] os: [linux] + '@swc/core-linux-arm64-gnu@1.15.33': + resolution: {integrity: sha512-TRJfnJbX3jqpxRDRoieMzRiCBS5jOmXNb3iQXmcgjFEHKLnAgK1RZRU8Cq1MsPqO4jAJp/ld1G4O3fXuxv85uw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + '@swc/core-linux-arm64-musl@1.15.1': resolution: {integrity: sha512-fKzP9mRQGbhc5QhJPIsqKNNX/jyWrZgBxmo3Nz1SPaepfCUc7RFmtcJQI5q8xAun3XabXjh90wqcY/OVyg2+Kg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] + '@swc/core-linux-arm64-musl@1.15.33': + resolution: {integrity: sha512-il7tYM+CpUNzieQbwAjFT1P8zqAhmGWNAGhQZBnxurXZ0aNn+5nqYFTEUKNZl7QibtT0uQXzTZrNGHCIj6Y1Og==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-ppc64-gnu@1.15.33': + resolution: {integrity: sha512-ZtNBwN0Z7CFj9Il0FcPaKdjgP7URyKu/3RfH46vq+0paOBqLj4NYldD6Qo//Duif/7IOtAraUfDOmp0PLAufog==} + engines: {node: '>=10'} + cpu: [ppc64] + os: [linux] + + '@swc/core-linux-s390x-gnu@1.15.33': + resolution: {integrity: sha512-De1IyajoOmhOYYjw/lx66bKlyDpHZTueqwpDrWgf5O7T6d1ODeJJO9/OqMBmrBQc5C+dNnlmIufHsp4QVCWufA==} + engines: {node: '>=10'} + cpu: [s390x] + os: [linux] + '@swc/core-linux-x64-gnu@1.15.1': resolution: {integrity: sha512-ZLjMi138uTJxb+1wzo4cB8mIbJbAsSLWRNeHc1g1pMvkERPWOGlem+LEYkkzaFzCNv1J8aKcL653Vtw8INHQeg==} engines: {node: '>=10'} cpu: [x64] os: [linux] + '@swc/core-linux-x64-gnu@1.15.33': + resolution: {integrity: sha512-mGTH0YxmUN+x6vRN/I6NOk5X0ogNktkwPnJ94IMvR7QjhRDwL0O8RXEDhyUM0YtwWrryBOqaJQBX4zruxEPRGw==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + '@swc/core-linux-x64-musl@1.15.1': resolution: {integrity: sha512-jvSI1IdsIYey5kOITzyajjofXOOySVitmLxb45OPUjoNojql4sDojvlW5zoHXXFePdA6qAX4Y6KbzAOV3T3ctA==} engines: {node: '>=10'} cpu: [x64] os: [linux] + '@swc/core-linux-x64-musl@1.15.33': + resolution: {integrity: sha512-hj628ZkSEJf6zMf5VMbYrG2O6QqyTIp2qwY6VlCjvIa9lAEZ5c2lfPblCLVGYubTeLJDxadLB/CxqQYOQABeEQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + '@swc/core-win32-arm64-msvc@1.15.1': resolution: {integrity: sha512-X/FcDtNrDdY9r4FcXHt9QxUqC/2FbQdvZobCKHlHe8vTSKhUHOilWl5EBtkFVfsEs4D5/yAri9e3bJbwyBhhBw==} engines: {node: '>=10'} cpu: [arm64] os: [win32] + '@swc/core-win32-arm64-msvc@1.15.33': + resolution: {integrity: sha512-GV2oohtN2/5+KSccl86VULu3aT+LrISC8uzgSq0FRnikpD+Zwc+sBlXmoKQ+Db6jI57ITUOIB8jRkdGMABC29g==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + '@swc/core-win32-ia32-msvc@1.15.1': resolution: {integrity: sha512-vfheiWBux8PpC87oy1cshcqzgH7alWYpnVq5jWe7xuVkjqjGGDbBUKuS84eJCdsWcVaB5EXIWLKt+11W3/BOwA==} engines: {node: '>=10'} cpu: [ia32] os: [win32] + '@swc/core-win32-ia32-msvc@1.15.33': + resolution: {integrity: sha512-gtyvzSNR8DHKfFEA2uqb8Ld1myqi6uEg2jyeUq3ikn5ytYs7H8RpZYC8mdy4NXr8hfcdJfCLXPlYaqqfBXpoEQ==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + '@swc/core-win32-x64-msvc@1.15.1': resolution: {integrity: sha512-n3Ppn0LSov/IdlANq+8kxHqENuJRX5XtwQqPgQsgwKIcFq22u17NKfDs9vL5PwRsEHY6Xd67pnOqQX0h4AvbuQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] + '@swc/core-win32-x64-msvc@1.15.33': + resolution: {integrity: sha512-d6fRqQSkJI+kmMEBWaDQ7TMl8+YjLYbwRUPZQ9DY0ORBJeTzOrG0twvfvlZ2xgw6jA0ScQKgfBm4vHLSLl5Hqg==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + '@swc/core@1.15.1': resolution: {integrity: sha512-s9GN3M2jA32k+StvuS9uGe4ztf5KVGBdlJMMC6LR6Ah23Lq/CWKVcC3WeQi8qaAcLd+DiddoNCNMUWymLv+wWQ==} engines: {node: '>=10'} @@ -5180,6 +5381,15 @@ packages: '@swc/helpers': optional: true + '@swc/core@1.15.33': + resolution: {integrity: sha512-jOlwnFV2xhuuZeAUILGFULeR6vDPfijEJ57evfocwznQldLU3w2cZ9bSDryY9ip+AsM3r1NJKzf47V2NXebkeQ==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '>=0.5.17' + peerDependenciesMeta: + '@swc/helpers': + optional: true + '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} @@ -5195,6 +5405,9 @@ packages: '@swc/types@0.1.25': resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} + '@swc/types@0.1.26': + resolution: {integrity: sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==} + '@tailwindcss/node@4.1.12': resolution: {integrity: sha512-3hm9brwvQkZFe++SBt+oLjo4OLDtkvlE8q2WalaD/7QWaeM7KEJbAiY/LJZUaCs7Xa8aUu4xy3uoyX4q54UVdQ==} @@ -9799,6 +10012,9 @@ packages: peerDependencies: postcss: ^8.1.0 + icu-minify@4.11.1: + resolution: {integrity: sha512-C0tsPVuvyNp+++qWJP+mty/KLLStjerOZqu3W1xWLJkChEDbDi9Taoj6blK7L/onxbuVzwgH6k9Sf+rOV6lOvw==} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -9927,6 +10143,9 @@ packages: intl-messageformat@10.7.15: resolution: {integrity: sha512-LRyExsEsefQSBjU2p47oAheoKz+EOJxSLDdjOaEjdriajfHsMXOmV/EhMvYSg9bAgCUHasuAC+mcUBe/95PfIg==} + intl-messageformat@11.2.4: + resolution: {integrity: sha512-iKP6+uJXn+XcfRgYfGPE3+mqCoODV2vATrXDLo/YkYgIdelJHJPBEbc0GZThipAYPuk+8QJFiPgOfblU085ABg==} + intl-messageformat@9.13.0: resolution: {integrity: sha512-7sGC7QnSQGa5LZP7bXLDhVDtQOeKGeBFGHF2Y8LVBwYZoQZCgWeKoPGTa5GMG8g/TzDgeXuYJQis7Ggiw2xTOw==} @@ -11866,6 +12085,19 @@ packages: nodemailer: optional: true + next-intl-swc-plugin-extractor@4.11.1: + resolution: {integrity: sha512-jHKGij7NoYccy2y54+e/wHVMoRgNt4h/Kn0XS9c4GbKu3KgJyANLUN8sFcDixv6sqz4V2kh6CTWgrkIidQksUg==} + + next-intl@4.11.1: + resolution: {integrity: sha512-s32lFFLXkxrW6fy+4IVaGD5J8xPpbEDFLfBbXV73CTbHAGhOGMjYN4/rftdsKOQ44AnPhnZ5Et+ZNMr5tRpsqA==} + peerDependencies: + next: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + next-sitemap@4.2.3: resolution: {integrity: sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ==} engines: {node: '>=14.18'} @@ -12013,6 +12245,9 @@ packages: node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-dir@0.1.17: resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} engines: {node: '>= 0.10.5'} @@ -12684,6 +12919,10 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} @@ -12764,6 +13003,9 @@ packages: resolution: {integrity: sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==} engines: {node: '>=6'} + po-parser@2.1.1: + resolution: {integrity: sha512-ECF4zHLbUItpUgE3OTtLKlPjeBN+fKEczj2zYjDfCGOzicNs0GK3Vg2IoAYwx7LH/XYw43fZQP6xnZ4TkNxSLQ==} + points-on-curve@0.2.0: resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} @@ -15515,6 +15757,11 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 + use-intl@4.11.1: + resolution: {integrity: sha512-/dqWSqUSbVMzC+fdy7io8enhGYHeGeHK1bFhTLrp0ZblqdzY4FkE+tkffW6IfCauqaIA2/z4DQae4XEn93+raw==} + peerDependencies: + react: ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 + use-sidecar@1.1.3: resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} engines: {node: '>=10'} @@ -15939,6 +16186,7 @@ packages: whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-fetch@3.6.2: resolution: {integrity: sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==} @@ -18327,6 +18575,12 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + '@floating-ui/react-dom@2.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/dom': 1.6.5 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + '@floating-ui/react-dom@2.1.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@floating-ui/dom': 1.6.5 @@ -18370,6 +18624,8 @@ snapshots: dependencies: tslib: 2.8.0 + '@formatjs/fast-memoize@3.1.4': {} + '@formatjs/icu-messageformat-parser@2.1.0': dependencies: '@formatjs/ecma402-abstract': 1.11.4 @@ -18382,6 +18638,10 @@ snapshots: '@formatjs/icu-skeleton-parser': 1.8.13 tslib: 2.8.0 + '@formatjs/icu-messageformat-parser@3.5.7': + dependencies: + '@formatjs/icu-skeleton-parser': 2.1.7 + '@formatjs/icu-skeleton-parser@1.3.6': dependencies: '@formatjs/ecma402-abstract': 1.11.4 @@ -18392,6 +18652,8 @@ snapshots: '@formatjs/ecma402-abstract': 2.3.3 tslib: 2.8.1 + '@formatjs/icu-skeleton-parser@2.1.7': {} + '@formatjs/intl-localematcher@0.2.25': dependencies: tslib: 2.8.1 @@ -18408,6 +18670,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@formatjs/intl-localematcher@0.8.6': + dependencies: + '@formatjs/fast-memoize': 3.1.4 + '@gar/promisify@1.1.3': {} '@graphql-typed-document-node/core@3.2.0(graphql@15.8.0)': @@ -19222,6 +19488,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@mdx-js/loader@3.1.0(webpack@5.98.0)': + dependencies: + '@mdx-js/mdx': 3.0.1 + source-map: 0.7.4 + optionalDependencies: + webpack: 5.98.0 + transitivePeerDependencies: + - supports-color + '@mdx-js/mdx@2.3.0': dependencies: '@types/estree-jsx': 1.0.5 @@ -19308,6 +19583,12 @@ snapshots: '@types/react': 19.2.2 react: 18.3.1 + '@mdx-js/react@3.1.0(@types/react@19.2.2)(react@19.1.0)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 19.2.2 + react: 19.1.0 + '@mdx-js/react@3.1.0(@types/react@19.2.2)(react@19.2.0)': dependencies: '@types/mdx': 2.0.13 @@ -19408,6 +19689,13 @@ snapshots: dependencies: fast-glob: 3.3.1 + '@next/mdx@15.5.18(@mdx-js/loader@3.1.0(webpack@5.98.0))(@mdx-js/react@3.1.0(@types/react@19.2.2)(react@19.1.0))': + dependencies: + source-map: 0.7.4 + optionalDependencies: + '@mdx-js/loader': 3.1.0(webpack@5.98.0) + '@mdx-js/react': 3.1.0(@types/react@19.2.2)(react@19.1.0) + '@next/mdx@16.0.1(@mdx-js/loader@3.1.0(webpack@5.98.0(esbuild@0.25.1)))(@mdx-js/react@3.1.0(@types/react@19.2.2)(react@19.2.0))': dependencies: source-map: 0.7.4 @@ -19802,6 +20090,66 @@ snapshots: '@panva/hkdf@1.2.0': {} + '@parcel/watcher-android-arm64@2.5.6': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.6': + optional: true + + '@parcel/watcher-darwin-x64@2.5.6': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.6': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.6': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.6': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.6': + optional: true + + '@parcel/watcher-win32-arm64@2.5.6': + optional: true + + '@parcel/watcher-win32-ia32@2.5.6': + optional: true + + '@parcel/watcher-win32-x64@2.5.6': + optional: true + + '@parcel/watcher@2.5.6': + dependencies: + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.4 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.6 + '@parcel/watcher-darwin-arm64': 2.5.6 + '@parcel/watcher-darwin-x64': 2.5.6 + '@parcel/watcher-freebsd-x64': 2.5.6 + '@parcel/watcher-linux-arm-glibc': 2.5.6 + '@parcel/watcher-linux-arm-musl': 2.5.6 + '@parcel/watcher-linux-arm64-glibc': 2.5.6 + '@parcel/watcher-linux-arm64-musl': 2.5.6 + '@parcel/watcher-linux-x64-glibc': 2.5.6 + '@parcel/watcher-linux-x64-musl': 2.5.6 + '@parcel/watcher-win32-arm64': 2.5.6 + '@parcel/watcher-win32-ia32': 2.5.6 + '@parcel/watcher-win32-x64': 2.5.6 + '@pkgjs/parseargs@0.11.0': optional: true @@ -19837,6 +20185,15 @@ snapshots: '@radix-ui/primitive@1.1.3': {} + '@radix-ui/react-arrow@1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-arrow@1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -19846,6 +20203,18 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-collection@1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.1.2(@types/react@19.2.2)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-collection@1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.2.2)(react@19.2.0) @@ -19858,6 +20227,12 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-compose-refs@1.1.1(@types/react@19.2.2)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-compose-refs@1.1.1(@types/react@19.2.2)(react@19.2.0)': dependencies: react: 19.2.0 @@ -19870,6 +20245,12 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 + '@radix-ui/react-context@1.1.1(@types/react@19.2.2)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-context@1.1.1(@types/react@19.2.2)(react@19.2.0)': dependencies: react: 19.2.0 @@ -19882,6 +20263,12 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 + '@radix-ui/react-direction@1.1.0(@types/react@19.2.2)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-direction@1.1.0(@types/react@19.2.2)(react@19.2.0)': dependencies: react: 19.2.0 @@ -19894,6 +20281,19 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 + '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.2.2)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -19907,6 +20307,21 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-dropdown-menu@2.1.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-menu': 2.1.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.2.2)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-dropdown-menu@2.1.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -19922,12 +20337,29 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-focus-guards@1.1.1(@types/react@19.2.2)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-focus-guards@1.1.1(@types/react@19.2.2)(react@19.2.0)': dependencies: react: 19.2.0 optionalDependencies: '@types/react': 19.2.2 + '@radix-ui/react-focus-scope@1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.2.2)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-focus-scope@1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.2.2)(react@19.2.0) @@ -19939,6 +20371,13 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-id@1.1.0(@types/react@19.2.2)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.2.2)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-id@1.1.0(@types/react@19.2.2)(react@19.2.0)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.2.2)(react@19.2.0) @@ -19946,6 +20385,32 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 + '@radix-ui/react-menu@2.1.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-popper': 1.2.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.4(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.1.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.2.2)(react@19.1.0) + aria-hidden: 1.2.4 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-remove-scroll: 2.6.3(@types/react@19.2.2)(react@19.1.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-menu@2.1.6(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -19972,6 +20437,24 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-popper@1.2.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-arrow': 1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-rect': 1.1.0(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/rect': 1.1.0 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-popper@1.2.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -19990,6 +20473,16 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-portal@1.1.4(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.2.2)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-portal@1.1.4(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -20000,6 +20493,16 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-presence@1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.2.2)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-presence@1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.2.2)(react@19.2.0) @@ -20020,6 +20523,15 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-primitive@2.0.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-slot': 1.1.2(@types/react@19.2.2)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-primitive@2.0.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/react-slot': 1.1.2(@types/react@19.2.2)(react@19.2.0) @@ -20038,6 +20550,23 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-roving-focus@1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.2.2)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-roving-focus@1.1.2(@types/react-dom@19.2.1(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -20101,6 +20630,13 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.1(@types/react@19.2.2) + '@radix-ui/react-slot@1.1.2(@types/react@19.2.2)(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.2.2)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-slot@1.1.2(@types/react@19.2.2)(react@19.2.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.2.2)(react@19.2.0) @@ -20122,6 +20658,12 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.2.2)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.2.2)(react@19.2.0)': dependencies: react: 19.2.0 @@ -20134,6 +20676,13 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.2.2)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.2.2)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.2.2)(react@19.2.0)': dependencies: '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.2.2)(react@19.2.0) @@ -20141,6 +20690,13 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@19.2.2)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.2.2)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@19.2.2)(react@19.2.0)': dependencies: '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.2.2)(react@19.2.0) @@ -20148,6 +20704,12 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.2.2)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.2.2)(react@19.2.0)': dependencies: react: 19.2.0 @@ -20166,6 +20728,13 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 + '@radix-ui/react-use-rect@1.1.0(@types/react@19.2.2)(react@19.1.0)': + dependencies: + '@radix-ui/rect': 1.1.0 + react: 19.1.0 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-use-rect@1.1.0(@types/react@19.2.2)(react@19.2.0)': dependencies: '@radix-ui/rect': 1.1.0 @@ -20173,6 +20742,13 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 + '@radix-ui/react-use-size@1.1.0(@types/react@19.2.2)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.2.2)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-use-size@1.1.0(@types/react@19.2.2)(react@19.2.0)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.2.2)(react@19.2.0) @@ -21038,33 +21614,69 @@ snapshots: '@swc/core-darwin-arm64@1.15.1': optional: true + '@swc/core-darwin-arm64@1.15.33': + optional: true + '@swc/core-darwin-x64@1.15.1': optional: true + '@swc/core-darwin-x64@1.15.33': + optional: true + '@swc/core-linux-arm-gnueabihf@1.15.1': optional: true + '@swc/core-linux-arm-gnueabihf@1.15.33': + optional: true + '@swc/core-linux-arm64-gnu@1.15.1': optional: true + '@swc/core-linux-arm64-gnu@1.15.33': + optional: true + '@swc/core-linux-arm64-musl@1.15.1': optional: true + '@swc/core-linux-arm64-musl@1.15.33': + optional: true + + '@swc/core-linux-ppc64-gnu@1.15.33': + optional: true + + '@swc/core-linux-s390x-gnu@1.15.33': + optional: true + '@swc/core-linux-x64-gnu@1.15.1': optional: true + '@swc/core-linux-x64-gnu@1.15.33': + optional: true + '@swc/core-linux-x64-musl@1.15.1': optional: true + '@swc/core-linux-x64-musl@1.15.33': + optional: true + '@swc/core-win32-arm64-msvc@1.15.1': optional: true + '@swc/core-win32-arm64-msvc@1.15.33': + optional: true + '@swc/core-win32-ia32-msvc@1.15.1': optional: true + '@swc/core-win32-ia32-msvc@1.15.33': + optional: true + '@swc/core-win32-x64-msvc@1.15.1': optional: true + '@swc/core-win32-x64-msvc@1.15.33': + optional: true + '@swc/core@1.15.1': dependencies: '@swc/counter': 0.1.3 @@ -21081,6 +21693,24 @@ snapshots: '@swc/core-win32-ia32-msvc': 1.15.1 '@swc/core-win32-x64-msvc': 1.15.1 + '@swc/core@1.15.33': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.26 + optionalDependencies: + '@swc/core-darwin-arm64': 1.15.33 + '@swc/core-darwin-x64': 1.15.33 + '@swc/core-linux-arm-gnueabihf': 1.15.33 + '@swc/core-linux-arm64-gnu': 1.15.33 + '@swc/core-linux-arm64-musl': 1.15.33 + '@swc/core-linux-ppc64-gnu': 1.15.33 + '@swc/core-linux-s390x-gnu': 1.15.33 + '@swc/core-linux-x64-gnu': 1.15.33 + '@swc/core-linux-x64-musl': 1.15.33 + '@swc/core-win32-arm64-msvc': 1.15.33 + '@swc/core-win32-ia32-msvc': 1.15.33 + '@swc/core-win32-x64-msvc': 1.15.33 + '@swc/counter@0.1.3': {} '@swc/helpers@0.4.11': @@ -21100,6 +21730,10 @@ snapshots: dependencies: '@swc/counter': 0.1.3 + '@swc/types@0.1.26': + dependencies: + '@swc/counter': 0.1.3 + '@tailwindcss/node@4.1.12': dependencies: '@jridgewell/remapping': 2.3.5 @@ -24702,8 +25336,7 @@ snapshots: detect-libc@2.0.4: {} - detect-libc@2.1.2: - optional: true + detect-libc@2.1.2: {} detect-newline@3.1.0: {} @@ -25470,7 +26103,7 @@ snapshots: eslint: 9.39.1(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.39.1(jiti@2.5.1)))(eslint@9.39.1(jiti@2.5.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.39.1(jiti@2.5.1)))(eslint@9.39.1(jiti@2.5.1)))(eslint@9.39.1(jiti@2.5.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.39.1(jiti@2.5.1)) eslint-plugin-jsx-a11y: 6.10.0(eslint@9.39.1(jiti@2.5.1)) eslint-plugin-react: 7.37.1(eslint@9.39.1(jiti@2.5.1)) eslint-plugin-react-hooks: 7.0.1(eslint@9.39.1(jiti@2.5.1)) @@ -25562,7 +26195,7 @@ snapshots: is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.39.1(jiti@2.5.1)))(eslint@9.39.1(jiti@2.5.1)))(eslint@9.39.1(jiti@2.5.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.39.1(jiti@2.5.1)) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node @@ -25840,7 +26473,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.2))(eslint@9.39.1(jiti@2.5.1)))(eslint@9.39.1(jiti@2.5.1)))(eslint@9.39.1(jiti@2.5.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.39.1(jiti@2.5.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -27829,6 +28462,10 @@ snapshots: dependencies: postcss: 8.5.3 + icu-minify@4.11.1: + dependencies: + '@formatjs/icu-messageformat-parser': 3.5.7 + ieee754@1.2.1: {} iferr@0.1.5: {} @@ -27943,6 +28580,11 @@ snapshots: '@formatjs/icu-messageformat-parser': 2.11.1 tslib: 2.8.0 + intl-messageformat@11.2.4: + dependencies: + '@formatjs/fast-memoize': 3.1.4 + '@formatjs/icu-messageformat-parser': 3.5.7 + intl-messageformat@9.13.0: dependencies: '@formatjs/ecma402-abstract': 1.11.4 @@ -30931,7 +31573,7 @@ snapshots: dependencies: type-fest: 2.19.0 - next-auth@4.24.11(next@16.0.1(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + next-auth@4.24.11(next@16.0.1(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: '@babel/runtime': 7.24.7 '@panva/hkdf': 1.2.0 @@ -30946,6 +31588,25 @@ snapshots: react-dom: 19.2.0(react@19.2.0) uuid: 8.3.2 + next-intl-swc-plugin-extractor@4.11.1: {} + + next-intl@4.11.1(next@15.5.4(@playwright/test@1.55.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(typescript@5.8.2): + dependencies: + '@formatjs/intl-localematcher': 0.8.6 + '@parcel/watcher': 2.5.6 + '@swc/core': 1.15.33 + icu-minify: 4.11.1 + negotiator: 1.0.0 + next: 15.5.4(@playwright/test@1.55.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next-intl-swc-plugin-extractor: 4.11.1 + po-parser: 2.1.1 + react: 19.1.0 + use-intl: 4.11.1(react@19.1.0) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - '@swc/helpers' + next-sitemap@4.2.3(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): dependencies: '@corex/deepmerge': 4.0.43 @@ -31180,6 +31841,8 @@ snapshots: node-abort-controller@3.1.1: {} + node-addon-api@7.1.1: {} + node-dir@0.1.17: dependencies: minimatch: 3.1.2 @@ -31974,6 +32637,8 @@ snapshots: picomatch@4.0.2: {} + picomatch@4.0.4: {} + pidtree@0.6.0: {} pify@2.3.0: {} @@ -32048,6 +32713,8 @@ snapshots: transitivePeerDependencies: - typescript + po-parser@2.1.1: {} + points-on-curve@0.2.0: {} points-on-path@0.2.1: @@ -32792,6 +33459,14 @@ snapshots: react-refresh@0.4.3: {} + react-remove-scroll-bar@2.3.8(@types/react@19.2.2)(react@19.1.0): + dependencies: + react: 19.1.0 + react-style-singleton: 2.2.3(@types/react@19.2.2)(react@19.1.0) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.2 + react-remove-scroll-bar@2.3.8(@types/react@19.2.2)(react@19.2.0): dependencies: react: 19.2.0 @@ -32800,6 +33475,17 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 + react-remove-scroll@2.6.3(@types/react@19.2.2)(react@19.1.0): + dependencies: + react: 19.1.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.2)(react@19.1.0) + react-style-singleton: 2.2.3(@types/react@19.2.2)(react@19.1.0) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.2.2)(react@19.1.0) + use-sidecar: 1.1.3(@types/react@19.2.2)(react@19.1.0) + optionalDependencies: + '@types/react': 19.2.2 + react-remove-scroll@2.6.3(@types/react@19.2.2)(react@19.2.0): dependencies: react: 19.2.0 @@ -32829,6 +33515,14 @@ snapshots: react: 18.1.0 react-is: 18.3.1 + react-style-singleton@2.2.3(@types/react@19.2.2)(react@19.1.0): + dependencies: + get-nonce: 1.0.1 + react: 19.1.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.2 + react-style-singleton@2.2.3(@types/react@19.2.2)(react@19.2.0): dependencies: get-nonce: 1.0.1 @@ -34654,6 +35348,16 @@ snapshots: optionalDependencies: esbuild: 0.25.1 + terser-webpack-plugin@5.3.14(webpack@5.98.0): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 4.3.0 + serialize-javascript: 6.0.2 + terser: 5.39.0 + webpack: 5.98.0 + optional: true + terser@4.8.1: dependencies: acorn: 8.14.1 @@ -35333,6 +36037,13 @@ snapshots: punycode: 1.4.1 qs: 6.13.0 + use-callback-ref@1.3.3(@types/react@19.2.2)(react@19.1.0): + dependencies: + react: 19.1.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.2 + use-callback-ref@1.3.3(@types/react@19.2.2)(react@19.2.0): dependencies: react: 19.2.0 @@ -35352,6 +36063,22 @@ snapshots: intl-messageformat: 10.7.15 react: 18.3.1 + use-intl@4.11.1(react@19.1.0): + dependencies: + '@formatjs/fast-memoize': 3.1.4 + '@schummar/icu-type-parser': 1.21.5 + icu-minify: 4.11.1 + intl-messageformat: 11.2.4 + react: 19.1.0 + + use-sidecar@1.1.3(@types/react@19.2.2)(react@19.1.0): + dependencies: + detect-node-es: 1.1.0 + react: 19.1.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.2 + use-sidecar@1.1.3(@types/react@19.2.2)(react@19.2.0): dependencies: detect-node-es: 1.1.0 @@ -35945,6 +36672,37 @@ snapshots: transitivePeerDependencies: - supports-color + webpack@5.98.0: + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.6 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.14.1 + browserslist: 4.24.4 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.1 + es-module-lexer: 1.6.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.14(webpack@5.98.0) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + optional: true + webpack@5.98.0(@swc/core@1.15.1): dependencies: '@types/eslint-scope': 3.7.7 From 5a9c8be1dedf4d0a86a6ad672dd53728b0184e31 Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Fri, 8 May 2026 11:39:12 +0100 Subject: [PATCH 11/55] feat(playground): configure @next/mdx and Code Hike plugins --- playground/next.config.ts | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/playground/next.config.ts b/playground/next.config.ts index e9ffa3083..95a49c524 100644 --- a/playground/next.config.ts +++ b/playground/next.config.ts @@ -1,7 +1,27 @@ -import type { NextConfig } from "next"; +import type { NextConfig } from 'next'; +import createMDX from '@next/mdx'; +import { remarkCodeHike, recmaCodeHike, type CodeHikeConfig } from 'codehike/mdx'; +// NOTE: import kept for when withNextIntl is re-enabled in a later task. +import createNextIntlPlugin from 'next-intl/plugin'; + +const chConfig: CodeHikeConfig = { + components: { code: 'Code' }, +}; + +const withMDX = createMDX({ + extension: /\.mdx?$/, + options: { + remarkPlugins: [[remarkCodeHike, chConfig]], + recmaPlugins: [[recmaCodeHike, chConfig]], + jsx: true, + }, +}); + +// NOTE: withNextIntl is commented out until src/i18n/request.ts is created in a later task. +// const withNextIntl = createNextIntlPlugin('./src/i18n/request.ts'); const nextConfig: NextConfig = { - /* config options here */ + pageExtensions: ['ts', 'tsx', 'mdx'], }; -export default nextConfig; +export default withMDX(nextConfig); From 568670329a09219ee3ab49cddb77d3926fae74a8 Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Fri, 8 May 2026 11:44:53 +0100 Subject: [PATCH 12/55] feat(playground): wire MDX components map with stub --- playground/mdx-components.tsx | 6 ++++++ playground/next.config.ts | 9 ++++++--- playground/src/components/code/code.tsx | 5 +++++ 3 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 playground/mdx-components.tsx create mode 100644 playground/src/components/code/code.tsx diff --git a/playground/mdx-components.tsx b/playground/mdx-components.tsx new file mode 100644 index 000000000..49eea7a75 --- /dev/null +++ b/playground/mdx-components.tsx @@ -0,0 +1,6 @@ +import type { MDXComponents } from 'mdx/types'; +import { Code } from '@/components/code/code'; + +export function useMDXComponents(components: MDXComponents): MDXComponents { + return { Code, ...components }; +} diff --git a/playground/next.config.ts b/playground/next.config.ts index 95a49c524..913edf34c 100644 --- a/playground/next.config.ts +++ b/playground/next.config.ts @@ -11,8 +11,10 @@ const chConfig: CodeHikeConfig = { const withMDX = createMDX({ extension: /\.mdx?$/, options: { - remarkPlugins: [[remarkCodeHike, chConfig]], - recmaPlugins: [[recmaCodeHike, chConfig]], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + remarkPlugins: [[remarkCodeHike as any, chConfig]], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + recmaPlugins: [[recmaCodeHike as any, chConfig]], jsx: true, }, }); @@ -24,4 +26,5 @@ const nextConfig: NextConfig = { pageExtensions: ['ts', 'tsx', 'mdx'], }; -export default withMDX(nextConfig); +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export default withMDX(nextConfig as any); diff --git a/playground/src/components/code/code.tsx b/playground/src/components/code/code.tsx new file mode 100644 index 000000000..80f07626f --- /dev/null +++ b/playground/src/components/code/code.tsx @@ -0,0 +1,5 @@ +import type { RawCode } from 'codehike/code'; + +export function Code({ codeblock }: { codeblock: RawCode }) { + return
{codeblock.value}
; +} From 337adbc4fa73576a7e05b71f2ea9b8400ece78f2 Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Fri, 8 May 2026 11:59:55 +0100 Subject: [PATCH 13/55] feat(playground): set up next-intl routing and message catalogs --- playground/messages/de.json | 21 +++++++++++++++++++++ playground/messages/en.json | 21 +++++++++++++++++++++ playground/next.config.ts | 6 ++---- playground/src/i18n/navigation.ts | 5 +++++ playground/src/i18n/request.ts | 15 +++++++++++++++ playground/src/i18n/routing.ts | 6 ++++++ playground/src/middleware.ts | 8 ++++++++ 7 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 playground/messages/de.json create mode 100644 playground/messages/en.json create mode 100644 playground/src/i18n/navigation.ts create mode 100644 playground/src/i18n/request.ts create mode 100644 playground/src/i18n/routing.ts create mode 100644 playground/src/middleware.ts diff --git a/playground/messages/de.json b/playground/messages/de.json new file mode 100644 index 000000000..120c34623 --- /dev/null +++ b/playground/messages/de.json @@ -0,0 +1,21 @@ +{ + "Layout": { + "title": "next-intl Playground", + "tagline": "Übersetzungen, Formatierung, Routing und Patterns mit Next.js." + }, + "Nav": { + "translations": "Übersetzungen", + "serverComponents": "Server-Komponenten", + "clientComponents": "Client-Komponenten" + }, + "ServerDemo": { + "title": "Server-Komponenten", + "greeting": "Hallo, Welt!" + }, + "ClientDemo": { + "title": "Client-Komponenten", + "label": "Dein Name", + "placeholder": "Frodo", + "greeting": "Hallo, {name}!" + } +} diff --git a/playground/messages/en.json b/playground/messages/en.json new file mode 100644 index 000000000..94d21b99d --- /dev/null +++ b/playground/messages/en.json @@ -0,0 +1,21 @@ +{ + "Layout": { + "title": "next-intl Playground", + "tagline": "Translations, formatting, routing, and patterns with Next.js." + }, + "Nav": { + "translations": "Translations", + "serverComponents": "Server components", + "clientComponents": "Client components" + }, + "ServerDemo": { + "title": "Server Components", + "greeting": "Hello, world!" + }, + "ClientDemo": { + "title": "Client Components", + "label": "Your name", + "placeholder": "Frodo", + "greeting": "Hello, {name}!" + } +} diff --git a/playground/next.config.ts b/playground/next.config.ts index 913edf34c..8f9a5c733 100644 --- a/playground/next.config.ts +++ b/playground/next.config.ts @@ -1,7 +1,6 @@ import type { NextConfig } from 'next'; import createMDX from '@next/mdx'; import { remarkCodeHike, recmaCodeHike, type CodeHikeConfig } from 'codehike/mdx'; -// NOTE: import kept for when withNextIntl is re-enabled in a later task. import createNextIntlPlugin from 'next-intl/plugin'; const chConfig: CodeHikeConfig = { @@ -19,12 +18,11 @@ const withMDX = createMDX({ }, }); -// NOTE: withNextIntl is commented out until src/i18n/request.ts is created in a later task. -// const withNextIntl = createNextIntlPlugin('./src/i18n/request.ts'); +const withNextIntl = createNextIntlPlugin('./src/i18n/request.ts'); const nextConfig: NextConfig = { pageExtensions: ['ts', 'tsx', 'mdx'], }; // eslint-disable-next-line @typescript-eslint/no-explicit-any -export default withMDX(nextConfig as any); +export default withNextIntl(withMDX(nextConfig as any) as any); diff --git a/playground/src/i18n/navigation.ts b/playground/src/i18n/navigation.ts new file mode 100644 index 000000000..90e06544c --- /dev/null +++ b/playground/src/i18n/navigation.ts @@ -0,0 +1,5 @@ +import { createNavigation } from 'next-intl/navigation'; +import { routing } from './routing'; + +export const { Link, redirect, usePathname, useRouter, getPathname } = + createNavigation(routing); diff --git a/playground/src/i18n/request.ts b/playground/src/i18n/request.ts new file mode 100644 index 000000000..380268dba --- /dev/null +++ b/playground/src/i18n/request.ts @@ -0,0 +1,15 @@ +import { getRequestConfig } from 'next-intl/server'; +import { hasLocale } from 'next-intl'; +import { routing } from './routing'; + +export default getRequestConfig(async ({ requestLocale }) => { + const requested = await requestLocale; + const locale = hasLocale(routing.locales, requested) + ? requested + : routing.defaultLocale; + + return { + locale, + messages: (await import(`../../messages/${locale}.json`)).default, + }; +}); diff --git a/playground/src/i18n/routing.ts b/playground/src/i18n/routing.ts new file mode 100644 index 000000000..3ca4612bf --- /dev/null +++ b/playground/src/i18n/routing.ts @@ -0,0 +1,6 @@ +import { defineRouting } from 'next-intl/routing'; + +export const routing = defineRouting({ + locales: ['en', 'de'], + defaultLocale: 'en', +}); diff --git a/playground/src/middleware.ts b/playground/src/middleware.ts new file mode 100644 index 000000000..14e2b3ce7 --- /dev/null +++ b/playground/src/middleware.ts @@ -0,0 +1,8 @@ +import createMiddleware from 'next-intl/middleware'; +import { routing } from './i18n/routing'; + +export default createMiddleware(routing); + +export const config = { + matcher: ['/((?!api|_next|.*\\..*).*)'], +}; From ea3b26fdee6658c5aeee43524a8b5193d5283677 Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Fri, 8 May 2026 12:06:51 +0100 Subject: [PATCH 14/55] refactor(playground): move app routes under [locale] segment --- playground/src/app/[locale]/layout.tsx | 57 +++++++++++++++++++ playground/src/app/{ => [locale]}/page.tsx | 6 +- .../translations/client-components/README.md | 0 .../client-components/client-example.tsx | 0 .../translations/client-components/page.tsx | 0 .../translations/server-components/README.md | 0 .../translations/server-components/page.tsx | 0 .../server-components/server-example.tsx | 0 playground/src/app/layout.tsx | 41 +------------ .../client-components/[locale]/page.tsx | 0 .../server-components/[locale]/page.tsx | 0 11 files changed, 63 insertions(+), 41 deletions(-) create mode 100644 playground/src/app/[locale]/layout.tsx rename playground/src/app/{ => [locale]}/page.tsx (90%) rename playground/src/app/{ => [locale]}/translations/client-components/README.md (100%) rename playground/src/app/{ => [locale]}/translations/client-components/client-example.tsx (100%) rename playground/src/app/{ => [locale]}/translations/client-components/page.tsx (100%) rename playground/src/app/{ => [locale]}/translations/server-components/README.md (100%) rename playground/src/app/{ => [locale]}/translations/server-components/page.tsx (100%) rename playground/src/app/{ => [locale]}/translations/server-components/server-example.tsx (100%) delete mode 100644 playground/src/app/translations/client-components/[locale]/page.tsx delete mode 100644 playground/src/app/translations/server-components/[locale]/page.tsx diff --git a/playground/src/app/[locale]/layout.tsx b/playground/src/app/[locale]/layout.tsx new file mode 100644 index 000000000..d07c4413c --- /dev/null +++ b/playground/src/app/[locale]/layout.tsx @@ -0,0 +1,57 @@ +import type { Metadata } from 'next'; +import { Geist, Geist_Mono } from 'next/font/google'; +import { NextIntlClientProvider, hasLocale } from 'next-intl'; +import { setRequestLocale, getMessages } from 'next-intl/server'; +import { notFound } from 'next/navigation'; +import { routing } from '@/i18n/routing'; +import { ClientProviders } from '@/components/playground/client-providers'; +import { PlaygroundSidebar } from '@/components/playground/sidebar'; +import { PlaygroundByline } from '@/components/playground/byline'; +import '../globals.css'; + +const geistSans = Geist({ variable: '--font-geist-sans', subsets: ['latin'] }); +const geistMono = Geist_Mono({ variable: '--font-geist-mono', subsets: ['latin'] }); + +export const metadata: Metadata = { + title: 'next-intl Playground', + description: + 'Explore translations, formatting, routing, and patterns with next-intl.', +}; + +export function generateStaticParams() { + return routing.locales.map((locale) => ({ locale })); +} + +export default async function LocaleLayout({ + children, + params, +}: { + children: React.ReactNode; + params: Promise<{ locale: string }>; +}) { + const { locale } = await params; + if (!hasLocale(routing.locales, locale)) notFound(); + + setRequestLocale(locale); + const messages = await getMessages(); + + return ( + + + + + +
+
+ {children} + +
+
+
+
+ + + ); +} diff --git a/playground/src/app/page.tsx b/playground/src/app/[locale]/page.tsx similarity index 90% rename from playground/src/app/page.tsx rename to playground/src/app/[locale]/page.tsx index d07f2b626..48b13d006 100644 --- a/playground/src/app/page.tsx +++ b/playground/src/app/[locale]/page.tsx @@ -1,7 +1,7 @@ import Link from "next/link"; -import { PlaygroundBoundary } from "./_components/playground-boundary"; -import { sections } from "./assets/navigations"; -import { LinkStatus } from "./_components/link-status"; +import { PlaygroundBoundary } from "@/components/playground/boundary"; +import { sections } from "@/lib/nav"; +import { LinkStatus } from "@/components/playground/link-status"; export default function Home() { return ( diff --git a/playground/src/app/translations/client-components/README.md b/playground/src/app/[locale]/translations/client-components/README.md similarity index 100% rename from playground/src/app/translations/client-components/README.md rename to playground/src/app/[locale]/translations/client-components/README.md diff --git a/playground/src/app/translations/client-components/client-example.tsx b/playground/src/app/[locale]/translations/client-components/client-example.tsx similarity index 100% rename from playground/src/app/translations/client-components/client-example.tsx rename to playground/src/app/[locale]/translations/client-components/client-example.tsx diff --git a/playground/src/app/translations/client-components/page.tsx b/playground/src/app/[locale]/translations/client-components/page.tsx similarity index 100% rename from playground/src/app/translations/client-components/page.tsx rename to playground/src/app/[locale]/translations/client-components/page.tsx diff --git a/playground/src/app/translations/server-components/README.md b/playground/src/app/[locale]/translations/server-components/README.md similarity index 100% rename from playground/src/app/translations/server-components/README.md rename to playground/src/app/[locale]/translations/server-components/README.md diff --git a/playground/src/app/translations/server-components/page.tsx b/playground/src/app/[locale]/translations/server-components/page.tsx similarity index 100% rename from playground/src/app/translations/server-components/page.tsx rename to playground/src/app/[locale]/translations/server-components/page.tsx diff --git a/playground/src/app/translations/server-components/server-example.tsx b/playground/src/app/[locale]/translations/server-components/server-example.tsx similarity index 100% rename from playground/src/app/translations/server-components/server-example.tsx rename to playground/src/app/[locale]/translations/server-components/server-example.tsx diff --git a/playground/src/app/layout.tsx b/playground/src/app/layout.tsx index 8366493e0..293a20c36 100644 --- a/playground/src/app/layout.tsx +++ b/playground/src/app/layout.tsx @@ -1,40 +1,5 @@ -import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; -import "./globals.css"; -import { PlaygroundSidebar } from "./_components/playground-sidebar"; -import PlaygroundByline from "./_components/playground-byline"; -import { ClientProviders } from "./_components/client-providers"; +import type { ReactNode } from 'react'; -const geistSans = Geist({ - variable: "--font-geist-sans", - subsets: ["latin"], -}); - -const geistMono = Geist_Mono({ - variable: "--font-geist-mono", - subsets: ["latin"], -}); - -export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", -}; - -export default function RootLayout({ children }: { children: React.ReactNode }) { - return ( - - - - -
-
- {children} - -
-
-
- - - ); +export default function RootLayout({ children }: { children: ReactNode }) { + return children; } - diff --git a/playground/src/app/translations/client-components/[locale]/page.tsx b/playground/src/app/translations/client-components/[locale]/page.tsx deleted file mode 100644 index e69de29bb..000000000 diff --git a/playground/src/app/translations/server-components/[locale]/page.tsx b/playground/src/app/translations/server-components/[locale]/page.tsx deleted file mode 100644 index e69de29bb..000000000 From 7e0a9eb874903b3233e32e0894ae130bf599297a Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Fri, 8 May 2026 12:08:17 +0100 Subject: [PATCH 15/55] refactor(playground): move chrome components to src/components/playground --- .../translations/client-components/page.tsx | 68 ++++++------------- .../translations/server-components/page.tsx | 68 ++++++------------- .../src/app/_components/demo-content.tsx | 51 -------------- playground/src/{app => }/assets/logo.tsx | 0 .../playground/boundary.tsx} | 0 .../playground/byline.tsx} | 5 +- .../playground}/client-providers.tsx | 0 .../playground}/github-link.tsx | 0 .../playground}/link-status.tsx | 0 .../playground/sidebar.tsx} | 4 +- .../playground}/theme-toggle.tsx | 0 .../{app/assets/navigations.ts => lib/nav.ts} | 0 12 files changed, 44 insertions(+), 152 deletions(-) delete mode 100644 playground/src/app/_components/demo-content.tsx rename playground/src/{app => }/assets/logo.tsx (100%) rename playground/src/{app/_components/playground-boundary.tsx => components/playground/boundary.tsx} (100%) rename playground/src/{app/_components/playground-byline.tsx => components/playground/byline.tsx} (89%) rename playground/src/{app/_components => components/playground}/client-providers.tsx (100%) rename playground/src/{app/_components => components/playground}/github-link.tsx (100%) rename playground/src/{app/_components => components/playground}/link-status.tsx (100%) rename playground/src/{app/_components/playground-sidebar.tsx => components/playground/sidebar.tsx} (97%) rename playground/src/{app/_components => components/playground}/theme-toggle.tsx (100%) rename playground/src/{app/assets/navigations.ts => lib/nav.ts} (100%) diff --git a/playground/src/app/[locale]/translations/client-components/page.tsx b/playground/src/app/[locale]/translations/client-components/page.tsx index c61b46fe3..640deb99b 100644 --- a/playground/src/app/[locale]/translations/client-components/page.tsx +++ b/playground/src/app/[locale]/translations/client-components/page.tsx @@ -1,6 +1,6 @@ -import { DemoContent, Example } from "@/app/_components/demo-content"; -import { GitHubLink } from "@/app/_components/github-link"; -import { PlaygroundBoundary } from "@/app/_components/playground-boundary"; +// TODO (Phase D): replace with MDX-based content +import { GitHubLink } from "@/components/playground/github-link"; +import { PlaygroundBoundary } from "@/components/playground/boundary"; import { ClientExample } from "./client-example"; export const metadata = { @@ -12,55 +12,27 @@ export default function ClientComponentsPage() { return (
- -
-

- Client Components run in the browser and can use interactive - features like hooks. With next-intl, you can use the{" "} - - useTranslations() - {" "} - hook to access translated strings in your interactive components. -

- -
-

When to use:

-
    -
  • Components with interactivity (buttons, forms, etc.)
  • -
  • Components using React hooks (useState, useEffect, etc.)
  • -
  • Event handlers and user interactions
  • -
  • Real-time updates and dynamic content
  • -
-
- -
-

Usage example:

- - {`'use client';\n\nimport { useTranslations } from 'next-intl';\n\nexport default function Button() {\n const t = useTranslations();\n \n return ;\n}`} - -
+
+

Client Components

+

+ Client Components run in the browser and can use interactive + features like hooks. With next-intl, you can use the{" "} + + useTranslations() + {" "} + hook to access translated strings in your interactive components. +

+
-

- Learn more in the{" "} - - next-intl documentation - - . -

+
+

Live Example

+
+
- - - - - +
- +
diff --git a/playground/src/app/[locale]/translations/server-components/page.tsx b/playground/src/app/[locale]/translations/server-components/page.tsx index b9982d925..1b73c2dde 100644 --- a/playground/src/app/[locale]/translations/server-components/page.tsx +++ b/playground/src/app/[locale]/translations/server-components/page.tsx @@ -1,6 +1,6 @@ -import { DemoContent, Example } from "@/app/_components/demo-content"; -import { GitHubLink } from "@/app/_components/github-link"; -import { PlaygroundBoundary } from "@/app/_components/playground-boundary"; +// TODO (Phase D): replace with MDX-based content +import { GitHubLink } from "@/components/playground/github-link"; +import { PlaygroundBoundary } from "@/components/playground/boundary"; import { ServerExample } from "./server-example"; export const metadata = { @@ -12,55 +12,27 @@ export default function ServerComponentsPage() { return (
- -
-

- Server Components are components that render exclusively on the - server. With next-intl, you can seamlessly use the{" "} - - useTranslations() - {" "} - hook to access translated strings. -

- -
-

Benefits:

-
    -
  • Messages are only sent to the server, reducing bundle size
  • -
  • No client-side hydration overhead
  • -
  • Better performance and faster page loads
  • -
  • Ideal for static content and page layouts
  • -
-
- -
-

Usage example:

- - {`import { useTranslations } from 'next-intl';\n\nexport default function Page() {\n const t = useTranslations();\n return

{t('welcome.title')}

;\n}`} -
-
+
+

Server Components

+

+ Server Components are components that render exclusively on the + server. With next-intl, you can seamlessly use the{" "} + + useTranslations() + {" "} + hook to access translated strings. +

+
-

- Learn more in the{" "} - - next-intl documentation - - . -

+
+

Live Example

+
+
- - - - - +
- +
diff --git a/playground/src/app/_components/demo-content.tsx b/playground/src/app/_components/demo-content.tsx deleted file mode 100644 index 73acde7e8..000000000 --- a/playground/src/app/_components/demo-content.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { ReactNode } from "react"; - -export function DemoContent({ - title, - children, -}: { - title: string; - children: ReactNode; -}) { - return ( -
-

{title}

-
- {children} -
-
- ); -} - -export function CodeBlock({ - children, - language = "tsx", -}: { - children: string; - language?: string; -}) { - return ( -
-      
-        {children}
-      
-    
- ); -} - -export function Example({ - title, - children, -}: { - title: string; - children: ReactNode; -}) { - return ( -
-

{title}

-
- {children} -
-
- ); -} diff --git a/playground/src/app/assets/logo.tsx b/playground/src/assets/logo.tsx similarity index 100% rename from playground/src/app/assets/logo.tsx rename to playground/src/assets/logo.tsx diff --git a/playground/src/app/_components/playground-boundary.tsx b/playground/src/components/playground/boundary.tsx similarity index 100% rename from playground/src/app/_components/playground-boundary.tsx rename to playground/src/components/playground/boundary.tsx diff --git a/playground/src/app/_components/playground-byline.tsx b/playground/src/components/playground/byline.tsx similarity index 89% rename from playground/src/app/_components/playground-byline.tsx rename to playground/src/components/playground/byline.tsx index c7383c877..c26741502 100644 --- a/playground/src/app/_components/playground-byline.tsx +++ b/playground/src/components/playground/byline.tsx @@ -1,7 +1,6 @@ -import { PlaygroundBoundary } from "./playground-boundary"; +import { PlaygroundBoundary } from "./boundary"; - -export default function PlaygroundByline() { +export function PlaygroundByline() { return (
diff --git a/playground/src/app/_components/client-providers.tsx b/playground/src/components/playground/client-providers.tsx similarity index 100% rename from playground/src/app/_components/client-providers.tsx rename to playground/src/components/playground/client-providers.tsx diff --git a/playground/src/app/_components/github-link.tsx b/playground/src/components/playground/github-link.tsx similarity index 100% rename from playground/src/app/_components/github-link.tsx rename to playground/src/components/playground/github-link.tsx diff --git a/playground/src/app/_components/link-status.tsx b/playground/src/components/playground/link-status.tsx similarity index 100% rename from playground/src/app/_components/link-status.tsx rename to playground/src/components/playground/link-status.tsx diff --git a/playground/src/app/_components/playground-sidebar.tsx b/playground/src/components/playground/sidebar.tsx similarity index 97% rename from playground/src/app/_components/playground-sidebar.tsx rename to playground/src/components/playground/sidebar.tsx index e6bca74f3..921f4b747 100644 --- a/playground/src/app/_components/playground-sidebar.tsx +++ b/playground/src/components/playground/sidebar.tsx @@ -9,8 +9,8 @@ import { ScrollArea } from "@/components/ui/scroll-area"; import { Button } from "@/components/ui/button"; import { ThemeToggle } from "./theme-toggle"; import { LinkStatus } from "./link-status"; -import { Logo } from "../assets/logo"; -import { sections } from "../assets/navigations"; +import { Logo } from "@/assets/logo"; +import { sections } from "@/lib/nav"; export function PlaygroundSidebar() { const [isOpen, setIsOpen] = useState(false); diff --git a/playground/src/app/_components/theme-toggle.tsx b/playground/src/components/playground/theme-toggle.tsx similarity index 100% rename from playground/src/app/_components/theme-toggle.tsx rename to playground/src/components/playground/theme-toggle.tsx diff --git a/playground/src/app/assets/navigations.ts b/playground/src/lib/nav.ts similarity index 100% rename from playground/src/app/assets/navigations.ts rename to playground/src/lib/nav.ts From b7f2a9aa41cb4757183c5fb8aa5332665c7d7100 Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Fri, 8 May 2026 12:09:18 +0100 Subject: [PATCH 16/55] refactor(playground): keep client providers as a pure theme wrapper --- .../components/playground/client-providers.tsx | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/playground/src/components/playground/client-providers.tsx b/playground/src/components/playground/client-providers.tsx index 87863386e..9982e2135 100644 --- a/playground/src/components/playground/client-providers.tsx +++ b/playground/src/components/playground/client-providers.tsx @@ -1,17 +1,12 @@ -"use client"; +'use client'; -import { ThemeProvider } from "next-themes"; -import React from "react"; +import { ThemeProvider } from 'next-themes'; +import type { ReactNode } from 'react'; -export const ClientProviders = ({ children }: { children: React.ReactNode }) => { +export function ClientProviders({ children }: { children: ReactNode }) { return ( - + {children} ); -}; +} From f44bb0cb8667d1541dd05fbaa028a3ad8c284c13 Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Fri, 8 May 2026 12:21:04 +0100 Subject: [PATCH 17/55] chore(playground): drop turbopack flag (incompatible with @next/mdx + Code Hike) --- playground/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/playground/package.json b/playground/package.json index 7c8807dbb..52a28353f 100644 --- a/playground/package.json +++ b/playground/package.json @@ -3,8 +3,8 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev --turbopack", - "build": "next build --turbopack", + "dev": "next dev", + "build": "next build", "start": "next start", "lint": "eslint" }, From 3de41220073c7abed0f445ec3548168b98cbbcb2 Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Fri, 8 May 2026 12:22:24 +0100 Subject: [PATCH 18/55] feat(playground): scaffold filename header --- playground/src/components/code/annotations/filename.tsx | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 playground/src/components/code/annotations/filename.tsx diff --git a/playground/src/components/code/annotations/filename.tsx b/playground/src/components/code/annotations/filename.tsx new file mode 100644 index 000000000..38f768baa --- /dev/null +++ b/playground/src/components/code/annotations/filename.tsx @@ -0,0 +1,3 @@ +// Filename is rendered as a header strip in code.tsx using codeblock.meta. +// This file exists only as a placeholder so importers stay consistent. +export {}; From fa5c90b8955ff595005af57e57bf774793db61cd Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Fri, 8 May 2026 12:30:04 +0100 Subject: [PATCH 19/55] feat(playground): add mark annotation handler --- .../src/components/code/annotations/mark.tsx | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 playground/src/components/code/annotations/mark.tsx diff --git a/playground/src/components/code/annotations/mark.tsx b/playground/src/components/code/annotations/mark.tsx new file mode 100644 index 000000000..3afe1aabc --- /dev/null +++ b/playground/src/components/code/annotations/mark.tsx @@ -0,0 +1,35 @@ +import type { AnnotationHandler } from 'codehike/code'; +import { InnerLine } from 'codehike/code'; + +export const mark: AnnotationHandler = { + name: 'mark', + Line: ({ annotation, ...props }) => { + const color = annotation?.query || 'rgb(14 165 233)'; + return ( +
+ +
+ ); + }, + Inline: ({ annotation, children }) => { + const color = annotation?.query || 'rgb(14 165 233)'; + return ( + + {children} + + ); + }, +}; From c997228768e3e234f949e8147f9ce6695f7e8492 Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Fri, 8 May 2026 12:30:58 +0100 Subject: [PATCH 20/55] feat(playground): add callout annotation handler --- .../components/code/annotations/callout.tsx | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 playground/src/components/code/annotations/callout.tsx diff --git a/playground/src/components/code/annotations/callout.tsx b/playground/src/components/code/annotations/callout.tsx new file mode 100644 index 000000000..155478949 --- /dev/null +++ b/playground/src/components/code/annotations/callout.tsx @@ -0,0 +1,33 @@ +import type { AnnotationHandler, InlineAnnotation } from 'codehike/code'; + +export const callout: AnnotationHandler = { + name: 'callout', + transform: (annotation: InlineAnnotation) => { + const { name, query, lineNumber, fromColumn, toColumn, data } = annotation; + return { + name, + query, + fromLineNumber: lineNumber, + toLineNumber: lineNumber, + data: { ...data, column: (fromColumn + toColumn) / 2 }, + }; + }, + Block: ({ annotation, children }) => { + const { column } = annotation.data as { column: number }; + return ( + <> + {children} +
+
+ {annotation.query} +
+ + ); + }, +}; From d2da339c6745ca7247a1a80f99fed2256c29a433 Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Fri, 8 May 2026 12:32:53 +0100 Subject: [PATCH 21/55] feat(playground): add focus annotation handler --- .../code/annotations/focus.client.tsx | 36 +++++++++++++++++++ .../src/components/code/annotations/focus.tsx | 18 ++++++++++ 2 files changed, 54 insertions(+) create mode 100644 playground/src/components/code/annotations/focus.client.tsx create mode 100644 playground/src/components/code/annotations/focus.tsx diff --git a/playground/src/components/code/annotations/focus.client.tsx b/playground/src/components/code/annotations/focus.client.tsx new file mode 100644 index 000000000..a133a065b --- /dev/null +++ b/playground/src/components/code/annotations/focus.client.tsx @@ -0,0 +1,36 @@ +'use client'; + +import React, { useLayoutEffect, useRef } from 'react'; +import type { AnnotationHandler } from 'codehike/code'; +import { InnerPre, getPreRef } from 'codehike/code'; + +export const PreWithFocus: AnnotationHandler['PreWithRef'] = (props) => { + const ref = getPreRef(props); + useScrollToFocus(ref); + return ; +}; + +function useScrollToFocus(ref: React.RefObject) { + const firstRender = useRef(true); + useLayoutEffect(() => { + if (!ref.current) return; + const focused = ref.current.querySelectorAll( + '[data-focus=true]', + ); + const containerRect = ref.current.getBoundingClientRect(); + let top = Infinity; + let bottom = -Infinity; + focused.forEach((el) => { + const rect = el.getBoundingClientRect(); + top = Math.min(top, rect.top - containerRect.top); + bottom = Math.max(bottom, rect.bottom - containerRect.top); + }); + if (bottom > containerRect.height || top < 0) { + ref.current.scrollTo({ + top: ref.current.scrollTop + top - 10, + behavior: firstRender.current ? 'instant' : 'smooth', + }); + } + firstRender.current = false; + }, [ref]); +} diff --git a/playground/src/components/code/annotations/focus.tsx b/playground/src/components/code/annotations/focus.tsx new file mode 100644 index 000000000..8d6449190 --- /dev/null +++ b/playground/src/components/code/annotations/focus.tsx @@ -0,0 +1,18 @@ +import type { AnnotationHandler } from 'codehike/code'; +import { InnerLine } from 'codehike/code'; +import { PreWithFocus } from './focus.client'; + +export const focus: AnnotationHandler = { + name: 'focus', + onlyIfAnnotated: true, + PreWithRef: PreWithFocus, + Line: (props) => ( + + ), + AnnotatedLine: ({ annotation, ...props }) => ( + + ), +}; From 91d9da5b03c1970c19f6ef71fdf0610745639d79 Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Fri, 8 May 2026 12:45:31 +0100 Subject: [PATCH 22/55] feat(playground): add link annotation handler --- .../src/components/code/annotations/link.tsx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 playground/src/components/code/annotations/link.tsx diff --git a/playground/src/components/code/annotations/link.tsx b/playground/src/components/code/annotations/link.tsx new file mode 100644 index 000000000..07a2dcb05 --- /dev/null +++ b/playground/src/components/code/annotations/link.tsx @@ -0,0 +1,15 @@ +import type { AnnotationHandler } from 'codehike/code'; + +export const link: AnnotationHandler = { + name: 'link', + Inline: ({ annotation, children }) => ( + + {children} + + ), +}; From 55730c5612ded569a7191a1d11d413969da0b08d Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Fri, 8 May 2026 12:53:27 +0100 Subject: [PATCH 23/55] feat(playground): add fold annotation handler --- playground/src/components/code/annotations/fold.tsx | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 playground/src/components/code/annotations/fold.tsx diff --git a/playground/src/components/code/annotations/fold.tsx b/playground/src/components/code/annotations/fold.tsx new file mode 100644 index 000000000..a3043c907 --- /dev/null +++ b/playground/src/components/code/annotations/fold.tsx @@ -0,0 +1,8 @@ +import type { AnnotationHandler } from 'codehike/code'; + +export const fold: AnnotationHandler = { + name: 'fold', + Inline: () => ( + + ), +}; From be923e3f8eff1d7f507f0d8c0282b4cbc9b909a8 Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Fri, 8 May 2026 12:53:42 +0100 Subject: [PATCH 24/55] feat(playground): add line-numbers annotation handler --- .../code/annotations/line-numbers.tsx | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 playground/src/components/code/annotations/line-numbers.tsx diff --git a/playground/src/components/code/annotations/line-numbers.tsx b/playground/src/components/code/annotations/line-numbers.tsx new file mode 100644 index 000000000..f7b276830 --- /dev/null +++ b/playground/src/components/code/annotations/line-numbers.tsx @@ -0,0 +1,21 @@ +import type { AnnotationHandler } from 'codehike/code'; +import { InnerLine } from 'codehike/code'; + +export const lineNumbers: AnnotationHandler = { + name: 'line-numbers', + Line: (props) => { + const { lineNumber, totalLines } = props; + const width = String(totalLines).length; + return ( +
+ + {lineNumber} + + +
+ ); + }, +}; From 4aac59164c0c96241471cabedb4f3abe958d44b0 Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Fri, 8 May 2026 12:53:49 +0100 Subject: [PATCH 25/55] feat(playground): export annotation handlers from barrel --- playground/src/components/code/annotations/index.ts | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 playground/src/components/code/annotations/index.ts diff --git a/playground/src/components/code/annotations/index.ts b/playground/src/components/code/annotations/index.ts new file mode 100644 index 000000000..f2b15f700 --- /dev/null +++ b/playground/src/components/code/annotations/index.ts @@ -0,0 +1,6 @@ +export { mark } from './mark'; +export { callout } from './callout'; +export { focus } from './focus'; +export { link } from './link'; +export { fold } from './fold'; +export { lineNumbers } from './line-numbers'; From 77ee713d67d51f4755dd1d9a34b75c041706b2aa Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Fri, 8 May 2026 12:59:10 +0100 Subject: [PATCH 26/55] feat(playground): wire RSC with Code Hike highlight + theme --- playground/src/app/globals.css | 57 +++++++++++++++++++++++++ playground/src/components/code/code.tsx | 25 +++++++++-- 2 files changed, 79 insertions(+), 3 deletions(-) diff --git a/playground/src/app/globals.css b/playground/src/app/globals.css index 56c22a039..f68e48c7b 100644 --- a/playground/src/app/globals.css +++ b/playground/src/app/globals.css @@ -152,3 +152,60 @@ cursor: pointer; } } + +/* Code Hike — github-from-css theme variables */ +:root { + --ch-0: light; + --ch-1: #6e7781; + --ch-2: #0550ae; + --ch-3: #953800; + --ch-4: #24292f; + --ch-5: #8250df; + --ch-6: #116329; + --ch-7: #cf222e; + --ch-8: #0a3069; + --ch-9: #82071e; + --ch-10: #f6f8fa; + --ch-11: #ffebe9; + --ch-12: #ffd8b5; + --ch-13: #eaeef2; + --ch-14: #57606a; + --ch-15: #ffffff; + --ch-16: #eaeef2; + --ch-17: #fdf2f8; + --ch-18: #1f883d; + --ch-19: #cf222e; + --ch-20: #8250df; + --ch-21: #fff8c5; + --ch-22: #fbf0a4; + --ch-23: #6e7781; + --ch-24: #ffffffe6; +} + +.dark { + --ch-0: dark; + --ch-1: #8b949e; + --ch-2: #79c0ff; + --ch-3: #ffa657; + --ch-4: #c9d1d9; + --ch-5: #d2a8ff; + --ch-6: #7ee787; + --ch-7: #ff7b72; + --ch-8: #a5d6ff; + --ch-9: #ffa198; + --ch-10: #f0f6fc; + --ch-11: #490202; + --ch-12: #5a1e02; + --ch-13: #161b22; + --ch-14: #8b949e; + --ch-15: #0d1117; + --ch-16: #30363d; + --ch-17: #261d2d; + --ch-18: #56d364; + --ch-19: #f85149; + --ch-20: #d2a8ff; + --ch-21: #5a1e02; + --ch-22: #693e00; + --ch-23: #8b949e; + --ch-24: #1f6feb1a; +} diff --git a/playground/src/components/code/code.tsx b/playground/src/components/code/code.tsx index 80f07626f..805059234 100644 --- a/playground/src/components/code/code.tsx +++ b/playground/src/components/code/code.tsx @@ -1,5 +1,24 @@ -import type { RawCode } from 'codehike/code'; +import { Pre, type RawCode, highlight } from 'codehike/code'; +import { mark, callout, focus, link, fold, lineNumbers } from './annotations'; -export function Code({ codeblock }: { codeblock: RawCode }) { - return
{codeblock.value}
; +const handlers = [mark, callout, focus, link, fold, lineNumbers]; + +export async function Code({ codeblock }: { codeblock: RawCode }) { + const highlighted = await highlight(codeblock, 'github-from-css'); + + const filename = codeblock.meta; + return ( +
+ {filename ? ( +
+ {filename} +
+ ) : null} +
+    
+ ); } From 8d90418905219574b9c15bf1fe3eb75982c5a991 Mon Sep 17 00:00:00 2001 From: Adebesin Tolulope Date: Fri, 8 May 2026 13:03:19 +0100 Subject: [PATCH 27/55] refactor(playground): restructure sidebar nav and apply design nits --- .../src/components/playground/sidebar.tsx | 129 +++++++----------- playground/src/lib/nav.ts | 50 +++++-- 2 files changed, 93 insertions(+), 86 deletions(-) diff --git a/playground/src/components/playground/sidebar.tsx b/playground/src/components/playground/sidebar.tsx index 921f4b747..691f87e5b 100644 --- a/playground/src/components/playground/sidebar.tsx +++ b/playground/src/components/playground/sidebar.tsx @@ -1,53 +1,49 @@ -"use client"; +'use client'; -import clsx from "clsx"; -import { Menu, X } from "lucide-react"; -import Link from "next/link"; -import { usePathname } from "next/navigation"; -import { Suspense, useState } from "react"; -import { ScrollArea } from "@/components/ui/scroll-area"; -import { Button } from "@/components/ui/button"; -import { ThemeToggle } from "./theme-toggle"; -import { LinkStatus } from "./link-status"; -import { Logo } from "@/assets/logo"; -import { sections } from "@/lib/nav"; +import clsx from 'clsx'; +import { Menu, X } from 'lucide-react'; +import { useState } from 'react'; +import { useTranslations } from 'next-intl'; +import { Link, usePathname } from '@/i18n/navigation'; +import { ScrollArea } from '@/components/ui/scroll-area'; +import { Button } from '@/components/ui/button'; +import { Logo } from '@/assets/logo'; +import { sections } from '@/lib/nav'; +import { ThemeToggle } from './theme-toggle'; +import { LinkStatus } from './link-status'; +import { LocaleSwitcher } from './locale-switcher'; export function PlaygroundSidebar() { const [isOpen, setIsOpen] = useState(false); const pathname = usePathname(); + const t = useTranslations('Layout'); const close = () => setIsOpen(false); return (
- -

+ +

Playground

-
+
+
@@ -55,31 +51,37 @@ export function PlaygroundSidebar() {