diff --git a/components.json b/components.json new file mode 100644 index 0000000..edcaef2 --- /dev/null +++ b/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/package.json b/package.json index 42fbc1a..3eaeb1f 100644 --- a/package.json +++ b/package.json @@ -21,15 +21,28 @@ "@payloadcms/plugin-multi-tenant": "3.65.0", "@payloadcms/richtext-lexical": "3.65.0", "@payloadcms/ui": "3.65.0", + "@radix-ui/react-checkbox": "^1.3.3", + "@radix-ui/react-label": "^2.1.8", + "@radix-ui/react-radio-group": "^1.3.8", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-separator": "^1.1.8", + "@radix-ui/react-slot": "^1.2.4", + "@tailwindcss/postcss": "^4.1.17", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", "cross-env": "^7.0.3", "dotenv": "^8.2.0", "graphql": "^16.9.0", + "lucide-react": "^0.555.0", "next": "^15.2.3", "payload": "3.65.0", + "postcss": "^8.5.6", "qs-esm": "7.0.2", "react": "19.0.0", "react-dom": "19.0.0", - "sharp": "0.32.6" + "sharp": "0.32.6", + "tailwind-merge": "^3.4.0", + "tailwindcss": "^4.1.17" }, "devDependencies": { "@payloadcms/eslint-config": "^3.28.0", @@ -40,6 +53,7 @@ "eslint": "^8.57.0", "eslint-config-next": "^15.0.0", "tsx": "^4.16.2", + "tw-animate-css": "^1.4.0", "typescript": "5.5.2" }, "engines": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b05fef4..d7308d3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,33 @@ importers: '@payloadcms/ui': specifier: 3.65.0 version: 3.65.0(@types/react@19.0.1)(monaco-editor@0.55.1)(next@15.5.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.65.0(graphql@16.12.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + '@radix-ui/react-checkbox': + specifier: ^1.3.3 + version: 1.3.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-label': + specifier: ^2.1.8 + version: 2.1.8(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-radio-group': + specifier: ^1.3.8 + version: 1.3.8(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-select': + specifier: ^2.2.6 + version: 2.2.6(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-separator': + specifier: ^1.1.8 + version: 1.1.8(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': + specifier: ^1.2.4 + version: 1.2.4(@types/react@19.0.1)(react@19.0.0) + '@tailwindcss/postcss': + specifier: ^4.1.17 + version: 4.1.17 + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -32,12 +59,18 @@ importers: graphql: specifier: ^16.9.0 version: 16.12.0 + lucide-react: + specifier: ^0.555.0 + version: 0.555.0(react@19.0.0) next: specifier: ^15.2.3 version: 15.5.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) payload: specifier: 3.65.0 version: 3.65.0(graphql@16.12.0)(typescript@5.5.2) + postcss: + specifier: ^8.5.6 + version: 8.5.6 qs-esm: specifier: 7.0.2 version: 7.0.2 @@ -50,10 +83,16 @@ importers: sharp: specifier: 0.32.6 version: 0.32.6 + tailwind-merge: + specifier: ^3.4.0 + version: 3.4.0 + tailwindcss: + specifier: ^4.1.17 + version: 4.1.17 devDependencies: '@payloadcms/eslint-config': specifier: ^3.28.0 - version: 3.28.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2))(ts-api-utils@2.1.0(typescript@5.5.2)) + version: 3.28.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.26.1(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2))(jiti@2.6.1)(ts-api-utils@2.1.0(typescript@5.5.2)) '@payloadcms/graphql': specifier: latest version: 3.65.0(graphql@16.12.0)(payload@3.65.0(graphql@16.12.0)(typescript@5.5.2))(typescript@5.5.2) @@ -75,12 +114,19 @@ importers: tsx: specifier: ^4.16.2 version: 4.21.0 + tw-animate-css: + specifier: ^1.4.0 + version: 1.4.0 typescript: specifier: 5.5.2 version: 5.5.2 packages: + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + '@apidevtools/json-schema-ref-parser@11.9.3': resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==} engines: {node: '>= 16'} @@ -951,6 +997,9 @@ packages: '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@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'} @@ -1239,6 +1288,358 @@ packages: '@pinojs/redact@0.4.0': resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} + + '@radix-ui/primitive@1.1.3': + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + + '@radix-ui/react-arrow@1.1.7': + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} + 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-checkbox@1.3.3': + resolution: {integrity: sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==} + 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-collection@1.1.7': + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + 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-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.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.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.11': + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} + 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-focus-guards@1.1.3': + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.7': + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + 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-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-label@2.1.8': + resolution: {integrity: sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==} + 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-popper@1.2.8': + resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} + 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-portal@1.1.9': + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + 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-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.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-primitive@2.1.4': + resolution: {integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==} + 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-radio-group@1.3.8': + resolution: {integrity: sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==} + 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.11': + resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} + 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.2.6': + resolution: {integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==} + 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-separator@1.1.8': + resolution: {integrity: sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==} + 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-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-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.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.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + 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-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + 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-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + 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-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.1': + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} + 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-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + 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-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.2.3': + resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} + 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/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -1323,6 +1724,94 @@ packages: '@swc/types@0.1.25': resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} + '@tailwindcss/node@4.1.17': + resolution: {integrity: sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==} + + '@tailwindcss/oxide-android-arm64@4.1.17': + resolution: {integrity: sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.17': + resolution: {integrity: sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.17': + resolution: {integrity: sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.17': + resolution: {integrity: sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17': + resolution: {integrity: sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.17': + resolution: {integrity: sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.17': + resolution: {integrity: sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.17': + resolution: {integrity: sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.17': + resolution: {integrity: sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.17': + resolution: {integrity: sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==} + 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.17': + resolution: {integrity: sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.17': + resolution: {integrity: sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.17': + resolution: {integrity: sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==} + engines: {node: '>= 10'} + + '@tailwindcss/postcss@4.1.17': + resolution: {integrity: sha512-+nKl9N9mN5uJ+M7dBOOCzINw94MPstNR/GtIhz1fpZysxL/4a+No64jCBD6CPN+bIHWFx3KWuu8XJRrj/572Dw==} + '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -1643,6 +2132,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -1846,6 +2339,9 @@ packages: resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} engines: {node: '>=8'} + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} @@ -2004,6 +2500,9 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -2588,6 +3087,10 @@ packages: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -2889,6 +3392,10 @@ packages: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + jose@5.9.6: resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} @@ -2978,6 +3485,76 @@ packages: cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] + lightningcss-android-arm64@1.30.2: + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.30.2: + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.2: + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.2: + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.2: + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.2: + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.2: + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.2: + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.2: + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.2: + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.2: + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.2: + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + engines: {node: '>= 12.0.0'} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -2998,6 +3575,14 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + lucide-react@0.555.0: + resolution: {integrity: sha512-D8FvHUGbxWBRQM90NZeIyhAvkFfsh3u9ekrMvJ30Z6gnpBHS6HC6ldLg7tL45hwiIz/u66eKDtdA23gwwGsAHA==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + marked@14.0.0: resolution: {integrity: sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==} engines: {node: '>= 18'} @@ -3375,6 +3960,10 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} @@ -3492,12 +4081,42 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + react-select@5.9.0: resolution: {integrity: sha512-nwRKGanVHGjdccsnzhFte/PULziueZxGD8LL2WojON78Mvnq7LdAMEtu2frrwld1fr3geixg3iiMBIc/LLAZpw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + react-transition-group@4.4.5: resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} peerDependencies: @@ -3811,6 +4430,12 @@ packages: tabbable@6.3.0: resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} + tailwind-merge@3.4.0: + resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} + + tailwindcss@4.1.17: + resolution: {integrity: sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==} + tapable@2.3.0: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} @@ -3902,6 +4527,9 @@ packages: tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + tw-animate-css@1.4.0: + resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -3979,6 +4607,16 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + use-context-selector@2.0.0: resolution: {integrity: sha512-owfuSmUNd3eNp3J9CdDl0kMgfidV+MkDvHPpvthN5ThqM+ibMccNE0k+Iq7TWC6JPFvGZqanqiGCuQx6DyV24g==} peerDependencies: @@ -3994,6 +4632,16 @@ packages: '@types/react': optional: true + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + utf8-byte-length@1.0.5: resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} @@ -4081,6 +4729,8 @@ packages: snapshots: + '@alloc/quick-lru@5.2.0': {} + '@apidevtools/json-schema-ref-parser@11.9.3': dependencies: '@jsdevtools/ono': 7.1.3 @@ -4491,19 +5141,19 @@ snapshots: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.0(eslint@9.22.0)': + '@eslint-community/eslint-utils@4.9.0(eslint@9.22.0(jiti@2.6.1))': dependencies: - eslint: 9.22.0 + eslint: 9.22.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint-react/ast@1.31.0(eslint@9.22.0)(typescript@5.7.3)': + '@eslint-react/ast@1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3)': dependencies: '@eslint-react/eff': 1.31.0 '@typescript-eslint/types': 8.48.0 '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.48.0(eslint@9.22.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) string-ts: 2.3.1 ts-pattern: 5.9.0 transitivePeerDependencies: @@ -4511,17 +5161,17 @@ snapshots: - supports-color - typescript - '@eslint-react/core@1.31.0(eslint@9.22.0)(typescript@5.7.3)': + '@eslint-react/core@1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3)': dependencies: - '@eslint-react/ast': 1.31.0(eslint@9.22.0)(typescript@5.7.3) + '@eslint-react/ast': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@eslint-react/eff': 1.31.0 - '@eslint-react/jsx': 1.31.0(eslint@9.22.0)(typescript@5.7.3) - '@eslint-react/shared': 1.31.0(eslint@9.22.0)(typescript@5.7.3) - '@eslint-react/var': 1.31.0(eslint@9.22.0)(typescript@5.7.3) + '@eslint-react/jsx': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@eslint-react/shared': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@eslint-react/var': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/type-utils': 8.48.0(eslint@9.22.0)(typescript@5.7.3) + '@typescript-eslint/type-utils': 8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.22.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) birecord: 0.1.1 ts-pattern: 5.9.0 transitivePeerDependencies: @@ -4531,45 +5181,45 @@ snapshots: '@eslint-react/eff@1.31.0': {} - '@eslint-react/eslint-plugin@1.31.0(eslint@9.22.0)(ts-api-utils@2.1.0(typescript@5.5.2))(typescript@5.7.3)': + '@eslint-react/eslint-plugin@1.31.0(eslint@9.22.0(jiti@2.6.1))(ts-api-utils@2.1.0(typescript@5.5.2))(typescript@5.7.3)': dependencies: '@eslint-react/eff': 1.31.0 - '@eslint-react/shared': 1.31.0(eslint@9.22.0)(typescript@5.7.3) + '@eslint-react/shared': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/type-utils': 8.48.0(eslint@9.22.0)(typescript@5.7.3) + '@typescript-eslint/type-utils': 8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.22.0)(typescript@5.7.3) - eslint: 9.22.0 - eslint-plugin-react-debug: 1.31.0(eslint@9.22.0)(typescript@5.7.3) - eslint-plugin-react-dom: 1.31.0(eslint@9.22.0)(typescript@5.7.3) - eslint-plugin-react-hooks-extra: 1.31.0(eslint@9.22.0)(typescript@5.7.3) - eslint-plugin-react-naming-convention: 1.31.0(eslint@9.22.0)(typescript@5.7.3) - eslint-plugin-react-web-api: 1.31.0(eslint@9.22.0)(typescript@5.7.3) - eslint-plugin-react-x: 1.31.0(eslint@9.22.0)(ts-api-utils@2.1.0(typescript@5.5.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + eslint: 9.22.0(jiti@2.6.1) + eslint-plugin-react-debug: 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + eslint-plugin-react-dom: 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + eslint-plugin-react-hooks-extra: 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + eslint-plugin-react-naming-convention: 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + eslint-plugin-react-web-api: 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + eslint-plugin-react-x: 1.31.0(eslint@9.22.0(jiti@2.6.1))(ts-api-utils@2.1.0(typescript@5.5.2))(typescript@5.7.3) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: - supports-color - ts-api-utils - '@eslint-react/jsx@1.31.0(eslint@9.22.0)(typescript@5.7.3)': + '@eslint-react/jsx@1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3)': dependencies: - '@eslint-react/ast': 1.31.0(eslint@9.22.0)(typescript@5.7.3) + '@eslint-react/ast': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@eslint-react/eff': 1.31.0 - '@eslint-react/var': 1.31.0(eslint@9.22.0)(typescript@5.7.3) + '@eslint-react/var': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@typescript-eslint/scope-manager': 8.48.0 '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.22.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) ts-pattern: 5.9.0 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/shared@1.31.0(eslint@9.22.0)(typescript@5.7.3)': + '@eslint-react/shared@1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3)': dependencies: '@eslint-react/eff': 1.31.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.22.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) picomatch: 4.0.3 ts-pattern: 5.9.0 transitivePeerDependencies: @@ -4577,13 +5227,13 @@ snapshots: - supports-color - typescript - '@eslint-react/var@1.31.0(eslint@9.22.0)(typescript@5.7.3)': + '@eslint-react/var@1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3)': dependencies: - '@eslint-react/ast': 1.31.0(eslint@9.22.0)(typescript@5.7.3) + '@eslint-react/ast': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@eslint-react/eff': 1.31.0 '@typescript-eslint/scope-manager': 8.48.0 '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.22.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) string-ts: 2.3.1 ts-pattern: 5.9.0 transitivePeerDependencies: @@ -4814,6 +5464,11 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.5': {} @@ -5179,25 +5834,25 @@ snapshots: - sql.js - sqlite3 - '@payloadcms/eslint-config@3.28.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2))(ts-api-utils@2.1.0(typescript@5.5.2))': + '@payloadcms/eslint-config@3.28.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.26.1(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2))(jiti@2.6.1)(ts-api-utils@2.1.0(typescript@5.5.2))': dependencies: - '@eslint-react/eslint-plugin': 1.31.0(eslint@9.22.0)(ts-api-utils@2.1.0(typescript@5.5.2))(typescript@5.7.3) + '@eslint-react/eslint-plugin': 1.31.0(eslint@9.22.0(jiti@2.6.1))(ts-api-utils@2.1.0(typescript@5.5.2))(typescript@5.7.3) '@eslint/js': 9.22.0 - '@payloadcms/eslint-plugin': 3.28.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2))(ts-api-utils@2.1.0(typescript@5.5.2)) + '@payloadcms/eslint-plugin': 3.28.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.26.1(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2))(jiti@2.6.1)(ts-api-utils@2.1.0(typescript@5.5.2)) '@types/eslint': 9.6.1 - '@typescript-eslint/parser': 8.26.1(eslint@9.22.0)(typescript@5.7.3) - eslint: 9.22.0 - eslint-config-prettier: 10.1.1(eslint@9.22.0) - eslint-plugin-import-x: 4.6.1(eslint@9.22.0)(typescript@5.7.3) - eslint-plugin-jest: 28.11.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2))(eslint@9.22.0)(typescript@5.7.3) - eslint-plugin-jest-dom: 5.5.0(eslint@9.22.0) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.22.0) - eslint-plugin-perfectionist: 3.9.1(eslint@9.22.0)(typescript@5.7.3) - eslint-plugin-react-hooks: 0.0.0-experimental-d331ba04-20250307(eslint@9.22.0) - eslint-plugin-regexp: 2.7.0(eslint@9.22.0) + '@typescript-eslint/parser': 8.26.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + eslint: 9.22.0(jiti@2.6.1) + eslint-config-prettier: 10.1.1(eslint@9.22.0(jiti@2.6.1)) + eslint-plugin-import-x: 4.6.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + eslint-plugin-jest: 28.11.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.26.1(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2))(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + eslint-plugin-jest-dom: 5.5.0(eslint@9.22.0(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.22.0(jiti@2.6.1)) + eslint-plugin-perfectionist: 3.9.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + eslint-plugin-react-hooks: 0.0.0-experimental-d331ba04-20250307(eslint@9.22.0(jiti@2.6.1)) + eslint-plugin-regexp: 2.7.0(eslint@9.22.0(jiti@2.6.1)) globals: 16.0.0 typescript: 5.7.3 - typescript-eslint: 8.26.1(eslint@9.22.0)(typescript@5.7.3) + typescript-eslint: 8.26.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) transitivePeerDependencies: - '@testing-library/dom' - '@typescript-eslint/eslint-plugin' @@ -5210,24 +5865,24 @@ snapshots: - ts-api-utils - vue-eslint-parser - '@payloadcms/eslint-plugin@3.28.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2))(ts-api-utils@2.1.0(typescript@5.5.2))': + '@payloadcms/eslint-plugin@3.28.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.26.1(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2))(jiti@2.6.1)(ts-api-utils@2.1.0(typescript@5.5.2))': dependencies: - '@eslint-react/eslint-plugin': 1.31.0(eslint@9.22.0)(ts-api-utils@2.1.0(typescript@5.5.2))(typescript@5.7.3) + '@eslint-react/eslint-plugin': 1.31.0(eslint@9.22.0(jiti@2.6.1))(ts-api-utils@2.1.0(typescript@5.5.2))(typescript@5.7.3) '@eslint/js': 9.22.0 '@types/eslint': 9.6.1 - '@typescript-eslint/parser': 8.26.1(eslint@9.22.0)(typescript@5.7.3) - eslint: 9.22.0 - eslint-config-prettier: 10.1.1(eslint@9.22.0) - eslint-plugin-import-x: 4.6.1(eslint@9.22.0)(typescript@5.7.3) - eslint-plugin-jest: 28.11.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2))(eslint@9.22.0)(typescript@5.7.3) - eslint-plugin-jest-dom: 5.5.0(eslint@9.22.0) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.22.0) - eslint-plugin-perfectionist: 3.9.1(eslint@9.22.0)(typescript@5.7.3) - eslint-plugin-react-hooks: 0.0.0-experimental-d331ba04-20250307(eslint@9.22.0) - eslint-plugin-regexp: 2.7.0(eslint@9.22.0) + '@typescript-eslint/parser': 8.26.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + eslint: 9.22.0(jiti@2.6.1) + eslint-config-prettier: 10.1.1(eslint@9.22.0(jiti@2.6.1)) + eslint-plugin-import-x: 4.6.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + eslint-plugin-jest: 28.11.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.26.1(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2))(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + eslint-plugin-jest-dom: 5.5.0(eslint@9.22.0(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.22.0(jiti@2.6.1)) + eslint-plugin-perfectionist: 3.9.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + eslint-plugin-react-hooks: 0.0.0-experimental-d331ba04-20250307(eslint@9.22.0(jiti@2.6.1)) + eslint-plugin-regexp: 2.7.0(eslint@9.22.0(jiti@2.6.1)) globals: 16.0.0 typescript: 5.7.3 - typescript-eslint: 8.26.1(eslint@9.22.0)(typescript@5.7.3) + typescript-eslint: 8.26.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) transitivePeerDependencies: - '@testing-library/dom' - '@typescript-eslint/eslint-plugin' @@ -5369,6 +6024,319 @@ snapshots: '@pinojs/redact@0.4.0': {} + '@radix-ui/number@1.1.1': {} + + '@radix-ui/primitive@1.1.3': {} + + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.1 + '@types/react-dom': 19.0.1 + + '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.0.1)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.1 + '@types/react-dom': 19.0.1 + + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.0.1)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.1 + '@types/react-dom': 19.0.1 + + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.0.1)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.1 + + '@radix-ui/react-context@1.1.2(@types/react@19.0.1)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.1 + + '@radix-ui/react-direction@1.1.1(@types/react@19.0.1)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.1 + + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.0.1)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.1 + '@types/react-dom': 19.0.1 + + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.0.1)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.1 + + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.0.1)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.1 + '@types/react-dom': 19.0.1 + + '@radix-ui/react-id@1.1.1(@types/react@19.0.1)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.0.1)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.1 + + '@radix-ui/react-label@2.1.8(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.1 + '@types/react-dom': 19.0.1 + + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@floating-ui/react-dom': 2.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/rect': 1.1.1 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.1 + '@types/react-dom': 19.0.1 + + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.0.1)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.1 + '@types/react-dom': 19.0.1 + + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.0.1)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.1 + '@types/react-dom': 19.0.1 + + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.0.1)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.1 + '@types/react-dom': 19.0.1 + + '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-slot': 1.2.4(@types/react@19.0.1)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.1 + '@types/react-dom': 19.0.1 + + '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.0.1)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.1 + '@types/react-dom': 19.0.1 + + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.0.1)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.1 + '@types/react-dom': 19.0.1 + + '@radix-ui/react-select@2.2.6(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + aria-hidden: 1.2.6 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.7.2(@types/react@19.0.1)(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.1 + '@types/react-dom': 19.0.1 + + '@radix-ui/react-separator@1.1.8(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.1 + '@types/react-dom': 19.0.1 + + '@radix-ui/react-slot@1.2.3(@types/react@19.0.1)(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.1)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.1 + + '@radix-ui/react-slot@1.2.4(@types/react@19.0.1)(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.1)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.1 + + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.0.1)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.1 + + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.0.1)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.0.1)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.1 + + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.0.1)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.0.1)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.1 + + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.0.1)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.0.1)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.1 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.0.1)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.1 + + '@radix-ui/react-use-previous@1.1.1(@types/react@19.0.1)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.1 + + '@radix-ui/react-use-rect@1.1.1(@types/react@19.0.1)(react@19.0.0)': + dependencies: + '@radix-ui/rect': 1.1.1 + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.1 + + '@radix-ui/react-use-size@1.1.1(@types/react@19.0.1)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.0.1)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.1 + + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.1 + '@types/react-dom': 19.0.1 + + '@radix-ui/rect@1.1.1': {} + '@rtsao/scc@1.1.0': {} '@rushstack/eslint-patch@1.15.0': {} @@ -5429,6 +6397,75 @@ snapshots: dependencies: '@swc/counter': 0.1.3 + '@tailwindcss/node@4.1.17': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.3 + jiti: 2.6.1 + lightningcss: 1.30.2 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.1.17 + + '@tailwindcss/oxide-android-arm64@4.1.17': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.17': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.17': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.17': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.17': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.17': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.17': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.17': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.17': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.17': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.17': + optional: true + + '@tailwindcss/oxide@4.1.17': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.17 + '@tailwindcss/oxide-darwin-arm64': 4.1.17 + '@tailwindcss/oxide-darwin-x64': 4.1.17 + '@tailwindcss/oxide-freebsd-x64': 4.1.17 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.17 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.17 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.17 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.17 + '@tailwindcss/oxide-linux-x64-musl': 4.1.17 + '@tailwindcss/oxide-wasm32-wasi': 4.1.17 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.17 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.17 + + '@tailwindcss/postcss@4.1.17': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.1.17 + '@tailwindcss/oxide': 4.1.17 + postcss: 8.5.6 + tailwindcss: 4.1.17 + '@tokenizer/token@0.3.0': {} '@tybys/wasm-util@0.10.1': @@ -5515,15 +6552,15 @@ snapshots: dependencies: '@types/node': 24.10.1 - '@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0)(typescript@5.7.3))(eslint@9.22.0)(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@8.57.1)(typescript@5.5.2))(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.26.1(eslint@9.22.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.26.1(eslint@8.57.1)(typescript@5.5.2) '@typescript-eslint/scope-manager': 8.26.1 - '@typescript-eslint/type-utils': 8.26.1(eslint@9.22.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.26.1(eslint@9.22.0)(typescript@5.7.3) + '@typescript-eslint/type-utils': 8.26.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@typescript-eslint/utils': 8.26.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@typescript-eslint/visitor-keys': 8.26.1 - eslint: 9.22.0 + eslint: 9.22.0(jiti@2.6.1) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -5532,6 +6569,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.26.1(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.26.1(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/scope-manager': 8.48.0 + '@typescript-eslint/type-utils': 8.48.0(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/utils': 8.48.0(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/visitor-keys': 8.48.0 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.5.2) + typescript: 5.5.2 + transitivePeerDependencies: + - supports-color + optional: true + '@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -5549,14 +6604,26 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.26.1(eslint@9.22.0)(typescript@5.7.3)': + '@typescript-eslint/parser@8.26.1(eslint@8.57.1)(typescript@5.5.2)': + dependencies: + '@typescript-eslint/scope-manager': 8.26.1 + '@typescript-eslint/types': 8.26.1 + '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.5.2) + '@typescript-eslint/visitor-keys': 8.26.1 + debug: 4.4.3 + eslint: 8.57.1 + typescript: 5.5.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3)': dependencies: '@typescript-eslint/scope-manager': 8.26.1 '@typescript-eslint/types': 8.26.1 '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.7.3) '@typescript-eslint/visitor-keys': 8.26.1 debug: 4.4.3 - eslint: 9.22.0 + eslint: 9.22.0(jiti@2.6.1) typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -5609,12 +6676,12 @@ snapshots: dependencies: typescript: 5.7.3 - '@typescript-eslint/type-utils@8.26.1(eslint@9.22.0)(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.26.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3)': dependencies: '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.7.3) - '@typescript-eslint/utils': 8.26.1(eslint@9.22.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.26.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) debug: 4.4.3 - eslint: 9.22.0 + eslint: 9.22.0(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: @@ -5632,13 +6699,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.48.0(eslint@9.22.0)(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3)': dependencies: '@typescript-eslint/types': 8.48.0 '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.48.0(eslint@9.22.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) debug: 4.4.3 - eslint: 9.22.0 + eslint: 9.22.0(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: @@ -5648,6 +6715,20 @@ snapshots: '@typescript-eslint/types@8.48.0': {} + '@typescript-eslint/typescript-estree@8.26.1(typescript@5.5.2)': + dependencies: + '@typescript-eslint/types': 8.26.1 + '@typescript-eslint/visitor-keys': 8.26.1 + debug: 4.4.3 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.5.2) + typescript: 5.5.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/typescript-estree@8.26.1(typescript@5.7.3)': dependencies: '@typescript-eslint/types': 8.26.1 @@ -5692,13 +6773,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.26.1(eslint@9.22.0)(typescript@5.7.3)': + '@typescript-eslint/utils@8.26.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.22.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.22.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.26.1 '@typescript-eslint/types': 8.26.1 '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.7.3) - eslint: 9.22.0 + eslint: 9.22.0(jiti@2.6.1) typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -5714,13 +6795,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.48.0(eslint@9.22.0)(typescript@5.7.3)': + '@typescript-eslint/utils@8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.22.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.22.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.48.0 '@typescript-eslint/types': 8.48.0 '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.7.3) - eslint: 9.22.0 + eslint: 9.22.0(jiti@2.6.1) typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -5831,6 +6912,10 @@ snapshots: argparse@2.0.1: {} + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + aria-query@5.3.2: {} array-buffer-byte-length@1.0.2: @@ -6055,6 +7140,10 @@ snapshots: ci-info@4.3.1: {} + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + client-only@0.0.1: {} clsx@2.1.1: {} @@ -6189,6 +7278,8 @@ snapshots: detect-libc@2.1.2: {} + detect-node-es@1.1.0: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -6451,8 +7542,8 @@ snapshots: '@typescript-eslint/parser': 8.48.0(eslint@8.57.1)(typescript@5.5.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.6.1(eslint@8.57.1)(typescript@5.5.2))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1))(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.6.1(eslint@8.57.1)(typescript@5.5.2))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.6.1(eslint@8.57.1)(typescript@5.5.2))(eslint-plugin-import@2.32.0)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.26.1(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.5(eslint@8.57.1) eslint-plugin-react-hooks: 5.2.0(eslint@8.57.1) @@ -6463,9 +7554,9 @@ snapshots: - eslint-plugin-import-x - supports-color - eslint-config-prettier@10.1.1(eslint@9.22.0): + eslint-config-prettier@10.1.1(eslint@9.22.0(jiti@2.6.1)): dependencies: - eslint: 9.22.0 + eslint: 9.22.0(jiti@2.6.1) eslint-import-resolver-node@0.3.9: dependencies: @@ -6475,7 +7566,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.6.1(eslint@8.57.1)(typescript@5.5.2))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1))(eslint@8.57.1): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.6.1(eslint@8.57.1)(typescript@5.5.2))(eslint-plugin-import@2.32.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 @@ -6486,19 +7577,19 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.6.1(eslint@8.57.1)(typescript@5.5.2))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.26.1(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1) eslint-plugin-import-x: 4.6.1(eslint@8.57.1)(typescript@5.5.2) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.6.1(eslint@8.57.1)(typescript@5.5.2))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.48.0(eslint@8.57.1)(typescript@5.5.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.6.1(eslint@8.57.1)(typescript@5.5.2))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.6.1(eslint@8.57.1)(typescript@5.5.2))(eslint-plugin-import@2.32.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -6523,15 +7614,15 @@ snapshots: - typescript optional: true - eslint-plugin-import-x@4.6.1(eslint@9.22.0)(typescript@5.7.3): + eslint-plugin-import-x@4.6.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3): dependencies: '@types/doctrine': 0.0.9 '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.22.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) debug: 4.4.3 doctrine: 3.0.0 enhanced-resolve: 5.18.3 - eslint: 9.22.0 + eslint: 9.22.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 get-tsconfig: 4.13.0 is-glob: 4.0.3 @@ -6543,7 +7634,7 @@ snapshots: - supports-color - typescript - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.6.1(eslint@8.57.1)(typescript@5.5.2))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.26.1(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -6554,7 +7645,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.6.1(eslint@8.57.1)(typescript@5.5.2))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -6566,24 +7657,24 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.48.0(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/parser': 8.26.1(eslint@8.57.1)(typescript@5.5.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest-dom@5.5.0(eslint@9.22.0): + eslint-plugin-jest-dom@5.5.0(eslint@9.22.0(jiti@2.6.1)): dependencies: '@babel/runtime': 7.28.4 - eslint: 9.22.0 + eslint: 9.22.0(jiti@2.6.1) requireindex: 1.2.0 - eslint-plugin-jest@28.11.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2))(eslint@9.22.0)(typescript@5.7.3): + eslint-plugin-jest@28.11.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.26.1(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2))(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3): dependencies: - '@typescript-eslint/utils': 8.48.0(eslint@9.22.0)(typescript@5.7.3) - eslint: 9.22.0 + '@typescript-eslint/utils': 8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + eslint: 9.22.0(jiti@2.6.1) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.48.0(@typescript-eslint/parser@8.48.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/eslint-plugin': 8.48.0(@typescript-eslint/parser@8.26.1(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2) transitivePeerDependencies: - supports-color - typescript @@ -6607,7 +7698,7 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-jsx-a11y@6.10.2(eslint@9.22.0): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.22.0(jiti@2.6.1)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -6617,7 +7708,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.22.0 + eslint: 9.22.0(jiti@2.6.1) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -6626,30 +7717,30 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-perfectionist@3.9.1(eslint@9.22.0)(typescript@5.7.3): + eslint-plugin-perfectionist@3.9.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3): dependencies: '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.22.0)(typescript@5.7.3) - eslint: 9.22.0 + '@typescript-eslint/utils': 8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + eslint: 9.22.0(jiti@2.6.1) minimatch: 9.0.5 natural-compare-lite: 1.4.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-react-debug@1.31.0(eslint@9.22.0)(typescript@5.7.3): + eslint-plugin-react-debug@1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3): dependencies: - '@eslint-react/ast': 1.31.0(eslint@9.22.0)(typescript@5.7.3) - '@eslint-react/core': 1.31.0(eslint@9.22.0)(typescript@5.7.3) + '@eslint-react/ast': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@eslint-react/core': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@eslint-react/eff': 1.31.0 - '@eslint-react/jsx': 1.31.0(eslint@9.22.0)(typescript@5.7.3) - '@eslint-react/shared': 1.31.0(eslint@9.22.0)(typescript@5.7.3) - '@eslint-react/var': 1.31.0(eslint@9.22.0)(typescript@5.7.3) + '@eslint-react/jsx': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@eslint-react/shared': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@eslint-react/var': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/type-utils': 8.48.0(eslint@9.22.0)(typescript@5.7.3) + '@typescript-eslint/type-utils': 8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.22.0)(typescript@5.7.3) - eslint: 9.22.0 + '@typescript-eslint/utils': 8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + eslint: 9.22.0(jiti@2.6.1) string-ts: 2.3.1 ts-pattern: 5.9.0 optionalDependencies: @@ -6657,19 +7748,19 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-dom@1.31.0(eslint@9.22.0)(typescript@5.7.3): + eslint-plugin-react-dom@1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3): dependencies: - '@eslint-react/ast': 1.31.0(eslint@9.22.0)(typescript@5.7.3) - '@eslint-react/core': 1.31.0(eslint@9.22.0)(typescript@5.7.3) + '@eslint-react/ast': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@eslint-react/core': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@eslint-react/eff': 1.31.0 - '@eslint-react/jsx': 1.31.0(eslint@9.22.0)(typescript@5.7.3) - '@eslint-react/shared': 1.31.0(eslint@9.22.0)(typescript@5.7.3) - '@eslint-react/var': 1.31.0(eslint@9.22.0)(typescript@5.7.3) + '@eslint-react/jsx': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@eslint-react/shared': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@eslint-react/var': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@typescript-eslint/scope-manager': 8.48.0 '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.22.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) compare-versions: 6.1.1 - eslint: 9.22.0 + eslint: 9.22.0(jiti@2.6.1) string-ts: 2.3.1 ts-pattern: 5.9.0 optionalDependencies: @@ -6677,19 +7768,19 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks-extra@1.31.0(eslint@9.22.0)(typescript@5.7.3): + eslint-plugin-react-hooks-extra@1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3): dependencies: - '@eslint-react/ast': 1.31.0(eslint@9.22.0)(typescript@5.7.3) - '@eslint-react/core': 1.31.0(eslint@9.22.0)(typescript@5.7.3) + '@eslint-react/ast': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@eslint-react/core': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@eslint-react/eff': 1.31.0 - '@eslint-react/jsx': 1.31.0(eslint@9.22.0)(typescript@5.7.3) - '@eslint-react/shared': 1.31.0(eslint@9.22.0)(typescript@5.7.3) - '@eslint-react/var': 1.31.0(eslint@9.22.0)(typescript@5.7.3) + '@eslint-react/jsx': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@eslint-react/shared': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@eslint-react/var': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/type-utils': 8.48.0(eslint@9.22.0)(typescript@5.7.3) + '@typescript-eslint/type-utils': 8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.22.0)(typescript@5.7.3) - eslint: 9.22.0 + '@typescript-eslint/utils': 8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + eslint: 9.22.0(jiti@2.6.1) string-ts: 2.3.1 ts-pattern: 5.9.0 optionalDependencies: @@ -6697,27 +7788,27 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@0.0.0-experimental-d331ba04-20250307(eslint@9.22.0): + eslint-plugin-react-hooks@0.0.0-experimental-d331ba04-20250307(eslint@9.22.0(jiti@2.6.1)): dependencies: - eslint: 9.22.0 + eslint: 9.22.0(jiti@2.6.1) eslint-plugin-react-hooks@5.2.0(eslint@8.57.1): dependencies: eslint: 8.57.1 - eslint-plugin-react-naming-convention@1.31.0(eslint@9.22.0)(typescript@5.7.3): + eslint-plugin-react-naming-convention@1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3): dependencies: - '@eslint-react/ast': 1.31.0(eslint@9.22.0)(typescript@5.7.3) - '@eslint-react/core': 1.31.0(eslint@9.22.0)(typescript@5.7.3) + '@eslint-react/ast': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@eslint-react/core': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@eslint-react/eff': 1.31.0 - '@eslint-react/jsx': 1.31.0(eslint@9.22.0)(typescript@5.7.3) - '@eslint-react/shared': 1.31.0(eslint@9.22.0)(typescript@5.7.3) - '@eslint-react/var': 1.31.0(eslint@9.22.0)(typescript@5.7.3) + '@eslint-react/jsx': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@eslint-react/shared': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@eslint-react/var': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/type-utils': 8.48.0(eslint@9.22.0)(typescript@5.7.3) + '@typescript-eslint/type-utils': 8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.22.0)(typescript@5.7.3) - eslint: 9.22.0 + '@typescript-eslint/utils': 8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + eslint: 9.22.0(jiti@2.6.1) string-ts: 2.3.1 ts-pattern: 5.9.0 optionalDependencies: @@ -6725,18 +7816,18 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-web-api@1.31.0(eslint@9.22.0)(typescript@5.7.3): + eslint-plugin-react-web-api@1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3): dependencies: - '@eslint-react/ast': 1.31.0(eslint@9.22.0)(typescript@5.7.3) - '@eslint-react/core': 1.31.0(eslint@9.22.0)(typescript@5.7.3) + '@eslint-react/ast': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@eslint-react/core': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@eslint-react/eff': 1.31.0 - '@eslint-react/jsx': 1.31.0(eslint@9.22.0)(typescript@5.7.3) - '@eslint-react/shared': 1.31.0(eslint@9.22.0)(typescript@5.7.3) - '@eslint-react/var': 1.31.0(eslint@9.22.0)(typescript@5.7.3) + '@eslint-react/jsx': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@eslint-react/shared': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@eslint-react/var': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@typescript-eslint/scope-manager': 8.48.0 '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.22.0)(typescript@5.7.3) - eslint: 9.22.0 + '@typescript-eslint/utils': 8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + eslint: 9.22.0(jiti@2.6.1) string-ts: 2.3.1 ts-pattern: 5.9.0 optionalDependencies: @@ -6744,20 +7835,20 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-x@1.31.0(eslint@9.22.0)(ts-api-utils@2.1.0(typescript@5.5.2))(typescript@5.7.3): + eslint-plugin-react-x@1.31.0(eslint@9.22.0(jiti@2.6.1))(ts-api-utils@2.1.0(typescript@5.5.2))(typescript@5.7.3): dependencies: - '@eslint-react/ast': 1.31.0(eslint@9.22.0)(typescript@5.7.3) - '@eslint-react/core': 1.31.0(eslint@9.22.0)(typescript@5.7.3) + '@eslint-react/ast': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@eslint-react/core': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@eslint-react/eff': 1.31.0 - '@eslint-react/jsx': 1.31.0(eslint@9.22.0)(typescript@5.7.3) - '@eslint-react/shared': 1.31.0(eslint@9.22.0)(typescript@5.7.3) - '@eslint-react/var': 1.31.0(eslint@9.22.0)(typescript@5.7.3) + '@eslint-react/jsx': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@eslint-react/shared': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@eslint-react/var': 1.31.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/type-utils': 8.48.0(eslint@9.22.0)(typescript@5.7.3) + '@typescript-eslint/type-utils': 8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.22.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) compare-versions: 6.1.1 - eslint: 9.22.0 + eslint: 9.22.0(jiti@2.6.1) string-ts: 2.3.1 ts-pattern: 5.9.0 optionalDependencies: @@ -6788,12 +7879,12 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-regexp@2.7.0(eslint@9.22.0): + eslint-plugin-regexp@2.7.0(eslint@9.22.0(jiti@2.6.1)): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.22.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.22.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 comment-parser: 1.4.1 - eslint: 9.22.0 + eslint: 9.22.0(jiti@2.6.1) jsdoc-type-pratt-parser: 4.8.0 refa: 0.12.1 regexp-ast-analysis: 0.7.1 @@ -6856,9 +7947,9 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@9.22.0: + eslint@9.22.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.22.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.22.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.19.2 '@eslint/config-helpers': 0.1.0 @@ -6893,6 +7984,8 @@ snapshots: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 transitivePeerDependencies: - supports-color @@ -7063,6 +8156,8 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 + get-nonce@1.0.1: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -7349,6 +8444,8 @@ snapshots: has-symbols: 1.1.0 set-function-name: 2.0.2 + jiti@2.6.1: {} + jose@5.9.6: {} joycon@3.1.1: {} @@ -7436,6 +8533,55 @@ snapshots: '@libsql/linux-x64-musl': 0.4.7 '@libsql/win32-x64-msvc': 0.4.7 + lightningcss-android-arm64@1.30.2: + optional: true + + lightningcss-darwin-arm64@1.30.2: + optional: true + + lightningcss-darwin-x64@1.30.2: + optional: true + + lightningcss-freebsd-x64@1.30.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.2: + optional: true + + lightningcss-linux-arm64-gnu@1.30.2: + optional: true + + lightningcss-linux-arm64-musl@1.30.2: + optional: true + + lightningcss-linux-x64-gnu@1.30.2: + optional: true + + lightningcss-linux-x64-musl@1.30.2: + optional: true + + lightningcss-win32-arm64-msvc@1.30.2: + optional: true + + lightningcss-win32-x64-msvc@1.30.2: + optional: true + + lightningcss@1.30.2: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 + lines-and-columns@1.2.4: {} locate-path@6.0.0: @@ -7452,6 +8598,14 @@ snapshots: dependencies: js-tokens: 4.0.0 + lucide-react@0.555.0(react@19.0.0): + dependencies: + react: 19.0.0 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + marked@14.0.0: {} math-intrinsics@1.1.0: {} @@ -8024,6 +9178,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postgres-array@2.0.0: optional: true @@ -8140,6 +9300,25 @@ snapshots: react-is@16.13.1: {} + react-remove-scroll-bar@2.3.8(@types/react@19.0.1)(react@19.0.0): + dependencies: + react: 19.0.0 + react-style-singleton: 2.2.3(@types/react@19.0.1)(react@19.0.0) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.0.1 + + react-remove-scroll@2.7.2(@types/react@19.0.1)(react@19.0.0): + dependencies: + react: 19.0.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.0.1)(react@19.0.0) + react-style-singleton: 2.2.3(@types/react@19.0.1)(react@19.0.0) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.0.1)(react@19.0.0) + use-sidecar: 1.1.3(@types/react@19.0.1)(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.1 + react-select@5.9.0(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@babel/runtime': 7.28.4 @@ -8157,6 +9336,14 @@ snapshots: - '@types/react' - supports-color + react-style-singleton@2.2.3(@types/react@19.0.1)(react@19.0.0): + dependencies: + get-nonce: 1.0.1 + react: 19.0.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.0.1 + react-transition-group@4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@babel/runtime': 7.28.4 @@ -8544,6 +9731,10 @@ snapshots: tabbable@6.3.0: {} + tailwind-merge@3.4.0: {} + + tailwindcss@4.1.17: {} + tapable@2.3.0: {} tar-fs@2.1.4: @@ -8671,6 +9862,8 @@ snapshots: dependencies: safe-buffer: 5.2.1 + tw-animate-css@1.4.0: {} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -8710,12 +9903,12 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.26.1(eslint@9.22.0)(typescript@5.7.3): + typescript-eslint@8.26.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0)(typescript@5.7.3))(eslint@9.22.0)(typescript@5.7.3) - '@typescript-eslint/parser': 8.26.1(eslint@9.22.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.26.1(eslint@9.22.0)(typescript@5.7.3) - eslint: 9.22.0 + '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1(eslint@8.57.1)(typescript@5.5.2))(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@typescript-eslint/parser': 8.26.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + '@typescript-eslint/utils': 8.26.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.7.3) + eslint: 9.22.0(jiti@2.6.1) typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -8788,6 +9981,13 @@ snapshots: dependencies: punycode: 2.3.1 + use-callback-ref@1.3.3(@types/react@19.0.1)(react@19.0.0): + dependencies: + react: 19.0.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.0.1 + use-context-selector@2.0.0(react@19.0.0)(scheduler@0.25.0): dependencies: react: 19.0.0 @@ -8799,6 +9999,14 @@ snapshots: optionalDependencies: '@types/react': 19.0.1 + use-sidecar@1.1.3(@types/react@19.0.1)(react@19.0.0): + dependencies: + detect-node-es: 1.1.0 + react: 19.0.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.0.1 + utf8-byte-length@1.0.5: {} util-deprecate@1.0.2: {} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..61e3684 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/src/app/(app)/caregiver/dashboard/page.tsx b/src/app/(app)/caregiver/dashboard/page.tsx index 344cbb4..9c98b00 100644 --- a/src/app/(app)/caregiver/dashboard/page.tsx +++ b/src/app/(app)/caregiver/dashboard/page.tsx @@ -3,6 +3,19 @@ import React, { useState, useEffect } from 'react' import { useRouter } from 'next/navigation' import Link from 'next/link' +import { + Loader2, + LogOut, + Sun, + Moon, + Sunrise, + ClipboardList, + Users, + Settings, +} from 'lucide-react' + +import { Button } from '@/components/ui/button' +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' interface User { id: number @@ -30,7 +43,6 @@ export default function CaregiverDashboardPage() { useEffect(() => { const fetchData = async () => { try { - // Check auth const userRes = await fetch('/api/users/me', { credentials: 'include' }) if (!userRes.ok) { router.push('/caregiver/login') @@ -43,7 +55,6 @@ export default function CaregiverDashboardPage() { } setUser(userData.user) - // Fetch today's orders stats const today = new Date().toISOString().split('T')[0] const ordersRes = await fetch(`/api/meal-orders?where[date][equals]=${today}&limit=1000`, { credentials: 'include', @@ -77,8 +88,8 @@ export default function CaregiverDashboardPage() { if (loading) { return ( -
-
+
+
) } @@ -89,78 +100,127 @@ export default function CaregiverDashboardPage() { : 'Care Home' return ( - <> -
-
-

{tenantName}

-
- {user?.name || user?.email} - +
-
-
-

Dashboard

-

Today's overview

+
+
+

Dashboard

+

Today's overview

-
-
-
{stats.total}
-
Total Orders Today
-
-
-
{stats.pending}
-
Pending
-
-
-
{stats.preparing}
-
Preparing
-
-
-
{stats.prepared}
-
Prepared
-
+
+ + + Total Orders + + + +
{stats.total}
+

Today

+
+
+ + + Pending +
+ + +
{stats.pending}
+

Awaiting preparation

+
+ + + + Preparing +
+ + +
{stats.preparing}
+

In progress

+
+ + + + Prepared +
+ + +
{stats.prepared}
+

Ready to serve

+
+
-
-
-

Quick Actions

-
-
-
- -
🌅
-
New Breakfast
+ + + Quick Actions + + +
+ + + + + New Breakfast + + - -
☀️
-
New Lunch
+ + + + + New Lunch + + - -
🌙
-
New Dinner
+ + + + + New Dinner + + - -
📋
-
View Orders
+ + + + + View Orders + + - -
👥
-
Residents
+ + + + + Residents + + - -
⚙️
-
Admin Panel
+ + + + + Admin Panel + +
-
-
+ +
- +
) } diff --git a/src/app/(app)/caregiver/login/page.tsx b/src/app/(app)/caregiver/login/page.tsx index 5f675b7..ce6bcd4 100644 --- a/src/app/(app)/caregiver/login/page.tsx +++ b/src/app/(app)/caregiver/login/page.tsx @@ -2,6 +2,13 @@ import React, { useState, useEffect } from 'react' import { useRouter } from 'next/navigation' +import { Loader2 } from 'lucide-react' + +import { Button } from '@/components/ui/button' +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' +import { Input } from '@/components/ui/input' +import { Label } from '@/components/ui/label' +import { Alert, AlertDescription } from '@/components/ui/alert' export default function CaregiverLoginPage() { const router = useRouter() @@ -11,7 +18,6 @@ export default function CaregiverLoginPage() { const [loading, setLoading] = useState(false) const [checking, setChecking] = useState(true) - // Check if already logged in useEffect(() => { const checkAuth = async () => { try { @@ -50,7 +56,6 @@ export default function CaregiverLoginPage() { throw new Error(data.errors?.[0]?.message || 'Login failed') } - // Check if user has caregiver or admin role const user = data.user const hasCaregiverRole = user?.roles?.includes('super-admin') || @@ -60,7 +65,6 @@ export default function CaregiverLoginPage() { ) if (!hasCaregiverRole) { - // Logout if not a caregiver await fetch('/api/users/logout', { method: 'POST', credentials: 'include', @@ -78,31 +82,38 @@ export default function CaregiverLoginPage() { if (checking) { return ( -
-
+
+
) } return ( -
-
-
-

Meal Planner

-

Caregiver Portal

+
+
+
+

Meal Planner

+

Caregiver Portal

-
-
- {error &&
{error}
} + + + Login + Enter your credentials to access the caregiver portal + + + {error && ( + + {error} + + )} -
-
- - +
+ + setEmail(e.target.value)} placeholder="Enter your email" @@ -111,12 +122,11 @@ export default function CaregiverLoginPage() { />
-
- - + + setPassword(e.target.value)} placeholder="Enter your password" @@ -125,16 +135,19 @@ export default function CaregiverLoginPage() { />
- + -
-
+ +
) diff --git a/src/app/(app)/caregiver/orders/new/page.tsx b/src/app/(app)/caregiver/orders/new/page.tsx index 05eb727..eadde74 100644 --- a/src/app/(app)/caregiver/orders/new/page.tsx +++ b/src/app/(app)/caregiver/orders/new/page.tsx @@ -3,6 +3,27 @@ import React, { useState, useEffect, Suspense } from 'react' import { useRouter, useSearchParams } from 'next/navigation' import Link from 'next/link' +import { + ArrowLeft, + Loader2, + Search, + Sunrise, + Sun, + Moon, + AlertTriangle, + Check, +} from 'lucide-react' + +import { Button } from '@/components/ui/button' +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' +import { Input } from '@/components/ui/input' +import { Label } from '@/components/ui/label' +import { Checkbox } from '@/components/ui/checkbox' +import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group' +import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert' +import { Separator } from '@/components/ui/separator' +import { Badge } from '@/components/ui/badge' +import { cn } from '@/lib/utils' interface Resident { id: number @@ -119,6 +140,33 @@ const defaultDinner: DinnerOptions = { additions: { sugar: false, sweetener: false }, } +function CheckboxOption({ + id, + label, + checked, + onCheckedChange, +}: { + id: string + label: string + checked: boolean + onCheckedChange: (checked: boolean) => void +}) { + return ( +
onCheckedChange(!checked)} + > + + +
+ ) +} + function NewOrderContent() { const router = useRouter() const searchParams = useSearchParams() @@ -217,289 +265,254 @@ function NewOrderContent() { } } - const renderCheckbox = ( - label: string, - checked: boolean, - onChange: (checked: boolean) => void, - ) => ( - - ) - if (loading) { return ( -
-
+
+
) } return ( - <> -
-
- - ← Back - -

New Meal Order

+
+
+
+ +

New Meal Order

-
+
{/* Progress Steps */} -
-
= 1 ? 'steps__step--active' : ''} ${step > 1 ? 'steps__step--completed' : ''}`} /> -
= 2 ? 'steps__step--active' : ''} ${step > 2 ? 'steps__step--completed' : ''}`} /> -
= 3 ? 'steps__step--active' : ''} ${step > 3 ? 'steps__step--completed' : ''}`} /> -
= 4 ? 'steps__step--active' : ''}`} /> +
+ {[1, 2, 3, 4].map((s) => ( +
= s ? (step > s ? 'bg-green-500' : 'bg-primary') : 'bg-muted' + )} + /> + ))}
- {error &&
{error}
} + {error && ( + + + {error} + + )} {/* Step 1: Select Meal Type */} {step === 1 && ( -
-
-

Step 1: Select Meal Type

-
-
-
- - + + Step 1: Select Meal Type + + +
+ + setDate(e.target.value)} />
-
- - - +
+ {[ + { type: 'breakfast' as MealType, icon: Sunrise, label: 'Breakfast', sublabel: 'Frühstück', color: 'text-orange-500' }, + { type: 'lunch' as MealType, icon: Sun, label: 'Lunch', sublabel: 'Mittagessen', color: 'text-yellow-500' }, + { type: 'dinner' as MealType, icon: Moon, label: 'Dinner', sublabel: 'Abendessen', color: 'text-indigo-500' }, + ].map(({ type, icon: Icon, label, sublabel, color }) => ( + setMealType(type)} + > + + + {label} + {sublabel} + + + ))}
-
- -
-
-
+ + + )} {/* Step 2: Select Resident */} {step === 2 && ( -
-
-

Step 2: Select Resident

-
-
-
-
- setSearchQuery(e.target.value)} - /> -
+ + + Step 2: Select Resident + + +
+ + setSearchQuery(e.target.value)} + className="pl-10" + />
-
+
{filteredResidents.map((resident) => ( -
setSelectedResident(resident)} > -
{resident.name}
-
- Room {resident.room} - {resident.table && Table {resident.table}} - {resident.station && {resident.station}} -
- {resident.highCaloric && ( -
High Caloric
- )} -
+ +
{resident.name}
+
+ Room {resident.room} + {resident.table && Table {resident.table}} +
+ {resident.highCaloric && ( + + High Caloric + + )} +
+ ))}
-
- - +
-
-
+ + )} {/* Step 3: Meal Options */} {step === 3 && ( -
-
-

Step 3: {mealType && getMealTypeLabel(mealType)} Options

-
-
- {/* Show resident notes if any */} + + + Step 3: {mealType && getMealTypeLabel(mealType)} Options + + {(selectedResident?.aversions || selectedResident?.notes) && ( -
- Notes for {selectedResident?.name}: - {selectedResident?.aversions &&
Aversions: {selectedResident.aversions}
} - {selectedResident?.notes &&
{selectedResident.notes}
} -
+ + + Notes for {selectedResident?.name} + + {selectedResident?.aversions &&
Aversions: {selectedResident.aversions}
} + {selectedResident?.notes &&
{selectedResident.notes}
} +
+
)} {/* BREAKFAST OPTIONS */} {mealType === 'breakfast' && ( <> -
-

General

-
- {renderCheckbox('According to Plan (lt. Plan)', breakfast.accordingToPlan, (v) => - setBreakfast({ ...breakfast, accordingToPlan: v }), - )} +
+

General

+ setBreakfast({ ...breakfast, accordingToPlan: v })} + /> +
+ + + +
+

Bread (Brot)

+
+ setBreakfast({ ...breakfast, bread: { ...breakfast.bread, breadRoll: v } })} /> + setBreakfast({ ...breakfast, bread: { ...breakfast.bread, wholeGrainRoll: v } })} /> + setBreakfast({ ...breakfast, bread: { ...breakfast.bread, greyBread: v } })} /> + setBreakfast({ ...breakfast, bread: { ...breakfast.bread, wholeGrainBread: v } })} /> + setBreakfast({ ...breakfast, bread: { ...breakfast.bread, whiteBread: v } })} /> + setBreakfast({ ...breakfast, bread: { ...breakfast.bread, crispbread: v } })} />
-
-

Bread (Brot)

-
- {renderCheckbox('Bread Roll (Brötchen)', breakfast.bread.breadRoll, (v) => - setBreakfast({ ...breakfast, bread: { ...breakfast.bread, breadRoll: v } }), - )} - {renderCheckbox('Whole Grain Roll (Vollkornbrötchen)', breakfast.bread.wholeGrainRoll, (v) => - setBreakfast({ ...breakfast, bread: { ...breakfast.bread, wholeGrainRoll: v } }), - )} - {renderCheckbox('Grey Bread (Graubrot)', breakfast.bread.greyBread, (v) => - setBreakfast({ ...breakfast, bread: { ...breakfast.bread, greyBread: v } }), - )} - {renderCheckbox('Whole Grain Bread (Vollkornbrot)', breakfast.bread.wholeGrainBread, (v) => - setBreakfast({ ...breakfast, bread: { ...breakfast.bread, wholeGrainBread: v } }), - )} - {renderCheckbox('White Bread (Weißbrot)', breakfast.bread.whiteBread, (v) => - setBreakfast({ ...breakfast, bread: { ...breakfast.bread, whiteBread: v } }), - )} - {renderCheckbox('Crispbread (Knäckebrot)', breakfast.bread.crispbread, (v) => - setBreakfast({ ...breakfast, bread: { ...breakfast.bread, crispbread: v } }), - )} + + +
+

Preparation

+
+ setBreakfast({ ...breakfast, porridge: v })} /> + setBreakfast({ ...breakfast, preparation: { ...breakfast.preparation, sliced: v } })} /> + setBreakfast({ ...breakfast, preparation: { ...breakfast.preparation, spread: v } })} />
-
-

Preparation

-
- {renderCheckbox('Porridge (Brei)', breakfast.porridge, (v) => - setBreakfast({ ...breakfast, porridge: v }), - )} - {renderCheckbox('Sliced (geschnitten)', breakfast.preparation.sliced, (v) => - setBreakfast({ ...breakfast, preparation: { ...breakfast.preparation, sliced: v } }), - )} - {renderCheckbox('Spread (geschmiert)', breakfast.preparation.spread, (v) => - setBreakfast({ ...breakfast, preparation: { ...breakfast.preparation, spread: v } }), - )} + + +
+

Spreads (Aufstrich)

+
+ setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, butter: v } })} /> + setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, margarine: v } })} /> + setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, jam: v } })} /> + setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, diabeticJam: v } })} /> + setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, honey: v } })} /> + setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, cheese: v } })} /> + setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, quark: v } })} /> + setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, sausage: v } })} />
-
-

Spreads (Aufstrich)

-
- {renderCheckbox('Butter', breakfast.spreads.butter, (v) => - setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, butter: v } }), - )} - {renderCheckbox('Margarine', breakfast.spreads.margarine, (v) => - setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, margarine: v } }), - )} - {renderCheckbox('Jam (Konfitüre)', breakfast.spreads.jam, (v) => - setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, jam: v } }), - )} - {renderCheckbox('Diabetic Jam (Diab. Konfitüre)', breakfast.spreads.diabeticJam, (v) => - setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, diabeticJam: v } }), - )} - {renderCheckbox('Honey (Honig)', breakfast.spreads.honey, (v) => - setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, honey: v } }), - )} - {renderCheckbox('Cheese (Käse)', breakfast.spreads.cheese, (v) => - setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, cheese: v } }), - )} - {renderCheckbox('Quark', breakfast.spreads.quark, (v) => - setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, quark: v } }), - )} - {renderCheckbox('Sausage (Wurst)', breakfast.spreads.sausage, (v) => - setBreakfast({ ...breakfast, spreads: { ...breakfast.spreads, sausage: v } }), - )} + + +
+

Beverages (Getränke)

+
+ setBreakfast({ ...breakfast, beverages: { ...breakfast.beverages, coffee: v } })} /> + setBreakfast({ ...breakfast, beverages: { ...breakfast.beverages, tea: v } })} /> + setBreakfast({ ...breakfast, beverages: { ...breakfast.beverages, hotMilk: v } })} /> + setBreakfast({ ...breakfast, beverages: { ...breakfast.beverages, coldMilk: v } })} />
-
-

Beverages (Getränke)

-
- {renderCheckbox('Coffee (Kaffee)', breakfast.beverages.coffee, (v) => - setBreakfast({ ...breakfast, beverages: { ...breakfast.beverages, coffee: v } }), - )} - {renderCheckbox('Tea (Tee)', breakfast.beverages.tea, (v) => - setBreakfast({ ...breakfast, beverages: { ...breakfast.beverages, tea: v } }), - )} - {renderCheckbox('Hot Milk (Milch heiß)', breakfast.beverages.hotMilk, (v) => - setBreakfast({ ...breakfast, beverages: { ...breakfast.beverages, hotMilk: v } }), - )} - {renderCheckbox('Cold Milk (Milch kalt)', breakfast.beverages.coldMilk, (v) => - setBreakfast({ ...breakfast, beverages: { ...breakfast.beverages, coldMilk: v } }), - )} -
-
+ -
-

Additions (Zusätze)

-
- {renderCheckbox('Sugar (Zucker)', breakfast.additions.sugar, (v) => - setBreakfast({ ...breakfast, additions: { ...breakfast.additions, sugar: v } }), - )} - {renderCheckbox('Sweetener (Süßstoff)', breakfast.additions.sweetener, (v) => - setBreakfast({ ...breakfast, additions: { ...breakfast.additions, sweetener: v } }), - )} - {renderCheckbox('Coffee Creamer (Kaffeesahne)', breakfast.additions.coffeeCreamer, (v) => - setBreakfast({ ...breakfast, additions: { ...breakfast.additions, coffeeCreamer: v } }), - )} +
+

Additions (Zusätze)

+
+ setBreakfast({ ...breakfast, additions: { ...breakfast.additions, sugar: v } })} /> + setBreakfast({ ...breakfast, additions: { ...breakfast.additions, sweetener: v } })} /> + setBreakfast({ ...breakfast, additions: { ...breakfast.additions, coffeeCreamer: v } })} />
@@ -508,83 +521,63 @@ function NewOrderContent() { {/* LUNCH OPTIONS */} {mealType === 'lunch' && ( <> -
-

Portion Size

-
- - - +
+

Portion Size

+ setLunch({ ...lunch, portionSize: v as 'small' | 'large' | 'vegetarian' })} + className="grid gap-2 sm:grid-cols-3" + > + {[ + { value: 'small', label: 'Small (Kleine)' }, + { value: 'large', label: 'Large (Große)' }, + { value: 'vegetarian', label: 'Vegetarian' }, + ].map(({ value, label }) => ( +
setLunch({ ...lunch, portionSize: value as 'small' | 'large' | 'vegetarian' })} + > + + +
+ ))} +
+
+ + + +
+

Meal Options

+
+ setLunch({ ...lunch, soup: v })} /> + setLunch({ ...lunch, dessert: v })} />
-
-

Meal Options

-
- {renderCheckbox('Soup (Suppe)', lunch.soup, (v) => setLunch({ ...lunch, soup: v }))} - {renderCheckbox('Dessert', lunch.dessert, (v) => setLunch({ ...lunch, dessert: v }))} + + +
+

Special Preparations

+
+ setLunch({ ...lunch, specialPreparations: { ...lunch.specialPreparations, pureedFood: v } })} /> + setLunch({ ...lunch, specialPreparations: { ...lunch.specialPreparations, pureedMeat: v } })} /> + setLunch({ ...lunch, specialPreparations: { ...lunch.specialPreparations, slicedMeat: v } })} /> + setLunch({ ...lunch, specialPreparations: { ...lunch.specialPreparations, mashedPotatoes: v } })} />
-
-

Special Preparations

-
- {renderCheckbox('Pureed Food (passierte Kost)', lunch.specialPreparations.pureedFood, (v) => - setLunch({ ...lunch, specialPreparations: { ...lunch.specialPreparations, pureedFood: v } }), - )} - {renderCheckbox('Pureed Meat (passiertes Fleisch)', lunch.specialPreparations.pureedMeat, (v) => - setLunch({ ...lunch, specialPreparations: { ...lunch.specialPreparations, pureedMeat: v } }), - )} - {renderCheckbox('Sliced Meat (geschnittenes Fleisch)', lunch.specialPreparations.slicedMeat, (v) => - setLunch({ ...lunch, specialPreparations: { ...lunch.specialPreparations, slicedMeat: v } }), - )} - {renderCheckbox('Mashed Potatoes (Kartoffelbrei)', lunch.specialPreparations.mashedPotatoes, (v) => - setLunch({ ...lunch, specialPreparations: { ...lunch.specialPreparations, mashedPotatoes: v } }), - )} -
-
+ -
-

Restrictions

-
- {renderCheckbox('No Fish (ohne Fisch)', lunch.restrictions.noFish, (v) => - setLunch({ ...lunch, restrictions: { ...lunch.restrictions, noFish: v } }), - )} - {renderCheckbox('Finger Food', lunch.restrictions.fingerFood, (v) => - setLunch({ ...lunch, restrictions: { ...lunch.restrictions, fingerFood: v } }), - )} - {renderCheckbox('Only Sweet (nur süß)', lunch.restrictions.onlySweet, (v) => - setLunch({ ...lunch, restrictions: { ...lunch.restrictions, onlySweet: v } }), - )} +
+

Restrictions

+
+ setLunch({ ...lunch, restrictions: { ...lunch.restrictions, noFish: v } })} /> + setLunch({ ...lunch, restrictions: { ...lunch.restrictions, fingerFood: v } })} /> + setLunch({ ...lunch, restrictions: { ...lunch.restrictions, onlySweet: v } })} />
@@ -593,163 +586,161 @@ function NewOrderContent() { {/* DINNER OPTIONS */} {mealType === 'dinner' && ( <> -
-

General

-
- {renderCheckbox('According to Plan (lt. Plan)', dinner.accordingToPlan, (v) => - setDinner({ ...dinner, accordingToPlan: v }), - )} +
+

General

+ setDinner({ ...dinner, accordingToPlan: v })} + /> +
+ + + +
+

Bread (Brot)

+
+ setDinner({ ...dinner, bread: { ...dinner.bread, greyBread: v } })} /> + setDinner({ ...dinner, bread: { ...dinner.bread, wholeGrainBread: v } })} /> + setDinner({ ...dinner, bread: { ...dinner.bread, whiteBread: v } })} /> + setDinner({ ...dinner, bread: { ...dinner.bread, crispbread: v } })} />
-
-

Bread (Brot)

-
- {renderCheckbox('Grey Bread (Graubrot)', dinner.bread.greyBread, (v) => - setDinner({ ...dinner, bread: { ...dinner.bread, greyBread: v } }), - )} - {renderCheckbox('Whole Grain Bread (Vollkornbrot)', dinner.bread.wholeGrainBread, (v) => - setDinner({ ...dinner, bread: { ...dinner.bread, wholeGrainBread: v } }), - )} - {renderCheckbox('White Bread (Weißbrot)', dinner.bread.whiteBread, (v) => - setDinner({ ...dinner, bread: { ...dinner.bread, whiteBread: v } }), - )} - {renderCheckbox('Crispbread (Knäckebrot)', dinner.bread.crispbread, (v) => - setDinner({ ...dinner, bread: { ...dinner.bread, crispbread: v } }), - )} + + +
+

Preparation

+
+ setDinner({ ...dinner, preparation: { ...dinner.preparation, spread: v } })} /> + setDinner({ ...dinner, preparation: { ...dinner.preparation, sliced: v } })} />
-
-

Preparation

-
- {renderCheckbox('Spread (geschmiert)', dinner.preparation.spread, (v) => - setDinner({ ...dinner, preparation: { ...dinner.preparation, spread: v } }), - )} - {renderCheckbox('Sliced (geschnitten)', dinner.preparation.sliced, (v) => - setDinner({ ...dinner, preparation: { ...dinner.preparation, sliced: v } }), - )} + + +
+

Spreads (Aufstrich)

+
+ setDinner({ ...dinner, spreads: { ...dinner.spreads, butter: v } })} /> + setDinner({ ...dinner, spreads: { ...dinner.spreads, margarine: v } })} />
-
-

Spreads (Aufstrich)

-
- {renderCheckbox('Butter', dinner.spreads.butter, (v) => - setDinner({ ...dinner, spreads: { ...dinner.spreads, butter: v } }), - )} - {renderCheckbox('Margarine', dinner.spreads.margarine, (v) => - setDinner({ ...dinner, spreads: { ...dinner.spreads, margarine: v } }), - )} + + +
+

Additional Items

+
+ setDinner({ ...dinner, soup: v })} /> + setDinner({ ...dinner, porridge: v })} /> + setDinner({ ...dinner, noFish: v })} />
-
-

Additional Items

-
- {renderCheckbox('Soup (Suppe)', dinner.soup, (v) => setDinner({ ...dinner, soup: v }))} - {renderCheckbox('Porridge (Brei)', dinner.porridge, (v) => - setDinner({ ...dinner, porridge: v }), - )} - {renderCheckbox('No Fish (ohne Fisch)', dinner.noFish, (v) => - setDinner({ ...dinner, noFish: v }), - )} + + +
+

Beverages (Getränke)

+
+ setDinner({ ...dinner, beverages: { ...dinner.beverages, tea: v } })} /> + setDinner({ ...dinner, beverages: { ...dinner.beverages, cocoa: v } })} /> + setDinner({ ...dinner, beverages: { ...dinner.beverages, hotMilk: v } })} /> + setDinner({ ...dinner, beverages: { ...dinner.beverages, coldMilk: v } })} />
-
-

Beverages (Getränke)

-
- {renderCheckbox('Tea (Tee)', dinner.beverages.tea, (v) => - setDinner({ ...dinner, beverages: { ...dinner.beverages, tea: v } }), - )} - {renderCheckbox('Cocoa (Kakao)', dinner.beverages.cocoa, (v) => - setDinner({ ...dinner, beverages: { ...dinner.beverages, cocoa: v } }), - )} - {renderCheckbox('Hot Milk (Milch heiß)', dinner.beverages.hotMilk, (v) => - setDinner({ ...dinner, beverages: { ...dinner.beverages, hotMilk: v } }), - )} - {renderCheckbox('Cold Milk (Milch kalt)', dinner.beverages.coldMilk, (v) => - setDinner({ ...dinner, beverages: { ...dinner.beverages, coldMilk: v } }), - )} -
-
+ -
-

Additions (Zusätze)

-
- {renderCheckbox('Sugar (Zucker)', dinner.additions.sugar, (v) => - setDinner({ ...dinner, additions: { ...dinner.additions, sugar: v } }), - )} - {renderCheckbox('Sweetener (Süßstoff)', dinner.additions.sweetener, (v) => - setDinner({ ...dinner, additions: { ...dinner.additions, sweetener: v } }), - )} +
+

Additions (Zusätze)

+
+ setDinner({ ...dinner, additions: { ...dinner.additions, sugar: v } })} /> + setDinner({ ...dinner, additions: { ...dinner.additions, sweetener: v } })} />
)} -
- - + +
-
-
+ + )} {/* Step 4: Review and Submit */} {step === 4 && ( -
-
-

Step 4: Review & Submit

-
-
-
-
- Resident - {selectedResident?.name} + + + Step 4: Review & Submit + + +
+
+ Resident + {selectedResident?.name}
-
- Room - {selectedResident?.room} + +
+ Room + {selectedResident?.room}
-
- Date - {date} + +
+ Date + {date}
-
- Meal Type - {mealType && getMealTypeLabel(mealType)} + +
+ Meal Type + {mealType && getMealTypeLabel(mealType)}
{selectedResident?.highCaloric && ( -
- Note: This resident requires high caloric meals. -
+ + + + Note: This resident requires high caloric meals. + + )} -
- - + {submitting ? ( + <> + + Creating... + + ) : ( + <> + + Create Order + + )} +
-
-
+ + )}
- +
) } @@ -757,8 +748,8 @@ export default function NewOrderPage() { return ( -
+
+
} > diff --git a/src/app/(app)/caregiver/orders/page.tsx b/src/app/(app)/caregiver/orders/page.tsx index 002627c..825b418 100644 --- a/src/app/(app)/caregiver/orders/page.tsx +++ b/src/app/(app)/caregiver/orders/page.tsx @@ -3,6 +3,28 @@ import React, { useState, useEffect } from 'react' import { useRouter } from 'next/navigation' import Link from 'next/link' +import { ArrowLeft, Plus, Loader2 } from 'lucide-react' + +import { Button } from '@/components/ui/button' +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' +import { Input } from '@/components/ui/input' +import { Label } from '@/components/ui/label' +import { Badge } from '@/components/ui/badge' +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select' +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from '@/components/ui/table' interface Resident { id: number @@ -69,7 +91,16 @@ export default function OrdersListPage() { } const getStatusBadge = (status: string) => { - return {status.charAt(0).toUpperCase() + status.slice(1)} + switch (status) { + case 'pending': + return Pending + case 'preparing': + return Preparing + case 'prepared': + return Prepared + default: + return {status} + } } const getResidentName = (resident: Resident | number) => { @@ -80,89 +111,99 @@ export default function OrdersListPage() { } return ( - <> -
-
- - ← Back - -

Meal Orders

- - + New Order - +
+
+
+
+ +

Meal Orders

+
+
-
-
-
-

Filter Orders

-
-
-
-
- - + + + Filter Orders + + +
+
+ + setDateFilter(e.target.value)} />
-
- - +
+ +
-
-
+ + -
-
+ + {loading ? ( -
-
+
+
) : orders.length === 0 ? ( -
- No orders found for the selected criteria. +
+

No orders found for the selected criteria.

+
) : ( - - - - - - - - - - +
ResidentDateMealStatus
+ + + Resident + Date + Meal + Status + + + {orders.map((order) => ( - - - - - - + + {getResidentName(order.resident)} + {order.date} + {getMealTypeLabel(order.mealType)} + {getStatusBadge(order.status)} + ))} - -
{getResidentName(order.resident)}{order.date}{getMealTypeLabel(order.mealType)}{getStatusBadge(order.status)}
+ + )} -
-
+ +
- +
) } diff --git a/src/app/(app)/caregiver/residents/page.tsx b/src/app/(app)/caregiver/residents/page.tsx index 32e4b58..36980a6 100644 --- a/src/app/(app)/caregiver/residents/page.tsx +++ b/src/app/(app)/caregiver/residents/page.tsx @@ -3,6 +3,12 @@ import React, { useState, useEffect } from 'react' import { useRouter } from 'next/navigation' import Link from 'next/link' +import { ArrowLeft, Search, Loader2, Plus } from 'lucide-react' + +import { Button } from '@/components/ui/button' +import { Card, CardContent } from '@/components/ui/card' +import { Input } from '@/components/ui/input' +import { Badge } from '@/components/ui/badge' interface Resident { id: number @@ -51,83 +57,93 @@ export default function ResidentsListPage() { ) return ( - <> -
-
- - ← Back - -

Residents

+
+
+
+ +

Residents

-
-
-

Residents

-

View resident information and dietary requirements

+
+
+

Residents

+

View resident information and dietary requirements

-
-
- +
+ + setSearchQuery(e.target.value)} + className="pl-10" />
{loading ? ( -
-
+
+
) : filteredResidents.length === 0 ? ( -
-
- No residents found. -
-
+ + +

No residents found.

+
+
) : ( -
+
{filteredResidents.map((resident) => ( -
-
{resident.name}
-
- Room {resident.room} - {resident.table && Table {resident.table}} - {resident.station && {resident.station}} -
- {resident.highCaloric && ( -
High Caloric
- )} - {(resident.aversions || resident.notes) && ( -
- {resident.aversions && ( -
- Aversions: {resident.aversions} -
- )} - {resident.notes && ( -
- Notes: {resident.notes} -
- )} + + +
{resident.name}
+
+ Room {resident.room} + {resident.table && Table {resident.table}} + {resident.station && {resident.station}}
- )} -
- - Create Order - -
-
+ + {resident.highCaloric && ( + + High Caloric + + )} + + {(resident.aversions || resident.notes) && ( +
+ {resident.aversions && ( +
+ Aversions: {resident.aversions} +
+ )} + {resident.notes && ( +
+ Notes: {resident.notes} +
+ )} +
+ )} + + + + ))}
)}
- +
) } diff --git a/src/app/(app)/index.scss b/src/app/(app)/index.scss deleted file mode 100644 index d4688b6..0000000 --- a/src/app/(app)/index.scss +++ /dev/null @@ -1,704 +0,0 @@ -/* Caregiver Tablet App Styles */ -:root { - --primary: #2563eb; - --primary-hover: #1d4ed8; - --success: #16a34a; - --success-hover: #15803d; - --warning: #ca8a04; - --error: #dc2626; - --gray-50: #f9fafb; - --gray-100: #f3f4f6; - --gray-200: #e5e7eb; - --gray-300: #d1d5db; - --gray-400: #9ca3af; - --gray-500: #6b7280; - --gray-600: #4b5563; - --gray-700: #374151; - --gray-800: #1f2937; - --gray-900: #111827; - --radius: 12px; - --shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); - --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); -} - -.caregiver-app { - * { - box-sizing: border-box; - margin: 0; - padding: 0; - } - - body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; - background: var(--gray-100); - color: var(--gray-900); - min-height: 100vh; - -webkit-font-smoothing: antialiased; - } -} - -/* Container */ -.container { - max-width: 1200px; - margin: 0 auto; - padding: 1rem; -} - -/* Header */ -.header { - background: white; - border-bottom: 1px solid var(--gray-200); - padding: 1rem; - position: sticky; - top: 0; - z-index: 100; - box-shadow: var(--shadow); - - &__content { - max-width: 1200px; - margin: 0 auto; - display: flex; - justify-content: space-between; - align-items: center; - gap: 1rem; - flex-wrap: wrap; - } - - &__title { - font-size: 1.5rem; - font-weight: 600; - color: var(--gray-900); - } - - &__user { - display: flex; - align-items: center; - gap: 1rem; - } - - &__user-name { - color: var(--gray-600); - font-size: 0.875rem; - } -} - -/* Page Title */ -.page-title { - margin: 1.5rem 0; - - h1 { - font-size: 1.75rem; - font-weight: 600; - color: var(--gray-900); - margin-bottom: 0.5rem; - } - - p { - color: var(--gray-500); - font-size: 1rem; - } -} - -/* Buttons */ -.btn { - display: inline-flex; - align-items: center; - justify-content: center; - gap: 0.5rem; - padding: 1rem 1.5rem; - font-size: 1rem; - font-weight: 500; - border-radius: var(--radius); - border: none; - cursor: pointer; - transition: all 0.2s ease; - min-height: 52px; - text-decoration: none; - - &:active { - transform: scale(0.98); - } - - &--primary { - background: var(--primary); - color: white; - - &:hover { - background: var(--primary-hover); - } - } - - &--success { - background: var(--success); - color: white; - - &:hover { - background: var(--success-hover); - } - } - - &--secondary { - background: white; - color: var(--gray-700); - border: 1px solid var(--gray-300); - - &:hover { - background: var(--gray-50); - } - } - - &--danger { - background: var(--error); - color: white; - - &:hover { - background: #b91c1c; - } - } - - &--large { - padding: 1.25rem 2rem; - font-size: 1.125rem; - min-height: 64px; - } - - &--block { - width: 100%; - } - - &:disabled { - opacity: 0.5; - cursor: not-allowed; - } -} - -/* Cards */ -.card { - background: white; - border-radius: var(--radius); - box-shadow: var(--shadow); - overflow: hidden; - - &__header { - padding: 1rem 1.25rem; - border-bottom: 1px solid var(--gray-200); - background: var(--gray-50); - - h2 { - font-size: 1.125rem; - font-weight: 600; - color: var(--gray-800); - } - } - - &__body { - padding: 1.25rem; - } -} - -/* Form elements */ -.form-group { - margin-bottom: 1.25rem; - - label { - display: block; - font-weight: 500; - color: var(--gray-700); - margin-bottom: 0.5rem; - font-size: 0.9375rem; - } -} - -.input { - width: 100%; - padding: 0.875rem 1rem; - font-size: 1rem; - border: 1px solid var(--gray-300); - border-radius: var(--radius); - background: white; - transition: border-color 0.2s, box-shadow 0.2s; - - &:focus { - outline: none; - border-color: var(--primary); - box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1); - } -} - -.select { - width: 100%; - padding: 0.875rem 1rem; - font-size: 1rem; - border: 1px solid var(--gray-300); - border-radius: var(--radius); - background: white; - cursor: pointer; - - &:focus { - outline: none; - border-color: var(--primary); - box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1); - } -} - -/* Checkbox Group */ -.checkbox-group { - display: grid; - gap: 0.75rem; - - &--cols-2 { - grid-template-columns: repeat(2, 1fr); - } - - &--cols-3 { - grid-template-columns: repeat(3, 1fr); - } -} - -.checkbox-item { - display: flex; - align-items: center; - gap: 0.75rem; - padding: 0.875rem; - background: var(--gray-50); - border: 2px solid var(--gray-200); - border-radius: var(--radius); - cursor: pointer; - transition: all 0.2s; - min-height: 52px; - - &:hover { - border-color: var(--gray-300); - } - - &--checked { - background: #eff6ff; - border-color: var(--primary); - } - - input[type="checkbox"] { - width: 24px; - height: 24px; - accent-color: var(--primary); - cursor: pointer; - } - - span { - font-size: 0.9375rem; - color: var(--gray-700); - } -} - -/* Resident Card */ -.resident-card { - background: white; - border: 2px solid var(--gray-200); - border-radius: var(--radius); - padding: 1rem; - cursor: pointer; - transition: all 0.2s; - - &:hover { - border-color: var(--gray-300); - box-shadow: var(--shadow-md); - } - - &--selected { - background: #eff6ff; - border-color: var(--primary); - } - - &__name { - font-size: 1.125rem; - font-weight: 600; - color: var(--gray-900); - margin-bottom: 0.5rem; - } - - &__details { - display: flex; - gap: 1rem; - flex-wrap: wrap; - font-size: 0.875rem; - color: var(--gray-500); - } - - &__badge { - display: inline-flex; - align-items: center; - gap: 0.25rem; - background: var(--warning); - color: white; - padding: 0.25rem 0.5rem; - border-radius: 4px; - font-size: 0.75rem; - font-weight: 500; - margin-top: 0.5rem; - } -} - -/* Resident List */ -.resident-list { - display: grid; - gap: 0.75rem; - grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); -} - -/* Meal Type Buttons */ -.meal-type-grid { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 1rem; -} - -.meal-type-btn { - background: white; - border: 2px solid var(--gray-200); - border-radius: var(--radius); - padding: 2rem 1rem; - cursor: pointer; - transition: all 0.2s; - text-align: center; - - &:hover { - border-color: var(--gray-300); - } - - &--selected { - background: #eff6ff; - border-color: var(--primary); - } - - &__icon { - font-size: 2.5rem; - margin-bottom: 0.5rem; - } - - &__label { - font-size: 1rem; - font-weight: 600; - color: var(--gray-800); - } - - &__sublabel { - font-size: 0.875rem; - color: var(--gray-500); - margin-top: 0.25rem; - } -} - -/* Section */ -.section { - margin-bottom: 2rem; - - &__title { - font-size: 1rem; - font-weight: 600; - color: var(--gray-700); - margin-bottom: 1rem; - padding-bottom: 0.5rem; - border-bottom: 1px solid var(--gray-200); - } -} - -/* Steps indicator */ -.steps { - display: flex; - gap: 0.5rem; - margin-bottom: 1.5rem; - - &__step { - flex: 1; - height: 4px; - background: var(--gray-200); - border-radius: 2px; - transition: background 0.3s; - - &--active { - background: var(--primary); - } - - &--completed { - background: var(--success); - } - } -} - -/* Order Summary */ -.order-summary { - background: var(--gray-50); - border-radius: var(--radius); - padding: 1.25rem; - - &__row { - display: flex; - justify-content: space-between; - padding: 0.5rem 0; - border-bottom: 1px solid var(--gray-200); - - &:last-child { - border-bottom: none; - } - } - - &__label { - color: var(--gray-600); - } - - &__value { - font-weight: 500; - color: var(--gray-900); - } -} - -/* Message boxes */ -.message { - padding: 1rem 1.25rem; - border-radius: var(--radius); - margin-bottom: 1rem; - - &--success { - background: #dcfce7; - color: #166534; - border: 1px solid #86efac; - } - - &--error { - background: #fee2e2; - color: #991b1b; - border: 1px solid #fca5a5; - } - - &--warning { - background: #fef3c7; - color: #92400e; - border: 1px solid #fcd34d; - } -} - -/* Loading spinner */ -.spinner { - width: 24px; - height: 24px; - border: 3px solid var(--gray-200); - border-top-color: var(--primary); - border-radius: 50%; - animation: spin 0.8s linear infinite; -} - -@keyframes spin { - to { - transform: rotate(360deg); - } -} - -/* Grid */ -.grid { - display: grid; - gap: 1rem; - - &--2 { - grid-template-columns: repeat(2, 1fr); - } - - &--3 { - grid-template-columns: repeat(3, 1fr); - } -} - -/* Login page */ -.login-page { - min-height: 100vh; - display: flex; - align-items: center; - justify-content: center; - padding: 1rem; - - &__card { - width: 100%; - max-width: 400px; - } - - &__logo { - text-align: center; - margin-bottom: 2rem; - - h1 { - font-size: 1.5rem; - color: var(--gray-900); - margin-bottom: 0.5rem; - } - - p { - color: var(--gray-500); - } - } -} - -/* Dashboard stats */ -.stats-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 1rem; - margin-bottom: 2rem; -} - -.stat-card { - background: white; - border-radius: var(--radius); - padding: 1.25rem; - box-shadow: var(--shadow); - - &__value { - font-size: 2rem; - font-weight: 700; - color: var(--gray-900); - } - - &__label { - color: var(--gray-500); - font-size: 0.875rem; - margin-top: 0.25rem; - } -} - -/* Quick actions */ -.quick-actions { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); - gap: 1rem; -} - -.quick-action { - background: white; - border: 2px solid var(--gray-200); - border-radius: var(--radius); - padding: 1.5rem; - text-align: center; - cursor: pointer; - transition: all 0.2s; - text-decoration: none; - color: inherit; - - &:hover { - border-color: var(--primary); - box-shadow: var(--shadow-md); - } - - &__icon { - font-size: 2rem; - margin-bottom: 0.5rem; - } - - &__label { - font-weight: 500; - color: var(--gray-700); - } -} - -/* Table */ -.table { - width: 100%; - border-collapse: collapse; - - th, - td { - padding: 0.875rem 1rem; - text-align: left; - border-bottom: 1px solid var(--gray-200); - } - - th { - background: var(--gray-50); - font-weight: 600; - color: var(--gray-700); - font-size: 0.875rem; - text-transform: uppercase; - letter-spacing: 0.05em; - } - - tbody tr:hover { - background: var(--gray-50); - } -} - -/* Badge */ -.badge { - display: inline-flex; - align-items: center; - padding: 0.25rem 0.75rem; - border-radius: 9999px; - font-size: 0.75rem; - font-weight: 500; - - &--pending { - background: #fef3c7; - color: #92400e; - } - - &--preparing { - background: #dbeafe; - color: #1e40af; - } - - &--prepared { - background: #dcfce7; - color: #166534; - } -} - -/* Actions bar */ -.actions-bar { - display: flex; - gap: 1rem; - justify-content: space-between; - align-items: center; - flex-wrap: wrap; - margin-bottom: 1.5rem; -} - -/* Search */ -.search-box { - position: relative; - flex: 1; - min-width: 200px; - max-width: 400px; - - input { - width: 100%; - padding: 0.75rem 1rem 0.75rem 2.5rem; - border: 1px solid var(--gray-300); - border-radius: var(--radius); - font-size: 1rem; - } - - &::before { - content: '🔍'; - position: absolute; - left: 0.75rem; - top: 50%; - transform: translateY(-50%); - font-size: 1rem; - } -} - -/* Responsive */ -@media (max-width: 768px) { - .meal-type-grid { - grid-template-columns: 1fr; - } - - .checkbox-group--cols-2, - .checkbox-group--cols-3 { - grid-template-columns: 1fr; - } - - .grid--2, - .grid--3 { - grid-template-columns: 1fr; - } - - .resident-list { - grid-template-columns: 1fr; - } -} diff --git a/src/app/(app)/layout.tsx b/src/app/(app)/layout.tsx index a4b464f..2864bda 100644 --- a/src/app/(app)/layout.tsx +++ b/src/app/(app)/layout.tsx @@ -1,6 +1,6 @@ import React from 'react' -import './index.scss' +import '@/app/globals.css' export const metadata = { description: 'Meal ordering for caregivers', @@ -10,8 +10,8 @@ export const metadata = { // eslint-disable-next-line no-restricted-exports export default function RootLayout({ children }: { children: React.ReactNode }) { return ( - - {children} + + {children} ) } diff --git a/src/app/(payload)/admin/importMap.js b/src/app/(payload)/admin/importMap.js index 842a9f3..51d1abf 100644 --- a/src/app/(payload)/admin/importMap.js +++ b/src/app/(payload)/admin/importMap.js @@ -1,13 +1,15 @@ +import { WatchTenantCollection as WatchTenantCollection_1d0591e3cf4f332c83a86da13a0de59a } from '@payloadcms/plugin-multi-tenant/client' import { TenantField as TenantField_1d0591e3cf4f332c83a86da13a0de59a } from '@payloadcms/plugin-multi-tenant/client' import { AssignTenantFieldTrigger as AssignTenantFieldTrigger_1d0591e3cf4f332c83a86da13a0de59a } from '@payloadcms/plugin-multi-tenant/client' -import { WatchTenantCollection as WatchTenantCollection_1d0591e3cf4f332c83a86da13a0de59a } from '@payloadcms/plugin-multi-tenant/client' import { TenantSelector as TenantSelector_d6d5f193a167989e2ee7d14202901e62 } from '@payloadcms/plugin-multi-tenant/rsc' import { TenantSelectionProvider as TenantSelectionProvider_d6d5f193a167989e2ee7d14202901e62 } from '@payloadcms/plugin-multi-tenant/rsc' +import { KitchenDashboard as KitchenDashboard_466f0c465119ff8e562eb80399daabc0 } from './views/KitchenDashboard' export const importMap = { + "@payloadcms/plugin-multi-tenant/client#WatchTenantCollection": WatchTenantCollection_1d0591e3cf4f332c83a86da13a0de59a, "@payloadcms/plugin-multi-tenant/client#TenantField": TenantField_1d0591e3cf4f332c83a86da13a0de59a, "@payloadcms/plugin-multi-tenant/client#AssignTenantFieldTrigger": AssignTenantFieldTrigger_1d0591e3cf4f332c83a86da13a0de59a, - "@payloadcms/plugin-multi-tenant/client#WatchTenantCollection": WatchTenantCollection_1d0591e3cf4f332c83a86da13a0de59a, "@payloadcms/plugin-multi-tenant/rsc#TenantSelector": TenantSelector_d6d5f193a167989e2ee7d14202901e62, - "@payloadcms/plugin-multi-tenant/rsc#TenantSelectionProvider": TenantSelectionProvider_d6d5f193a167989e2ee7d14202901e62 + "@payloadcms/plugin-multi-tenant/rsc#TenantSelectionProvider": TenantSelectionProvider_d6d5f193a167989e2ee7d14202901e62, + "/app/(payload)/admin/views/KitchenDashboard#KitchenDashboard": KitchenDashboard_466f0c465119ff8e562eb80399daabc0 } diff --git a/src/app/components/Login/client.page.tsx b/src/app/components/Login/client.page.tsx deleted file mode 100644 index 4092777..0000000 --- a/src/app/components/Login/client.page.tsx +++ /dev/null @@ -1,83 +0,0 @@ -'use client' -import type { FormEvent } from 'react' - -import { useRouter, useSearchParams } from 'next/navigation' -import React from 'react' - -import './index.scss' - -const baseClass = 'loginPage' - -// go to /tenant1/home -// redirects to /tenant1/login?redirect=%2Ftenant1%2Fhome -// login, uses slug to set payload-tenant cookie - -type Props = { - tenantSlug?: string - tenantDomain?: string -} -export const Login = ({ tenantSlug, tenantDomain }: Props) => { - const usernameRef = React.useRef(null) - const passwordRef = React.useRef(null) - const router = useRouter() - const searchParams = useSearchParams() - - const handleSubmit = async (e: FormEvent) => { - e.preventDefault() - if (!usernameRef?.current?.value || !passwordRef?.current?.value) { - return - } - const actionRes = await fetch('/api/users/external-users/login', { - body: JSON.stringify({ - password: passwordRef.current.value, - tenantSlug, - tenantDomain, - username: usernameRef.current.value, - }), - headers: { - 'content-type': 'application/json', - }, - method: 'post', - }) - const json = await actionRes.json() - - if (actionRes.status === 200 && json.user) { - const redirectTo = searchParams.get('redirect') - if (redirectTo) { - router.push(redirectTo) - return - } else { - if (tenantDomain) { - router.push('/tenant-domains') - } else { - router.push(`/tenant-slugs/${tenantSlug}`) - } - } - } else if (actionRes.status === 400 && json?.errors?.[0]?.message) { - window.alert(json.errors[0].message) - } else { - window.alert('Something went wrong, please try again.') - } - } - - return ( -
-
-
- -
-
- -
- - -
-
- ) -} diff --git a/src/app/components/Login/index.scss b/src/app/components/Login/index.scss deleted file mode 100644 index 5e352b9..0000000 --- a/src/app/components/Login/index.scss +++ /dev/null @@ -1,29 +0,0 @@ -.loginPage { - min-height: 100vh; - display: flex; - align-items: center; - justify-content: center; - - form { - display: flex; - align-items: flex-start; - flex-direction: column; - gap: 16px; - } - - label { - display: flex; - flex-direction: column; - gap: 4px; - } - - input { - padding: 8px 16px; - width: 300px; - } - - button { - margin-top: 4px; - padding: 8px 20px; - } -} diff --git a/src/app/globals.css b/src/app/globals.css new file mode 100644 index 0000000..d6e531f --- /dev/null +++ b/src/app/globals.css @@ -0,0 +1,169 @@ +@import "tailwindcss"; +@import "tw-animate-css"; + +@custom-variant dark (&:is(.dark *)); + +@theme { + --color-background: hsl(0 0% 100%); + --color-foreground: hsl(240 10% 3.9%); + --color-card: hsl(0 0% 100%); + --color-card-foreground: hsl(240 10% 3.9%); + --color-popover: hsl(0 0% 100%); + --color-popover-foreground: hsl(240 10% 3.9%); + --color-primary: hsl(240 5.9% 10%); + --color-primary-foreground: hsl(0 0% 98%); + --color-secondary: hsl(240 4.8% 95.9%); + --color-secondary-foreground: hsl(240 5.9% 10%); + --color-muted: hsl(240 4.8% 95.9%); + --color-muted-foreground: hsl(240 3.8% 46.1%); + --color-accent: hsl(240 4.8% 95.9%); + --color-accent-foreground: hsl(240 5.9% 10%); + --color-destructive: hsl(0 84.2% 60.2%); + --color-destructive-foreground: hsl(0 0% 98%); + --color-border: hsl(240 5.9% 90%); + --color-input: hsl(240 5.9% 90%); + --color-ring: hsl(240 5.9% 10%); + --color-chart-1: hsl(12 76% 61%); + --color-chart-2: hsl(173 58% 39%); + --color-chart-3: hsl(197 37% 24%); + --color-chart-4: hsl(43 74% 66%); + --color-chart-5: hsl(27 87% 67%); + --radius-sm: 0.25rem; + --radius-md: 0.5rem; + --radius-lg: 0.75rem; + --radius-xl: 1rem; +} + +@layer base { + *, + *::before, + *::after { + @apply border-border; + } + + body { + @apply bg-background text-foreground; + } +} + +@theme inline { + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --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); + --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); +} + +: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; + } +} + +@layer utilities { + .container { + @apply mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8; + } +} diff --git a/src/components/ui/alert.tsx b/src/components/ui/alert.tsx new file mode 100644 index 0000000..1421354 --- /dev/null +++ b/src/components/ui/alert.tsx @@ -0,0 +1,66 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const alertVariants = cva( + "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current", + { + variants: { + variant: { + default: "bg-card text-card-foreground", + destructive: + "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +function Alert({ + className, + variant, + ...props +}: React.ComponentProps<"div"> & VariantProps) { + return ( +
+ ) +} + +function AlertTitle({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function AlertDescription({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ) +} + +export { Alert, AlertTitle, AlertDescription } diff --git a/src/components/ui/badge.tsx b/src/components/ui/badge.tsx new file mode 100644 index 0000000..fd3a406 --- /dev/null +++ b/src/components/ui/badge.tsx @@ -0,0 +1,46 @@ +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 badgeVariants = cva( + "inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-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 transition-[color,box-shadow] overflow-hidden", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90", + secondary: + "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90", + destructive: + "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + outline: + "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +function Badge({ + className, + variant, + asChild = false, + ...props +}: React.ComponentProps<"span"> & + VariantProps & { asChild?: boolean }) { + const Comp = asChild ? Slot : "span" + + return ( + + ) +} + +export { Badge, badgeVariants } diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx new file mode 100644 index 0000000..21409a0 --- /dev/null +++ b/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/src/components/ui/card.tsx b/src/components/ui/card.tsx new file mode 100644 index 0000000..681ad98 --- /dev/null +++ b/src/components/ui/card.tsx @@ -0,0 +1,92 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +function Card({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardHeader({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardTitle({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardDescription({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardAction({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardContent({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardFooter({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +export { + Card, + CardHeader, + CardFooter, + CardTitle, + CardAction, + CardDescription, + CardContent, +} diff --git a/src/components/ui/checkbox.tsx b/src/components/ui/checkbox.tsx new file mode 100644 index 0000000..cb0b07b --- /dev/null +++ b/src/components/ui/checkbox.tsx @@ -0,0 +1,32 @@ +"use client" + +import * as React from "react" +import * as CheckboxPrimitive from "@radix-ui/react-checkbox" +import { CheckIcon } from "lucide-react" + +import { cn } from "@/lib/utils" + +function Checkbox({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + + + ) +} + +export { Checkbox } diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx new file mode 100644 index 0000000..8916905 --- /dev/null +++ b/src/components/ui/input.tsx @@ -0,0 +1,21 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +function Input({ className, type, ...props }: React.ComponentProps<"input">) { + return ( + + ) +} + +export { Input } diff --git a/src/components/ui/label.tsx b/src/components/ui/label.tsx new file mode 100644 index 0000000..fb5fbc3 --- /dev/null +++ b/src/components/ui/label.tsx @@ -0,0 +1,24 @@ +"use client" + +import * as React from "react" +import * as LabelPrimitive from "@radix-ui/react-label" + +import { cn } from "@/lib/utils" + +function Label({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { Label } diff --git a/src/components/ui/radio-group.tsx b/src/components/ui/radio-group.tsx new file mode 100644 index 0000000..5e6778c --- /dev/null +++ b/src/components/ui/radio-group.tsx @@ -0,0 +1,45 @@ +"use client" + +import * as React from "react" +import * as RadioGroupPrimitive from "@radix-ui/react-radio-group" +import { CircleIcon } from "lucide-react" + +import { cn } from "@/lib/utils" + +function RadioGroup({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function RadioGroupItem({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + + + ) +} + +export { RadioGroup, RadioGroupItem } diff --git a/src/components/ui/select.tsx b/src/components/ui/select.tsx new file mode 100644 index 0000000..25e5439 --- /dev/null +++ b/src/components/ui/select.tsx @@ -0,0 +1,187 @@ +"use client" + +import * as React from "react" +import * as SelectPrimitive from "@radix-ui/react-select" +import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react" + +import { cn } from "@/lib/utils" + +function Select({ + ...props +}: React.ComponentProps) { + return +} + +function SelectGroup({ + ...props +}: React.ComponentProps) { + return +} + +function SelectValue({ + ...props +}: React.ComponentProps) { + return +} + +function SelectTrigger({ + className, + size = "default", + children, + ...props +}: React.ComponentProps & { + size?: "sm" | "default" +}) { + return ( + + {children} + + + + + ) +} + +function SelectContent({ + className, + children, + position = "popper", + align = "center", + ...props +}: React.ComponentProps) { + return ( + + + + + {children} + + + + + ) +} + +function SelectLabel({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function SelectItem({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + + + + + + {children} + + ) +} + +function SelectSeparator({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function SelectScrollUpButton({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +function SelectScrollDownButton({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +export { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectLabel, + SelectScrollDownButton, + SelectScrollUpButton, + SelectSeparator, + SelectTrigger, + SelectValue, +} diff --git a/src/components/ui/separator.tsx b/src/components/ui/separator.tsx new file mode 100644 index 0000000..275381c --- /dev/null +++ b/src/components/ui/separator.tsx @@ -0,0 +1,28 @@ +"use client" + +import * as React from "react" +import * as SeparatorPrimitive from "@radix-ui/react-separator" + +import { cn } from "@/lib/utils" + +function Separator({ + className, + orientation = "horizontal", + decorative = true, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { Separator } diff --git a/src/components/ui/table.tsx b/src/components/ui/table.tsx new file mode 100644 index 0000000..51b74dd --- /dev/null +++ b/src/components/ui/table.tsx @@ -0,0 +1,116 @@ +"use client" + +import * as React from "react" + +import { cn } from "@/lib/utils" + +function Table({ className, ...props }: React.ComponentProps<"table">) { + return ( +
+ + + ) +} + +function TableHeader({ className, ...props }: React.ComponentProps<"thead">) { + return ( + + ) +} + +function TableBody({ className, ...props }: React.ComponentProps<"tbody">) { + return ( + + ) +} + +function TableFooter({ className, ...props }: React.ComponentProps<"tfoot">) { + return ( + tr]:last:border-b-0", + className + )} + {...props} + /> + ) +} + +function TableRow({ className, ...props }: React.ComponentProps<"tr">) { + return ( + + ) +} + +function TableHead({ className, ...props }: React.ComponentProps<"th">) { + return ( +
[role=checkbox]]:translate-y-[2px]", + className + )} + {...props} + /> + ) +} + +function TableCell({ className, ...props }: React.ComponentProps<"td">) { + return ( + [role=checkbox]]:translate-y-[2px]", + className + )} + {...props} + /> + ) +} + +function TableCaption({ + className, + ...props +}: React.ComponentProps<"caption">) { + return ( +
+ ) +} + +export { + Table, + TableHeader, + TableBody, + TableFooter, + TableHead, + TableRow, + TableCell, + TableCaption, +} diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..bd0c391 --- /dev/null +++ b/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)) +}