The recipes.blue monorepo recipes.blue
recipes appview atproto
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: move to more 'secure' typescript settings

+316 -5619
-25
apps/api/scripts/generate-jwk.ts
··· 1 - import { generateKeyPair } from "jose"; 2 - 3 - async function serializeKeyToJwk() { 4 - // Generate an RSA key pair 5 - const { publicKey, privateKey } = await generateKeyPair("ES256"); 6 - 7 - // Export keys as JWK 8 - const publicJwk = await import("jose").then((lib) => 9 - lib.exportJWK(publicKey) 10 - ); 11 - const privateJwk = await import("jose").then((lib) => 12 - lib.exportJWK(privateKey) 13 - ); 14 - 15 - // Convert to JSON strings 16 - const publicJwkString = JSON.stringify(publicJwk); 17 - const privateJwkString = JSON.stringify(privateJwk); 18 - 19 - // save 3 of these to PRIVATE_KEY_X env vars 20 - console.log(privateJwkString); 21 - 22 - return { publicJwkString, privateJwkString }; 23 - } 24 - 25 - serializeKeyToJwk();
+4 -4
apps/api/src/util/api.ts
··· 1 1 import type {} from '@atcute/atproto'; 2 2 import { CompositeDidDocumentResolver, PlcDidDocumentResolver, WebDidDocumentResolver } from '@atcute/identity-resolver'; 3 3 import { CompositeHandleResolver, DohJsonHandleResolver, WellKnownHandleResolver } from '@atcute/identity-resolver'; 4 - import { ActorIdentifier, AtprotoDid, Handle, isHandle } from '@atcute/lexicons/syntax'; 4 + import { type ActorIdentifier, type AtprotoDid, type Handle, isHandle } from '@atcute/lexicons/syntax'; 5 5 import { isAtprotoDid } from '@atcute/identity'; 6 6 import { RedisClient } from 'bun'; 7 - import { ProfileViewBasic } from '../../../../libs/lexicons/dist/types/blue/recipes/actor/defs.js'; 8 - import { Blob, LegacyBlob } from '@atcute/lexicons'; 7 + import type { BlueRecipesActorDefs } from '@cookware/lexicons'; 8 + import type { Blob, LegacyBlob } from '@atcute/lexicons'; 9 9 import { buildCdnUrl } from './cdn.js'; 10 10 11 11 const handleResolver = new CompositeHandleResolver({ ··· 53 53 pronouns: string | null; 54 54 avatarRef: Blob | LegacyBlob | null; 55 55 createdAt: Date; 56 - }, redis: RedisClient): Promise<ProfileViewBasic> => ({ 56 + }, redis: RedisClient): Promise<BlueRecipesActorDefs.ProfileViewBasic> => ({ 57 57 did: author.did, 58 58 handle: await getHandle(author.did, redis), 59 59 displayName: author.displayName,
+1 -1
apps/api/src/xrpc/blue.recipes.actor.getProfile.ts
··· 2 2 import { BlueRecipesActorGetProfile } from '@cookware/lexicons'; 3 3 import { db, eq } from '@cookware/database'; 4 4 import { getHandle, parseDid } from '../util/api.js'; 5 - import { Logger } from 'pino'; 5 + import { type Logger } from 'pino'; 6 6 import { profilesTable, recipeTable } from '@cookware/database/schema'; 7 7 import { RedisClient } from 'bun'; 8 8 import { buildCdnUrl } from '../util/cdn.js';
+3 -3
apps/api/src/xrpc/blue.recipes.feed.getRecipe.ts
··· 1 1 import { json, XRPCRouter, XRPCError } from '@atcute/xrpc-server'; 2 - import { BlueRecipesFeedDefs, BlueRecipesFeedGetRecipe, BlueRecipesFeedRecipe } from '@cookware/lexicons'; 2 + import { BlueRecipesFeedGetRecipe, BlueRecipesFeedRecipe } from '@cookware/lexicons'; 3 3 import { db, and, or, eq } from '@cookware/database'; 4 4 import { buildProfileViewBasic, parseDid } from '../util/api.js'; 5 - import { Logger } from 'pino'; 6 - import { parseResourceUri, ResourceUri } from '@atcute/lexicons'; 5 + import { type Logger } from 'pino'; 6 + import { parseResourceUri, type ResourceUri } from '@atcute/lexicons'; 7 7 import { recipeTable } from '@cookware/database/schema'; 8 8 import { isLegacyBlob } from '@atcute/lexicons/interfaces'; 9 9 import { RedisClient } from 'bun';
+2 -2
apps/api/src/xrpc/blue.recipes.feed.getRecipes.ts
··· 3 3 import { BlueRecipesFeedGetRecipes, BlueRecipesFeedRecipe } from '@cookware/lexicons'; 4 4 import { json, XRPCRouter } from '@atcute/xrpc-server'; 5 5 import { getHandle, parseDid } from '../util/api.js'; 6 - import { ResourceUri } from '@atcute/lexicons/syntax'; 7 - import { Logger } from 'pino'; 6 + import { type ResourceUri } from '@atcute/lexicons/syntax'; 7 + import { type Logger } from 'pino'; 8 8 import { isLegacyBlob } from '@atcute/lexicons/interfaces'; 9 9 import { RedisClient } from 'bun'; 10 10 import { buildCdnUrl } from '../util/cdn.js';
+1 -1
apps/ingester/package.json
··· 10 10 "build": "bun --bun run check-types && bun --bun run compile", 11 11 "dev": "bun run --hot src/index.ts | pino-pretty", 12 12 "check-types": "tsc --noEmit", 13 - "compile": "bun build src/index.ts --compile --minify --sourcemap --outfile=dist/api --target=bun", 13 + "compile": "bun build src/index.ts --compile --minify --sourcemap --outfile=dist/ingester --target=bun", 14 14 "clean": "rimraf dist" 15 15 }, 16 16 "dependencies": {
+3 -3
apps/ingester/src/ingesters/profile.ts
··· 2 2 import { profilesTable } from "@cookware/database/schema"; 3 3 import { is } from '@atcute/lexicons'; 4 4 import { BlueRecipesActorProfile } from "@cookware/lexicons"; 5 - import { CommitOperation } from "@atcute/jetstream"; 6 - import { Logger } from "pino"; 7 - import { AtprotoDid } from "@atcute/lexicons/syntax"; 5 + import type { CommitOperation } from "@atcute/jetstream"; 6 + import type { Logger } from "pino"; 7 + import type { AtprotoDid } from "@atcute/lexicons/syntax"; 8 8 import { RedisClient } from "bun"; 9 9 import { CompositeDidDocumentResolver, PlcDidDocumentResolver, WebDidDocumentResolver } from "@atcute/identity-resolver"; 10 10 import env from "../config.js";
+3 -3
apps/ingester/src/ingesters/recipe.ts
··· 2 2 import { recipeTable } from "@cookware/database/schema"; 3 3 import { is } from '@atcute/lexicons'; 4 4 import { BlueRecipesFeedRecipe } from "@cookware/lexicons"; 5 - import { CommitOperation } from "@atcute/jetstream"; 6 - import { Logger } from "pino"; 7 - import { AtprotoDid } from "@atcute/lexicons/syntax"; 5 + import type { CommitOperation } from "@atcute/jetstream"; 6 + import type { Logger } from "pino"; 7 + import type { AtprotoDid } from "@atcute/lexicons/syntax"; 8 8 9 9 export const ingestRecipe = async (did: AtprotoDid, commit: CommitOperation, logger: Logger) => { 10 10 if (commit.operation == 'create' || commit.operation == 'update') {
+52 -29
apps/web/README.md
··· 4 4 5 5 Currently, two official plugins are available: 6 6 7 - - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh 8 - - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh 7 + - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh 8 + - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh 9 + 10 + ## React Compiler 11 + 12 + The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). 9 13 10 14 ## Expanding the ESLint configuration 11 15 12 - If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: 16 + If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: 17 + 18 + ```js 19 + export default defineConfig([ 20 + globalIgnores(['dist']), 21 + { 22 + files: ['**/*.{ts,tsx}'], 23 + extends: [ 24 + // Other configs... 13 25 14 - - Configure the top-level `parserOptions` property like this: 26 + // Remove tseslint.configs.recommended and replace with this 27 + tseslint.configs.recommendedTypeChecked, 28 + // Alternatively, use this for stricter rules 29 + tseslint.configs.strictTypeChecked, 30 + // Optionally, add this for stylistic rules 31 + tseslint.configs.stylisticTypeChecked, 15 32 16 - ```js 17 - export default tseslint.config({ 18 - languageOptions: { 19 - // other options... 20 - parserOptions: { 21 - project: ['./tsconfig.node.json', './tsconfig.app.json'], 22 - tsconfigRootDir: import.meta.dirname, 33 + // Other configs... 34 + ], 35 + languageOptions: { 36 + parserOptions: { 37 + project: ['./tsconfig.node.json', './tsconfig.app.json'], 38 + tsconfigRootDir: import.meta.dirname, 39 + }, 40 + // other options... 23 41 }, 24 42 }, 25 - }) 43 + ]) 26 44 ``` 27 45 28 - - Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked` 29 - - Optionally add `...tseslint.configs.stylisticTypeChecked` 30 - - Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config: 46 + You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: 31 47 32 48 ```js 33 49 // eslint.config.js 34 - import react from 'eslint-plugin-react' 50 + import reactX from 'eslint-plugin-react-x' 51 + import reactDom from 'eslint-plugin-react-dom' 35 52 36 - export default tseslint.config({ 37 - // Set the react version 38 - settings: { react: { version: '18.3' } }, 39 - plugins: { 40 - // Add the react plugin 41 - react, 42 - }, 43 - rules: { 44 - // other rules... 45 - // Enable its recommended rules 46 - ...react.configs.recommended.rules, 47 - ...react.configs['jsx-runtime'].rules, 53 + export default defineConfig([ 54 + globalIgnores(['dist']), 55 + { 56 + files: ['**/*.{ts,tsx}'], 57 + extends: [ 58 + // Other configs... 59 + // Enable lint rules for React 60 + reactX.configs['recommended-typescript'], 61 + // Enable lint rules for React DOM 62 + reactDom.configs.recommended, 63 + ], 64 + languageOptions: { 65 + parserOptions: { 66 + project: ['./tsconfig.node.json', './tsconfig.app.json'], 67 + tsconfigRootDir: import.meta.dirname, 68 + }, 69 + // other options... 70 + }, 48 71 }, 49 - }) 72 + ]) 50 73 ```
-21
apps/web/components.json
··· 1 - { 2 - "$schema": "https://ui.shadcn.com/schema.json", 3 - "style": "new-york", 4 - "rsc": false, 5 - "tsx": true, 6 - "tailwind": { 7 - "config": "tailwind.config.js", 8 - "css": "src/index.css", 9 - "baseColor": "zinc", 10 - "cssVariables": true, 11 - "prefix": "" 12 - }, 13 - "aliases": { 14 - "components": "@/components", 15 - "utils": "@/lib/utils", 16 - "ui": "@/components/ui", 17 - "lib": "@/lib", 18 - "hooks": "@/hooks" 19 - }, 20 - "iconLibrary": "lucide" 21 - }
+10 -15
apps/web/eslint.config.js
··· 3 3 import reactHooks from 'eslint-plugin-react-hooks' 4 4 import reactRefresh from 'eslint-plugin-react-refresh' 5 5 import tseslint from 'typescript-eslint' 6 + import { defineConfig, globalIgnores } from 'eslint/config' 6 7 7 - export default tseslint.config( 8 - { ignores: ['dist'] }, 8 + export default defineConfig([ 9 + globalIgnores(['dist']), 9 10 { 10 - extends: [js.configs.recommended, ...tseslint.configs.recommended], 11 11 files: ['**/*.{ts,tsx}'], 12 + extends: [ 13 + js.configs.recommended, 14 + tseslint.configs.recommended, 15 + reactHooks.configs.flat.recommended, 16 + reactRefresh.configs.vite, 17 + ], 12 18 languageOptions: { 13 19 ecmaVersion: 2020, 14 20 globals: globals.browser, 15 21 }, 16 - plugins: { 17 - 'react-hooks': reactHooks, 18 - 'react-refresh': reactRefresh, 19 - }, 20 - rules: { 21 - ...reactHooks.configs.recommended.rules, 22 - 'react-refresh/only-export-components': [ 23 - 'warn', 24 - { allowConstantExport: true }, 25 - ], 26 - }, 27 22 }, 28 - ) 23 + ])
+2 -1
apps/web/index.html
··· 2 2 <html lang="en"> 3 3 <head> 4 4 <meta charset="UTF-8" /> 5 + <link rel="icon" type="image/svg+xml" href="/icon.svg" /> 5 6 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 - <title>Recipes</title> 7 + <title>Cookware</title> 7 8 </head> 8 9 <body> 9 10 <div id="root"></div>
+21 -58
apps/web/package.json
··· 1 1 { 2 - "name": "@cookware/web", 2 + "name": "web", 3 3 "private": true, 4 4 "version": "0.0.0", 5 5 "type": "module", 6 6 "scripts": { 7 - "dev": "vite --host", 7 + "dev": "vite", 8 8 "build": "tsc -b && vite build", 9 9 "lint": "eslint .", 10 10 "preview": "vite preview" 11 11 }, 12 12 "dependencies": { 13 - "@atcute/atproto": "^3.1.9", 14 - "@atcute/client": "catalog:", 15 - "@atcute/identity-resolver": "^1.1.4", 16 - "@atcute/lexicons": "catalog:", 17 - "@atcute/oauth-browser-client": "^2.0.1", 18 - "@atproto/common": "^0.4.5", 19 - "@atproto/common-web": "^0.3.1", 20 - "@dnd-kit/core": "^6.3.1", 21 - "@dnd-kit/modifiers": "^9.0.0", 22 - "@dnd-kit/sortable": "^10.0.0", 23 - "@dnd-kit/utilities": "^3.2.2", 24 - "@hookform/resolvers": "^3.9.1", 25 - "@radix-ui/react-avatar": "^1.1.1", 26 - "@radix-ui/react-collapsible": "^1.1.1", 27 - "@radix-ui/react-dialog": "^1.1.4", 28 - "@radix-ui/react-dropdown-menu": "^2.1.4", 29 - "@radix-ui/react-icons": "^1.3.2", 30 - "@radix-ui/react-label": "^2.1.8", 31 - "@radix-ui/react-separator": "^1.1.8", 32 - "@radix-ui/react-slot": "^1.2.4", 33 - "@radix-ui/react-tooltip": "^1.1.4", 34 - "@tanstack/react-query": "^5.62.2", 35 - "@tanstack/react-query-devtools": "^5.62.2", 36 - "@tanstack/react-router": "^1.91.2", 37 - "axios": "^1.7.9", 38 - "class-variance-authority": "^0.7.1", 39 - "clsx": "^2.1.1", 40 - "lucide-react": "^0.464.0", 41 - "react-dom": "19.0.0", 42 - "react-hook-form": "^7.54.1", 43 - "tailwind-merge": "^2.5.5", 44 - "tailwindcss-animate": "^1.0.7", 45 - "zod": "^3.23.8" 13 + "react": "^19.2.0", 14 + "react-dom": "^19.2.0", 15 + "tailwindcss": "^4.1.17" 46 16 }, 47 17 "devDependencies": { 48 - "@atcute/bluesky": "^1.0.9", 49 - "@cookware/lexicons": "workspace:*", 50 - "@eslint/js": "^9.15.0", 51 - "@tanstack/eslint-plugin-query": "^5.62.1", 52 - "@tanstack/router-devtools": "^1.85.5", 53 - "@tanstack/router-plugin": "^1.85.3", 54 - "@types/node": "^22.10.1", 55 - "@types/react": "^19.0.0", 56 - "@types/react-dom": "^19.0.0", 18 + "@cookware/tsconfig": "workspace:*", 19 + "@eslint/js": "^9.39.1", 20 + "@tailwindcss/vite": "^4.1.17", 21 + "@types/bun": "^1.3.4", 22 + "@types/react": "^19.2.5", 23 + "@types/react-dom": "^19.2.3", 57 24 "@vitejs/plugin-react": "^5.1.1", 58 - "@vitejs/plugin-react-swc": "^3.5.0", 59 - "autoprefixer": "^10.4.20", 60 - "babel-plugin-react-compiler": "^1.0.0", 61 - "cssnano": "^7.0.6", 62 - "eslint": "^9.15.0", 63 - "eslint-plugin-react-hooks": "^5.0.0", 64 - "eslint-plugin-react-refresh": "^0.4.14", 65 - "globals": "^15.12.0", 66 - "postcss": "^8.4.49", 67 - "react": "19.0.0", 68 - "tailwindcss": "^3.4.16", 69 - "typescript": "~5.6.2", 70 - "typescript-eslint": "^8.15.0", 71 - "vite": "^7.2.4" 25 + "eslint": "^9.39.1", 26 + "eslint-plugin-react-hooks": "^7.0.1", 27 + "eslint-plugin-react-refresh": "^0.4.24", 28 + "globals": "^16.5.0", 29 + "typescript": "~5.9.3", 30 + "typescript-eslint": "^8.46.4", 31 + "vite": "npm:rolldown-vite@7.2.5" 32 + }, 33 + "overrides": { 34 + "vite": "npm:rolldown-vite@7.2.5" 72 35 } 73 36 }
-7
apps/web/postcss.config.js
··· 1 - export default { 2 - plugins: { 3 - tailwindcss: {}, 4 - autoprefixer: {}, 5 - ...(process.env.NODE_ENV === 'production' ? { cssnano: {} } : {}) 6 - }, 7 - }
-13
apps/web/public/.well-known/did.json
··· 1 - { 2 - "@context": [ 3 - "https://www.w3.org/ns/did/v1" 4 - ], 5 - "id": "did:web:recipes.blue", 6 - "service": [ 7 - { 8 - "id": "#api", 9 - "type": "RecipesApiService", 10 - "serviceEndpoint": "https://recipes.blue" 11 - } 12 - ] 13 - }
+1
apps/web/public/icon.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-chef-hat"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 3c1.918 0 3.52 1.35 3.91 3.151a4 4 0 0 1 2.09 7.723l0 7.126h-12v-7.126a4 4 0 1 1 2.092 -7.723a4 4 0 0 1 3.908 -3.151z" /><path d="M6.161 17.009l11.839 -.009" /></svg>
-9
apps/web/public/oauth-client-metadata.json
··· 1 - { 2 - "client_id": "https://recipes.blue/oauth-client-metadata.json", 3 - "client_name": "Recipes.blue", 4 - "redirect_uris": ["https://recipes.blue/"], 5 - "scope": "atproto transition:generic", 6 - "token_endpoint_auth_method": "none", 7 - "application_type": "web", 8 - "dpop_bound_access_tokens": true 9 - }
+1
apps/web/src/assets/react.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>
-90
apps/web/src/components/app-sidebar.tsx
··· 1 - import * as React from "react" 2 - import { 3 - Book, 4 - CookingPot, 5 - ForkKnife, 6 - } from "lucide-react" 7 - 8 - import { NavMain } from "@/components/nav-main" 9 - import { NavUser } from "@/components/nav-user" 10 - import { 11 - Sidebar, 12 - SidebarContent, 13 - SidebarFooter, 14 - SidebarHeader, 15 - SidebarMenu, 16 - SidebarMenuButton, 17 - SidebarMenuItem, 18 - SidebarRail, 19 - } from "@/components/ui/sidebar" 20 - import { NavUserOpts } from "./nav-user-opts" 21 - import { ModeToggle } from "./mode-toggle" 22 - 23 - const data = { 24 - navMain: [ 25 - { 26 - title: "Recipes", 27 - url: "#", 28 - icon: ForkKnife, 29 - isActive: true, 30 - items: [ 31 - { 32 - title: "Browse", 33 - url: "/", 34 - isActive: true, 35 - }, 36 - { 37 - title: "Starred", 38 - url: "#", 39 - }, 40 - ], 41 - }, 42 - { 43 - title: "Cookbooks", 44 - url: "#", 45 - icon: Book, 46 - items: [ 47 - { 48 - title: "Browse", 49 - url: "/", 50 - }, 51 - { 52 - title: "Starred", 53 - url: "#", 54 - }, 55 - ], 56 - }, 57 - ] 58 - } 59 - 60 - export function AppSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) { 61 - return ( 62 - <Sidebar collapsible="icon" {...props}> 63 - <SidebarHeader> 64 - <SidebarMenu> 65 - <SidebarMenuItem className="flex items-center justify-between gap-x-2"> 66 - <SidebarMenuButton size="lg" asChild> 67 - <a href="#"> 68 - <div className="flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground"> 69 - <CookingPot className="size-4" /> 70 - </div> 71 - <div className="flex flex-col gap-0.5 leading-none"> 72 - <span className="font-semibold">Recipes</span> 73 - </div> 74 - </a> 75 - </SidebarMenuButton> 76 - <ModeToggle /> 77 - </SidebarMenuItem> 78 - </SidebarMenu> 79 - </SidebarHeader> 80 - <SidebarContent> 81 - <NavMain items={data.navMain} /> 82 - <NavUserOpts /> 83 - </SidebarContent> 84 - <SidebarFooter> 85 - <NavUser /> 86 - </SidebarFooter> 87 - <SidebarRail /> 88 - </Sidebar> 89 - ) 90 - }
-37
apps/web/src/components/mode-toggle.tsx
··· 1 - import { Moon, Sun } from "lucide-react" 2 - 3 - import { Button } from "@/components/ui/button" 4 - import { 5 - DropdownMenu, 6 - DropdownMenuContent, 7 - DropdownMenuItem, 8 - DropdownMenuTrigger, 9 - } from "@/components/ui/dropdown-menu" 10 - import { useTheme } from "@/components/theme-provider" 11 - 12 - export function ModeToggle() { 13 - const { setTheme } = useTheme() 14 - 15 - return ( 16 - <DropdownMenu> 17 - <DropdownMenuTrigger asChild> 18 - <Button variant="outline" size="icon" className="size-8 aspect-square flex items-center justify-center rounded-lg"> 19 - <Sun className="h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" /> 20 - <Moon className="absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" /> 21 - <span className="sr-only">Toggle theme</span> 22 - </Button> 23 - </DropdownMenuTrigger> 24 - <DropdownMenuContent align="end"> 25 - <DropdownMenuItem onClick={() => setTheme("light")}> 26 - Light 27 - </DropdownMenuItem> 28 - <DropdownMenuItem onClick={() => setTheme("dark")}> 29 - Dark 30 - </DropdownMenuItem> 31 - <DropdownMenuItem onClick={() => setTheme("system")}> 32 - System 33 - </DropdownMenuItem> 34 - </DropdownMenuContent> 35 - </DropdownMenu> 36 - ) 37 - }
-75
apps/web/src/components/nav-main.tsx
··· 1 - "use client" 2 - 3 - import { ChevronRight, type LucideIcon } from "lucide-react" 4 - 5 - import { 6 - Collapsible, 7 - CollapsibleContent, 8 - CollapsibleTrigger, 9 - } from "@/components/ui/collapsible" 10 - import { 11 - SidebarGroup, 12 - SidebarGroupLabel, 13 - SidebarMenu, 14 - SidebarMenuButton, 15 - SidebarMenuItem, 16 - SidebarMenuSub, 17 - SidebarMenuSubButton, 18 - SidebarMenuSubItem, 19 - } from "@/components/ui/sidebar" 20 - import { Link } from "@tanstack/react-router" 21 - 22 - export function NavMain({ 23 - items, 24 - }: { 25 - items: { 26 - title: string 27 - url: string 28 - icon?: LucideIcon 29 - isActive?: boolean 30 - items?: { 31 - title: string 32 - url: string 33 - isActive?: boolean 34 - }[] 35 - }[] 36 - }) { 37 - return ( 38 - <SidebarGroup> 39 - <SidebarGroupLabel>Community</SidebarGroupLabel> 40 - <SidebarMenu> 41 - {items.map((item) => ( 42 - <Collapsible 43 - key={item.title} 44 - asChild 45 - defaultOpen={item.isActive} 46 - className="group/collapsible" 47 - > 48 - <SidebarMenuItem> 49 - <CollapsibleTrigger asChild> 50 - <SidebarMenuButton tooltip={item.title}> 51 - {item.icon && <item.icon />} 52 - <span>{item.title}</span> 53 - <ChevronRight className="ml-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90" /> 54 - </SidebarMenuButton> 55 - </CollapsibleTrigger> 56 - <CollapsibleContent> 57 - <SidebarMenuSub> 58 - {item.items?.map((subItem) => ( 59 - <SidebarMenuSubItem key={subItem.title}> 60 - <SidebarMenuSubButton asChild isActive={subItem.isActive}> 61 - <Link to={subItem.url}> 62 - <span>{subItem.title}</span> 63 - </Link> 64 - </SidebarMenuSubButton> 65 - </SidebarMenuSubItem> 66 - ))} 67 - </SidebarMenuSub> 68 - </CollapsibleContent> 69 - </SidebarMenuItem> 70 - </Collapsible> 71 - ))} 72 - </SidebarMenu> 73 - </SidebarGroup> 74 - ) 75 - }
-67
apps/web/src/components/nav-user-opts.tsx
··· 1 - "use client" 2 - 3 - import { 4 - SidebarGroup, 5 - SidebarGroupContent, 6 - SidebarMenu, 7 - SidebarMenuButton, 8 - SidebarMenuItem, 9 - } from "@/components/ui/sidebar" 10 - import { useSession } from "@/state/auth" 11 - import { Link } from "@tanstack/react-router"; 12 - import { LifeBuoy, Pencil, Send } from "lucide-react"; 13 - 14 - export function NavUserOpts() { 15 - const { isLoggedIn } = useSession(); 16 - 17 - if (!isLoggedIn) { 18 - return ( 19 - <SidebarGroup className="mt-auto"> 20 - <SidebarGroupContent> 21 - <SidebarMenu> 22 - <AlwaysItems /> 23 - </SidebarMenu> 24 - </SidebarGroupContent> 25 - </SidebarGroup> 26 - ); 27 - } 28 - 29 - return ( 30 - <SidebarGroup className="mt-auto"> 31 - <SidebarGroupContent> 32 - <SidebarMenu> 33 - <AlwaysItems /> 34 - <SidebarMenuItem> 35 - <SidebarMenuButton asChild size="sm"> 36 - <Link to="/recipes/new"> 37 - <Pencil /> 38 - <span>New recipe</span> 39 - </Link> 40 - </SidebarMenuButton> 41 - </SidebarMenuItem> 42 - </SidebarMenu> 43 - </SidebarGroupContent> 44 - </SidebarGroup> 45 - ) 46 - } 47 - 48 - const AlwaysItems = () => ( 49 - <> 50 - <SidebarMenuItem> 51 - <SidebarMenuButton asChild size="sm"> 52 - <a href="https://github.com/recipes-blue/recipes.blue/issues/new"> 53 - <LifeBuoy /> 54 - <span>Support</span> 55 - </a> 56 - </SidebarMenuButton> 57 - </SidebarMenuItem> 58 - <SidebarMenuItem> 59 - <SidebarMenuButton asChild size="sm"> 60 - <a href="https://github.com/recipes-blue/recipes.blue/discussions"> 61 - <Send /> 62 - <span>Feedback</span> 63 - </a> 64 - </SidebarMenuButton> 65 - </SidebarMenuItem> 66 - </> 67 - );
-113
apps/web/src/components/nav-user.tsx
··· 1 - "use client" 2 - 3 - import { 4 - ChevronsUpDown, 5 - LogOut, 6 - } from "lucide-react" 7 - import { 8 - DropdownMenu, 9 - DropdownMenuContent, 10 - DropdownMenuItem, 11 - DropdownMenuLabel, 12 - DropdownMenuSeparator, 13 - DropdownMenuTrigger, 14 - } from "@/components/ui/dropdown-menu" 15 - import { 16 - SidebarMenu, 17 - SidebarMenuButton, 18 - SidebarMenuItem, 19 - useSidebar, 20 - } from "@/components/ui/sidebar" 21 - import { Button } from "./ui/button" 22 - import { Link } from "@tanstack/react-router" 23 - import { useSession } from "@/state/auth" 24 - import { Skeleton } from "./ui/skeleton" 25 - import { Avatar, AvatarFallback, AvatarImage } from "./ui/avatar" 26 - import { useUserQuery } from "@/queries/self" 27 - 28 - export function NavUser() { 29 - const { isMobile } = useSidebar() 30 - const { isLoggedIn, agent, signOut } = useSession(); 31 - 32 - const userQuery = useUserQuery(); 33 - 34 - if (!isLoggedIn || !agent || userQuery.isError || !userQuery.data) { 35 - return ( 36 - <SidebarMenu> 37 - <SidebarMenuItem> 38 - <SidebarMenuButton 39 - size="lg" 40 - className="data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground" 41 - > 42 - <Button asChild> 43 - <Link to="/login" className="w-full">Log in</Link> 44 - </Button> 45 - </SidebarMenuButton> 46 - </SidebarMenuItem> 47 - </SidebarMenu> 48 - ); 49 - } 50 - 51 - if (userQuery.isFetching) return ( 52 - <SidebarMenu> 53 - <SidebarMenuItem> 54 - <SidebarMenuButton 55 - size="lg" 56 - className="data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground" 57 - > 58 - <Skeleton className="h-8 w-8 rounded-lg" /> 59 - <div className="grid flex-1 text-left text-sm leading-tight"> 60 - <Skeleton className="h-2 w-20 rounded-lg" /> 61 - </div> 62 - </SidebarMenuButton> 63 - </SidebarMenuItem> 64 - </SidebarMenu> 65 - ); 66 - 67 - return ( 68 - <SidebarMenu> 69 - <SidebarMenuItem> 70 - <DropdownMenu> 71 - <DropdownMenuTrigger asChild> 72 - <SidebarMenuButton 73 - size="lg" 74 - className="data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground" 75 - > 76 - <Avatar className="h-8 w-8 rounded-lg"> 77 - <AvatarImage src={userQuery.data.avatar} alt={userQuery.data.displayName} /> 78 - <AvatarFallback className="rounded-lg">{userQuery.data.displayName}</AvatarFallback> 79 - </Avatar> 80 - <div className="grid flex-1 text-left text-sm leading-tight"> 81 - <span className="truncate font-semibold">{userQuery.data.displayName}</span> 82 - </div> 83 - <ChevronsUpDown className="ml-auto size-4" /> 84 - </SidebarMenuButton> 85 - </DropdownMenuTrigger> 86 - <DropdownMenuContent 87 - className="w-[--radix-dropdown-menu-trigger-width] min-w-56 rounded-lg" 88 - side={isMobile ? "bottom" : "right"} 89 - align="end" 90 - sideOffset={4} 91 - > 92 - <DropdownMenuLabel className="p-0 font-normal"> 93 - <div className="flex items-center gap-2 px-1 py-1.5 text-left text-sm"> 94 - <Avatar className="h-8 w-8 rounded-lg"> 95 - <AvatarImage src={userQuery.data.avatar} alt={userQuery.data.displayName} /> 96 - <AvatarFallback className="rounded-lg">{userQuery.data.displayName}</AvatarFallback> 97 - </Avatar> 98 - <div className="grid flex-1 text-left text-sm leading-tight"> 99 - <span className="truncate font-semibold">{userQuery.data.displayName}</span> 100 - </div> 101 - </div> 102 - </DropdownMenuLabel> 103 - <DropdownMenuSeparator /> 104 - <DropdownMenuItem className="cursor-pointer" onClick={() => signOut()}> 105 - <LogOut /> 106 - Log out 107 - </DropdownMenuItem> 108 - </DropdownMenuContent> 109 - </DropdownMenu> 110 - </SidebarMenuItem> 111 - </SidebarMenu> 112 - ) 113 - }
-62
apps/web/src/components/query-placeholder.tsx
··· 1 - import type { UseQueryResult } from '@tanstack/react-query'; 2 - import { ReactNode } from 'react'; 3 - import { Skeleton } from './ui/skeleton'; 4 - import { Alert, AlertDescription, AlertTitle } from './ui/alert'; 5 - import { AlertCircle } from 'lucide-react'; 6 - import { isXRPCErrorPayload } from '@atcute/client'; 7 - 8 - type QueryPlaceholderProps<TData, TError> = { 9 - query: UseQueryResult<TData, TError>; 10 - cards?: boolean; 11 - cardsCount?: number; 12 - noData?: ReactNode; 13 - children: ReactNode | ReactNode[] | ((data: TData) => ReactNode | ReactNode[]); 14 - }; 15 - 16 - const QueryPlaceholder = <TData = {}, TError = Error>( 17 - { 18 - query, 19 - children, 20 - cards = false, 21 - cardsCount = 3, 22 - noData = <></>, 23 - }: QueryPlaceholderProps<TData, TError> 24 - ) => { 25 - if (query.isPending || query.isLoading) { 26 - if (cards) { 27 - return [...Array(cardsCount)].map((_, i) => <Skeleton key={i} className="h-[200px] w-full rounded-lg" />); 28 - } 29 - 30 - return ( 31 - <p>Loading...</p> 32 - ) 33 - } else if (query.isError) { 34 - const { error } = query; 35 - let errMsg = 'Unknown'; 36 - if (isXRPCErrorPayload(error)) { 37 - errMsg = error.message ?? `XRPC_${error.error}`; 38 - } if (error instanceof Error) { 39 - errMsg = `${error.message} (${error.name})`; 40 - } 41 - 42 - return ( 43 - <Alert variant="destructive"> 44 - <AlertCircle className="size-4" /> 45 - 46 - <AlertTitle>Error fetching data.</AlertTitle> 47 - <AlertDescription> 48 - The data you were trying to see failed to fetch.<br/> 49 - <b>Error code: {errMsg}</b> 50 - </AlertDescription> 51 - </Alert> 52 - ) 53 - } else if (query.data) { 54 - if (typeof children === 'function') { 55 - return children(query.data); 56 - } 57 - return children; 58 - } 59 - return noData; 60 - }; 61 - 62 - export default QueryPlaceholder;
-72
apps/web/src/components/recipe-card.tsx
··· 1 - import { Card, CardContent, CardFooter, CardHeader } from "./ui/card"; 2 - import { Avatar, AvatarFallback, AvatarImage } from "./ui/avatar"; 3 - import { Link } from "@tanstack/react-router"; 4 - import { Clock, ListOrdered, Users, Utensils } from "lucide-react"; 5 - import { BlueRecipesFeedGetRecipes } from "@cookware/lexicons"; 6 - 7 - type RecipeCardProps = { 8 - recipe: BlueRecipesFeedGetRecipes.$output['recipes'][0]; 9 - }; 10 - 11 - function truncateDescription(description: string, maxLength: number = 120) { 12 - if (description.length <= maxLength) return description; 13 - return description.slice(0, maxLength).trim() + '...'; 14 - } 15 - 16 - export const RecipeCard = ({ recipe }: RecipeCardProps) => { 17 - return ( 18 - <Link to="/recipes/$author/$rkey" params={{ author: recipe.author.handle, rkey: recipe.rkey }} className="w-full"> 19 - <Card className="overflow-hidden"> 20 - <CardHeader className="p-0"> 21 - { recipe.record.image && 22 - <div className="relative h-48 w-full"> 23 - <img 24 - src={recipe.imageUrl} 25 - alt={recipe.record.title} 26 - className="h-full w-full object-cover" 27 - /> 28 - </div> 29 - } 30 - </CardHeader> 31 - <CardContent className="p-4"> 32 - <h3 className="text-lg font-semibold mb-2">{recipe.record.title}</h3> 33 - <p className="text-sm text-muted-foreground mb-4"> 34 - {truncateDescription(recipe.record.description || '')} 35 - </p> 36 - </CardContent> 37 - <CardFooter className="p-4 pt-0"> 38 - <div className="w-full flex items-center justify-between"> 39 - <div className="flex items-center"> 40 - <Avatar className="h-8 w-8 mr-2"> 41 - <AvatarImage src={recipe.author.avatar} alt={recipe.author.displayName} /> 42 - <AvatarFallback className="rounded-lg">{recipe.author.displayName?.charAt(0)}</AvatarFallback> 43 - </Avatar> 44 - <span className="text-sm text-muted-foreground">{recipe.author.displayName}</span> 45 - </div> 46 - <div className="flex gap-6 justify-between items-center text-sm text-muted-foreground"> 47 - <div className="flex items-center"> 48 - <Utensils className="w-4 h-4 mr-1" /> 49 - <span>{recipe.record.ingredients.length}</span> 50 - </div> 51 - 52 - <div className="flex items-center"> 53 - <ListOrdered className="w-4 h-4 mr-1" /> 54 - <span>{recipe.record.steps.length}</span> 55 - </div> 56 - 57 - <div className="flex items-center"> 58 - <Users className="w-4 h-4 mr-1" /> 59 - <span>{recipe.record.serves}</span> 60 - </div> 61 - 62 - <div className="flex items-center"> 63 - <Clock className="w-4 h-4 mr-1" /> 64 - <span>{recipe.record.time} min</span> 65 - </div> 66 - </div> 67 - </div> 68 - </CardFooter> 69 - </Card> 70 - </Link> 71 - ); 72 - };
-23
apps/web/src/components/sidebar-title.tsx
··· 1 - import { CookingPot } from "lucide-react" 2 - 3 - import { 4 - SidebarMenu, 5 - SidebarMenuItem, 6 - } from "@/components/ui/sidebar" 7 - import { ModeToggle } from "./mode-toggle" 8 - 9 - export function SidebarTitle() { 10 - return ( 11 - <SidebarMenu> 12 - <SidebarMenuItem> 13 - <div className="flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground"> 14 - <CookingPot className="size-4" /> 15 - </div> 16 - <div className="flex flex-col gap-0.5 leading-none"> 17 - <span className="font-semibold">Recipes</span> 18 - </div> 19 - <ModeToggle /> 20 - </SidebarMenuItem> 21 - </SidebarMenu> 22 - ) 23 - }
-73
apps/web/src/components/theme-provider.tsx
··· 1 - import { createContext, useContext, useEffect, useState } from "react" 2 - 3 - type Theme = "dark" | "light" | "system" 4 - 5 - type ThemeProviderProps = { 6 - children: React.ReactNode 7 - defaultTheme?: Theme 8 - storageKey?: string 9 - } 10 - 11 - type ThemeProviderState = { 12 - theme: Theme 13 - setTheme: (theme: Theme) => void 14 - } 15 - 16 - const initialState: ThemeProviderState = { 17 - theme: "system", 18 - setTheme: () => null, 19 - } 20 - 21 - const ThemeProviderContext = createContext<ThemeProviderState>(initialState) 22 - 23 - export function ThemeProvider({ 24 - children, 25 - defaultTheme = "system", 26 - storageKey = "vite-ui-theme", 27 - ...props 28 - }: ThemeProviderProps) { 29 - const [theme, setTheme] = useState<Theme>( 30 - () => (localStorage.getItem(storageKey) as Theme) || defaultTheme 31 - ) 32 - 33 - useEffect(() => { 34 - const root = window.document.documentElement 35 - 36 - root.classList.remove("light", "dark") 37 - 38 - if (theme === "system") { 39 - const systemTheme = window.matchMedia("(prefers-color-scheme: dark)") 40 - .matches 41 - ? "dark" 42 - : "light" 43 - 44 - root.classList.add(systemTheme) 45 - return 46 - } 47 - 48 - root.classList.add(theme) 49 - }, [theme]) 50 - 51 - const value = { 52 - theme, 53 - setTheme: (theme: Theme) => { 54 - localStorage.setItem(storageKey, theme) 55 - setTheme(theme) 56 - }, 57 - } 58 - 59 - return ( 60 - <ThemeProviderContext.Provider {...props} value={value}> 61 - {children} 62 - </ThemeProviderContext.Provider> 63 - ) 64 - } 65 - 66 - export const useTheme = () => { 67 - const context = useContext(ThemeProviderContext) 68 - 69 - if (context === undefined) 70 - throw new Error("useTheme must be used within a ThemeProvider") 71 - 72 - return context 73 - }
-59
apps/web/src/components/ui/alert.tsx
··· 1 - import * as React from "react" 2 - import { cva, type VariantProps } from "class-variance-authority" 3 - 4 - import { cn } from "@/lib/utils" 5 - 6 - const alertVariants = cva( 7 - "relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7", 8 - { 9 - variants: { 10 - variant: { 11 - default: "bg-background text-foreground", 12 - destructive: 13 - "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive", 14 - }, 15 - }, 16 - defaultVariants: { 17 - variant: "default", 18 - }, 19 - } 20 - ) 21 - 22 - const Alert = React.forwardRef< 23 - HTMLDivElement, 24 - React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants> 25 - >(({ className, variant, ...props }, ref) => ( 26 - <div 27 - ref={ref} 28 - role="alert" 29 - className={cn(alertVariants({ variant }), className)} 30 - {...props} 31 - /> 32 - )) 33 - Alert.displayName = "Alert" 34 - 35 - const AlertTitle = React.forwardRef< 36 - HTMLParagraphElement, 37 - React.HTMLAttributes<HTMLHeadingElement> 38 - >(({ className, ...props }, ref) => ( 39 - <h5 40 - ref={ref} 41 - className={cn("mb-1 font-medium leading-none tracking-tight", className)} 42 - {...props} 43 - /> 44 - )) 45 - AlertTitle.displayName = "AlertTitle" 46 - 47 - const AlertDescription = React.forwardRef< 48 - HTMLParagraphElement, 49 - React.HTMLAttributes<HTMLParagraphElement> 50 - >(({ className, ...props }, ref) => ( 51 - <div 52 - ref={ref} 53 - className={cn("text-sm [&_p]:leading-relaxed", className)} 54 - {...props} 55 - /> 56 - )) 57 - AlertDescription.displayName = "AlertDescription" 58 - 59 - export { Alert, AlertTitle, AlertDescription }
-48
apps/web/src/components/ui/avatar.tsx
··· 1 - import * as React from "react" 2 - import * as AvatarPrimitive from "@radix-ui/react-avatar" 3 - 4 - import { cn } from "@/lib/utils" 5 - 6 - const Avatar = React.forwardRef< 7 - React.ElementRef<typeof AvatarPrimitive.Root>, 8 - React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root> 9 - >(({ className, ...props }, ref) => ( 10 - <AvatarPrimitive.Root 11 - ref={ref} 12 - className={cn( 13 - "relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full", 14 - className 15 - )} 16 - {...props} 17 - /> 18 - )) 19 - Avatar.displayName = AvatarPrimitive.Root.displayName 20 - 21 - const AvatarImage = React.forwardRef< 22 - React.ElementRef<typeof AvatarPrimitive.Image>, 23 - React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image> 24 - >(({ className, ...props }, ref) => ( 25 - <AvatarPrimitive.Image 26 - ref={ref} 27 - className={cn("aspect-square h-full w-full", className)} 28 - {...props} 29 - /> 30 - )) 31 - AvatarImage.displayName = AvatarPrimitive.Image.displayName 32 - 33 - const AvatarFallback = React.forwardRef< 34 - React.ElementRef<typeof AvatarPrimitive.Fallback>, 35 - React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback> 36 - >(({ className, ...props }, ref) => ( 37 - <AvatarPrimitive.Fallback 38 - ref={ref} 39 - className={cn( 40 - "flex h-full w-full items-center justify-center rounded-full bg-muted", 41 - className 42 - )} 43 - {...props} 44 - /> 45 - )) 46 - AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName 47 - 48 - export { Avatar, AvatarImage, AvatarFallback }
-36
apps/web/src/components/ui/badge.tsx
··· 1 - import * as React from "react" 2 - import { cva, type VariantProps } from "class-variance-authority" 3 - 4 - import { cn } from "@/lib/utils" 5 - 6 - const badgeVariants = cva( 7 - "inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", 8 - { 9 - variants: { 10 - variant: { 11 - default: 12 - "border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80", 13 - secondary: 14 - "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", 15 - destructive: 16 - "border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80", 17 - outline: "text-foreground", 18 - }, 19 - }, 20 - defaultVariants: { 21 - variant: "default", 22 - }, 23 - } 24 - ) 25 - 26 - export interface BadgeProps 27 - extends React.HTMLAttributes<HTMLDivElement>, 28 - VariantProps<typeof badgeVariants> {} 29 - 30 - function Badge({ className, variant, ...props }: BadgeProps) { 31 - return ( 32 - <div className={cn(badgeVariants({ variant }), className)} {...props} /> 33 - ) 34 - } 35 - 36 - export { Badge, badgeVariants }
-115
apps/web/src/components/ui/breadcrumb.tsx
··· 1 - import * as React from "react" 2 - import { Slot } from "@radix-ui/react-slot" 3 - import { ChevronRight, MoreHorizontal } from "lucide-react" 4 - 5 - import { cn } from "@/lib/utils" 6 - 7 - const Breadcrumb = React.forwardRef< 8 - HTMLElement, 9 - React.ComponentPropsWithoutRef<"nav"> & { 10 - separator?: React.ReactNode 11 - } 12 - >(({ ...props }, ref) => <nav ref={ref} aria-label="breadcrumb" {...props} />) 13 - Breadcrumb.displayName = "Breadcrumb" 14 - 15 - const BreadcrumbList = React.forwardRef< 16 - HTMLOListElement, 17 - React.ComponentPropsWithoutRef<"ol"> 18 - >(({ className, ...props }, ref) => ( 19 - <ol 20 - ref={ref} 21 - className={cn( 22 - "flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5", 23 - className 24 - )} 25 - {...props} 26 - /> 27 - )) 28 - BreadcrumbList.displayName = "BreadcrumbList" 29 - 30 - const BreadcrumbItem = React.forwardRef< 31 - HTMLLIElement, 32 - React.ComponentPropsWithoutRef<"li"> 33 - >(({ className, ...props }, ref) => ( 34 - <li 35 - ref={ref} 36 - className={cn("inline-flex items-center gap-1.5", className)} 37 - {...props} 38 - /> 39 - )) 40 - BreadcrumbItem.displayName = "BreadcrumbItem" 41 - 42 - const BreadcrumbLink = React.forwardRef< 43 - HTMLAnchorElement, 44 - React.ComponentPropsWithoutRef<"a"> & { 45 - asChild?: boolean 46 - } 47 - >(({ asChild, className, ...props }, ref) => { 48 - const Comp = asChild ? Slot : "a" 49 - 50 - return ( 51 - <Comp 52 - ref={ref} 53 - className={cn("transition-colors hover:text-foreground", className)} 54 - {...props} 55 - /> 56 - ) 57 - }) 58 - BreadcrumbLink.displayName = "BreadcrumbLink" 59 - 60 - const BreadcrumbPage = React.forwardRef< 61 - HTMLSpanElement, 62 - React.ComponentPropsWithoutRef<"span"> 63 - >(({ className, ...props }, ref) => ( 64 - <span 65 - ref={ref} 66 - role="link" 67 - aria-disabled="true" 68 - aria-current="page" 69 - className={cn("font-normal text-foreground", className)} 70 - {...props} 71 - /> 72 - )) 73 - BreadcrumbPage.displayName = "BreadcrumbPage" 74 - 75 - const BreadcrumbSeparator = ({ 76 - children, 77 - className, 78 - ...props 79 - }: React.ComponentProps<"li">) => ( 80 - <li 81 - role="presentation" 82 - aria-hidden="true" 83 - className={cn("[&>svg]:w-3.5 [&>svg]:h-3.5", className)} 84 - {...props} 85 - > 86 - {children ?? <ChevronRight />} 87 - </li> 88 - ) 89 - BreadcrumbSeparator.displayName = "BreadcrumbSeparator" 90 - 91 - const BreadcrumbEllipsis = ({ 92 - className, 93 - ...props 94 - }: React.ComponentProps<"span">) => ( 95 - <span 96 - role="presentation" 97 - aria-hidden="true" 98 - className={cn("flex h-9 w-9 items-center justify-center", className)} 99 - {...props} 100 - > 101 - <MoreHorizontal className="h-4 w-4" /> 102 - <span className="sr-only">More</span> 103 - </span> 104 - ) 105 - BreadcrumbEllipsis.displayName = "BreadcrumbElipssis" 106 - 107 - export { 108 - Breadcrumb, 109 - BreadcrumbList, 110 - BreadcrumbItem, 111 - BreadcrumbLink, 112 - BreadcrumbPage, 113 - BreadcrumbSeparator, 114 - BreadcrumbEllipsis, 115 - }
-57
apps/web/src/components/ui/button.tsx
··· 1 - import * as React from "react" 2 - import { Slot } from "@radix-ui/react-slot" 3 - import { cva, type VariantProps } from "class-variance-authority" 4 - 5 - import { cn } from "@/lib/utils" 6 - 7 - const buttonVariants = cva( 8 - "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", 9 - { 10 - variants: { 11 - variant: { 12 - default: 13 - "bg-primary text-primary-foreground shadow hover:bg-primary/90", 14 - destructive: 15 - "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", 16 - outline: 17 - "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", 18 - secondary: 19 - "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", 20 - ghost: "hover:bg-accent hover:text-accent-foreground", 21 - link: "text-primary underline-offset-4 hover:underline", 22 - }, 23 - size: { 24 - default: "h-9 px-4 py-2", 25 - sm: "h-8 rounded-md px-3 text-xs", 26 - lg: "h-10 rounded-md px-8", 27 - icon: "h-9 w-9", 28 - }, 29 - }, 30 - defaultVariants: { 31 - variant: "default", 32 - size: "default", 33 - }, 34 - } 35 - ) 36 - 37 - export interface ButtonProps 38 - extends React.ButtonHTMLAttributes<HTMLButtonElement>, 39 - VariantProps<typeof buttonVariants> { 40 - asChild?: boolean 41 - } 42 - 43 - const Button = React.forwardRef<HTMLButtonElement, ButtonProps>( 44 - ({ className, variant, size, asChild = false, ...props }, ref) => { 45 - const Comp = asChild ? Slot : "button" 46 - return ( 47 - <Comp 48 - className={cn(buttonVariants({ variant, size, className }))} 49 - ref={ref} 50 - {...props} 51 - /> 52 - ) 53 - } 54 - ) 55 - Button.displayName = "Button" 56 - 57 - export { Button, buttonVariants }
-76
apps/web/src/components/ui/card.tsx
··· 1 - import * as React from "react" 2 - 3 - import { cn } from "@/lib/utils" 4 - 5 - const Card = React.forwardRef< 6 - HTMLDivElement, 7 - React.HTMLAttributes<HTMLDivElement> 8 - >(({ className, ...props }, ref) => ( 9 - <div 10 - ref={ref} 11 - className={cn( 12 - "rounded-xl border bg-card text-card-foreground shadow", 13 - className 14 - )} 15 - {...props} 16 - /> 17 - )) 18 - Card.displayName = "Card" 19 - 20 - const CardHeader = React.forwardRef< 21 - HTMLDivElement, 22 - React.HTMLAttributes<HTMLDivElement> 23 - >(({ className, ...props }, ref) => ( 24 - <div 25 - ref={ref} 26 - className={cn("flex flex-col space-y-1.5 p-6", className)} 27 - {...props} 28 - /> 29 - )) 30 - CardHeader.displayName = "CardHeader" 31 - 32 - const CardTitle = React.forwardRef< 33 - HTMLDivElement, 34 - React.HTMLAttributes<HTMLDivElement> 35 - >(({ className, ...props }, ref) => ( 36 - <div 37 - ref={ref} 38 - className={cn("font-semibold leading-none tracking-tight", className)} 39 - {...props} 40 - /> 41 - )) 42 - CardTitle.displayName = "CardTitle" 43 - 44 - const CardDescription = React.forwardRef< 45 - HTMLDivElement, 46 - React.HTMLAttributes<HTMLDivElement> 47 - >(({ className, ...props }, ref) => ( 48 - <div 49 - ref={ref} 50 - className={cn("text-sm text-muted-foreground", className)} 51 - {...props} 52 - /> 53 - )) 54 - CardDescription.displayName = "CardDescription" 55 - 56 - const CardContent = React.forwardRef< 57 - HTMLDivElement, 58 - React.HTMLAttributes<HTMLDivElement> 59 - >(({ className, ...props }, ref) => ( 60 - <div ref={ref} className={cn("p-6 pt-0", className)} {...props} /> 61 - )) 62 - CardContent.displayName = "CardContent" 63 - 64 - const CardFooter = React.forwardRef< 65 - HTMLDivElement, 66 - React.HTMLAttributes<HTMLDivElement> 67 - >(({ className, ...props }, ref) => ( 68 - <div 69 - ref={ref} 70 - className={cn("flex items-center p-6 pt-0", className)} 71 - {...props} 72 - /> 73 - )) 74 - CardFooter.displayName = "CardFooter" 75 - 76 - export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
-9
apps/web/src/components/ui/collapsible.tsx
··· 1 - import * as CollapsiblePrimitive from "@radix-ui/react-collapsible" 2 - 3 - const Collapsible = CollapsiblePrimitive.Root 4 - 5 - const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger 6 - 7 - const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent 8 - 9 - export { Collapsible, CollapsibleTrigger, CollapsibleContent }
-201
apps/web/src/components/ui/dropdown-menu.tsx
··· 1 - "use client" 2 - 3 - import * as React from "react" 4 - import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" 5 - import { Check, ChevronRight, Circle } from "lucide-react" 6 - 7 - import { cn } from "@/lib/utils" 8 - 9 - const DropdownMenu = DropdownMenuPrimitive.Root 10 - 11 - const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger 12 - 13 - const DropdownMenuGroup = DropdownMenuPrimitive.Group 14 - 15 - const DropdownMenuPortal = DropdownMenuPrimitive.Portal 16 - 17 - const DropdownMenuSub = DropdownMenuPrimitive.Sub 18 - 19 - const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup 20 - 21 - const DropdownMenuSubTrigger = React.forwardRef< 22 - React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>, 23 - React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & { 24 - inset?: boolean 25 - } 26 - >(({ className, inset, children, ...props }, ref) => ( 27 - <DropdownMenuPrimitive.SubTrigger 28 - ref={ref} 29 - className={cn( 30 - "flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", 31 - inset && "pl-8", 32 - className 33 - )} 34 - {...props} 35 - > 36 - {children} 37 - <ChevronRight className="ml-auto" /> 38 - </DropdownMenuPrimitive.SubTrigger> 39 - )) 40 - DropdownMenuSubTrigger.displayName = 41 - DropdownMenuPrimitive.SubTrigger.displayName 42 - 43 - const DropdownMenuSubContent = React.forwardRef< 44 - React.ElementRef<typeof DropdownMenuPrimitive.SubContent>, 45 - React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent> 46 - >(({ className, ...props }, ref) => ( 47 - <DropdownMenuPrimitive.SubContent 48 - ref={ref} 49 - className={cn( 50 - "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", 51 - className 52 - )} 53 - {...props} 54 - /> 55 - )) 56 - DropdownMenuSubContent.displayName = 57 - DropdownMenuPrimitive.SubContent.displayName 58 - 59 - const DropdownMenuContent = React.forwardRef< 60 - React.ElementRef<typeof DropdownMenuPrimitive.Content>, 61 - React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content> 62 - >(({ className, sideOffset = 4, ...props }, ref) => ( 63 - <DropdownMenuPrimitive.Portal> 64 - <DropdownMenuPrimitive.Content 65 - ref={ref} 66 - sideOffset={sideOffset} 67 - className={cn( 68 - "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md", 69 - "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", 70 - className 71 - )} 72 - {...props} 73 - /> 74 - </DropdownMenuPrimitive.Portal> 75 - )) 76 - DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName 77 - 78 - const DropdownMenuItem = React.forwardRef< 79 - React.ElementRef<typeof DropdownMenuPrimitive.Item>, 80 - React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & { 81 - inset?: boolean 82 - } 83 - >(({ className, inset, ...props }, ref) => ( 84 - <DropdownMenuPrimitive.Item 85 - ref={ref} 86 - className={cn( 87 - "relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0", 88 - inset && "pl-8", 89 - className 90 - )} 91 - {...props} 92 - /> 93 - )) 94 - DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName 95 - 96 - const DropdownMenuCheckboxItem = React.forwardRef< 97 - React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>, 98 - React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem> 99 - >(({ className, children, checked, ...props }, ref) => ( 100 - <DropdownMenuPrimitive.CheckboxItem 101 - ref={ref} 102 - className={cn( 103 - "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", 104 - className 105 - )} 106 - checked={checked} 107 - {...props} 108 - > 109 - <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center"> 110 - <DropdownMenuPrimitive.ItemIndicator> 111 - <Check className="h-4 w-4" /> 112 - </DropdownMenuPrimitive.ItemIndicator> 113 - </span> 114 - {children} 115 - </DropdownMenuPrimitive.CheckboxItem> 116 - )) 117 - DropdownMenuCheckboxItem.displayName = 118 - DropdownMenuPrimitive.CheckboxItem.displayName 119 - 120 - const DropdownMenuRadioItem = React.forwardRef< 121 - React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>, 122 - React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem> 123 - >(({ className, children, ...props }, ref) => ( 124 - <DropdownMenuPrimitive.RadioItem 125 - ref={ref} 126 - className={cn( 127 - "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", 128 - className 129 - )} 130 - {...props} 131 - > 132 - <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center"> 133 - <DropdownMenuPrimitive.ItemIndicator> 134 - <Circle className="h-2 w-2 fill-current" /> 135 - </DropdownMenuPrimitive.ItemIndicator> 136 - </span> 137 - {children} 138 - </DropdownMenuPrimitive.RadioItem> 139 - )) 140 - DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName 141 - 142 - const DropdownMenuLabel = React.forwardRef< 143 - React.ElementRef<typeof DropdownMenuPrimitive.Label>, 144 - React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & { 145 - inset?: boolean 146 - } 147 - >(({ className, inset, ...props }, ref) => ( 148 - <DropdownMenuPrimitive.Label 149 - ref={ref} 150 - className={cn( 151 - "px-2 py-1.5 text-sm font-semibold", 152 - inset && "pl-8", 153 - className 154 - )} 155 - {...props} 156 - /> 157 - )) 158 - DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName 159 - 160 - const DropdownMenuSeparator = React.forwardRef< 161 - React.ElementRef<typeof DropdownMenuPrimitive.Separator>, 162 - React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator> 163 - >(({ className, ...props }, ref) => ( 164 - <DropdownMenuPrimitive.Separator 165 - ref={ref} 166 - className={cn("-mx-1 my-1 h-px bg-muted", className)} 167 - {...props} 168 - /> 169 - )) 170 - DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName 171 - 172 - const DropdownMenuShortcut = ({ 173 - className, 174 - ...props 175 - }: React.HTMLAttributes<HTMLSpanElement>) => { 176 - return ( 177 - <span 178 - className={cn("ml-auto text-xs tracking-widest opacity-60", className)} 179 - {...props} 180 - /> 181 - ) 182 - } 183 - DropdownMenuShortcut.displayName = "DropdownMenuShortcut" 184 - 185 - export { 186 - DropdownMenu, 187 - DropdownMenuTrigger, 188 - DropdownMenuContent, 189 - DropdownMenuItem, 190 - DropdownMenuCheckboxItem, 191 - DropdownMenuRadioItem, 192 - DropdownMenuLabel, 193 - DropdownMenuSeparator, 194 - DropdownMenuShortcut, 195 - DropdownMenuGroup, 196 - DropdownMenuPortal, 197 - DropdownMenuSub, 198 - DropdownMenuSubContent, 199 - DropdownMenuSubTrigger, 200 - DropdownMenuRadioGroup, 201 - }
-242
apps/web/src/components/ui/field.tsx
··· 1 - import { useMemo } from "react" 2 - import { cva, type VariantProps } from "class-variance-authority" 3 - 4 - import { cn } from "@/lib/utils" 5 - import { Label } from "@/components/ui/label" 6 - import { Separator } from "@/components/ui/separator" 7 - 8 - function FieldSet({ className, ...props }: React.ComponentProps<"fieldset">) { 9 - return ( 10 - <fieldset 11 - data-slot="field-set" 12 - className={cn( 13 - "flex flex-col gap-6", 14 - "has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3", 15 - className 16 - )} 17 - {...props} 18 - /> 19 - ) 20 - } 21 - 22 - function FieldLegend({ 23 - className, 24 - variant = "legend", 25 - ...props 26 - }: React.ComponentProps<"legend"> & { variant?: "legend" | "label" }) { 27 - return ( 28 - <legend 29 - data-slot="field-legend" 30 - data-variant={variant} 31 - className={cn( 32 - "mb-3 font-medium", 33 - "data-[variant=legend]:text-base", 34 - "data-[variant=label]:text-sm", 35 - className 36 - )} 37 - {...props} 38 - /> 39 - ) 40 - } 41 - 42 - function FieldGroup({ className, ...props }: React.ComponentProps<"div">) { 43 - return ( 44 - <div 45 - data-slot="field-group" 46 - className={cn( 47 - "group/field-group @container/field-group flex w-full flex-col gap-7 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4", 48 - className 49 - )} 50 - {...props} 51 - /> 52 - ) 53 - } 54 - 55 - const fieldVariants = cva( 56 - "group/field data-[invalid=true]:text-destructive flex w-full gap-3", 57 - { 58 - variants: { 59 - orientation: { 60 - vertical: ["flex-col [&>*]:w-full [&>.sr-only]:w-auto"], 61 - horizontal: [ 62 - "flex-row items-center", 63 - "[&>[data-slot=field-label]]:flex-auto", 64 - "has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px has-[>[data-slot=field-content]]:items-start", 65 - ], 66 - responsive: [ 67 - "@md/field-group:flex-row @md/field-group:items-center @md/field-group:[&>*]:w-auto flex-col [&>*]:w-full [&>.sr-only]:w-auto", 68 - "@md/field-group:[&>[data-slot=field-label]]:flex-auto", 69 - "@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px", 70 - ], 71 - }, 72 - }, 73 - defaultVariants: { 74 - orientation: "vertical", 75 - }, 76 - } 77 - ) 78 - 79 - function Field({ 80 - className, 81 - orientation = "vertical", 82 - ...props 83 - }: React.ComponentProps<"div"> & VariantProps<typeof fieldVariants>) { 84 - return ( 85 - <div 86 - role="group" 87 - data-slot="field" 88 - data-orientation={orientation} 89 - className={cn(fieldVariants({ orientation }), className)} 90 - {...props} 91 - /> 92 - ) 93 - } 94 - 95 - function FieldContent({ className, ...props }: React.ComponentProps<"div">) { 96 - return ( 97 - <div 98 - data-slot="field-content" 99 - className={cn( 100 - "group/field-content flex flex-1 flex-col gap-1.5 leading-snug", 101 - className 102 - )} 103 - {...props} 104 - /> 105 - ) 106 - } 107 - 108 - function FieldLabel({ 109 - className, 110 - ...props 111 - }: React.ComponentProps<typeof Label>) { 112 - return ( 113 - <Label 114 - data-slot="field-label" 115 - className={cn( 116 - "group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50", 117 - "has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-md has-[>[data-slot=field]]:border [&>[data-slot=field]]:p-4", 118 - "has-data-[state=checked]:bg-primary/5 has-data-[state=checked]:border-primary dark:has-data-[state=checked]:bg-primary/10", 119 - className 120 - )} 121 - {...props} 122 - /> 123 - ) 124 - } 125 - 126 - function FieldTitle({ className, ...props }: React.ComponentProps<"div">) { 127 - return ( 128 - <div 129 - data-slot="field-label" 130 - className={cn( 131 - "flex w-fit items-center gap-2 text-sm font-medium leading-snug group-data-[disabled=true]/field:opacity-50", 132 - className 133 - )} 134 - {...props} 135 - /> 136 - ) 137 - } 138 - 139 - function FieldDescription({ className, ...props }: React.ComponentProps<"p">) { 140 - return ( 141 - <p 142 - data-slot="field-description" 143 - className={cn( 144 - "text-muted-foreground text-sm font-normal leading-normal group-has-[[data-orientation=horizontal]]/field:text-balance", 145 - "nth-last-2:-mt-1 last:mt-0 [[data-variant=legend]+&]:-mt-1.5", 146 - "[&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4", 147 - className 148 - )} 149 - {...props} 150 - /> 151 - ) 152 - } 153 - 154 - function FieldSeparator({ 155 - children, 156 - className, 157 - ...props 158 - }: React.ComponentProps<"div"> & { 159 - children?: React.ReactNode 160 - }) { 161 - return ( 162 - <div 163 - data-slot="field-separator" 164 - data-content={!!children} 165 - className={cn( 166 - "relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2", 167 - className 168 - )} 169 - {...props} 170 - > 171 - <Separator className="absolute inset-0 top-1/2" /> 172 - {children && ( 173 - <span 174 - className="bg-background text-muted-foreground relative mx-auto block w-fit px-2" 175 - data-slot="field-separator-content" 176 - > 177 - {children} 178 - </span> 179 - )} 180 - </div> 181 - ) 182 - } 183 - 184 - function FieldError({ 185 - className, 186 - children, 187 - errors, 188 - ...props 189 - }: React.ComponentProps<"div"> & { 190 - errors?: Array<{ message?: string } | undefined> 191 - }) { 192 - const content = useMemo(() => { 193 - if (children) { 194 - return children 195 - } 196 - 197 - if (!errors) { 198 - return null 199 - } 200 - 201 - if (errors?.length === 1 && errors[0]?.message) { 202 - return errors[0].message 203 - } 204 - 205 - return ( 206 - <ul className="ml-4 flex list-disc flex-col gap-1"> 207 - {errors.map( 208 - (error, index) => 209 - error?.message && <li key={index}>{error.message}</li> 210 - )} 211 - </ul> 212 - ) 213 - }, [children, errors]) 214 - 215 - if (!content) { 216 - return null 217 - } 218 - 219 - return ( 220 - <div 221 - role="alert" 222 - data-slot="field-error" 223 - className={cn("text-destructive text-sm font-normal", className)} 224 - {...props} 225 - > 226 - {content} 227 - </div> 228 - ) 229 - } 230 - 231 - export { 232 - Field, 233 - FieldLabel, 234 - FieldDescription, 235 - FieldError, 236 - FieldGroup, 237 - FieldLegend, 238 - FieldSeparator, 239 - FieldSet, 240 - FieldContent, 241 - FieldTitle, 242 - }
-176
apps/web/src/components/ui/form.tsx
··· 1 - import * as React from "react" 2 - import * as LabelPrimitive from "@radix-ui/react-label" 3 - import { Slot } from "@radix-ui/react-slot" 4 - import { 5 - Controller, 6 - ControllerProps, 7 - FieldPath, 8 - FieldValues, 9 - FormProvider, 10 - useFormContext, 11 - } from "react-hook-form" 12 - 13 - import { cn } from "@/lib/utils" 14 - import { Label } from "@/components/ui/label" 15 - 16 - const Form = FormProvider 17 - 18 - type FormFieldContextValue< 19 - TFieldValues extends FieldValues = FieldValues, 20 - TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues> 21 - > = { 22 - name: TName 23 - } 24 - 25 - const FormFieldContext = React.createContext<FormFieldContextValue>( 26 - {} as FormFieldContextValue 27 - ) 28 - 29 - const FormField = < 30 - TFieldValues extends FieldValues = FieldValues, 31 - TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues> 32 - >({ 33 - ...props 34 - }: ControllerProps<TFieldValues, TName>) => { 35 - return ( 36 - <FormFieldContext.Provider value={{ name: props.name }}> 37 - <Controller {...props} /> 38 - </FormFieldContext.Provider> 39 - ) 40 - } 41 - 42 - const useFormField = () => { 43 - const fieldContext = React.useContext(FormFieldContext) 44 - const itemContext = React.useContext(FormItemContext) 45 - const { getFieldState, formState } = useFormContext() 46 - 47 - const fieldState = getFieldState(fieldContext.name, formState) 48 - 49 - if (!fieldContext) { 50 - throw new Error("useFormField should be used within <FormField>") 51 - } 52 - 53 - const { id } = itemContext 54 - 55 - return { 56 - id, 57 - name: fieldContext.name, 58 - formItemId: `${id}-form-item`, 59 - formDescriptionId: `${id}-form-item-description`, 60 - formMessageId: `${id}-form-item-message`, 61 - ...fieldState, 62 - } 63 - } 64 - 65 - type FormItemContextValue = { 66 - id: string 67 - } 68 - 69 - const FormItemContext = React.createContext<FormItemContextValue>( 70 - {} as FormItemContextValue 71 - ) 72 - 73 - const FormItem = React.forwardRef< 74 - HTMLDivElement, 75 - React.HTMLAttributes<HTMLDivElement> 76 - >(({ className, ...props }, ref) => { 77 - const id = React.useId() 78 - 79 - return ( 80 - <FormItemContext.Provider value={{ id }}> 81 - <div ref={ref} className={cn("space-y-2", className)} {...props} /> 82 - </FormItemContext.Provider> 83 - ) 84 - }) 85 - FormItem.displayName = "FormItem" 86 - 87 - const FormLabel = React.forwardRef< 88 - React.ElementRef<typeof LabelPrimitive.Root>, 89 - React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> 90 - >(({ className, ...props }, ref) => { 91 - const { error, formItemId } = useFormField() 92 - 93 - return ( 94 - <Label 95 - ref={ref} 96 - className={cn(error && "text-destructive", className)} 97 - htmlFor={formItemId} 98 - {...props} 99 - /> 100 - ) 101 - }) 102 - FormLabel.displayName = "FormLabel" 103 - 104 - const FormControl = React.forwardRef< 105 - React.ElementRef<typeof Slot>, 106 - React.ComponentPropsWithoutRef<typeof Slot> 107 - >(({ ...props }, ref) => { 108 - const { error, formItemId, formDescriptionId, formMessageId } = useFormField() 109 - 110 - return ( 111 - <Slot 112 - ref={ref} 113 - id={formItemId} 114 - aria-describedby={ 115 - !error 116 - ? `${formDescriptionId}` 117 - : `${formDescriptionId} ${formMessageId}` 118 - } 119 - aria-invalid={!!error} 120 - {...props} 121 - /> 122 - ) 123 - }) 124 - FormControl.displayName = "FormControl" 125 - 126 - const FormDescription = React.forwardRef< 127 - HTMLParagraphElement, 128 - React.HTMLAttributes<HTMLParagraphElement> 129 - >(({ className, ...props }, ref) => { 130 - const { formDescriptionId } = useFormField() 131 - 132 - return ( 133 - <p 134 - ref={ref} 135 - id={formDescriptionId} 136 - className={cn("text-[0.8rem] text-muted-foreground", className)} 137 - {...props} 138 - /> 139 - ) 140 - }) 141 - FormDescription.displayName = "FormDescription" 142 - 143 - const FormMessage = React.forwardRef< 144 - HTMLParagraphElement, 145 - React.HTMLAttributes<HTMLParagraphElement> 146 - >(({ className, children, ...props }, ref) => { 147 - const { error, formMessageId } = useFormField() 148 - const body = error ? String(error?.message) : children 149 - 150 - if (!body) { 151 - return null 152 - } 153 - 154 - return ( 155 - <p 156 - ref={ref} 157 - id={formMessageId} 158 - className={cn("text-[0.8rem] font-medium text-destructive", className)} 159 - {...props} 160 - > 161 - {body} 162 - </p> 163 - ) 164 - }) 165 - FormMessage.displayName = "FormMessage" 166 - 167 - export { 168 - useFormField, 169 - Form, 170 - FormItem, 171 - FormLabel, 172 - FormControl, 173 - FormDescription, 174 - FormMessage, 175 - FormField, 176 - }
-22
apps/web/src/components/ui/input.tsx
··· 1 - import * as React from "react" 2 - 3 - import { cn } from "@/lib/utils" 4 - 5 - const Input = React.forwardRef<HTMLInputElement, React.ComponentProps<"input">>( 6 - ({ className, type, ...props }, ref) => { 7 - return ( 8 - <input 9 - type={type} 10 - className={cn( 11 - "flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", 12 - className 13 - )} 14 - ref={ref} 15 - {...props} 16 - /> 17 - ) 18 - } 19 - ) 20 - Input.displayName = "Input" 21 - 22 - export { Input }
-24
apps/web/src/components/ui/label.tsx
··· 1 - import * as React from "react" 2 - import * as LabelPrimitive from "@radix-ui/react-label" 3 - import { cva, type VariantProps } from "class-variance-authority" 4 - 5 - import { cn } from "@/lib/utils" 6 - 7 - const labelVariants = cva( 8 - "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" 9 - ) 10 - 11 - const Label = React.forwardRef< 12 - React.ElementRef<typeof LabelPrimitive.Root>, 13 - React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & 14 - VariantProps<typeof labelVariants> 15 - >(({ className, ...props }, ref) => ( 16 - <LabelPrimitive.Root 17 - ref={ref} 18 - className={cn(labelVariants(), className)} 19 - {...props} 20 - /> 21 - )) 22 - Label.displayName = LabelPrimitive.Root.displayName 23 - 24 - export { Label }
-31
apps/web/src/components/ui/separator.tsx
··· 1 - "use client" 2 - 3 - import * as React from "react" 4 - import * as SeparatorPrimitive from "@radix-ui/react-separator" 5 - 6 - import { cn } from "@/lib/utils" 7 - 8 - const Separator = React.forwardRef< 9 - React.ElementRef<typeof SeparatorPrimitive.Root>, 10 - React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root> 11 - >( 12 - ( 13 - { className, orientation = "horizontal", decorative = true, ...props }, 14 - ref 15 - ) => ( 16 - <SeparatorPrimitive.Root 17 - ref={ref} 18 - decorative={decorative} 19 - orientation={orientation} 20 - className={cn( 21 - "shrink-0 bg-border", 22 - orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]", 23 - className 24 - )} 25 - {...props} 26 - /> 27 - ) 28 - ) 29 - Separator.displayName = SeparatorPrimitive.Root.displayName 30 - 31 - export { Separator }
-140
apps/web/src/components/ui/sheet.tsx
··· 1 - "use client" 2 - 3 - import * as React from "react" 4 - import * as SheetPrimitive from "@radix-ui/react-dialog" 5 - import { cva, type VariantProps } from "class-variance-authority" 6 - import { X } from "lucide-react" 7 - 8 - import { cn } from "@/lib/utils" 9 - 10 - const Sheet = SheetPrimitive.Root 11 - 12 - const SheetTrigger = SheetPrimitive.Trigger 13 - 14 - const SheetClose = SheetPrimitive.Close 15 - 16 - const SheetPortal = SheetPrimitive.Portal 17 - 18 - const SheetOverlay = React.forwardRef< 19 - React.ElementRef<typeof SheetPrimitive.Overlay>, 20 - React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay> 21 - >(({ className, ...props }, ref) => ( 22 - <SheetPrimitive.Overlay 23 - className={cn( 24 - "fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0", 25 - className 26 - )} 27 - {...props} 28 - ref={ref} 29 - /> 30 - )) 31 - SheetOverlay.displayName = SheetPrimitive.Overlay.displayName 32 - 33 - const sheetVariants = cva( 34 - "fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out", 35 - { 36 - variants: { 37 - side: { 38 - top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top", 39 - bottom: 40 - "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom", 41 - left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm", 42 - right: 43 - "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm", 44 - }, 45 - }, 46 - defaultVariants: { 47 - side: "right", 48 - }, 49 - } 50 - ) 51 - 52 - interface SheetContentProps 53 - extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>, 54 - VariantProps<typeof sheetVariants> {} 55 - 56 - const SheetContent = React.forwardRef< 57 - React.ElementRef<typeof SheetPrimitive.Content>, 58 - SheetContentProps 59 - >(({ side = "right", className, children, ...props }, ref) => ( 60 - <SheetPortal> 61 - <SheetOverlay /> 62 - <SheetPrimitive.Content 63 - ref={ref} 64 - className={cn(sheetVariants({ side }), className)} 65 - {...props} 66 - > 67 - <SheetPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary"> 68 - <X className="h-4 w-4" /> 69 - <span className="sr-only">Close</span> 70 - </SheetPrimitive.Close> 71 - {children} 72 - </SheetPrimitive.Content> 73 - </SheetPortal> 74 - )) 75 - SheetContent.displayName = SheetPrimitive.Content.displayName 76 - 77 - const SheetHeader = ({ 78 - className, 79 - ...props 80 - }: React.HTMLAttributes<HTMLDivElement>) => ( 81 - <div 82 - className={cn( 83 - "flex flex-col space-y-2 text-center sm:text-left", 84 - className 85 - )} 86 - {...props} 87 - /> 88 - ) 89 - SheetHeader.displayName = "SheetHeader" 90 - 91 - const SheetFooter = ({ 92 - className, 93 - ...props 94 - }: React.HTMLAttributes<HTMLDivElement>) => ( 95 - <div 96 - className={cn( 97 - "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", 98 - className 99 - )} 100 - {...props} 101 - /> 102 - ) 103 - SheetFooter.displayName = "SheetFooter" 104 - 105 - const SheetTitle = React.forwardRef< 106 - React.ElementRef<typeof SheetPrimitive.Title>, 107 - React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title> 108 - >(({ className, ...props }, ref) => ( 109 - <SheetPrimitive.Title 110 - ref={ref} 111 - className={cn("text-lg font-semibold text-foreground", className)} 112 - {...props} 113 - /> 114 - )) 115 - SheetTitle.displayName = SheetPrimitive.Title.displayName 116 - 117 - const SheetDescription = React.forwardRef< 118 - React.ElementRef<typeof SheetPrimitive.Description>, 119 - React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description> 120 - >(({ className, ...props }, ref) => ( 121 - <SheetPrimitive.Description 122 - ref={ref} 123 - className={cn("text-sm text-muted-foreground", className)} 124 - {...props} 125 - /> 126 - )) 127 - SheetDescription.displayName = SheetPrimitive.Description.displayName 128 - 129 - export { 130 - Sheet, 131 - SheetPortal, 132 - SheetOverlay, 133 - SheetTrigger, 134 - SheetClose, 135 - SheetContent, 136 - SheetHeader, 137 - SheetFooter, 138 - SheetTitle, 139 - SheetDescription, 140 - }
-763
apps/web/src/components/ui/sidebar.tsx
··· 1 - "use client" 2 - 3 - import * as React from "react" 4 - import { Slot } from "@radix-ui/react-slot" 5 - import { VariantProps, cva } from "class-variance-authority" 6 - import { PanelLeft } from "lucide-react" 7 - 8 - import { useIsMobile } from "@/hooks/use-mobile" 9 - import { cn } from "@/lib/utils" 10 - import { Button } from "@/components/ui/button" 11 - import { Input } from "@/components/ui/input" 12 - import { Separator } from "@/components/ui/separator" 13 - import { Sheet, SheetContent } from "@/components/ui/sheet" 14 - import { Skeleton } from "@/components/ui/skeleton" 15 - import { 16 - Tooltip, 17 - TooltipContent, 18 - TooltipProvider, 19 - TooltipTrigger, 20 - } from "@/components/ui/tooltip" 21 - 22 - const SIDEBAR_COOKIE_NAME = "sidebar:state" 23 - const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7 24 - const SIDEBAR_WIDTH = "16rem" 25 - const SIDEBAR_WIDTH_MOBILE = "18rem" 26 - const SIDEBAR_WIDTH_ICON = "3rem" 27 - const SIDEBAR_KEYBOARD_SHORTCUT = "b" 28 - 29 - type SidebarContext = { 30 - state: "expanded" | "collapsed" 31 - open: boolean 32 - setOpen: (open: boolean) => void 33 - openMobile: boolean 34 - setOpenMobile: (open: boolean) => void 35 - isMobile: boolean 36 - toggleSidebar: () => void 37 - } 38 - 39 - const SidebarContext = React.createContext<SidebarContext | null>(null) 40 - 41 - function useSidebar() { 42 - const context = React.useContext(SidebarContext) 43 - if (!context) { 44 - throw new Error("useSidebar must be used within a SidebarProvider.") 45 - } 46 - 47 - return context 48 - } 49 - 50 - const SidebarProvider = React.forwardRef< 51 - HTMLDivElement, 52 - React.ComponentProps<"div"> & { 53 - defaultOpen?: boolean 54 - open?: boolean 55 - onOpenChange?: (open: boolean) => void 56 - } 57 - >( 58 - ( 59 - { 60 - defaultOpen = true, 61 - open: openProp, 62 - onOpenChange: setOpenProp, 63 - className, 64 - style, 65 - children, 66 - ...props 67 - }, 68 - ref 69 - ) => { 70 - const isMobile = useIsMobile() 71 - const [openMobile, setOpenMobile] = React.useState(false) 72 - 73 - // This is the internal state of the sidebar. 74 - // We use openProp and setOpenProp for control from outside the component. 75 - const [_open, _setOpen] = React.useState(defaultOpen) 76 - const open = openProp ?? _open 77 - const setOpen = React.useCallback( 78 - (value: boolean | ((value: boolean) => boolean)) => { 79 - const openState = typeof value === "function" ? value(open) : value 80 - if (setOpenProp) { 81 - setOpenProp(openState) 82 - } else { 83 - _setOpen(openState) 84 - } 85 - 86 - // This sets the cookie to keep the sidebar state. 87 - document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}` 88 - }, 89 - [setOpenProp, open] 90 - ) 91 - 92 - // Helper to toggle the sidebar. 93 - const toggleSidebar = React.useCallback(() => { 94 - return isMobile 95 - ? setOpenMobile((open) => !open) 96 - : setOpen((open) => !open) 97 - }, [isMobile, setOpen, setOpenMobile]) 98 - 99 - // Adds a keyboard shortcut to toggle the sidebar. 100 - React.useEffect(() => { 101 - const handleKeyDown = (event: KeyboardEvent) => { 102 - if ( 103 - event.key === SIDEBAR_KEYBOARD_SHORTCUT && 104 - (event.metaKey || event.ctrlKey) 105 - ) { 106 - event.preventDefault() 107 - toggleSidebar() 108 - } 109 - } 110 - 111 - window.addEventListener("keydown", handleKeyDown) 112 - return () => window.removeEventListener("keydown", handleKeyDown) 113 - }, [toggleSidebar]) 114 - 115 - // We add a state so that we can do data-state="expanded" or "collapsed". 116 - // This makes it easier to style the sidebar with Tailwind classes. 117 - const state = open ? "expanded" : "collapsed" 118 - 119 - const contextValue = React.useMemo<SidebarContext>( 120 - () => ({ 121 - state, 122 - open, 123 - setOpen, 124 - isMobile, 125 - openMobile, 126 - setOpenMobile, 127 - toggleSidebar, 128 - }), 129 - [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar] 130 - ) 131 - 132 - return ( 133 - <SidebarContext.Provider value={contextValue}> 134 - <TooltipProvider delayDuration={0}> 135 - <div 136 - style={ 137 - { 138 - "--sidebar-width": SIDEBAR_WIDTH, 139 - "--sidebar-width-icon": SIDEBAR_WIDTH_ICON, 140 - ...style, 141 - } as React.CSSProperties 142 - } 143 - className={cn( 144 - "group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar", 145 - className 146 - )} 147 - ref={ref} 148 - {...props} 149 - > 150 - {children} 151 - </div> 152 - </TooltipProvider> 153 - </SidebarContext.Provider> 154 - ) 155 - } 156 - ) 157 - SidebarProvider.displayName = "SidebarProvider" 158 - 159 - const Sidebar = React.forwardRef< 160 - HTMLDivElement, 161 - React.ComponentProps<"div"> & { 162 - side?: "left" | "right" 163 - variant?: "sidebar" | "floating" | "inset" 164 - collapsible?: "offcanvas" | "icon" | "none" 165 - } 166 - >( 167 - ( 168 - { 169 - side = "left", 170 - variant = "sidebar", 171 - collapsible = "offcanvas", 172 - className, 173 - children, 174 - ...props 175 - }, 176 - ref 177 - ) => { 178 - const { isMobile, state, openMobile, setOpenMobile } = useSidebar() 179 - 180 - if (collapsible === "none") { 181 - return ( 182 - <div 183 - className={cn( 184 - "flex h-full w-[--sidebar-width] flex-col bg-sidebar text-sidebar-foreground", 185 - className 186 - )} 187 - ref={ref} 188 - {...props} 189 - > 190 - {children} 191 - </div> 192 - ) 193 - } 194 - 195 - if (isMobile) { 196 - return ( 197 - <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}> 198 - <SheetContent 199 - data-sidebar="sidebar" 200 - data-mobile="true" 201 - className="w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden" 202 - style={ 203 - { 204 - "--sidebar-width": SIDEBAR_WIDTH_MOBILE, 205 - } as React.CSSProperties 206 - } 207 - side={side} 208 - > 209 - <div className="flex h-full w-full flex-col">{children}</div> 210 - </SheetContent> 211 - </Sheet> 212 - ) 213 - } 214 - 215 - return ( 216 - <div 217 - ref={ref} 218 - className="group peer hidden md:block text-sidebar-foreground" 219 - data-state={state} 220 - data-collapsible={state === "collapsed" ? collapsible : ""} 221 - data-variant={variant} 222 - data-side={side} 223 - > 224 - {/* This is what handles the sidebar gap on desktop */} 225 - <div 226 - className={cn( 227 - "duration-200 relative h-svh w-[--sidebar-width] bg-transparent transition-[width] ease-linear", 228 - "group-data-[collapsible=offcanvas]:w-0", 229 - "group-data-[side=right]:rotate-180", 230 - variant === "floating" || variant === "inset" 231 - ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]" 232 - : "group-data-[collapsible=icon]:w-[--sidebar-width-icon]" 233 - )} 234 - /> 235 - <div 236 - className={cn( 237 - "duration-200 fixed inset-y-0 z-10 hidden h-svh w-[--sidebar-width] transition-[left,right,width] ease-linear md:flex", 238 - side === "left" 239 - ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]" 240 - : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]", 241 - // Adjust the padding for floating and inset variants. 242 - variant === "floating" || variant === "inset" 243 - ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]" 244 - : "group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l", 245 - className 246 - )} 247 - {...props} 248 - > 249 - <div 250 - data-sidebar="sidebar" 251 - className="flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow" 252 - > 253 - {children} 254 - </div> 255 - </div> 256 - </div> 257 - ) 258 - } 259 - ) 260 - Sidebar.displayName = "Sidebar" 261 - 262 - const SidebarTrigger = React.forwardRef< 263 - React.ElementRef<typeof Button>, 264 - React.ComponentProps<typeof Button> 265 - >(({ className, onClick, ...props }, ref) => { 266 - const { toggleSidebar } = useSidebar() 267 - 268 - return ( 269 - <Button 270 - ref={ref} 271 - data-sidebar="trigger" 272 - variant="ghost" 273 - size="icon" 274 - className={cn("h-7 w-7", className)} 275 - onClick={(event) => { 276 - onClick?.(event) 277 - toggleSidebar() 278 - }} 279 - {...props} 280 - > 281 - <PanelLeft /> 282 - <span className="sr-only">Toggle Sidebar</span> 283 - </Button> 284 - ) 285 - }) 286 - SidebarTrigger.displayName = "SidebarTrigger" 287 - 288 - const SidebarRail = React.forwardRef< 289 - HTMLButtonElement, 290 - React.ComponentProps<"button"> 291 - >(({ className, ...props }, ref) => { 292 - const { toggleSidebar } = useSidebar() 293 - 294 - return ( 295 - <button 296 - ref={ref} 297 - data-sidebar="rail" 298 - aria-label="Toggle Sidebar" 299 - tabIndex={-1} 300 - onClick={toggleSidebar} 301 - title="Toggle Sidebar" 302 - className={cn( 303 - "absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex", 304 - "[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize", 305 - "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize", 306 - "group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar", 307 - "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2", 308 - "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2", 309 - className 310 - )} 311 - {...props} 312 - /> 313 - ) 314 - }) 315 - SidebarRail.displayName = "SidebarRail" 316 - 317 - const SidebarInset = React.forwardRef< 318 - HTMLDivElement, 319 - React.ComponentProps<"main"> 320 - >(({ className, ...props }, ref) => { 321 - return ( 322 - <main 323 - ref={ref} 324 - className={cn( 325 - "relative flex min-h-svh flex-1 flex-col bg-background", 326 - "peer-data-[variant=inset]:min-h-[calc(100svh-theme(spacing.4))] md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow", 327 - className 328 - )} 329 - {...props} 330 - /> 331 - ) 332 - }) 333 - SidebarInset.displayName = "SidebarInset" 334 - 335 - const SidebarInput = React.forwardRef< 336 - React.ElementRef<typeof Input>, 337 - React.ComponentProps<typeof Input> 338 - >(({ className, ...props }, ref) => { 339 - return ( 340 - <Input 341 - ref={ref} 342 - data-sidebar="input" 343 - className={cn( 344 - "h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring", 345 - className 346 - )} 347 - {...props} 348 - /> 349 - ) 350 - }) 351 - SidebarInput.displayName = "SidebarInput" 352 - 353 - const SidebarHeader = React.forwardRef< 354 - HTMLDivElement, 355 - React.ComponentProps<"div"> 356 - >(({ className, ...props }, ref) => { 357 - return ( 358 - <div 359 - ref={ref} 360 - data-sidebar="header" 361 - className={cn("flex flex-col gap-2 p-2", className)} 362 - {...props} 363 - /> 364 - ) 365 - }) 366 - SidebarHeader.displayName = "SidebarHeader" 367 - 368 - const SidebarFooter = React.forwardRef< 369 - HTMLDivElement, 370 - React.ComponentProps<"div"> 371 - >(({ className, ...props }, ref) => { 372 - return ( 373 - <div 374 - ref={ref} 375 - data-sidebar="footer" 376 - className={cn("flex flex-col gap-2 p-2", className)} 377 - {...props} 378 - /> 379 - ) 380 - }) 381 - SidebarFooter.displayName = "SidebarFooter" 382 - 383 - const SidebarSeparator = React.forwardRef< 384 - React.ElementRef<typeof Separator>, 385 - React.ComponentProps<typeof Separator> 386 - >(({ className, ...props }, ref) => { 387 - return ( 388 - <Separator 389 - ref={ref} 390 - data-sidebar="separator" 391 - className={cn("mx-2 w-auto bg-sidebar-border", className)} 392 - {...props} 393 - /> 394 - ) 395 - }) 396 - SidebarSeparator.displayName = "SidebarSeparator" 397 - 398 - const SidebarContent = React.forwardRef< 399 - HTMLDivElement, 400 - React.ComponentProps<"div"> 401 - >(({ className, ...props }, ref) => { 402 - return ( 403 - <div 404 - ref={ref} 405 - data-sidebar="content" 406 - className={cn( 407 - "flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden", 408 - className 409 - )} 410 - {...props} 411 - /> 412 - ) 413 - }) 414 - SidebarContent.displayName = "SidebarContent" 415 - 416 - const SidebarGroup = React.forwardRef< 417 - HTMLDivElement, 418 - React.ComponentProps<"div"> 419 - >(({ className, ...props }, ref) => { 420 - return ( 421 - <div 422 - ref={ref} 423 - data-sidebar="group" 424 - className={cn("relative flex w-full min-w-0 flex-col p-2", className)} 425 - {...props} 426 - /> 427 - ) 428 - }) 429 - SidebarGroup.displayName = "SidebarGroup" 430 - 431 - const SidebarGroupLabel = React.forwardRef< 432 - HTMLDivElement, 433 - React.ComponentProps<"div"> & { asChild?: boolean } 434 - >(({ className, asChild = false, ...props }, ref) => { 435 - const Comp = asChild ? Slot : "div" 436 - 437 - return ( 438 - <Comp 439 - ref={ref} 440 - data-sidebar="group-label" 441 - className={cn( 442 - "duration-200 flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opa] ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0", 443 - "group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0", 444 - className 445 - )} 446 - {...props} 447 - /> 448 - ) 449 - }) 450 - SidebarGroupLabel.displayName = "SidebarGroupLabel" 451 - 452 - const SidebarGroupAction = React.forwardRef< 453 - HTMLButtonElement, 454 - React.ComponentProps<"button"> & { asChild?: boolean } 455 - >(({ className, asChild = false, ...props }, ref) => { 456 - const Comp = asChild ? Slot : "button" 457 - 458 - return ( 459 - <Comp 460 - ref={ref} 461 - data-sidebar="group-action" 462 - className={cn( 463 - "absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0", 464 - // Increases the hit area of the button on mobile. 465 - "after:absolute after:-inset-2 after:md:hidden", 466 - "group-data-[collapsible=icon]:hidden", 467 - className 468 - )} 469 - {...props} 470 - /> 471 - ) 472 - }) 473 - SidebarGroupAction.displayName = "SidebarGroupAction" 474 - 475 - const SidebarGroupContent = React.forwardRef< 476 - HTMLDivElement, 477 - React.ComponentProps<"div"> 478 - >(({ className, ...props }, ref) => ( 479 - <div 480 - ref={ref} 481 - data-sidebar="group-content" 482 - className={cn("w-full text-sm", className)} 483 - {...props} 484 - /> 485 - )) 486 - SidebarGroupContent.displayName = "SidebarGroupContent" 487 - 488 - const SidebarMenu = React.forwardRef< 489 - HTMLUListElement, 490 - React.ComponentProps<"ul"> 491 - >(({ className, ...props }, ref) => ( 492 - <ul 493 - ref={ref} 494 - data-sidebar="menu" 495 - className={cn("flex w-full min-w-0 flex-col gap-1", className)} 496 - {...props} 497 - /> 498 - )) 499 - SidebarMenu.displayName = "SidebarMenu" 500 - 501 - const SidebarMenuItem = React.forwardRef< 502 - HTMLLIElement, 503 - React.ComponentProps<"li"> 504 - >(({ className, ...props }, ref) => ( 505 - <li 506 - ref={ref} 507 - data-sidebar="menu-item" 508 - className={cn("group/menu-item relative", className)} 509 - {...props} 510 - /> 511 - )) 512 - SidebarMenuItem.displayName = "SidebarMenuItem" 513 - 514 - const sidebarMenuButtonVariants = cva( 515 - "peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0", 516 - { 517 - variants: { 518 - variant: { 519 - default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground", 520 - outline: 521 - "bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]", 522 - }, 523 - size: { 524 - default: "h-8 text-sm", 525 - sm: "h-7 text-xs", 526 - lg: "h-12 text-sm group-data-[collapsible=icon]:!p-0", 527 - }, 528 - }, 529 - defaultVariants: { 530 - variant: "default", 531 - size: "default", 532 - }, 533 - } 534 - ) 535 - 536 - const SidebarMenuButton = React.forwardRef< 537 - HTMLButtonElement, 538 - React.ComponentProps<"button"> & { 539 - asChild?: boolean 540 - isActive?: boolean 541 - tooltip?: string | React.ComponentProps<typeof TooltipContent> 542 - } & VariantProps<typeof sidebarMenuButtonVariants> 543 - >( 544 - ( 545 - { 546 - asChild = false, 547 - isActive = false, 548 - variant = "default", 549 - size = "default", 550 - tooltip, 551 - className, 552 - ...props 553 - }, 554 - ref 555 - ) => { 556 - const Comp = asChild ? Slot : "button" 557 - const { isMobile, state } = useSidebar() 558 - 559 - const button = ( 560 - <Comp 561 - ref={ref} 562 - data-sidebar="menu-button" 563 - data-size={size} 564 - data-active={isActive} 565 - className={cn(sidebarMenuButtonVariants({ variant, size }), className)} 566 - {...props} 567 - /> 568 - ) 569 - 570 - if (!tooltip) { 571 - return button 572 - } 573 - 574 - if (typeof tooltip === "string") { 575 - tooltip = { 576 - children: tooltip, 577 - } 578 - } 579 - 580 - return ( 581 - <Tooltip> 582 - <TooltipTrigger asChild>{button}</TooltipTrigger> 583 - <TooltipContent 584 - side="right" 585 - align="center" 586 - hidden={state !== "collapsed" || isMobile} 587 - {...tooltip} 588 - /> 589 - </Tooltip> 590 - ) 591 - } 592 - ) 593 - SidebarMenuButton.displayName = "SidebarMenuButton" 594 - 595 - const SidebarMenuAction = React.forwardRef< 596 - HTMLButtonElement, 597 - React.ComponentProps<"button"> & { 598 - asChild?: boolean 599 - showOnHover?: boolean 600 - } 601 - >(({ className, asChild = false, showOnHover = false, ...props }, ref) => { 602 - const Comp = asChild ? Slot : "button" 603 - 604 - return ( 605 - <Comp 606 - ref={ref} 607 - data-sidebar="menu-action" 608 - className={cn( 609 - "absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0", 610 - // Increases the hit area of the button on mobile. 611 - "after:absolute after:-inset-2 after:md:hidden", 612 - "peer-data-[size=sm]/menu-button:top-1", 613 - "peer-data-[size=default]/menu-button:top-1.5", 614 - "peer-data-[size=lg]/menu-button:top-2.5", 615 - "group-data-[collapsible=icon]:hidden", 616 - showOnHover && 617 - "group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0", 618 - className 619 - )} 620 - {...props} 621 - /> 622 - ) 623 - }) 624 - SidebarMenuAction.displayName = "SidebarMenuAction" 625 - 626 - const SidebarMenuBadge = React.forwardRef< 627 - HTMLDivElement, 628 - React.ComponentProps<"div"> 629 - >(({ className, ...props }, ref) => ( 630 - <div 631 - ref={ref} 632 - data-sidebar="menu-badge" 633 - className={cn( 634 - "absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground select-none pointer-events-none", 635 - "peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground", 636 - "peer-data-[size=sm]/menu-button:top-1", 637 - "peer-data-[size=default]/menu-button:top-1.5", 638 - "peer-data-[size=lg]/menu-button:top-2.5", 639 - "group-data-[collapsible=icon]:hidden", 640 - className 641 - )} 642 - {...props} 643 - /> 644 - )) 645 - SidebarMenuBadge.displayName = "SidebarMenuBadge" 646 - 647 - const SidebarMenuSkeleton = React.forwardRef< 648 - HTMLDivElement, 649 - React.ComponentProps<"div"> & { 650 - showIcon?: boolean 651 - } 652 - >(({ className, showIcon = false, ...props }, ref) => { 653 - // Random width between 50 to 90%. 654 - const width = React.useMemo(() => { 655 - return `${Math.floor(Math.random() * 40) + 50}%` 656 - }, []) 657 - 658 - return ( 659 - <div 660 - ref={ref} 661 - data-sidebar="menu-skeleton" 662 - className={cn("rounded-md h-8 flex gap-2 px-2 items-center", className)} 663 - {...props} 664 - > 665 - {showIcon && ( 666 - <Skeleton 667 - className="size-4 rounded-md" 668 - data-sidebar="menu-skeleton-icon" 669 - /> 670 - )} 671 - <Skeleton 672 - className="h-4 flex-1 max-w-[--skeleton-width]" 673 - data-sidebar="menu-skeleton-text" 674 - style={ 675 - { 676 - "--skeleton-width": width, 677 - } as React.CSSProperties 678 - } 679 - /> 680 - </div> 681 - ) 682 - }) 683 - SidebarMenuSkeleton.displayName = "SidebarMenuSkeleton" 684 - 685 - const SidebarMenuSub = React.forwardRef< 686 - HTMLUListElement, 687 - React.ComponentProps<"ul"> 688 - >(({ className, ...props }, ref) => ( 689 - <ul 690 - ref={ref} 691 - data-sidebar="menu-sub" 692 - className={cn( 693 - "mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5", 694 - "group-data-[collapsible=icon]:hidden", 695 - className 696 - )} 697 - {...props} 698 - /> 699 - )) 700 - SidebarMenuSub.displayName = "SidebarMenuSub" 701 - 702 - const SidebarMenuSubItem = React.forwardRef< 703 - HTMLLIElement, 704 - React.ComponentProps<"li"> 705 - >(({ ...props }, ref) => <li ref={ref} {...props} />) 706 - SidebarMenuSubItem.displayName = "SidebarMenuSubItem" 707 - 708 - const SidebarMenuSubButton = React.forwardRef< 709 - HTMLAnchorElement, 710 - React.ComponentProps<"a"> & { 711 - asChild?: boolean 712 - size?: "sm" | "md" 713 - isActive?: boolean 714 - } 715 - >(({ asChild = false, size = "md", isActive, className, ...props }, ref) => { 716 - const Comp = asChild ? Slot : "a" 717 - 718 - return ( 719 - <Comp 720 - ref={ref} 721 - data-sidebar="menu-sub-button" 722 - data-size={size} 723 - data-active={isActive} 724 - className={cn( 725 - "flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground", 726 - "data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground", 727 - size === "sm" && "text-xs", 728 - size === "md" && "text-sm", 729 - "group-data-[collapsible=icon]:hidden", 730 - className 731 - )} 732 - {...props} 733 - /> 734 - ) 735 - }) 736 - SidebarMenuSubButton.displayName = "SidebarMenuSubButton" 737 - 738 - export { 739 - Sidebar, 740 - SidebarContent, 741 - SidebarFooter, 742 - SidebarGroup, 743 - SidebarGroupAction, 744 - SidebarGroupContent, 745 - SidebarGroupLabel, 746 - SidebarHeader, 747 - SidebarInput, 748 - SidebarInset, 749 - SidebarMenu, 750 - SidebarMenuAction, 751 - SidebarMenuBadge, 752 - SidebarMenuButton, 753 - SidebarMenuItem, 754 - SidebarMenuSkeleton, 755 - SidebarMenuSub, 756 - SidebarMenuSubButton, 757 - SidebarMenuSubItem, 758 - SidebarProvider, 759 - SidebarRail, 760 - SidebarSeparator, 761 - SidebarTrigger, 762 - useSidebar, 763 - }
-15
apps/web/src/components/ui/skeleton.tsx
··· 1 - import { cn } from "@/lib/utils" 2 - 3 - function Skeleton({ 4 - className, 5 - ...props 6 - }: React.HTMLAttributes<HTMLDivElement>) { 7 - return ( 8 - <div 9 - className={cn("animate-pulse rounded-md bg-primary/10", className)} 10 - {...props} 11 - /> 12 - ) 13 - } 14 - 15 - export { Skeleton }
-336
apps/web/src/components/ui/sortable.tsx
··· 1 - "use client" 2 - 3 - import * as React from "react" 4 - import type { 5 - DndContextProps, 6 - DraggableSyntheticListeners, 7 - DropAnimation, 8 - UniqueIdentifier, 9 - } from "@dnd-kit/core" 10 - import { 11 - closestCenter, 12 - defaultDropAnimationSideEffects, 13 - DndContext, 14 - DragOverlay, 15 - KeyboardSensor, 16 - MouseSensor, 17 - TouchSensor, 18 - useSensor, 19 - useSensors, 20 - } from "@dnd-kit/core" 21 - import { 22 - restrictToHorizontalAxis, 23 - restrictToParentElement, 24 - restrictToVerticalAxis, 25 - } from "@dnd-kit/modifiers" 26 - import { 27 - arrayMove, 28 - horizontalListSortingStrategy, 29 - SortableContext, 30 - useSortable, 31 - verticalListSortingStrategy, 32 - type SortableContextProps, 33 - } from "@dnd-kit/sortable" 34 - import { CSS } from "@dnd-kit/utilities" 35 - import { Slot, type SlotProps } from "@radix-ui/react-slot" 36 - 37 - import { composeRefs } from "@/lib/compose-refs" 38 - import { cn } from "@/lib/utils" 39 - import { Button, type ButtonProps } from "@/components/ui/button" 40 - 41 - const orientationConfig = { 42 - vertical: { 43 - modifiers: [restrictToVerticalAxis, restrictToParentElement], 44 - strategy: verticalListSortingStrategy, 45 - }, 46 - horizontal: { 47 - modifiers: [restrictToHorizontalAxis, restrictToParentElement], 48 - strategy: horizontalListSortingStrategy, 49 - }, 50 - mixed: { 51 - modifiers: [restrictToParentElement], 52 - strategy: undefined, 53 - }, 54 - } 55 - 56 - interface SortableProps<TData extends { id: UniqueIdentifier }> 57 - extends DndContextProps { 58 - /** 59 - * An array of data items that the sortable component will render. 60 - * @example 61 - * value={[ 62 - * { id: 1, name: 'Item 1' }, 63 - * { id: 2, name: 'Item 2' }, 64 - * ]} 65 - */ 66 - value: TData[] 67 - 68 - /** 69 - * An optional callback function that is called when the order of the data items changes. 70 - * It receives the new array of items as its argument. 71 - * @example 72 - * onValueChange={(items) => console.log(items)} 73 - */ 74 - onValueChange?: (items: TData[]) => void 75 - 76 - /** 77 - * An optional callback function that is called when an item is moved. 78 - * It receives an event object with `activeIndex` and `overIndex` properties, representing the original and new positions of the moved item. 79 - * This will override the default behavior of updating the order of the data items. 80 - * @type (event: { activeIndex: number; overIndex: number }) => void 81 - * @example 82 - * onMove={(event) => console.log(`Item moved from index ${event.activeIndex} to index ${event.overIndex}`)} 83 - */ 84 - onMove?: (event: { activeIndex: number; overIndex: number }) => void 85 - 86 - /** 87 - * A collision detection strategy that will be used to determine the closest sortable item. 88 - * @default closestCenter 89 - * @type DndContextProps["collisionDetection"] 90 - */ 91 - collisionDetection?: DndContextProps["collisionDetection"] 92 - 93 - /** 94 - * An array of modifiers that will be used to modify the behavior of the sortable component. 95 - * @default 96 - * [restrictToVerticalAxis, restrictToParentElement] 97 - * @type Modifier[] 98 - */ 99 - modifiers?: DndContextProps["modifiers"] 100 - 101 - /** 102 - * A sorting strategy that will be used to determine the new order of the data items. 103 - * @default verticalListSortingStrategy 104 - * @type SortableContextProps["strategy"] 105 - */ 106 - strategy?: SortableContextProps["strategy"] 107 - 108 - /** 109 - * Specifies the axis for the drag-and-drop operation. It can be "vertical", "horizontal", or "both". 110 - * @default "vertical" 111 - * @type "vertical" | "horizontal" | "mixed" 112 - */ 113 - orientation?: "vertical" | "horizontal" | "mixed" 114 - 115 - /** 116 - * An optional React node that is rendered on top of the sortable component. 117 - * It can be used to display additional information or controls. 118 - * @default null 119 - * @type React.ReactNode | null 120 - * @example 121 - * overlay={<Skeleton className="w-full h-8" />} 122 - */ 123 - overlay?: React.ReactNode | null 124 - } 125 - 126 - function Sortable<TData extends { id: UniqueIdentifier }>({ 127 - value, 128 - onValueChange, 129 - collisionDetection = closestCenter, 130 - modifiers, 131 - strategy, 132 - onMove, 133 - orientation = "vertical", 134 - overlay, 135 - children, 136 - ...props 137 - }: SortableProps<TData>) { 138 - const [activeId, setActiveId] = React.useState<UniqueIdentifier | null>(null) 139 - const sensors = useSensors( 140 - useSensor(MouseSensor), 141 - useSensor(TouchSensor), 142 - useSensor(KeyboardSensor) 143 - ) 144 - 145 - const config = orientationConfig[orientation] 146 - 147 - return ( 148 - <DndContext 149 - modifiers={modifiers ?? config.modifiers} 150 - sensors={sensors} 151 - onDragStart={({ active }) => setActiveId(active.id)} 152 - onDragEnd={({ active, over }) => { 153 - if (over && active.id !== over?.id) { 154 - const activeIndex = value.findIndex((item) => item.id === active.id) 155 - const overIndex = value.findIndex((item) => item.id === over.id) 156 - 157 - if (onMove) { 158 - onMove({ activeIndex, overIndex }) 159 - } else { 160 - onValueChange?.(arrayMove(value, activeIndex, overIndex)) 161 - } 162 - } 163 - setActiveId(null) 164 - }} 165 - onDragCancel={() => setActiveId(null)} 166 - collisionDetection={collisionDetection} 167 - {...props} 168 - > 169 - <SortableContext items={value} strategy={strategy ?? config.strategy}> 170 - {children} 171 - </SortableContext> 172 - {overlay ? ( 173 - <SortableOverlay activeId={activeId}>{overlay}</SortableOverlay> 174 - ) : null} 175 - </DndContext> 176 - ) 177 - } 178 - 179 - const dropAnimationOpts: DropAnimation = { 180 - sideEffects: defaultDropAnimationSideEffects({ 181 - styles: { 182 - active: { 183 - opacity: "0.4", 184 - }, 185 - }, 186 - }), 187 - } 188 - 189 - interface SortableOverlayProps 190 - extends React.ComponentPropsWithRef<typeof DragOverlay> { 191 - activeId?: UniqueIdentifier | null 192 - } 193 - 194 - const SortableOverlay = React.forwardRef<HTMLDivElement, SortableOverlayProps>( 195 - ( 196 - { activeId, dropAnimation = dropAnimationOpts, children, ...props }, 197 - ref 198 - ) => { 199 - return ( 200 - <DragOverlay dropAnimation={dropAnimation} {...props}> 201 - {activeId ? ( 202 - <SortableItem 203 - ref={ref} 204 - value={activeId} 205 - className="cursor-grabbing" 206 - asChild 207 - > 208 - {children} 209 - </SortableItem> 210 - ) : null} 211 - </DragOverlay> 212 - ) 213 - } 214 - ) 215 - SortableOverlay.displayName = "SortableOverlay" 216 - 217 - interface SortableItemContextProps { 218 - attributes: React.HTMLAttributes<HTMLElement> 219 - listeners: DraggableSyntheticListeners | undefined 220 - isDragging?: boolean 221 - } 222 - 223 - const SortableItemContext = React.createContext<SortableItemContextProps>({ 224 - attributes: {}, 225 - listeners: undefined, 226 - isDragging: false, 227 - }) 228 - 229 - function useSortableItem() { 230 - const context = React.useContext(SortableItemContext) 231 - 232 - if (!context) { 233 - throw new Error("useSortableItem must be used within a SortableItem") 234 - } 235 - 236 - return context 237 - } 238 - 239 - interface SortableItemProps extends SlotProps { 240 - /** 241 - * The unique identifier of the item. 242 - * @example "item-1" 243 - * @type UniqueIdentifier 244 - */ 245 - value: UniqueIdentifier 246 - 247 - /** 248 - * Specifies whether the item should act as a trigger for the drag-and-drop action. 249 - * @default false 250 - * @type boolean | undefined 251 - */ 252 - asTrigger?: boolean 253 - 254 - /** 255 - * Merges the item's props into its immediate child. 256 - * @default false 257 - * @type boolean | undefined 258 - */ 259 - asChild?: boolean 260 - } 261 - 262 - const SortableItem = React.forwardRef<HTMLDivElement, SortableItemProps>( 263 - ({ value, asTrigger, asChild, className, ...props }, ref) => { 264 - const { 265 - attributes, 266 - listeners, 267 - setNodeRef, 268 - transform, 269 - transition, 270 - isDragging, 271 - } = useSortable({ id: value }) 272 - 273 - const context = React.useMemo<SortableItemContextProps>( 274 - () => ({ 275 - attributes, 276 - listeners, 277 - isDragging, 278 - }), 279 - [attributes, listeners, isDragging] 280 - ) 281 - const style: React.CSSProperties = { 282 - opacity: isDragging ? 0.5 : 1, 283 - transform: CSS.Translate.toString(transform), 284 - transition, 285 - } 286 - 287 - const Comp = asChild ? Slot : "div" 288 - 289 - return ( 290 - <SortableItemContext.Provider value={context}> 291 - <Comp 292 - data-state={isDragging ? "dragging" : undefined} 293 - className={cn( 294 - "data-[state=dragging]:cursor-grabbing", 295 - { "cursor-grab": !isDragging && asTrigger }, 296 - className 297 - )} 298 - ref={composeRefs(ref, setNodeRef as React.Ref<HTMLDivElement>)} 299 - style={style} 300 - {...(asTrigger ? attributes : {})} 301 - {...(asTrigger ? listeners : {})} 302 - {...props} 303 - /> 304 - </SortableItemContext.Provider> 305 - ) 306 - } 307 - ) 308 - SortableItem.displayName = "SortableItem" 309 - 310 - interface SortableDragHandleProps extends ButtonProps { 311 - withHandle?: boolean 312 - } 313 - 314 - const SortableDragHandle = React.forwardRef< 315 - HTMLButtonElement, 316 - SortableDragHandleProps 317 - >(({ className, ...props }, ref) => { 318 - const { attributes, listeners, isDragging } = useSortableItem() 319 - 320 - return ( 321 - <Button 322 - ref={composeRefs(ref)} 323 - data-state={isDragging ? "dragging" : undefined} 324 - className={cn( 325 - "cursor-grab data-[state=dragging]:cursor-grabbing", 326 - className 327 - )} 328 - {...attributes} 329 - {...listeners} 330 - {...props} 331 - /> 332 - ) 333 - }) 334 - SortableDragHandle.displayName = "SortableDragHandle" 335 - 336 - export { Sortable, SortableDragHandle, SortableItem, SortableOverlay }
-22
apps/web/src/components/ui/textarea.tsx
··· 1 - import * as React from "react" 2 - 3 - import { cn } from "@/lib/utils" 4 - 5 - const Textarea = React.forwardRef< 6 - HTMLTextAreaElement, 7 - React.ComponentProps<"textarea"> 8 - >(({ className, ...props }, ref) => { 9 - return ( 10 - <textarea 11 - className={cn( 12 - "flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", 13 - className 14 - )} 15 - ref={ref} 16 - {...props} 17 - /> 18 - ) 19 - }) 20 - Textarea.displayName = "Textarea" 21 - 22 - export { Textarea }
-30
apps/web/src/components/ui/tooltip.tsx
··· 1 - import * as React from "react" 2 - import * as TooltipPrimitive from "@radix-ui/react-tooltip" 3 - 4 - import { cn } from "@/lib/utils" 5 - 6 - const TooltipProvider = TooltipPrimitive.Provider 7 - 8 - const Tooltip = TooltipPrimitive.Root 9 - 10 - const TooltipTrigger = TooltipPrimitive.Trigger 11 - 12 - const TooltipContent = React.forwardRef< 13 - React.ElementRef<typeof TooltipPrimitive.Content>, 14 - React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content> 15 - >(({ className, sideOffset = 4, ...props }, ref) => ( 16 - <TooltipPrimitive.Portal> 17 - <TooltipPrimitive.Content 18 - ref={ref} 19 - sideOffset={sideOffset} 20 - className={cn( 21 - "z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", 22 - className 23 - )} 24 - {...props} 25 - /> 26 - </TooltipPrimitive.Portal> 27 - )) 28 - TooltipContent.displayName = TooltipPrimitive.Content.displayName 29 - 30 - export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
-19
apps/web/src/hooks/use-mobile.tsx
··· 1 - import * as React from "react" 2 - 3 - const MOBILE_BREAKPOINT = 768 4 - 5 - export function useIsMobile() { 6 - const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined) 7 - 8 - React.useEffect(() => { 9 - const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`) 10 - const onChange = () => { 11 - setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) 12 - } 13 - mql.addEventListener("change", onChange) 14 - setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) 15 - return () => mql.removeEventListener("change", onChange) 16 - }, []) 17 - 18 - return !!isMobile 19 - }
-7
apps/web/src/hooks/use-xrpc.tsx
··· 1 - import { useClient } from "@/state/auth"; 2 - 3 - /** @deprecated Use `useClient` from `state/auth/client` instead. */ 4 - export function useXrpc() { 5 - const client = useClient(); 6 - return client; 7 - }
+1 -84
apps/web/src/index.css
··· 1 - @tailwind base; 2 - @tailwind components; 3 - @tailwind utilities; 4 - 5 - @layer base { 6 - :root { 7 - --background: 0 0% 96.1%; 8 - --foreground: 0 0% 3.9%; 9 - --card: 0 0% 100%; 10 - --card-foreground: 0 0% 3.9%; 11 - --popover: 0 0% 100%; 12 - --popover-foreground: 0 0% 3.9%; 13 - --primary: 221.2 83.2% 53.3%; 14 - --primary-foreground: 210 40% 98%; 15 - --secondary: 210 40% 96.1%; 16 - --secondary-foreground: 222.2 47.4% 11.2%; 17 - --muted: 0 0% 96.1%; 18 - --muted-foreground: 0 0% 45.1%; 19 - --accent: 210 40% 96.1%; 20 - --accent-foreground: 222.2 47.4% 11.2%; 21 - --destructive: 0 84.2% 60.2%; 22 - --destructive-foreground: 0 0% 98%; 23 - --border: 214.3 31.8% 91.4%; 24 - --input: 214.3 31.8% 91.4%; 25 - --ring: 221.2 83.2% 53.3%; 26 - --radius: 0.5rem; 27 - --chart-1: 12 76% 61%; 28 - --chart-2: 173 58% 39%; 29 - --chart-3: 197 37% 24%; 30 - --chart-4: 43 74% 66%; 31 - --chart-5: 27 87% 67%; 32 - --sidebar-background: 0 0% 98%; 33 - --sidebar-foreground: 240 5.3% 26.1%; 34 - --sidebar-primary: 221.2 83.2% 53.3%; 35 - --sidebar-primary-foreground: 0 0% 98%; 36 - --sidebar-accent: 210 40% 96.1%; 37 - --sidebar-accent-foreground: 240 5.9% 10%; 38 - --sidebar-border: 220 13% 91%; 39 - --sidebar-ring: 221.2 83.2% 53.3%; 40 - } 41 - .dark { 42 - --background: 0 0% 3.9%; 43 - --foreground: 0 0% 98%; 44 - --card: 0 0% 3.9%; 45 - --card-foreground: 0 0% 98%; 46 - --popover: 0 0% 3.9%; 47 - --popover-foreground: 0 0% 98%; 48 - --primary: 217.2 91.2% 59.8%; 49 - --primary-foreground: 222.2 47.4% 11.2%; 50 - --secondary: 217.2 32.6% 17.5%; 51 - --secondary-foreground: 210 40% 98%; 52 - --muted: 217.2 32.6% 17.5%; 53 - --muted-foreground: 215 20.2% 65.1%; 54 - --accent: 217.2 32.6% 17.5%; 55 - --accent-foreground: 210 40% 98%; 56 - --destructive: 0 62.8% 30.6%; 57 - --destructive-foreground: 210 40% 98%; 58 - --border: 217.2 32.6% 17.5%; 59 - --input: 217.2 32.6% 17.5%; 60 - --ring: 224.3 76.3% 48%; 61 - --chart-1: 220 70% 50%; 62 - --chart-2: 160 60% 45%; 63 - --chart-3: 30 80% 55%; 64 - --chart-4: 280 65% 60%; 65 - --chart-5: 340 75% 55%; 66 - --sidebar-background: 240 5.9% 10%; 67 - --sidebar-foreground: 240 4.8% 95.9%; 68 - --sidebar-primary: 217.2 91.2% 59.8%; 69 - --sidebar-primary-foreground: 0 0% 100%; 70 - --sidebar-accent: 217.2 32.6% 17.5%; 71 - --sidebar-accent-foreground: 240 4.8% 95.9%; 72 - --sidebar-border: 240 3.7% 15.9%; 73 - --sidebar-ring: 217.2 91.2% 59.8%; 74 - } 75 - } 76 - 77 - @layer base { 78 - * { 79 - @apply border-border; 80 - } 81 - body { 82 - @apply bg-background text-foreground; 83 - } 84 - } 1 + @import "tailwindcss";
-36
apps/web/src/lib/compose-refs.ts
··· 1 - // @see https://github.com/radix-ui/primitives/blob/main/packages/react/compose-refs/src/composeRefs.tsx 2 - 3 - import * as React from "react" 4 - 5 - type PossibleRef<T> = React.Ref<T> | undefined 6 - 7 - /** 8 - * Set a given ref to a given value 9 - * This utility takes care of different types of refs: callback refs and RefObject(s) 10 - */ 11 - function setRef<T>(ref: PossibleRef<T>, value: T) { 12 - if (typeof ref === "function") { 13 - ref(value) 14 - } else if (ref !== null && ref !== undefined) { 15 - ;(ref as React.MutableRefObject<T>).current = value 16 - } 17 - } 18 - 19 - /** 20 - * A utility to compose multiple refs together 21 - * Accepts callback refs and RefObject(s) 22 - */ 23 - function composeRefs<T>(...refs: PossibleRef<T>[]) { 24 - return (node: T) => refs.forEach((ref) => setRef(ref, node)) 25 - } 26 - 27 - /** 28 - * A custom hook that composes multiple refs 29 - * Accepts callback refs and RefObject(s) 30 - */ 31 - function useComposedRefs<T>(...refs: PossibleRef<T>[]) { 32 - // eslint-disable-next-line react-hooks/exhaustive-deps 33 - return React.useCallback(composeRefs(...refs), refs) 34 - } 35 - 36 - export { composeRefs, useComposedRefs }
-139
apps/web/src/lib/did.ts
··· 1 - import { z } from "zod"; 2 - 3 - type Brand<K, T> = K & { __brand: T }; 4 - export type DID = Brand<string, "DID">; 5 - 6 - export function isDid(s: string): s is DID { 7 - return s.startsWith("did:"); 8 - } 9 - 10 - export function parseDid(s: string): DID | null { 11 - if (!isDid(s)) { 12 - return null; 13 - } 14 - return s; 15 - } 16 - 17 - export const getDidDoc = async (did: DID) => { 18 - let url = `https://plc.directory/${did}`; 19 - if (did.startsWith('did:web')) { 20 - url = `https://${did.split(':')[2]}/.well-known/did.json`; 21 - } 22 - 23 - const response = await fetch(url); 24 - 25 - return PlcDocument.parse(await response.json()); 26 - }; 27 - 28 - export const getPdsUrl = async (did: DID) => { 29 - const plc = await getDidDoc(did); 30 - 31 - return ( 32 - plc.service.find((s) => s.type === "AtprotoPersonalDataServer") 33 - ?.serviceEndpoint ?? null 34 - ); 35 - }; 36 - 37 - const PlcDocument = z.object({ 38 - id: z.string(), 39 - alsoKnownAs: z.array(z.string()), 40 - service: z.array( 41 - z.object({ 42 - id: z.string(), 43 - type: z.string(), 44 - serviceEndpoint: z.string(), 45 - }), 46 - ), 47 - }); 48 - 49 - const DnsQueryResponse = z.object({ 50 - Answer: z.array( 51 - z.object({ 52 - name: z.string(), 53 - type: z.number(), 54 - TTL: z.number(), 55 - data: z.string(), 56 - }), 57 - ), 58 - }); 59 - 60 - async function getAtprotoDidFromDns(handle: string) { 61 - const url = new URL("https://cloudflare-dns.com/dns-query"); 62 - url.searchParams.set("type", "TXT"); 63 - url.searchParams.set("name", `_atproto.${handle}`); 64 - 65 - const response = await fetch(url, { 66 - headers: { 67 - Accept: "application/dns-json", 68 - }, 69 - }); 70 - 71 - const { Answer } = DnsQueryResponse.parse(await response.json()); 72 - // Answer[0].data is "\"did=...\"" (with quotes) 73 - const val = Answer[0]?.data 74 - ? JSON.parse(Answer[0]?.data).split("did=")[1] 75 - : null; 76 - 77 - return val ? parseDid(val) : null; 78 - } 79 - 80 - const getAtprotoFromHttps = async (handle: string) => { 81 - let res; 82 - const timeoutSignal = AbortSignal.timeout(1500); 83 - try { 84 - res = await fetch(`https://${handle}/.well-known/atproto-did`, { 85 - signal: timeoutSignal, 86 - }); 87 - } catch (_e) { 88 - // We're caching failures here, we should at some point invalidate the cache by listening to handle changes on the network 89 - return null; 90 - } 91 - 92 - if (!res.ok) { 93 - return null; 94 - } 95 - return parseDid((await res.text()).trim()); 96 - }; 97 - 98 - export const getVerifiedDid = async (handle: string) => { 99 - const [dnsDid, httpDid] = await Promise.all([ 100 - getAtprotoDidFromDns(handle).catch((_) => { 101 - return null; 102 - }), 103 - getAtprotoFromHttps(handle).catch(() => { 104 - return null; 105 - }), 106 - ]); 107 - 108 - if (dnsDid && httpDid && dnsDid !== httpDid) { 109 - return null; 110 - } 111 - 112 - const did = dnsDid ?? (httpDid ? parseDid(httpDid) : null); 113 - if (!did) { 114 - return null; 115 - } 116 - 117 - const plcDoc = await getDidDoc(did); 118 - const plcHandle = plcDoc.alsoKnownAs 119 - .find((handle) => handle.startsWith("at://")) 120 - ?.replace("at://", ""); 121 - 122 - if (!plcHandle) return null; 123 - 124 - return plcHandle.toLowerCase() === handle.toLowerCase() ? did : null; 125 - }; 126 - 127 - export const getDidFromHandleOrDid = async (handleOrDid: string) => { 128 - const decodedHandleOrDid = decodeURIComponent(handleOrDid); 129 - if (isDid(decodedHandleOrDid)) { 130 - return decodedHandleOrDid; 131 - } 132 - 133 - return getVerifiedDid(decodedHandleOrDid); 134 - }; 135 - 136 - export const getHandleFromHandleOrDid = async (did: string) => { 137 - const didDoc = await getDidDoc(did as DID); 138 - return didDoc.alsoKnownAs[0]?.substring(5); 139 - }
-11
apps/web/src/lib/react-query.ts
··· 1 - import { QueryClient } from "@tanstack/react-query"; 2 - 3 - export const queryClient = new QueryClient({ 4 - defaultOptions: { 5 - queries: { 6 - refetchOnWindowFocus: false, 7 - structuralSharing: false, 8 - retry: false, 9 - } 10 - } 11 - });
-10
apps/web/src/lib/utils.ts
··· 1 - import { clsx, type ClassValue } from "clsx" 2 - import { twMerge } from "tailwind-merge" 3 - 4 - export function cn(...inputs: ClassValue[]) { 5 - return twMerge(clsx(inputs)) 6 - } 7 - 8 - export const sleep = (ms: number): Promise<void> => new Promise(resolve => setTimeout(resolve, ms)) 9 - 10 - export const SERVER_URL = import.meta.env.VITE_API_SERVICE;
+14 -69
apps/web/src/main.tsx
··· 1 - import { StrictMode } from 'react' 2 - import { createRoot } from 'react-dom/client' 3 - import { routeTree } from './routeTree.gen'; 1 + import { StrictMode } from 'react'; 2 + import { createRoot } from 'react-dom/client'; 4 3 import { createRouter, RouterProvider } from '@tanstack/react-router'; 5 - import { QueryClientProvider, QueryClient } from '@tanstack/react-query' 6 - import { ReactQueryDevtools } from '@tanstack/react-query-devtools' 7 - import { configureOAuth, defaultIdentityResolver } from '@atcute/oauth-browser-client'; 8 - import './index.css' 9 - import { ThemeProvider } from './components/theme-provider'; 10 - import { CompositeDidDocumentResolver, PlcDidDocumentResolver, WebDidDocumentResolver, XrpcHandleResolver } from '@atcute/identity-resolver'; 11 - import { SessionProvider, useSession } from './state/auth/session'; 12 - import { ClientProvider, useClient } from './state/auth'; 4 + import { routeTree } from './routeTree.gen'; 13 5 14 - const router = createRouter({ 15 - routeTree, 16 - context: { 17 - session: undefined!, 18 - client: undefined!, 19 - }, 20 - }); 6 + import './index.css'; 21 7 22 - declare module '@tanstack/react-router' { 23 - interface Register { 24 - router: typeof router 25 - } 8 + const router = createRouter({ routeTree }); 9 + 10 + const rootElement = document.getElementById('root')!; 11 + if (!rootElement.innerHTML) { 12 + const root = createRoot(rootElement); 13 + root.render( 14 + <StrictMode> 15 + <RouterProvider router={router} /> 16 + </StrictMode>, 17 + ); 26 18 } 27 - 28 - configureOAuth({ 29 - metadata: { 30 - client_id: import.meta.env.VITE_OAUTH_CLIENT_ID, 31 - redirect_uri: import.meta.env.VITE_OAUTH_REDIRECT_URI, 32 - }, 33 - identityResolver: defaultIdentityResolver({ 34 - handleResolver: new XrpcHandleResolver({ serviceUrl: 'https://slingshot.microcosm.blue' }), 35 - didDocumentResolver: new CompositeDidDocumentResolver({ 36 - methods: { 37 - plc: new PlcDidDocumentResolver(), 38 - web: new WebDidDocumentResolver(), 39 - }, 40 - }), 41 - }), 42 - }); 43 - 44 - const queryClient = new QueryClient({ 45 - defaultOptions: { 46 - queries: { 47 - refetchOnWindowFocus: false, 48 - structuralSharing: false, 49 - retry: false, 50 - } 51 - } 52 - }); 53 - 54 - const InnerApp = () => { 55 - const session = useSession(); 56 - const client = useClient(); 57 - return <RouterProvider router={router} context={{ session, client }} /> 58 - }; 59 - 60 - createRoot(document.getElementById('root')!).render( 61 - <StrictMode> 62 - <SessionProvider> 63 - <ClientProvider> 64 - <ThemeProvider defaultTheme="dark" storageKey="recipes-theme"> 65 - <QueryClientProvider client={queryClient}> 66 - <InnerApp /> 67 - <ReactQueryDevtools initialIsOpen={false} /> 68 - </QueryClientProvider> 69 - </ThemeProvider> 70 - </ClientProvider> 71 - </SessionProvider> 72 - </StrictMode>, 73 - )
-105
apps/web/src/queries/recipe.ts
··· 1 - import { queryOptions, useMutation, useQuery } from "@tanstack/react-query"; 2 - import { Client } from "@atcute/client"; 3 - import { notFound } from "@tanstack/react-router"; 4 - import { UseFormReturn } from "react-hook-form"; 5 - import { TID } from '@atproto/common-web'; 6 - import { z } from "zod"; 7 - import { ActorIdentifier, Did } from "@atcute/lexicons"; 8 - 9 - import type {} from '@atcute/atproto'; 10 - import type {} from '@cookware/lexicons'; 11 - import { useClient } from "../state/auth/client"; 12 - 13 - const RQKEY_ROOT = 'posts'; 14 - export const RQKEY = (cursor: string, did: string, rkey: string) => [RQKEY_ROOT, cursor, did, rkey]; 15 - 16 - export const useRecipesQuery = (cursor: string, did?: Did) => { 17 - const client = useClient(); 18 - return useQuery({ 19 - queryKey: RQKEY(cursor, did ?? '', ''), 20 - queryFn: async () => { 21 - const res = await client.get('blue.recipes.feed.getRecipes', { 22 - params: { cursor, did }, 23 - }); 24 - if (!res.ok) throw res.data; 25 - return res.data; 26 - }, 27 - }); 28 - }; 29 - 30 - export const recipeQueryOptions = (rpc: Client, actor: ActorIdentifier, rkey: string) => { 31 - return queryOptions({ 32 - queryKey: RQKEY('', actor, rkey), 33 - queryFn: async () => { 34 - const { ok, data } = await rpc.get('blue.recipes.feed.getRecipe', { 35 - params: { uris: [`at://${actor}/blue.recipes.feed.recipe/${rkey}`] }, 36 - }); 37 - 38 - if (!ok) { 39 - switch (data.error) { 40 - case 'RecipeNotFound': 41 - throw notFound({ routeId: '/_' }); 42 - default: 43 - throw new Error(`Error fetching recipe: ${data.error}`); 44 - } 45 - } 46 - 47 - return data; 48 - }, 49 - }); 50 - }; 51 - 52 - export const useRecipeQuery = (did: Did, rkey: string) => { 53 - const rpc = useClient(); 54 - return useQuery(recipeQueryOptions(rpc, did, rkey)); 55 - }; 56 - 57 - export const useNewRecipeMutation = (form: UseFormReturn<z.infer<typeof recipeSchema>>) => { 58 - const rpc = useClient(); 59 - return useMutation({ 60 - mutationKey: ['recipes.new'], 61 - mutationFn: async ({ recipe: { image, ...recipe } }: { recipe: z.infer<typeof recipeSchema> }) => { 62 - let recipeImg = null; 63 - if (image) { 64 - const imageFile = image.item(0) as File; 65 - const { ok, data } = await rpc.post('com.atproto.repo.uploadBlob', { 66 - input: imageFile, 67 - }); 68 - 69 - if (!ok) { 70 - throw new Error(`Image upload failed: ${data.error}`); 71 - } 72 - 73 - recipeImg = data.blob; 74 - } 75 - 76 - const rkey = TID.nextStr(); 77 - const { ok, data } = await rpc.post(`com.atproto.repo.createRecord`, { 78 - input: { 79 - repo: agent?.session.info.sub as ActorIdentifier, 80 - record: { 81 - ...recipe, 82 - image: recipeImg, 83 - }, 84 - collection: 'blue.recipes.feed.recipe', 85 - rkey: rkey, 86 - } 87 - }); 88 - 89 - if (!ok) { 90 - throw new Error(`Recipe creation failed: ${data.error}`); 91 - } 92 - 93 - return { 94 - rkey: rkey, 95 - resp: data, 96 - }; 97 - }, 98 - onError: (error) => { 99 - form.setError('title', error); 100 - }, 101 - onSuccess: ({ rkey }) => { 102 - window.location.assign(`/recipes/${agent?.sub}/${rkey}`); 103 - }, 104 - }); 105 - };
-22
apps/web/src/queries/self.ts
··· 1 - import { useClient, useSession } from "@/state/auth"; 2 - import { BlueRecipesActorDefs } from "@cookware/lexicons"; 3 - import { useQuery } from "@tanstack/react-query"; 4 - 5 - export const useUserQuery = () => { 6 - const { isLoggedIn, agent } = useSession(); 7 - const rpc = useClient(); 8 - 9 - return useQuery({ 10 - queryKey: ['self'], 11 - queryFn: async () => { 12 - const res = await rpc.get('blue.recipes.actor.getProfile', { 13 - params: { 14 - actor: agent?.sub! 15 - }, 16 - }); 17 - 18 - return res.data as BlueRecipesActorDefs.ProfileViewDetailed; 19 - }, 20 - enabled: isLoggedIn, 21 - }); 22 - }
+8 -164
apps/web/src/routeTree.gen.ts
··· 8 8 // You should NOT make any changes in this file as it will be overwritten. 9 9 // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. 10 10 11 - import { createFileRoute } from '@tanstack/react-router' 12 - 13 11 import { Route as rootRouteImport } from './routes/__root' 14 - import { Route as RouteImport } from './routes/_' 15 - import { Route as authLoginRouteImport } from './routes/_.(auth)/login' 16 - import { Route as appRecipesNewRouteImport } from './routes/_.(app)/recipes/new' 17 12 18 - const appIndexLazyRouteImport = createFileRoute('/_/(app)/')() 19 - const appRecipesAuthorIndexLazyRouteImport = createFileRoute( 20 - '/_/(app)/recipes/$author/', 21 - )() 22 - const appRecipesAuthorRkeyIndexLazyRouteImport = createFileRoute( 23 - '/_/(app)/recipes/$author/$rkey/', 24 - )() 25 - 26 - const Route = RouteImport.update({ 27 - id: '/_', 28 - getParentRoute: () => rootRouteImport, 29 - } as any) 30 - const appIndexLazyRoute = appIndexLazyRouteImport 31 - .update({ 32 - id: '/(app)/', 33 - path: '/', 34 - getParentRoute: () => Route, 35 - } as any) 36 - .lazy(() => import('./routes/_.(app)/index.lazy').then((d) => d.Route)) 37 - const authLoginRoute = authLoginRouteImport.update({ 38 - id: '/(auth)/login', 39 - path: '/login', 40 - getParentRoute: () => Route, 41 - } as any) 42 - const appRecipesNewRoute = appRecipesNewRouteImport.update({ 43 - id: '/(app)/recipes/new', 44 - path: '/recipes/new', 45 - getParentRoute: () => Route, 46 - } as any) 47 - const appRecipesAuthorIndexLazyRoute = appRecipesAuthorIndexLazyRouteImport 48 - .update({ 49 - id: '/(app)/recipes/$author/', 50 - path: '/recipes/$author/', 51 - getParentRoute: () => Route, 52 - } as any) 53 - .lazy(() => 54 - import('./routes/_.(app)/recipes/$author/index.lazy').then((d) => d.Route), 55 - ) 56 - const appRecipesAuthorRkeyIndexLazyRoute = 57 - appRecipesAuthorRkeyIndexLazyRouteImport 58 - .update({ 59 - id: '/(app)/recipes/$author/$rkey/', 60 - path: '/recipes/$author/$rkey/', 61 - getParentRoute: () => Route, 62 - } as any) 63 - .lazy(() => 64 - import('./routes/_.(app)/recipes/$author/$rkey/index.lazy').then( 65 - (d) => d.Route, 66 - ), 67 - ) 68 - 69 - export interface FileRoutesByFullPath { 70 - '/login': typeof authLoginRoute 71 - '/': typeof appIndexLazyRoute 72 - '/recipes/new': typeof appRecipesNewRoute 73 - '/recipes/$author': typeof appRecipesAuthorIndexLazyRoute 74 - '/recipes/$author/$rkey': typeof appRecipesAuthorRkeyIndexLazyRoute 75 - } 76 - export interface FileRoutesByTo { 77 - '/login': typeof authLoginRoute 78 - '/': typeof appIndexLazyRoute 79 - '/recipes/new': typeof appRecipesNewRoute 80 - '/recipes/$author': typeof appRecipesAuthorIndexLazyRoute 81 - '/recipes/$author/$rkey': typeof appRecipesAuthorRkeyIndexLazyRoute 82 - } 13 + export interface FileRoutesByFullPath {} 14 + export interface FileRoutesByTo {} 83 15 export interface FileRoutesById { 84 16 __root__: typeof rootRouteImport 85 - '/_': typeof RouteWithChildren 86 - '/_/(auth)/login': typeof authLoginRoute 87 - '/_/(app)/': typeof appIndexLazyRoute 88 - '/_/(app)/recipes/new': typeof appRecipesNewRoute 89 - '/_/(app)/recipes/$author/': typeof appRecipesAuthorIndexLazyRoute 90 - '/_/(app)/recipes/$author/$rkey/': typeof appRecipesAuthorRkeyIndexLazyRoute 91 17 } 92 18 export interface FileRouteTypes { 93 19 fileRoutesByFullPath: FileRoutesByFullPath 94 - fullPaths: 95 - | '/login' 96 - | '/' 97 - | '/recipes/new' 98 - | '/recipes/$author' 99 - | '/recipes/$author/$rkey' 20 + fullPaths: never 100 21 fileRoutesByTo: FileRoutesByTo 101 - to: 102 - | '/login' 103 - | '/' 104 - | '/recipes/new' 105 - | '/recipes/$author' 106 - | '/recipes/$author/$rkey' 107 - id: 108 - | '__root__' 109 - | '/_' 110 - | '/_/(auth)/login' 111 - | '/_/(app)/' 112 - | '/_/(app)/recipes/new' 113 - | '/_/(app)/recipes/$author/' 114 - | '/_/(app)/recipes/$author/$rkey/' 22 + to: never 23 + id: '__root__' 115 24 fileRoutesById: FileRoutesById 116 25 } 117 - export interface RootRouteChildren { 118 - Route: typeof RouteWithChildren 119 - } 26 + export interface RootRouteChildren {} 120 27 121 28 declare module '@tanstack/react-router' { 122 - interface FileRoutesByPath { 123 - '/_': { 124 - id: '/_' 125 - path: '' 126 - fullPath: '' 127 - preLoaderRoute: typeof RouteImport 128 - parentRoute: typeof rootRouteImport 129 - } 130 - '/_/(app)/': { 131 - id: '/_/(app)/' 132 - path: '/' 133 - fullPath: '/' 134 - preLoaderRoute: typeof appIndexLazyRouteImport 135 - parentRoute: typeof Route 136 - } 137 - '/_/(auth)/login': { 138 - id: '/_/(auth)/login' 139 - path: '/login' 140 - fullPath: '/login' 141 - preLoaderRoute: typeof authLoginRouteImport 142 - parentRoute: typeof Route 143 - } 144 - '/_/(app)/recipes/new': { 145 - id: '/_/(app)/recipes/new' 146 - path: '/recipes/new' 147 - fullPath: '/recipes/new' 148 - preLoaderRoute: typeof appRecipesNewRouteImport 149 - parentRoute: typeof Route 150 - } 151 - '/_/(app)/recipes/$author/': { 152 - id: '/_/(app)/recipes/$author/' 153 - path: '/recipes/$author' 154 - fullPath: '/recipes/$author' 155 - preLoaderRoute: typeof appRecipesAuthorIndexLazyRouteImport 156 - parentRoute: typeof Route 157 - } 158 - '/_/(app)/recipes/$author/$rkey/': { 159 - id: '/_/(app)/recipes/$author/$rkey/' 160 - path: '/recipes/$author/$rkey' 161 - fullPath: '/recipes/$author/$rkey' 162 - preLoaderRoute: typeof appRecipesAuthorRkeyIndexLazyRouteImport 163 - parentRoute: typeof Route 164 - } 165 - } 29 + interface FileRoutesByPath {} 166 30 } 167 31 168 - interface RouteChildren { 169 - authLoginRoute: typeof authLoginRoute 170 - appIndexLazyRoute: typeof appIndexLazyRoute 171 - appRecipesNewRoute: typeof appRecipesNewRoute 172 - appRecipesAuthorIndexLazyRoute: typeof appRecipesAuthorIndexLazyRoute 173 - appRecipesAuthorRkeyIndexLazyRoute: typeof appRecipesAuthorRkeyIndexLazyRoute 174 - } 175 - 176 - const RouteChildren: RouteChildren = { 177 - authLoginRoute: authLoginRoute, 178 - appIndexLazyRoute: appIndexLazyRoute, 179 - appRecipesNewRoute: appRecipesNewRoute, 180 - appRecipesAuthorIndexLazyRoute: appRecipesAuthorIndexLazyRoute, 181 - appRecipesAuthorRkeyIndexLazyRoute: appRecipesAuthorRkeyIndexLazyRoute, 182 - } 183 - 184 - const RouteWithChildren = Route._addFileChildren(RouteChildren) 185 - 186 - const rootRouteChildren: RootRouteChildren = { 187 - Route: RouteWithChildren, 188 - } 32 + const rootRouteChildren: RootRouteChildren = {} 189 33 export const routeTree = rootRouteImport 190 34 ._addFileChildren(rootRouteChildren) 191 35 ._addFileTypes<FileRouteTypes>()
-62
apps/web/src/routes/_.(app)/index.lazy.tsx
··· 1 - import { createLazyFileRoute, Link } from '@tanstack/react-router' 2 - import { 3 - Breadcrumb, 4 - BreadcrumbItem, 5 - BreadcrumbLink, 6 - BreadcrumbList, 7 - BreadcrumbPage, 8 - BreadcrumbSeparator, 9 - } from '@/components/ui/breadcrumb' 10 - import { Separator } from '@/components/ui/separator' 11 - import { SidebarTrigger } from '@/components/ui/sidebar' 12 - import QueryPlaceholder from '@/components/query-placeholder' 13 - import { useRecipesQuery } from '@/queries/recipe' 14 - import { RecipeCard } from '@/components/recipe-card'; 15 - 16 - export const Route = createLazyFileRoute('/_/(app)/')({ 17 - component: RouteComponent, 18 - }) 19 - 20 - function RouteComponent() { 21 - const query = useRecipesQuery('') 22 - 23 - return ( 24 - <> 25 - <header className="flex h-16 shrink-0 items-center gap-2 transition-[width,height] ease-linear group-has-[[data-collapsible=icon]]/sidebar-wrapper:h-12"> 26 - <div className="flex items-center gap-2 px-4"> 27 - <SidebarTrigger className="-ml-1" /> 28 - <Separator orientation="vertical" className="mr-2 h-4" /> 29 - <Breadcrumb> 30 - <BreadcrumbList> 31 - <BreadcrumbItem className="hidden md:block"> 32 - <BreadcrumbLink asChild> 33 - <Link to="/">Community</Link> 34 - </BreadcrumbLink> 35 - </BreadcrumbItem> 36 - <BreadcrumbSeparator className="hidden md:block" /> 37 - <BreadcrumbItem> 38 - <BreadcrumbPage>Browse Recipes</BreadcrumbPage> 39 - </BreadcrumbItem> 40 - </BreadcrumbList> 41 - </Breadcrumb> 42 - </div> 43 - </header> 44 - <div className="flex flex-col gap-4 p-4 pt-6 items-center"> 45 - <h1 className="text-4xl font-black">Community Recipes!</h1> 46 - <p className="text-lg">See what the community's been cooking.</p> 47 - </div> 48 - <div className="flex-1 flex flex-col items-center p-4"> 49 - <div className="flex flex-col gap-4 max-w-2xl w-full items-center"> 50 - <QueryPlaceholder query={query} cards cardsCount={12}> 51 - {data => data.recipes.map(recipe => ( 52 - <RecipeCard 53 - recipe={recipe} 54 - key={`${recipe.author.did}-${recipe.rkey}`} 55 - /> 56 - ))} 57 - </QueryPlaceholder> 58 - </div> 59 - </div> 60 - </> 61 - ) 62 - }
-135
apps/web/src/routes/_.(app)/recipes/$author/$rkey/index.lazy.tsx
··· 1 - import { createLazyFileRoute, Link } from '@tanstack/react-router' 2 - import { 3 - Breadcrumb, 4 - BreadcrumbItem, 5 - BreadcrumbLink, 6 - BreadcrumbList, 7 - BreadcrumbPage, 8 - BreadcrumbSeparator, 9 - } from '@/components/ui/breadcrumb' 10 - import { Separator } from '@/components/ui/separator' 11 - import { SidebarTrigger } from '@/components/ui/sidebar' 12 - import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card' 13 - import { recipeQueryOptions } from '@/queries/recipe' 14 - import { useSuspenseQuery } from '@tanstack/react-query' 15 - import { Badge } from '@/components/ui/badge' 16 - import { Clock, Users } from 'lucide-react' 17 - import { useClient, useSession } from '@/state/auth' 18 - import { Button } from '@/components/ui/button' 19 - import { ActorIdentifier } from '@atcute/lexicons' 20 - 21 - export const Route = createLazyFileRoute('/_/(app)/recipes/$author/$rkey/')({ 22 - component: RouteComponent, 23 - }) 24 - 25 - function RouteComponent() { 26 - const rpc = useClient(); 27 - const { author, rkey } = Route.useParams() 28 - const { 29 - data: { recipes }, 30 - error, 31 - } = useSuspenseQuery(recipeQueryOptions(rpc, author as ActorIdentifier, rkey)) 32 - const { isLoggedIn, agent } = useSession(); 33 - 34 - if (error || !recipes[0]) return <p>Error</p> 35 - 36 - return ( 37 - <> 38 - <header className="flex h-16 shrink-0 items-center gap-2 transition-[width,height] ease-linear group-has-[[data-collapsible=icon]]/sidebar-wrapper:h-12"> 39 - <div className="flex items-center gap-2 px-4"> 40 - <SidebarTrigger className="-ml-1" /> 41 - <Separator orientation="vertical" className="mr-2 h-4" /> 42 - <Breadcrumb> 43 - <BreadcrumbList> 44 - <BreadcrumbItem className="hidden md:block"> 45 - <BreadcrumbLink asChild> 46 - <Link to="/">Community</Link> 47 - </BreadcrumbLink> 48 - </BreadcrumbItem> 49 - <BreadcrumbSeparator className="hidden md:block" /> 50 - <BreadcrumbItem className="hidden md:block"> 51 - <BreadcrumbLink asChild> 52 - <Link to="/">Browse Recipes</Link> 53 - </BreadcrumbLink> 54 - </BreadcrumbItem> 55 - <BreadcrumbSeparator className="hidden md:block" /> 56 - <BreadcrumbItem className="hidden md:block"> 57 - <BreadcrumbLink asChild> 58 - <Link to="/recipes/$author" params={{ author: recipes[0].author.handle }}> 59 - {recipes[0].author.displayName} 60 - </Link> 61 - </BreadcrumbLink> 62 - </BreadcrumbItem> 63 - <BreadcrumbSeparator className="hidden md:block" /> 64 - <BreadcrumbItem> 65 - <BreadcrumbPage>{recipes[0].record.title}</BreadcrumbPage> 66 - </BreadcrumbItem> 67 - </BreadcrumbList> 68 - </Breadcrumb> 69 - </div> 70 - </header> 71 - <div className="flex flex-col gap-4 px-4 py-8 items-center max-w-2xl w-full mx-auto"> 72 - <Card className="w-full"> 73 - 74 - <CardHeader> 75 - <CardTitle className="text-3xl font-bold">{recipes[0].record.title}</CardTitle> 76 - <CardDescription>{recipes[0].record.description}</CardDescription> 77 - </CardHeader> 78 - 79 - <CardContent className="space-y-6"> 80 - { 81 - recipes[0].record.image && 82 - <img 83 - src={recipes[0].record.image.ref.$link} 84 - alt={recipes[0].record.title} 85 - className="h-64 w-full object-cover rounded-md" 86 - /> 87 - } 88 - <div className="flex flex-wrap gap-4"> 89 - <Badge variant="secondary" className="flex items-center gap-2"> 90 - <Clock className="size-4" /> 91 - <span>{recipes[0].record.time} mins</span> 92 - </Badge> 93 - <Badge variant="secondary" className="flex items-center gap-2"> 94 - <Users className="size-4" /> 95 - <span>Serves {recipes[0].record.serves ?? '1'}</span> 96 - </Badge> 97 - </div> 98 - 99 - <div> 100 - <h3 className="text-xl font-semibold mb-2">Ingredients</h3> 101 - <ul className="list-disc list-inside space-y-1"> 102 - {recipes[0].record.ingredients.map((ing, idx) => ( 103 - <li key={idx}> 104 - <b>{ing.amount}</b> {ing.name} 105 - </li> 106 - ))} 107 - </ul> 108 - </div> 109 - 110 - <div> 111 - <h3 className="text-xl font-semibold mb-2">Steps</h3> 112 - <ol className="list-decimal list-outside space-y-1 ml-4"> 113 - {recipes[0].record.steps.map((ing, idx) => ( 114 - <li key={idx}>{ing.text}</li> 115 - ))} 116 - </ol> 117 - </div> 118 - </CardContent> 119 - <CardFooter className="flex justify-between"> 120 - {(isLoggedIn && agent?.sub == recipes[0].author.did) && ( 121 - <div className="flex items-center gap-x-4"> 122 - <Button variant="outline">Edit</Button> 123 - <Button variant="destructive">Delete</Button> 124 - </div> 125 - )} 126 - 127 - <div className="flex items-center gap-x-4"> 128 - {/* TODO: share options */} 129 - </div> 130 - </CardFooter> 131 - </Card> 132 - </div> 133 - </> 134 - ) 135 - }
-74
apps/web/src/routes/_.(app)/recipes/$author/index.lazy.tsx
··· 1 - import { createLazyFileRoute, Link } from '@tanstack/react-router' 2 - import { 3 - Breadcrumb, 4 - BreadcrumbItem, 5 - BreadcrumbLink, 6 - BreadcrumbList, 7 - BreadcrumbPage, 8 - BreadcrumbSeparator, 9 - } from '@/components/ui/breadcrumb' 10 - import { Separator } from '@/components/ui/separator' 11 - import { SidebarTrigger } from '@/components/ui/sidebar' 12 - import QueryPlaceholder from '@/components/query-placeholder' 13 - import { useRecipesQuery } from '@/queries/recipe' 14 - import { RecipeCard } from '@/components/recipe-card' 15 - import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar' 16 - 17 - export const Route = createLazyFileRoute('/_/(app)/recipes/$author/')({ 18 - component: RouteComponent, 19 - }) 20 - 21 - function RouteComponent() { 22 - const { author } = Route.useParams() 23 - const query = useRecipesQuery('', author) 24 - 25 - return ( 26 - <> 27 - <header className="flex h-16 shrink-0 items-center gap-2 transition-[width,height] ease-linear group-has-[[data-collapsible=icon]]/sidebar-wrapper:h-12"> 28 - <div className="flex items-center gap-2 px-4"> 29 - <SidebarTrigger className="-ml-1" /> 30 - <Separator orientation="vertical" className="mr-2 h-4" /> 31 - <Breadcrumb> 32 - <BreadcrumbList> 33 - <BreadcrumbItem className="hidden md:block"> 34 - <BreadcrumbLink asChild> 35 - <Link href="/">Community</Link> 36 - </BreadcrumbLink> 37 - </BreadcrumbItem> 38 - <BreadcrumbSeparator className="hidden md:block" /> 39 - <BreadcrumbItem> 40 - <BreadcrumbLink asChild> 41 - <Link to="/">Browse Recipes</Link> 42 - </BreadcrumbLink> 43 - </BreadcrumbItem> 44 - <BreadcrumbSeparator className="hidden md:block" /> 45 - <BreadcrumbItem className="hidden md:block"> 46 - <BreadcrumbPage>{author}</BreadcrumbPage> 47 - </BreadcrumbItem> 48 - </BreadcrumbList> 49 - </Breadcrumb> 50 - </div> 51 - </header> 52 - <div className="flex flex-col gap-4 p-4 pt-6 items-center"> 53 - <Avatar className="h-24 w-24 rounded-lg"> 54 - <AvatarImage src={query.data?.author?.avatarUrl} alt={query.data?.author?.displayName} /> 55 - <AvatarFallback className="rounded-lg">{query.data?.author?.displayName}</AvatarFallback> 56 - </Avatar> 57 - <h1 className="text-4xl font-black">{query.data?.author?.displayName}'s recipes!</h1> 58 - <p className="text-lg">See what they've been cooking.</p> 59 - </div> 60 - <div className="flex-1 flex flex-col items-center p-4"> 61 - <div className="flex flex-col gap-4 max-w-2xl w-full items-center"> 62 - <QueryPlaceholder query={query} cards cardsCount={12}> 63 - {query.data?.recipes.map((recipe, idx) => ( 64 - <RecipeCard 65 - recipe={recipe} 66 - key={idx} 67 - /> 68 - ))} 69 - </QueryPlaceholder> 70 - </div> 71 - </div> 72 - </> 73 - ) 74 - }
-341
apps/web/src/routes/_.(app)/recipes/new.tsx
··· 1 - import { createFileRoute, Link, redirect } from "@tanstack/react-router"; 2 - import { 3 - Breadcrumb, 4 - BreadcrumbItem, 5 - BreadcrumbLink, 6 - BreadcrumbList, 7 - BreadcrumbPage, 8 - BreadcrumbSeparator, 9 - } from "@/components/ui/breadcrumb"; 10 - import { Separator } from "@/components/ui/separator"; 11 - import { SidebarTrigger } from "@/components/ui/sidebar"; 12 - 13 - export const Route = createFileRoute("/_/(app)/recipes/new")({ 14 - beforeLoad: async ({ context }) => { 15 - if (!context.session.isLoggedIn) { 16 - throw redirect({ 17 - to: '/login', 18 - }); 19 - } 20 - }, 21 - component: RouteComponent, 22 - }); 23 - 24 - function RouteComponent() { 25 - return (<></>); 26 - // const form = useForm<z.infer<typeof recipeSchema>>({ 27 - // resolver: zodResolver(recipeSchema), 28 - // defaultValues: { 29 - // title: "", 30 - // time: 0, 31 - // image: null, 32 - // description: "", 33 - // ingredients: [{ name: "" }], 34 - // steps: [{ text: "" }], 35 - // }, 36 - // }); 37 - // 38 - // const { mutate, isPending } = useNewRecipeMutation(form); 39 - // 40 - // const onSubmit = (values: z.infer<typeof recipeSchema>) => { 41 - // mutate({ recipe: values }); 42 - // }; 43 - // 44 - // const imageRef = form.register("image"); 45 - // 46 - // const ingredients = useFieldArray({ 47 - // control: form.control, 48 - // name: "ingredients", 49 - // }); 50 - // 51 - // const steps = useFieldArray({ 52 - // control: form.control, 53 - // name: "steps", 54 - // }); 55 - // 56 - // return ( 57 - // <> 58 - // <Breadcrumbs /> 59 - // <div className="flex-1 flex-col p-4 pt-0 max-w-xl w-full mx-auto"> 60 - // <Card> 61 - // <CardHeader> 62 - // <CardTitle>New recipe</CardTitle> 63 - // <CardDescription>Share your recipe with the world!</CardDescription> 64 - // </CardHeader> 65 - // <CardContent> 66 - // <Form {...form}> 67 - // <form 68 - // onSubmit={form.handleSubmit(onSubmit)} 69 - // className="space-y-8" 70 - // > 71 - // <FormField 72 - // name="title" 73 - // control={form.control} 74 - // render={({ field }) => ( 75 - // <FormItem> 76 - // <FormLabel>Title</FormLabel> 77 - // <FormControl> 78 - // <Input placeholder="My awesome recipe!" {...field} /> 79 - // </FormControl> 80 - // <FormDescription> 81 - // This is your recipe's name. 82 - // </FormDescription> 83 - // <FormMessage /> 84 - // </FormItem> 85 - // )} 86 - // /> 87 - // 88 - // <FormField 89 - // name="description" 90 - // control={form.control} 91 - // render={({ field: { value, ...field } }) => ( 92 - // <FormItem> 93 - // <FormLabel>Description</FormLabel> 94 - // <FormControl> 95 - // <Textarea 96 - // className="resize-none" 97 - // value={value || ""} 98 - // {...field} 99 - // /> 100 - // </FormControl> 101 - // <FormDescription>Describe your recipe, maybe tell the world how tasty it is? (Optional)</FormDescription> 102 - // <FormMessage /> 103 - // </FormItem> 104 - // )} 105 - // /> 106 - // 107 - // <FormField 108 - // name="image" 109 - // control={form.control} 110 - // render={(_props) => ( 111 - // <FormItem> 112 - // <FormLabel>Image</FormLabel> 113 - // <FormControl> 114 - // <Input 115 - // type="file" 116 - // className="resize-none" 117 - // {...imageRef} 118 - // /> 119 - // </FormControl> 120 - // <FormMessage /> 121 - // </FormItem> 122 - // )} 123 - // /> 124 - // 125 - // <FormField 126 - // name="time" 127 - // control={form.control} 128 - // render={({ field: { value, ...field } }) => ( 129 - // <FormItem> 130 - // <FormLabel>Time</FormLabel> 131 - // <FormControl> 132 - // <Input 133 - // type="number" 134 - // className="resize-none" 135 - // value={value || ""} 136 - // {...field} 137 - // /> 138 - // </FormControl> 139 - // <FormDescription>How long (in minutes) does your recipe take to complete?</FormDescription> 140 - // <FormMessage /> 141 - // </FormItem> 142 - // )} 143 - // /> 144 - // 145 - // <div className="grid gap-2"> 146 - // <Label>Ingredients</Label> 147 - // <Sortable 148 - // value={ingredients.fields} 149 - // onMove={({ activeIndex, overIndex }) => 150 - // ingredients.move(activeIndex, overIndex)} 151 - // > 152 - // <div className="flex w-full flex-col gap-2"> 153 - // {ingredients.fields.map((field, index) => ( 154 - // <SortableItem key={field.id} value={field.id} asChild> 155 - // <div className="grid grid-cols-[2rem_0.3fr_1fr_2rem] items-center gap-2"> 156 - // <SortableDragHandle 157 - // type="button" 158 - // variant="outline" 159 - // size="icon" 160 - // className="size-8 shrink-0" 161 - // > 162 - // <DragHandleDots2Icon 163 - // className="size-4" 164 - // aria-hidden="true" 165 - // /> 166 - // </SortableDragHandle> 167 - // 168 - // <FormField 169 - // control={form.control} 170 - // name={`ingredients.${index}.amount`} 171 - // render={({ field: { value, ...field } }) => ( 172 - // <FormItem> 173 - // <FormControl> 174 - // <Input 175 - // placeholder="Amount" 176 - // value={value || ""} 177 - // className="h-8" 178 - // {...field} 179 - // /> 180 - // </FormControl> 181 - // <FormMessage /> 182 - // </FormItem> 183 - // )} 184 - // /> 185 - // 186 - // <FormField 187 - // control={form.control} 188 - // name={`ingredients.${index}.name`} 189 - // render={({ field }) => ( 190 - // <FormItem> 191 - // <FormControl> 192 - // <Input 193 - // placeholder="Ingredient" 194 - // className="h-8" 195 - // {...field} 196 - // /> 197 - // </FormControl> 198 - // <FormMessage /> 199 - // </FormItem> 200 - // )} 201 - // /> 202 - // 203 - // <Button 204 - // type="button" 205 - // variant="destructive" 206 - // className="size-8" 207 - // onClick={(e) => { 208 - // e.preventDefault(); 209 - // ingredients.remove(index); 210 - // }} 211 - // > 212 - // <TrashIcon /> 213 - // </Button> 214 - // </div> 215 - // </SortableItem> 216 - // ))} 217 - // </div> 218 - // </Sortable> 219 - // <Button 220 - // type="button" 221 - // variant="secondary" 222 - // onClick={(e) => { 223 - // e.preventDefault(); 224 - // ingredients.append({ 225 - // name: "", 226 - // amount: "", 227 - // }); 228 - // }} 229 - // > 230 - // Add 231 - // </Button> 232 - // </div> 233 - // 234 - // <div className="grid gap-2"> 235 - // <Label>Steps</Label> 236 - // <Sortable 237 - // value={steps.fields} 238 - // onMove={({ activeIndex, overIndex }) => 239 - // steps.move(activeIndex, overIndex)} 240 - // > 241 - // <div className="flex w-full flex-col gap-2"> 242 - // {steps.fields.map((field, index) => ( 243 - // <SortableItem key={field.id} value={field.id} asChild> 244 - // <div className="grid grid-cols-[2rem_auto_2rem] items-center gap-2"> 245 - // <SortableDragHandle 246 - // type="button" 247 - // variant="outline" 248 - // size="icon" 249 - // className="size-8 shrink-0" 250 - // > 251 - // <DragHandleDots2Icon 252 - // className="size-4" 253 - // aria-hidden="true" 254 - // /> 255 - // </SortableDragHandle> 256 - // <FormField 257 - // control={form.control} 258 - // name={`steps.${index}.text`} 259 - // render={({ field }) => ( 260 - // <FormItem> 261 - // <FormControl> 262 - // <Input className="h-8" {...field} /> 263 - // </FormControl> 264 - // <FormMessage /> 265 - // </FormItem> 266 - // )} 267 - // /> 268 - // 269 - // <Button 270 - // type="button" 271 - // variant="destructive" 272 - // className="size-8" 273 - // onClick={(e) => { 274 - // e.preventDefault(); 275 - // steps.remove(index); 276 - // }} 277 - // > 278 - // <TrashIcon /> 279 - // </Button> 280 - // </div> 281 - // </SortableItem> 282 - // ))} 283 - // </div> 284 - // </Sortable> 285 - // <Button 286 - // type="button" 287 - // variant="secondary" 288 - // onClick={(e) => { 289 - // e.preventDefault(); 290 - // steps.append({ text: "" }); 291 - // }} 292 - // > 293 - // Add 294 - // </Button> 295 - // </div> 296 - // 297 - // <div className="grid justify-end"> 298 - // <Button 299 - // type="submit" 300 - // className="ml-auto" 301 - // disabled={isPending} 302 - // > 303 - // Submit 304 - // </Button> 305 - // </div> 306 - // </form> 307 - // </Form> 308 - // </CardContent> 309 - // </Card> 310 - // </div> 311 - // </> 312 - // ); 313 - } 314 - 315 - const Breadcrumbs = () => ( 316 - <header className="flex h-16 shrink-0 items-center gap-2 transition-[width,height] ease-linear group-has-[[data-collapsible=icon]]/sidebar-wrapper:h-12"> 317 - <div className="flex items-center gap-2 px-4"> 318 - <SidebarTrigger className="-ml-1" /> 319 - <Separator orientation="vertical" className="mr-2 h-4" /> 320 - <Breadcrumb> 321 - <BreadcrumbList> 322 - <BreadcrumbItem className="hidden md:block"> 323 - <BreadcrumbLink asChild> 324 - <Link href="/">Home</Link> 325 - </BreadcrumbLink> 326 - </BreadcrumbItem> 327 - <BreadcrumbSeparator className="hidden md:block" /> 328 - <BreadcrumbItem className="hidden md:block"> 329 - <BreadcrumbLink asChild> 330 - <Link href="/recipes">Recipes</Link> 331 - </BreadcrumbLink> 332 - </BreadcrumbItem> 333 - <BreadcrumbSeparator className="hidden md:block" /> 334 - <BreadcrumbItem> 335 - <BreadcrumbPage>New</BreadcrumbPage> 336 - </BreadcrumbItem> 337 - </BreadcrumbList> 338 - </Breadcrumb> 339 - </div> 340 - </header> 341 - );
-108
apps/web/src/routes/_.(auth)/login.tsx
··· 1 - import { 2 - Breadcrumb, 3 - BreadcrumbItem, 4 - BreadcrumbList, 5 - BreadcrumbPage, 6 - } from '@/components/ui/breadcrumb' 7 - import { Button } from '@/components/ui/button' 8 - import { 9 - Card, 10 - CardContent, 11 - CardDescription, 12 - CardFooter, 13 - CardHeader, 14 - CardTitle, 15 - } from '@/components/ui/card' 16 - import { Field, FieldError, FieldGroup, FieldLabel } from '@/components/ui/field' 17 - import { Input } from '@/components/ui/input' 18 - import { Label } from '@/components/ui/label' 19 - import { Separator } from '@/components/ui/separator' 20 - import { SidebarTrigger } from '@/components/ui/sidebar' 21 - import { useSession } from '@/state/auth/session' 22 - import { useMutation } from '@tanstack/react-query' 23 - import { createFileRoute } from '@tanstack/react-router' 24 - import { useState } from 'react' 25 - 26 - export const Route = createFileRoute('/_/(auth)/login')({ 27 - component: RouteComponent, 28 - }) 29 - 30 - function RouteComponent() { 31 - const { signIn } = useSession(); 32 - const [handle, setHandle] = useState('') 33 - 34 - const { mutate, isPending, error } = useMutation({ 35 - mutationKey: ['login'], 36 - mutationFn: async () => { 37 - await signIn(handle); 38 - return; 39 - }, 40 - }) 41 - 42 - return ( 43 - <> 44 - <header className="flex h-16 shrink-0 items-center gap-2 transition-[width,height] ease-linear group-has-[[data-collapsible=icon]]/sidebar-wrapper:h-12"> 45 - <div className="flex items-center gap-2 px-4"> 46 - <SidebarTrigger className="-ml-1" /> 47 - <Separator orientation="vertical" className="mr-2 h-4" /> 48 - <Breadcrumb> 49 - <BreadcrumbList> 50 - <BreadcrumbItem> 51 - <BreadcrumbPage>Log in</BreadcrumbPage> 52 - </BreadcrumbItem> 53 - </BreadcrumbList> 54 - </Breadcrumb> 55 - </div> 56 - </header> 57 - <div className="flex flex-1 flex-col items-center justify-center gap-4 p-4 pt-0"> 58 - <form onSubmit={e => { 59 - e.preventDefault(); 60 - mutate(); 61 - }}> 62 - <Card className="max-w-sm w-full"> 63 - <CardHeader> 64 - <CardTitle>Log in</CardTitle> 65 - <CardDescription> 66 - Enter your Atmosphere handle below to sign in to your account. 67 - </CardDescription> 68 - </CardHeader> 69 - <CardContent> 70 - <FieldGroup> 71 - <Field data-invalid={error ? true : false}> 72 - <FieldLabel htmlFor="handle">Handle</FieldLabel> 73 - <Input 74 - id="handle" 75 - placeholder="johndoe.bsky.social" 76 - required 77 - autoComplete="username" 78 - aria-invalid={error ? 'true' : 'false'} 79 - tabIndex={0} 80 - autoFocus 81 - value={handle} 82 - onChange={(e) => setHandle(e.currentTarget.value)} 83 - /> 84 - {error && <FieldError>{error.message}</FieldError>} 85 - </Field> 86 - </FieldGroup> 87 - </CardContent> 88 - <CardFooter className="grid gap-2"> 89 - <Button type="submit" disabled={isPending}> 90 - Log in 91 - </Button> 92 - <p className="text-sm text-muted-foreground text-center"> 93 - Don't have an account?{' '} 94 - <a 95 - className="font-bold text-primary" 96 - href="https://bsky.app/" 97 - target="_blank" 98 - > 99 - Sign up on Bluesky! 100 - </a> 101 - </p> 102 - </CardFooter> 103 - </Card> 104 - </form> 105 - </div> 106 - </> 107 - ) 108 - }
-70
apps/web/src/routes/_.tsx
··· 1 - import { Link, createFileRoute, Outlet } from '@tanstack/react-router' 2 - import { Button } from '@/components/ui/button' 3 - import { Card, CardContent, CardFooter, CardHeader, CardTitle } from '@/components/ui/card' 4 - import { SidebarTrigger } from '@/components/ui/sidebar' 5 - 6 - export const Route = createFileRoute('/_')({ 7 - component: RouteComponent, 8 - errorComponent: ({ error }) => { 9 - return ( 10 - <> 11 - <header className="flex h-16 shrink-0 items-center gap-2 transition-[width,height] ease-linear group-has-[[data-collapsible=icon]]/sidebar-wrapper:h-12"> 12 - <div className="flex items-center gap-2 px-4"> 13 - <SidebarTrigger className="-ml-1" /> 14 - </div> 15 - </header> 16 - <div className="flex flex-1 flex-col gap-4 p-4 pt-0"> 17 - <Card className="m-auto max-w-sm"> 18 - <CardHeader> 19 - <CardTitle>Error!</CardTitle> 20 - </CardHeader> 21 - <CardContent> 22 - {error.message} 23 - </CardContent> 24 - <CardFooter> 25 - <Button asChild> 26 - <Link to="/">Go home</Link> 27 - </Button> 28 - </CardFooter> 29 - </Card> 30 - </div> 31 - </> 32 - ); 33 - }, 34 - 35 - notFoundComponent: () => { 36 - return ( 37 - <> 38 - <header className="flex h-16 shrink-0 items-center gap-2 transition-[width,height] ease-linear group-has-[[data-collapsible=icon]]/sidebar-wrapper:h-12"> 39 - <div className="flex items-center gap-2 px-4"> 40 - <SidebarTrigger className="-ml-1" /> 41 - </div> 42 - </header> 43 - <div className="flex flex-1 flex-col gap-4 p-4 pt-0"> 44 - <Card className="m-auto max-w-sm"> 45 - <CardHeader> 46 - <CardTitle>Not found</CardTitle> 47 - </CardHeader> 48 - <CardContent> 49 - {"The page you tried to view doesn't exist."} 50 - </CardContent> 51 - <CardFooter> 52 - <Button asChild> 53 - <Link to="/">Go home</Link> 54 - </Button> 55 - </CardFooter> 56 - </Card> 57 - </div> 58 - </> 59 - ); 60 - }, 61 - 62 - }) 63 - 64 - function RouteComponent() { 65 - return ( 66 - <> 67 - <Outlet /> 68 - </> 69 - ) 70 - }
+8 -20
apps/web/src/routes/__root.tsx
··· 1 - import { AppSidebar } from '@/components/app-sidebar' 2 - import { 3 - SidebarInset, 4 - SidebarProvider, 5 - } from '@/components/ui/sidebar' 6 - import { ClientContext, SessionContext } from '@/state/auth'; 7 - import { Outlet, createRootRouteWithContext } from '@tanstack/react-router' 8 - 9 - type RootContext = { 10 - session: SessionContext; 11 - client: ClientContext['client']; 12 - }; 1 + import * as React from 'react' 2 + import { Outlet, createRootRoute } from '@tanstack/react-router' 13 3 14 - export const Route = createRootRouteWithContext<RootContext>()({ 4 + export const Route = createRootRoute({ 15 5 component: RootComponent, 16 - }); 6 + }) 17 7 18 8 function RootComponent() { 19 9 return ( 20 - <SidebarProvider> 21 - <AppSidebar /> 22 - <SidebarInset> 23 - <Outlet /> 24 - </SidebarInset> 25 - </SidebarProvider> 10 + <React.Fragment> 11 + <div>Hello "__root"!</div> 12 + <Outlet /> 13 + </React.Fragment> 26 14 ) 27 15 }
-45
apps/web/src/screens/Recipes/RecipeCard.tsx
··· 1 - import { Avatar, AvatarImage, AvatarFallback } from "@/components/ui/avatar"; 2 - import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; 3 - import { Link } from "@tanstack/react-router"; 4 - import { Clock, CookingPot, ListIcon } from "lucide-react"; 5 - import { BlueRecipesFeedGetRecipes } from "@cookware/lexicons"; 6 - 7 - type RecipeCardProps = { 8 - recipe: BlueRecipesFeedGetRecipes.$output['recipes'][0]; 9 - }; 10 - 11 - export const RecipeCard = ({ recipe }: RecipeCardProps) => { 12 - return ( 13 - <Link to="/recipes/$author/$rkey" params={{ author: recipe.author.handle, rkey: recipe.rkey }} className="w-full"> 14 - <Card className="w-full"> 15 - <CardHeader> 16 - <CardTitle>{recipe.record.title}</CardTitle> 17 - <CardDescription className="flex items-center space-x-2"> 18 - <Avatar className="h-6 w-6 rounded-lg"> 19 - <AvatarImage src={recipe.author.avatar} alt={recipe.author.displayName} /> 20 - <AvatarFallback className="rounded-lg">{recipe.author.displayName}</AvatarFallback> 21 - </Avatar> 22 - 23 - <span>{recipe.author.displayName}</span> 24 - </CardDescription> 25 - </CardHeader> 26 - <CardContent> 27 - <p>{recipe.record.description}</p> 28 - </CardContent> 29 - <CardFooter className="flex gap-6 text-sm text-muted-foreground"> 30 - <span className="flex items-center gap-2"> 31 - <ListIcon className="size-4" /> <span>{recipe.record.steps.length}</span> 32 - </span> 33 - 34 - <span className="flex items-center gap-2"> 35 - <CookingPot className="size-4" /> <span>{recipe.record.ingredients.length}</span> 36 - </span> 37 - 38 - <span className="flex items-center gap-2"> 39 - <Clock className="size-4" /> <span>{recipe.record.time} mins</span> 40 - </span> 41 - </CardFooter> 42 - </Card> 43 - </Link> 44 - ); 45 - };
-38
apps/web/src/state/auth/client.tsx
··· 1 - import { Client, simpleFetchHandler } from "@atcute/client"; 2 - import { createContext, PropsWithChildren, useContext, useEffect, useState } from "react"; 3 - import { useSession } from "./session"; 4 - 5 - export type ClientContext = { 6 - client: Client; 7 - }; 8 - 9 - const clientContext = createContext<ClientContext>({ 10 - client: new Client({ handler: simpleFetchHandler({ service: import.meta.env.VITE_API_SERVICE }) }), 11 - }); 12 - 13 - export const ClientProvider = ({ children }: PropsWithChildren) => { 14 - const { agent } = useSession(); 15 - const [client, setClient] = useState<Client>( 16 - () => new Client({ handler: simpleFetchHandler({ service: import.meta.env.VITE_API_SERVICE }) }) 17 - ); 18 - 19 - useEffect(() => { 20 - setClient(new Client({ 21 - handler: agent ?? simpleFetchHandler({ service: import.meta.env.VITE_API_SERVICE }), 22 - proxy: { 23 - did: 'did:web:localhost', 24 - serviceId: '#api_service' 25 - }, 26 - })); 27 - }, [agent]); 28 - 29 - return ( 30 - <clientContext.Provider value={{ client: client }}> 31 - {children} 32 - </clientContext.Provider> 33 - ); 34 - } 35 - 36 - export const useClient = () => { 37 - return useContext(clientContext).client; 38 - }
-2
apps/web/src/state/auth/index.ts
··· 1 - export * from './client'; 2 - export * from './session';
-121
apps/web/src/state/auth/session.tsx
··· 1 - import { isDid, isActorIdentifier } from "@atcute/lexicons/syntax"; 2 - import { createAuthorizationUrl, deleteStoredSession, finalizeAuthorization, getSession, OAuthUserAgent, Session } from "@atcute/oauth-browser-client"; 3 - import { createContext, PropsWithChildren, useContext, useEffect, useState } from "react"; 4 - 5 - export type SessionContext = { 6 - session: null | Session; 7 - agent: null | OAuthUserAgent; 8 - isLoading: boolean; 9 - isLoggedIn: boolean; 10 - signIn: (handle: string) => Promise<void>; 11 - signOut: () => Promise<void>; 12 - }; 13 - 14 - const sessionContext = createContext<SessionContext>({ 15 - session: null, 16 - agent: null, 17 - isLoading: false, 18 - isLoggedIn: false, 19 - signIn: async () => { 20 - throw new Error("AuthContext not initialized"); 21 - }, 22 - signOut: async () => { 23 - throw new Error("AuthContext not initialized"); 24 - }, 25 - }); 26 - 27 - const LS_LAST_SIGNED_IN = "recipes:last-signed-in"; 28 - 29 - export const SessionProvider = ({ children }: PropsWithChildren<{}>) => { 30 - const [initialized, setInitialized] = useState(false); 31 - const [loading, setLoading] = useState(true); 32 - const [session, setSession] = useState<null | Session>(null); 33 - const [agent, setAgent] = useState<null | OAuthUserAgent>(null); 34 - 35 - useEffect(() => { 36 - setInitialized(false); 37 - setSession(null); 38 - setAgent(null); 39 - 40 - const params = new URLSearchParams(location.hash.slice(1)); 41 - if (params.has("state") && params.has("iss") && params.has("code")) { 42 - // If there is an active auth attempt: 43 - history.replaceState(null, "", location.pathname + location.search); 44 - console.log("finalizing authorization..."); 45 - finalizeAuthorization(params) 46 - .then(val => { 47 - setSession(val.session); 48 - setAgent(new OAuthUserAgent(val.session)); 49 - }) 50 - .catch(err => { 51 - console.error("Failed to initialize session:", err); 52 - }) 53 - .finally(() => { 54 - setLoading(false); 55 - setInitialized(true); 56 - }); 57 - } else { 58 - const lastSignedIn = localStorage.getItem(LS_LAST_SIGNED_IN); 59 - if (lastSignedIn && isDid(lastSignedIn)) { 60 - getSession(lastSignedIn, { allowStale: true }) 61 - .then((session) => { 62 - setSession(session); 63 - setAgent(new OAuthUserAgent(session)); 64 - }) 65 - .catch(err => { 66 - console.error("Failed to initialize session:", err); 67 - }) 68 - } 69 - 70 - setLoading(false); 71 - setInitialized(true); 72 - } 73 - }, []); 74 - 75 - const signIn = async (handle: string) => { 76 - if (!isActorIdentifier(handle)) throw new Error("Invalid handle or DID!"); 77 - const authUrl = await createAuthorizationUrl({ 78 - target: { type: 'account', identifier: handle }, 79 - scope: 'atproto transition:generic', 80 - }); 81 - window.location.assign(authUrl); 82 - }; 83 - 84 - const signOut = async () => { 85 - if (!agent || !session) return; 86 - 87 - const did = session.info.sub; 88 - try { 89 - const session = await getSession(did, { allowStale: true }); 90 - const agent = new OAuthUserAgent(session); 91 - 92 - await agent.signOut(); 93 - setSession(null); 94 - } catch(err) { 95 - deleteStoredSession(did); 96 - } 97 - }; 98 - 99 - if (!initialized) return ( 100 - <p>Loading...</p> 101 - ); 102 - 103 - return ( 104 - <sessionContext.Provider value={{ 105 - isLoading: loading, 106 - isLoggedIn: session !== null, 107 - session, 108 - agent, 109 - signIn, 110 - signOut, 111 - }}> 112 - {children} 113 - </sessionContext.Provider> 114 - ); 115 - }; 116 - 117 - export const useSession = () => { 118 - const ctx = useContext(sessionContext); 119 - if (!ctx) throw new Error("useSession() must be called inside a <SessionProvider />!"); 120 - return ctx; 121 - };
-14
apps/web/src/vite-env.d.ts
··· 1 - /// <reference types="vite/client" /> 2 - 3 - interface ImportMetaEnv { 4 - readonly VITE_API_SERVICE: string; 5 - readonly VITE_DEV_SERVER_PORT?: string; 6 - readonly VITE_CLIENT_URI: string; 7 - readonly VITE_OAUTH_CLIENT_ID: string; 8 - readonly VITE_OAUTH_REDIRECT_URI: string; 9 - readonly VITE_OAUTH_SCOPE: string; 10 - } 11 - 12 - interface ImportMeta { 13 - readonly env: ImportMetaEnv; 14 - }
-69
apps/web/tailwind.config.js
··· 1 - import animate from 'tailwindcss-animate'; 2 - /** @type {import('tailwindcss').Config} */ 3 - export default { 4 - darkMode: ["class"], 5 - content: ["./index.html", "./src/**/*.{ts,tsx,js,jsx}"], 6 - theme: { 7 - extend: { 8 - borderRadius: { 9 - lg: 'var(--radius)', 10 - md: 'calc(var(--radius) - 2px)', 11 - sm: 'calc(var(--radius) - 4px)' 12 - }, 13 - colors: { 14 - background: 'hsl(var(--background))', 15 - foreground: 'hsl(var(--foreground))', 16 - card: { 17 - DEFAULT: 'hsl(var(--card))', 18 - foreground: 'hsl(var(--card-foreground))' 19 - }, 20 - popover: { 21 - DEFAULT: 'hsl(var(--popover))', 22 - foreground: 'hsl(var(--popover-foreground))' 23 - }, 24 - primary: { 25 - DEFAULT: 'hsl(var(--primary))', 26 - foreground: 'hsl(var(--primary-foreground))' 27 - }, 28 - secondary: { 29 - DEFAULT: 'hsl(var(--secondary))', 30 - foreground: 'hsl(var(--secondary-foreground))' 31 - }, 32 - muted: { 33 - DEFAULT: 'hsl(var(--muted))', 34 - foreground: 'hsl(var(--muted-foreground))' 35 - }, 36 - accent: { 37 - DEFAULT: 'hsl(var(--accent))', 38 - foreground: 'hsl(var(--accent-foreground))' 39 - }, 40 - destructive: { 41 - DEFAULT: 'hsl(var(--destructive))', 42 - foreground: 'hsl(var(--destructive-foreground))' 43 - }, 44 - border: 'hsl(var(--border))', 45 - input: 'hsl(var(--input))', 46 - ring: 'hsl(var(--ring))', 47 - chart: { 48 - '1': 'hsl(var(--chart-1))', 49 - '2': 'hsl(var(--chart-2))', 50 - '3': 'hsl(var(--chart-3))', 51 - '4': 'hsl(var(--chart-4))', 52 - '5': 'hsl(var(--chart-5))' 53 - }, 54 - sidebar: { 55 - DEFAULT: 'hsl(var(--sidebar-background))', 56 - foreground: 'hsl(var(--sidebar-foreground))', 57 - primary: 'hsl(var(--sidebar-primary))', 58 - 'primary-foreground': 'hsl(var(--sidebar-primary-foreground))', 59 - accent: 'hsl(var(--sidebar-accent))', 60 - 'accent-foreground': 'hsl(var(--sidebar-accent-foreground))', 61 - border: 'hsl(var(--sidebar-border))', 62 - ring: 'hsl(var(--sidebar-ring))' 63 - } 64 - } 65 - } 66 - }, 67 - plugins: [animate], 68 - } 69 -
+4 -25
apps/web/tsconfig.app.json
··· 1 1 { 2 + "extends": "@cookware/tsconfig/react.json", 2 3 "compilerOptions": { 3 - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 4 - "target": "ES2020", 5 - "useDefineForClassFields": true, 6 - "lib": ["ES2020", "DOM", "DOM.Iterable"], 7 - "module": "ESNext", 8 - "skipLibCheck": true, 4 + "types": ["bun", "vite/client"], 9 5 10 - /* Bundler mode */ 11 - "moduleResolution": "bundler", 12 - "allowImportingTsExtensions": true, 13 - "isolatedModules": true, 14 - "moduleDetection": "force", 15 - "noEmit": true, 16 - "jsx": "react-jsx", 17 - 18 - /* Linting */ 19 - "strict": true, 20 - "noUnusedLocals": true, 21 - "noUnusedParameters": true, 22 - "noFallthroughCasesInSwitch": true, 23 - "noUncheckedSideEffectImports": true, 24 - 25 - /* Import aliases */ 6 + /* Path aliasing */ 26 7 "baseUrl": ".", 27 8 "paths": { 28 - "@/*": [ 29 - "./src/*" 30 - ] 9 + "@/*": ["./src/*"] 31 10 } 32 11 }, 33 12 "include": ["src"]
+1
apps/web/tsconfig.json
··· 1 1 { 2 + "extends": "@cookware/tsconfig/react.json", 2 3 "files": [], 3 4 "references": [ 4 5 { "path": "./tsconfig.app.json" },
+1 -21
apps/web/tsconfig.node.json
··· 1 1 { 2 - "compilerOptions": { 3 - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 4 - "target": "ES2022", 5 - "lib": ["ES2023"], 6 - "module": "ESNext", 7 - "skipLibCheck": true, 8 - 9 - /* Bundler mode */ 10 - "moduleResolution": "bundler", 11 - "allowImportingTsExtensions": true, 12 - "isolatedModules": true, 13 - "moduleDetection": "force", 14 - "noEmit": true, 15 - 16 - /* Linting */ 17 - "strict": true, 18 - "noUnusedLocals": true, 19 - "noUnusedParameters": true, 20 - "noFallthroughCasesInSwitch": true, 21 - "noUncheckedSideEffectImports": true 22 - }, 2 + "extends": "@cookware/tsconfig/base.json", 23 3 "include": ["vite.config.ts"] 24 4 }
+3
apps/web/vite.config.d.ts
··· 1 + declare const _default: import("vite").UserConfig; 2 + export default _default; 3 + //# sourceMappingURL=vite.config.d.ts.map
+1
apps/web/vite.config.d.ts.map
··· 1 + {"version":3,"file":"vite.config.d.ts","sourceRoot":"","sources":["vite.config.ts"],"names":[],"mappings":";AAMA,wBAeE"}
+20
apps/web/vite.config.js
··· 1 + import { defineConfig } from 'vite'; 2 + import react from '@vitejs/plugin-react'; 3 + import tailwindcss from '@tailwindcss/vite'; 4 + import { tanstackRouter } from '@tanstack/router-plugin/vite'; 5 + import path from 'node:path'; 6 + export default defineConfig({ 7 + plugins: [ 8 + tanstackRouter({ 9 + target: 'react', 10 + autoCodeSplitting: true, 11 + }), 12 + tailwindcss(), 13 + react() 14 + ], 15 + resolve: { 16 + alias: { 17 + "@": path.resolve(__dirname, "./src"), 18 + } 19 + } 20 + });
+13 -46
apps/web/vite.config.ts
··· 1 - import { defineConfig } from 'vite' 2 - import react from '@vitejs/plugin-react' 3 - import { tanstackRouter } from '@tanstack/router-plugin/vite' 4 - import path from 'path' 5 - import metadata from "./public/oauth-client-metadata.json" with { type: 'json' }; 1 + import { defineConfig } from 'vite'; 2 + import react from '@vitejs/plugin-react'; 3 + import tailwindcss from '@tailwindcss/vite'; 4 + import { tanstackRouter } from '@tanstack/router-plugin/vite'; 5 + import path from 'node:path'; 6 6 7 - const SERVER_HOST = "127.0.0.1"; 8 - const SERVER_PORT = 5173; 9 - 10 - // https://vite.dev/config/ 11 7 export default defineConfig({ 12 8 plugins: [ 13 - tanstackRouter(), 14 - react({ babel: { plugins: ['babel-plugin-react-compiler'] } }), 15 - { 16 - name: '_config', 17 - config(_conf, { command }) { 18 - if (command === 'build') { 19 - process.env.VITE_OAUTH_CLIENT_ID = metadata.client_id; 20 - process.env.VITE_OAUTH_REDIRECT_URI = metadata.redirect_uris[0]; 21 - } else { 22 - const redirectUri = (() => { 23 - const url = new URL(metadata.redirect_uris[0]); 24 - return `http://${SERVER_HOST}:${SERVER_PORT}${url.pathname}`; 25 - })(); 26 - 27 - const clientId = 28 - `http://localhost` + 29 - `?redirect_uri=${encodeURIComponent(redirectUri)}` + 30 - `&scope=${encodeURIComponent(metadata.scope)}`; 31 - 32 - process.env.VITE_API_SERVICE = 'http://localhost:3000'; 33 - process.env.VITE_DEV_SERVER_PORT = '' + SERVER_PORT; 34 - process.env.VITE_OAUTH_CLIENT_ID = clientId; 35 - process.env.VITE_OAUTH_REDIRECT_URI = redirectUri; 36 - } 9 + tanstackRouter({ 10 + target: 'react', 11 + autoCodeSplitting: true, 12 + }), 13 + tailwindcss(), 14 + react() 15 + ], 37 16 38 - process.env.VITE_CLIENT_URI = metadata.client_uri; 39 - process.env.VITE_OAUTH_SCOPE = metadata.scope; 40 - }, 41 - }, 42 - ], 43 - server: { 44 - host: SERVER_HOST, 45 - port: SERVER_PORT, 46 - }, 47 - build: { 48 - target: "esnext", 49 - }, 50 17 resolve: { 51 18 alias: { 52 - '@': path.resolve(__dirname, './src'), 19 + "@": path.resolve(__dirname, "./src"), 53 20 } 54 21 } 55 22 })
+114 -541
bun.lock
··· 6 6 "name": "@cookware/monorepo", 7 7 "dependencies": { 8 8 "@atcute/oauth-browser-client": "^2.0.2", 9 + "@tanstack/react-router": "^1.140.0", 9 10 }, 10 11 "devDependencies": { 12 + "@tanstack/react-router-devtools": "^1.140.0", 13 + "@tanstack/router-plugin": "^1.140.0", 11 14 "turbo": "^2.3.3", 12 15 "typescript": "^5.9.3", 13 16 }, ··· 103 106 }, 104 107 }, 105 108 "apps/web": { 106 - "name": "@cookware/web", 109 + "name": "web", 107 110 "version": "0.0.0", 108 111 "dependencies": { 109 - "@atcute/atproto": "^3.1.9", 110 - "@atcute/client": "catalog:", 111 - "@atcute/identity-resolver": "^1.1.4", 112 - "@atcute/lexicons": "catalog:", 113 - "@atcute/oauth-browser-client": "^2.0.1", 114 - "@atproto/common": "^0.4.5", 115 - "@atproto/common-web": "^0.3.1", 116 - "@dnd-kit/core": "^6.3.1", 117 - "@dnd-kit/modifiers": "^9.0.0", 118 - "@dnd-kit/sortable": "^10.0.0", 119 - "@dnd-kit/utilities": "^3.2.2", 120 - "@hookform/resolvers": "^3.9.1", 121 - "@radix-ui/react-avatar": "^1.1.1", 122 - "@radix-ui/react-collapsible": "^1.1.1", 123 - "@radix-ui/react-dialog": "^1.1.4", 124 - "@radix-ui/react-dropdown-menu": "^2.1.4", 125 - "@radix-ui/react-icons": "^1.3.2", 126 - "@radix-ui/react-label": "^2.1.8", 127 - "@radix-ui/react-separator": "^1.1.8", 128 - "@radix-ui/react-slot": "^1.2.4", 129 - "@radix-ui/react-tooltip": "^1.1.4", 130 - "@tanstack/react-query": "^5.62.2", 131 - "@tanstack/react-query-devtools": "^5.62.2", 132 - "@tanstack/react-router": "^1.91.2", 133 - "axios": "^1.7.9", 134 - "class-variance-authority": "^0.7.1", 135 - "clsx": "^2.1.1", 136 - "lucide-react": "^0.464.0", 137 - "react-dom": "19.0.0", 138 - "react-hook-form": "^7.54.1", 139 - "tailwind-merge": "^2.5.5", 140 - "tailwindcss-animate": "^1.0.7", 141 - "zod": "^3.23.8", 112 + "react": "^19.2.0", 113 + "react-dom": "^19.2.0", 114 + "tailwindcss": "^4.1.17", 142 115 }, 143 116 "devDependencies": { 144 - "@atcute/bluesky": "^1.0.9", 145 - "@cookware/lexicons": "workspace:*", 146 - "@eslint/js": "^9.15.0", 147 - "@tanstack/eslint-plugin-query": "^5.62.1", 148 - "@tanstack/router-devtools": "^1.85.5", 149 - "@tanstack/router-plugin": "^1.85.3", 150 - "@types/node": "^22.10.1", 151 - "@types/react": "^19.0.0", 152 - "@types/react-dom": "^19.0.0", 117 + "@cookware/tsconfig": "workspace:^", 118 + "@eslint/js": "^9.39.1", 119 + "@tailwindcss/vite": "^4.1.17", 120 + "@types/bun": "^1.3.4", 121 + "@types/react": "^19.2.5", 122 + "@types/react-dom": "^19.2.3", 153 123 "@vitejs/plugin-react": "^5.1.1", 154 - "@vitejs/plugin-react-swc": "^3.5.0", 155 - "autoprefixer": "^10.4.20", 156 - "babel-plugin-react-compiler": "^1.0.0", 157 - "cssnano": "^7.0.6", 158 - "eslint": "^9.15.0", 159 - "eslint-plugin-react-hooks": "^5.0.0", 160 - "eslint-plugin-react-refresh": "^0.4.14", 161 - "globals": "^15.12.0", 162 - "postcss": "^8.4.49", 163 - "react": "19.0.0", 164 - "tailwindcss": "^3.4.16", 165 - "typescript": "~5.6.2", 166 - "typescript-eslint": "^8.15.0", 167 - "vite": "^7.2.4", 124 + "eslint": "^9.39.1", 125 + "eslint-plugin-react-hooks": "^7.0.1", 126 + "eslint-plugin-react-refresh": "^0.4.24", 127 + "globals": "^16.5.0", 128 + "typescript": "~5.9.3", 129 + "typescript-eslint": "^8.46.4", 130 + "vite": "npm:rolldown-vite@7.2.5", 168 131 }, 169 132 }, 170 133 "libs/database": { ··· 278 241 279 242 "@atproto-labs/simple-store-memory": ["@atproto-labs/simple-store-memory@0.1.3", "", { "dependencies": { "@atproto-labs/simple-store": "0.2.0", "lru-cache": "^10.2.0" } }, "sha512-jkitT9+AtU+0b28DoN92iURLaCt/q/q4yX8q6V+9LSwYlUTqKoj/5NFKvF7x6EBuG+gpUdlcycbH7e60gjOhRQ=="], 280 243 281 - "@atproto/common": ["@atproto/common@0.4.12", "", { "dependencies": { "@atproto/common-web": "^0.4.3", "@ipld/dag-cbor": "^7.0.3", "cbor-x": "^1.5.1", "iso-datestring-validator": "^2.2.2", "multiformats": "^9.9.0", "pino": "^8.21.0" } }, "sha512-NC+TULLQiqs6MvNymhQS5WDms3SlbIKGLf4n33tpftRJcalh507rI+snbcUb7TLIkKw7VO17qMqxEXtIdd5auQ=="], 282 - 283 - "@atproto/common-web": ["@atproto/common-web@0.3.2", "", { "dependencies": { "graphemer": "^1.4.0", "multiformats": "^9.9.0", "uint8arrays": "3.0.0", "zod": "^3.23.8" } }, "sha512-Vx0JtL1/CssJbFAb0UOdvTrkbUautsDfHNOXNTcX2vyPIxH9xOameSqLLunM1hZnOQbJwyjmQCt6TV+bhnanDg=="], 244 + "@atproto/common-web": ["@atproto/common-web@0.4.3", "", { "dependencies": { "graphemer": "^1.4.0", "multiformats": "^9.9.0", "uint8arrays": "3.0.0", "zod": "^3.23.8" } }, "sha512-nRDINmSe4VycJzPo6fP/hEltBcULFxt9Kw7fQk6405FyAWZiTluYHlXOnU7GkQfeUK44OENG1qFTBcmCJ7e8pg=="], 284 245 285 246 "@atproto/did": ["@atproto/did@0.1.5", "", { "dependencies": { "zod": "^3.23.8" } }, "sha512-8+1D08QdGE5TF0bB0vV8HLVrVZJeLNITpRTUVEoABNMRaUS7CoYSVb0+JNQDeJIVmqMjOL8dOjvCUDkp3gEaGQ=="], 286 247 ··· 368 329 369 330 "@badrap/valita": ["@badrap/valita@0.4.6", "", {}, "sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg=="], 370 331 371 - "@cbor-extract/cbor-extract-darwin-arm64": ["@cbor-extract/cbor-extract-darwin-arm64@2.2.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w=="], 372 - 373 - "@cbor-extract/cbor-extract-darwin-x64": ["@cbor-extract/cbor-extract-darwin-x64@2.2.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w=="], 374 - 375 - "@cbor-extract/cbor-extract-linux-arm": ["@cbor-extract/cbor-extract-linux-arm@2.2.0", "", { "os": "linux", "cpu": "arm" }, "sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q=="], 376 - 377 - "@cbor-extract/cbor-extract-linux-arm64": ["@cbor-extract/cbor-extract-linux-arm64@2.2.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ=="], 378 - 379 - "@cbor-extract/cbor-extract-linux-x64": ["@cbor-extract/cbor-extract-linux-x64@2.2.0", "", { "os": "linux", "cpu": "x64" }, "sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw=="], 380 - 381 - "@cbor-extract/cbor-extract-win32-x64": ["@cbor-extract/cbor-extract-win32-x64@2.2.0", "", { "os": "win32", "cpu": "x64" }, "sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w=="], 382 - 383 332 "@cookware/api": ["@cookware/api@workspace:apps/api"], 384 333 385 334 "@cookware/database": ["@cookware/database@workspace:libs/database"], ··· 390 339 391 340 "@cookware/tsconfig": ["@cookware/tsconfig@workspace:libs/tsconfig"], 392 341 393 - "@cookware/web": ["@cookware/web@workspace:apps/web"], 394 - 395 - "@dnd-kit/accessibility": ["@dnd-kit/accessibility@3.1.1", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw=="], 396 - 397 - "@dnd-kit/core": ["@dnd-kit/core@6.3.1", "", { "dependencies": { "@dnd-kit/accessibility": "^3.1.1", "@dnd-kit/utilities": "^3.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ=="], 398 - 399 - "@dnd-kit/modifiers": ["@dnd-kit/modifiers@9.0.0", "", { "dependencies": { "@dnd-kit/utilities": "^3.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@dnd-kit/core": "^6.3.0", "react": ">=16.8.0" } }, "sha512-ybiLc66qRGuZoC20wdSSG6pDXFikui/dCNGthxv4Ndy8ylErY0N3KVxY2bgo7AWwIbxDmXDg3ylAFmnrjcbVvw=="], 400 - 401 - "@dnd-kit/sortable": ["@dnd-kit/sortable@10.0.0", "", { "dependencies": { "@dnd-kit/utilities": "^3.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@dnd-kit/core": "^6.3.0", "react": ">=16.8.0" } }, "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg=="], 402 - 403 - "@dnd-kit/utilities": ["@dnd-kit/utilities@3.2.2", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg=="], 404 - 405 342 "@drizzle-team/brocli": ["@drizzle-team/brocli@0.10.2", "", {}, "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w=="], 406 343 407 344 "@emnapi/core": ["@emnapi/core@1.7.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg=="], ··· 448 385 449 386 "@esbuild/linux-x64": ["@esbuild/linux-x64@0.19.12", "", { "os": "linux", "cpu": "x64" }, "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg=="], 450 387 451 - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], 388 + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.1", "", { "os": "none", "cpu": "arm64" }, "sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ=="], 452 389 453 390 "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.19.12", "", { "os": "none", "cpu": "x64" }, "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA=="], 454 391 455 - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], 392 + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g=="], 456 393 457 394 "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.19.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw=="], 458 395 459 - "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], 396 + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.1", "", { "os": "none", "cpu": "arm64" }, "sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg=="], 460 397 461 398 "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.19.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA=="], 462 399 ··· 491 428 "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.6", "", { "dependencies": { "@floating-ui/dom": "^1.7.4" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw=="], 492 429 493 430 "@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="], 494 - 495 - "@hookform/resolvers": ["@hookform/resolvers@3.10.0", "", { "peerDependencies": { "react-hook-form": "^7.0.0" } }, "sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag=="], 496 431 497 432 "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], 498 433 ··· 584 519 585 520 "@inquirer/type": ["@inquirer/type@3.0.10", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA=="], 586 521 587 - "@ipld/dag-cbor": ["@ipld/dag-cbor@7.0.3", "", { "dependencies": { "cborg": "^1.6.0", "multiformats": "^9.5.4" } }, "sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA=="], 588 - 589 522 "@isaacs/balanced-match": ["@isaacs/balanced-match@4.0.1", "", {}, "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ=="], 590 523 591 524 "@isaacs/brace-expansion": ["@isaacs/brace-expansion@5.0.0", "", { "dependencies": { "@isaacs/balanced-match": "^4.0.1" } }, "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA=="], ··· 634 567 635 568 "@mary-ext/simple-event-emitter": ["@mary-ext/simple-event-emitter@1.0.0", "", {}, "sha512-meA/zJZKIN1RVBNEYIbjufkUrW7/tRjHH60FjolpG1ixJKo76TB208qefQLNdOVDA7uIG0CGEDuhmMirtHKLAg=="], 636 569 637 - "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="], 570 + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.0", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" } }, "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA=="], 638 571 639 572 "@neon-rs/load": ["@neon-rs/load@0.0.4", "", {}, "sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw=="], 640 573 ··· 740 673 741 674 "@optique/run": ["@optique/run@0.6.2", "", { "dependencies": { "@optique/core": "0.6.2" } }, "sha512-ERksB5bHozwEUVlTPToIc8UjZZBOgLeBhFZYh2lgldUbNDt7LItzgcErsPq5au5i5IBmmyCti4+2A3x+MRI4Xw=="], 742 675 676 + "@oxc-project/runtime": ["@oxc-project/runtime@0.97.0", "", {}, "sha512-yH0zw7z+jEws4dZ4IUKoix5Lh3yhqIJWF9Dc8PWvhpo7U7O+lJrv7ZZL4BeRO0la8LBQFwcCewtLBnVV7hPe/w=="], 677 + 678 + "@oxc-project/types": ["@oxc-project/types@0.97.0", "", {}, "sha512-lxmZK4xFrdvU0yZiDwgVQTCvh2gHWBJCBk5ALsrtsBWhs0uDIi+FTOnXRQeQfs304imdvTdaakT/lqwQ8hkOXQ=="], 679 + 743 680 "@pinojs/redact": ["@pinojs/redact@0.4.0", "", {}, "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg=="], 744 681 745 682 "@prisma/instrumentation": ["@prisma/instrumentation@5.22.0", "", { "dependencies": { "@opentelemetry/api": "^1.8", "@opentelemetry/instrumentation": "^0.49 || ^0.50 || ^0.51 || ^0.52.0 || ^0.53.0", "@opentelemetry/sdk-trace-base": "^1.22" } }, "sha512-LxccF392NN37ISGxIurUljZSh1YWnphO34V5a0+T7FVQG2u9bhAXRTJpgmQ3483woVhkraQZFF7cbRrpbw/F4Q=="], ··· 749 686 "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w=="], 750 687 751 688 "@radix-ui/react-avatar": ["@radix-ui/react-avatar@1.1.11", "", { "dependencies": { "@radix-ui/react-context": "1.1.3", "@radix-ui/react-primitive": "2.1.4", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q=="], 752 - 753 - "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA=="], 754 689 755 690 "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw=="], 756 691 ··· 770 705 771 706 "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw=="], 772 707 773 - "@radix-ui/react-icons": ["@radix-ui/react-icons@1.3.2", "", { "peerDependencies": { "react": "^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc" } }, "sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g=="], 774 - 775 708 "@radix-ui/react-id": ["@radix-ui/react-id@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg=="], 776 709 777 710 "@radix-ui/react-label": ["@radix-ui/react-label@2.1.8", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.4" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A=="], ··· 814 747 815 748 "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], 816 749 817 - "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.47", "", {}, "sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw=="], 750 + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-beta.50", "", { "os": "android", "cpu": "arm64" }, "sha512-XlEkrOIHLyGT3avOgzfTFSjG+f+dZMw+/qd+Y3HLN86wlndrB/gSimrJCk4gOhr1XtRtEKfszpadI3Md4Z4/Ag=="], 818 751 819 - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.53.3", "", { "os": "android", "cpu": "arm" }, "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w=="], 752 + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-beta.50", "", { "os": "darwin", "cpu": "arm64" }, "sha512-+JRqKJhoFlt5r9q+DecAGPLZ5PxeLva+wCMtAuoFMWPoZzgcYrr599KQ+Ix0jwll4B4HGP43avu9My8KtSOR+w=="], 820 753 821 - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.53.3", "", { "os": "android", "cpu": "arm64" }, "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w=="], 754 + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-beta.50", "", { "os": "darwin", "cpu": "x64" }, "sha512-fFXDjXnuX7/gQZQm/1FoivVtRcyAzdjSik7Eo+9iwPQ9EgtA5/nB2+jmbzaKtMGG3q+BnZbdKHCtOacmNrkIDA=="], 822 755 823 - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.53.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA=="], 756 + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-beta.50", "", { "os": "freebsd", "cpu": "x64" }, "sha512-F1b6vARy49tjmT/hbloplzgJS7GIvwWZqt+tAHEstCh0JIh9sa8FAMVqEmYxDviqKBaAI8iVvUREm/Kh/PD26Q=="], 824 757 825 - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.53.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ=="], 758 + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.50", "", { "os": "linux", "cpu": "arm" }, "sha512-U6cR76N8T8M6lHj7EZrQ3xunLPxSvYYxA8vJsBKZiFZkT8YV4kjgCO3KwMJL0NOjQCPGKyiXO07U+KmJzdPGRw=="], 826 759 827 - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.53.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w=="], 760 + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-beta.50", "", { "os": "linux", "cpu": "arm64" }, "sha512-ONgyjofCrrE3bnh5GZb8EINSFyR/hmwTzZ7oVuyUB170lboza1VMCnb8jgE6MsyyRgHYmN8Lb59i3NKGrxrYjw=="], 828 761 829 - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.53.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q=="], 762 + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-beta.50", "", { "os": "linux", "cpu": "arm64" }, "sha512-L0zRdH2oDPkmB+wvuTl+dJbXCsx62SkqcEqdM+79LOcB+PxbAxxjzHU14BuZIQdXcAVDzfpMfaHWzZuwhhBTcw=="], 830 763 831 - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.53.3", "", { "os": "linux", "cpu": "arm" }, "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw=="], 764 + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-beta.50", "", { "os": "linux", "cpu": "x64" }, "sha512-gyoI8o/TGpQd3OzkJnh1M2kxy1Bisg8qJ5Gci0sXm9yLFzEXIFdtc4EAzepxGvrT2ri99ar5rdsmNG0zP0SbIg=="], 832 765 833 - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.53.3", "", { "os": "linux", "cpu": "arm" }, "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg=="], 766 + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-beta.50", "", { "os": "linux", "cpu": "x64" }, "sha512-zti8A7M+xFDpKlghpcCAzyOi+e5nfUl3QhU023ce5NCgUxRG5zGP2GR9LTydQ1rnIPwZUVBWd4o7NjZDaQxaXA=="], 834 767 835 - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.53.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w=="], 768 + "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-beta.50", "", { "os": "none", "cpu": "arm64" }, "sha512-eZUssog7qljrrRU9Mi0eqYEPm3Ch0UwB+qlWPMKSUXHNqhm3TvDZarJQdTevGEfu3EHAXJvBIe0YFYr0TPVaMA=="], 836 769 837 - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.53.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A=="], 838 - 839 - "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.53.3", "", { "os": "linux", "cpu": "none" }, "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g=="], 840 - 841 - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.53.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw=="], 842 - 843 - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.53.3", "", { "os": "linux", "cpu": "none" }, "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g=="], 844 - 845 - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.53.3", "", { "os": "linux", "cpu": "none" }, "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A=="], 770 + "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-beta.50", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.7" }, "cpu": "none" }, "sha512-nmCN0nIdeUnmgeDXiQ+2HU6FT162o+rxnF7WMkBm4M5Ds8qTU7Dzv2Wrf22bo4ftnlrb2hKK6FSwAJSAe2FWLg=="], 846 771 847 - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.53.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg=="], 848 - 849 - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.53.3", "", { "os": "linux", "cpu": "x64" }, "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w=="], 850 - 851 - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.53.3", "", { "os": "linux", "cpu": "x64" }, "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q=="], 852 - 853 - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.53.3", "", { "os": "none", "cpu": "arm64" }, "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw=="], 854 - 855 - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.53.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw=="], 772 + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-beta.50", "", { "os": "win32", "cpu": "arm64" }, "sha512-7kcNLi7Ua59JTTLvbe1dYb028QEPaJPJQHqkmSZ5q3tJueUeb6yjRtx8mw4uIqgWZcnQHAR3PrLN4XRJxvgIkA=="], 856 773 857 - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.53.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA=="], 774 + "@rolldown/binding-win32-ia32-msvc": ["@rolldown/binding-win32-ia32-msvc@1.0.0-beta.50", "", { "os": "win32", "cpu": "ia32" }, "sha512-lL70VTNvSCdSZkDPPVMwWn/M2yQiYvSoXw9hTLgdIWdUfC3g72UaruezusR6ceRuwHCY1Ayu2LtKqXkBO5LIwg=="], 858 775 859 - "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.53.3", "", { "os": "win32", "cpu": "x64" }, "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg=="], 776 + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-beta.50", "", { "os": "win32", "cpu": "x64" }, "sha512-4qU4x5DXWB4JPjyTne/wBNPqkbQU8J45bl21geERBKtEittleonioACBL1R0PsBu0Aq21SwMK5a9zdBkWSlQtQ=="], 860 777 861 - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.53.3", "", { "os": "win32", "cpu": "x64" }, "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ=="], 778 + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.47", "", {}, "sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw=="], 862 779 863 780 "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], 864 781 ··· 872 789 873 790 "@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="], 874 791 875 - "@swc/core": ["@swc/core@1.15.3", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.25" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.15.3", "@swc/core-darwin-x64": "1.15.3", "@swc/core-linux-arm-gnueabihf": "1.15.3", "@swc/core-linux-arm64-gnu": "1.15.3", "@swc/core-linux-arm64-musl": "1.15.3", "@swc/core-linux-x64-gnu": "1.15.3", "@swc/core-linux-x64-musl": "1.15.3", "@swc/core-win32-arm64-msvc": "1.15.3", "@swc/core-win32-ia32-msvc": "1.15.3", "@swc/core-win32-x64-msvc": "1.15.3" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-Qd8eBPkUFL4eAONgGjycZXj1jFCBW8Fd+xF0PzdTlBCWQIV1xnUT7B93wUANtW3KGjl3TRcOyxwSx/u/jyKw/Q=="], 876 - 877 - "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.15.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-AXfeQn0CvcQ4cndlIshETx6jrAM45oeUrK8YeEY6oUZU/qzz0Id0CyvlEywxkWVC81Ajpd8TQQ1fW5yx6zQWkQ=="], 878 - 879 - "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.15.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-p68OeCz1ui+MZYG4wmfJGvcsAcFYb6Sl25H9TxWl+GkBgmNimIiRdnypK9nBGlqMZAcxngNPtnG3kEMNnvoJ2A=="], 880 - 881 - "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.15.3", "", { "os": "linux", "cpu": "arm" }, "sha512-Nuj5iF4JteFgwrai97mUX+xUOl+rQRHqTvnvHMATL/l9xE6/TJfPBpd3hk/PVpClMXG3Uvk1MxUFOEzM1JrMYg=="], 882 - 883 - "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.15.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-2Nc/s8jE6mW2EjXWxO/lyQuLKShcmTrym2LRf5Ayp3ICEMX6HwFqB1EzDhwoMa2DcUgmnZIalesq2lG3krrUNw=="], 884 - 885 - "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.15.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-j4SJniZ/qaZ5g8op+p1G9K1z22s/EYGg1UXIb3+Cg4nsxEpF5uSIGEE4mHUfA70L0BR9wKT2QF/zv3vkhfpX4g=="], 886 - 887 - "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.15.3", "", { "os": "linux", "cpu": "x64" }, "sha512-aKttAZnz8YB1VJwPQZtyU8Uk0BfMP63iDMkvjhJzRZVgySmqt/apWSdnoIcZlUoGheBrcqbMC17GGUmur7OT5A=="], 888 - 889 - "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.15.3", "", { "os": "linux", "cpu": "x64" }, "sha512-oe8FctPu1gnUsdtGJRO2rvOUIkkIIaHqsO9xxN0bTR7dFTlPTGi2Fhk1tnvXeyAvCPxLIcwD8phzKg6wLv9yug=="], 890 - 891 - "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.15.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-L9AjzP2ZQ/Xh58e0lTRMLvEDrcJpR7GwZqAtIeNLcTK7JVE+QineSyHp0kLkO1rttCHyCy0U74kDTj0dRz6raA=="], 892 - 893 - "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.15.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-B8UtogMzErUPDWUoKONSVBdsgKYd58rRyv2sHJWKOIMCHfZ22FVXICR4O/VwIYtlnZ7ahERcjayBHDlBZpR0aw=="], 894 - 895 - "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.15.3", "", { "os": "win32", "cpu": "x64" }, "sha512-SpZKMR9QBTecHeqpzJdYEfgw30Oo8b/Xl6rjSzBt1g0ZsXyy60KLXrp6IagQyfTYqNYE/caDvwtF2FPn7pomog=="], 896 - 897 - "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], 898 - 899 792 "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="], 900 - 901 - "@swc/types": ["@swc/types@0.1.25", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g=="], 902 793 903 794 "@tabler/icons": ["@tabler/icons@3.35.0", "", {}, "sha512-yYXe+gJ56xlZFiXwV9zVoe3FWCGuZ/D7/G4ZIlDtGxSx5CGQK110wrnT29gUj52kEZoxqF7oURTk97GQxELOFQ=="], 904 795 ··· 934 825 935 826 "@tailwindcss/postcss": ["@tailwindcss/postcss@4.1.17", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.1.17", "@tailwindcss/oxide": "4.1.17", "postcss": "^8.4.41", "tailwindcss": "4.1.17" } }, "sha512-+nKl9N9mN5uJ+M7dBOOCzINw94MPstNR/GtIhz1fpZysxL/4a+No64jCBD6CPN+bIHWFx3KWuu8XJRrj/572Dw=="], 936 827 937 - "@tanstack/eslint-plugin-query": ["@tanstack/eslint-plugin-query@5.91.2", "", { "dependencies": { "@typescript-eslint/utils": "^8.44.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0" } }, "sha512-UPeWKl/Acu1IuuHJlsN+eITUHqAaa9/04geHHPedY8siVarSaWprY0SVMKrkpKfk5ehRT7+/MZ5QwWuEtkWrFw=="], 828 + "@tailwindcss/vite": ["@tailwindcss/vite@4.1.17", "", { "dependencies": { "@tailwindcss/node": "4.1.17", "@tailwindcss/oxide": "4.1.17", "tailwindcss": "4.1.17" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-4+9w8ZHOiGnpcGI6z1TVVfWaX/koK7fKeSYF3qlYg2xpBtbteP2ddBxiarL+HVgfSJGeK5RIxRQmKm4rTJJAwA=="], 938 829 939 - "@tanstack/history": ["@tanstack/history@1.139.0", "", {}, "sha512-l6wcxwDBeh/7Dhles23U1O8lp9kNJmAb2yNjekR6olZwCRNAVA8TCXlVCrueELyFlYZqvQkh0ofxnzG62A1Kkg=="], 830 + "@tanstack/history": ["@tanstack/history@1.140.0", "", {}, "sha512-u+/dChlWlT3kYa/RmFP+E7xY5EnzvKEKcvKk+XrgWMpBWExQIh3RQX/eUqhqwCXJPNc4jfm1Coj8umnm/hDgyA=="], 940 831 941 - "@tanstack/query-core": ["@tanstack/query-core@5.90.10", "", {}, "sha512-EhZVFu9rl7GfRNuJLJ3Y7wtbTnENsvzp+YpcAV7kCYiXni1v8qZh++lpw4ch4rrwC0u/EZRnBHIehzCGzwXDSQ=="], 832 + "@tanstack/query-core": ["@tanstack/query-core@5.90.12", "", {}, "sha512-T1/8t5DhV/SisWjDnaiU2drl6ySvsHj1bHBCWNXd+/T+Hh1cf6JodyEYMd5sgwm+b/mETT4EV3H+zCVczCU5hg=="], 942 833 943 834 "@tanstack/query-devtools": ["@tanstack/query-devtools@5.91.1", "", {}, "sha512-l8bxjk6BMsCaVQH6NzQEE/bEgFy1hAs5qbgXl0xhzezlaQbPk6Mgz9BqEg2vTLPOHD8N4k+w/gdgCbEzecGyNg=="], 944 835 945 - "@tanstack/react-query": ["@tanstack/react-query@5.90.10", "", { "dependencies": { "@tanstack/query-core": "5.90.10" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-BKLss9Y8PQ9IUjPYQiv3/Zmlx92uxffUOX8ZZNoQlCIZBJPT5M+GOMQj7xislvVQ6l1BstBjcX0XB/aHfFYVNw=="], 836 + "@tanstack/react-query": ["@tanstack/react-query@5.90.12", "", { "dependencies": { "@tanstack/query-core": "5.90.12" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-graRZspg7EoEaw0a8faiUASCyJrqjKPdqJ9EwuDRUF9mEYJ1YPczI9H+/agJ0mOJkPCJDk0lsz5QTrLZ/jQ2rg=="], 946 837 947 - "@tanstack/react-query-devtools": ["@tanstack/react-query-devtools@5.91.0", "", { "dependencies": { "@tanstack/query-devtools": "5.91.0" }, "peerDependencies": { "@tanstack/react-query": "^5.90.10", "react": "^18 || ^19" } }, "sha512-s7g8Zn8HN05HNe22n/KdNm8wXaRbkcsVkqpkdYIQuCfjVmEUoTQqtJsN2iZtgd9CU36xNS38trWIofxzyW5vbQ=="], 838 + "@tanstack/react-query-devtools": ["@tanstack/react-query-devtools@5.91.1", "", { "dependencies": { "@tanstack/query-devtools": "5.91.1" }, "peerDependencies": { "@tanstack/react-query": "^5.90.10", "react": "^18 || ^19" } }, "sha512-tRnJYwEbH0kAOuToy8Ew7bJw1lX3AjkkgSlf/vzb+NpnqmHPdWM+lA2DSdGQSLi1SU0PDRrrCI1vnZnci96CsQ=="], 948 839 949 - "@tanstack/react-router": ["@tanstack/react-router@1.139.3", "", { "dependencies": { "@tanstack/history": "1.139.0", "@tanstack/react-store": "^0.8.0", "@tanstack/router-core": "1.139.3", "isbot": "^5.1.22", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-lhqK0DnbA7PgHOnmhzOoWVzx8qd8oEpR4cOUbxAjwb3+ExFQWrEvRf9+ZdSxs49ZrtZL2S2UltxBv3vBV4Si5g=="], 840 + "@tanstack/react-router": ["@tanstack/react-router@1.140.0", "", { "dependencies": { "@tanstack/history": "1.140.0", "@tanstack/react-store": "^0.8.0", "@tanstack/router-core": "1.140.0", "isbot": "^5.1.22", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-Xe4K1bEtU5h0cAhaKYXDQA2cuITgEs1x6tOognJbcxamlAdzDAkhYBhRg8dKSVAyfGejAUNlUi4utnN0s6R+Yw=="], 950 841 951 - "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.139.3", "", { "dependencies": { "@tanstack/router-devtools-core": "1.139.3", "vite": "^7.1.7" }, "peerDependencies": { "@tanstack/react-router": "^1.139.3", "@tanstack/router-core": "^1.139.3", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" }, "optionalPeers": ["@tanstack/router-core"] }, "sha512-taH/Zklh3TOEaGXo3Nmck67J6Cgj7LDY9E7pIwncocWXt/6s91kYKHsiSkCWfAbZ/bLIrj4YWu21ObnvU0PlHw=="], 842 + "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.140.0", "", { "dependencies": { "@tanstack/router-devtools-core": "1.140.0" }, "peerDependencies": { "@tanstack/react-router": "^1.140.0", "@tanstack/router-core": "^1.140.0", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" }, "optionalPeers": ["@tanstack/router-core"] }, "sha512-11NFwHCG8KphG7Bif570qOxBVwNBTkIOExsf42WNv7cgRhwD6cHjUvfx20/WzkAlvFbEGlV+pp7wiJm3HR56bQ=="], 952 843 953 844 "@tanstack/react-store": ["@tanstack/react-store@0.8.0", "", { "dependencies": { "@tanstack/store": "0.8.0", "use-sync-external-store": "^1.6.0" }, "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" } }, "sha512-1vG9beLIuB7q69skxK9r5xiLN3ztzIPfSQSs0GfeqWGO2tGIyInZx0x1COhpx97RKaONSoAb8C3dxacWksm1ow=="], 954 845 955 - "@tanstack/router-core": ["@tanstack/router-core@1.139.3", "", { "dependencies": { "@tanstack/history": "1.139.0", "@tanstack/store": "^0.8.0", "cookie-es": "^2.0.0", "seroval": "^1.4.0", "seroval-plugins": "^1.4.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" } }, "sha512-j3v1e739jmozBdtnmA45xHQHjCC2aKqBtfkMT3t2ZPijVrueaVP6qNRIAWmDK4ZSqd67TF5wP8vyqeTShJsEQQ=="], 956 - 957 - "@tanstack/router-devtools": ["@tanstack/router-devtools@1.139.3", "", { "dependencies": { "@tanstack/react-router-devtools": "1.139.3", "clsx": "^2.1.1", "goober": "^2.1.16", "vite": "^7.1.7" }, "peerDependencies": { "@tanstack/react-router": "^1.139.3", "csstype": "^3.0.10", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" }, "optionalPeers": ["csstype"] }, "sha512-cJ8mQNMm/4nMFDwQxSMLWP4pk9kAXLl/SkRQqOwEbhzO35enSo7r2UdcM0uTwNEEKGjdjmNrNanFzDIZJnFHCg=="], 846 + "@tanstack/router-core": ["@tanstack/router-core@1.140.0", "", { "dependencies": { "@tanstack/history": "1.140.0", "@tanstack/store": "^0.8.0", "cookie-es": "^2.0.0", "seroval": "^1.4.0", "seroval-plugins": "^1.4.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" } }, "sha512-/Te/mlAzi5FEpZ9NF9RhVw/n+cWYLiCHpvevNKo7JPA8ZYWF58wkalPtNWSocftX4P+OIBNerFAW9UbLgSbvSw=="], 958 847 959 - "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.139.3", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16", "tiny-invariant": "^1.3.3", "vite": "^7.1.7" }, "peerDependencies": { "@tanstack/router-core": "^1.139.3", "csstype": "^3.0.10", "solid-js": ">=1.9.5" }, "optionalPeers": ["csstype"] }, "sha512-dqjL9QroVORlLC283uwwMB7CLMWAfn9rgKwwcXdaSQlPcuSVScFzyFI4Iz7l6A4jGC0ALtNPQoHJ52+mvTzY5Q=="], 848 + "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.140.0", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16", "tiny-invariant": "^1.3.3" }, "peerDependencies": { "@tanstack/router-core": "^1.140.0", "csstype": "^3.0.10", "solid-js": ">=1.9.5" }, "optionalPeers": ["csstype"] }, "sha512-jrfJZabe2ndKgoQWd7xLdfLFG/ew6hfPMjCmx2Ep+KBkSqfR19Pww8UtJ8Y0KcfTEFKL3YzVEsRS4EZDX3A1Qw=="], 960 849 961 - "@tanstack/router-generator": ["@tanstack/router-generator@1.139.3", "", { "dependencies": { "@tanstack/router-core": "1.139.3", "@tanstack/router-utils": "1.139.0", "@tanstack/virtual-file-routes": "1.139.0", "prettier": "^3.5.0", "recast": "^0.23.11", "source-map": "^0.7.4", "tsx": "^4.19.2", "zod": "^3.24.2" } }, "sha512-zq/ZC+1rx7pGNqYOthHSm0jxioNqm7JszYDcZPAZVhHT2Qhen02b7PzW8M7Qx4FU+ldXgnhpenDN5/jqYYClfQ=="], 850 + "@tanstack/router-generator": ["@tanstack/router-generator@1.140.0", "", { "dependencies": { "@tanstack/router-core": "1.140.0", "@tanstack/router-utils": "1.140.0", "@tanstack/virtual-file-routes": "1.140.0", "prettier": "^3.5.0", "recast": "^0.23.11", "source-map": "^0.7.4", "tsx": "^4.19.2", "zod": "^3.24.2" } }, "sha512-YYq/DSn7EkBboCySf87RDH3mNq3AfN18v4qHmre73KOdxUJchTZ4LC1+8vbO/1K/Uus2ZFXUDy7QX5KziNx08g=="], 962 851 963 - "@tanstack/router-plugin": ["@tanstack/router-plugin@1.139.3", "", { "dependencies": { "@babel/core": "^7.27.7", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/template": "^7.27.2", "@babel/traverse": "^7.27.7", "@babel/types": "^7.27.7", "@tanstack/router-core": "1.139.3", "@tanstack/router-generator": "1.139.3", "@tanstack/router-utils": "1.139.0", "@tanstack/virtual-file-routes": "1.139.0", "babel-dead-code-elimination": "^1.0.10", "chokidar": "^3.6.0", "unplugin": "^2.1.2", "zod": "^3.24.2" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", "@tanstack/react-router": "^1.139.3", "vite": ">=5.0.0 || >=6.0.0 || >=7.0.0", "vite-plugin-solid": "^2.11.10", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-ymv5mr2IULgrZblzYeYUVZXzz3fzW1OzoDZh5cs5gEetRcEpXQ6XL8KG4pCkIQ04AJcrtXEWt1yZxi01XjZWxw=="], 852 + "@tanstack/router-plugin": ["@tanstack/router-plugin@1.140.0", "", { "dependencies": { "@babel/core": "^7.27.7", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/template": "^7.27.2", "@babel/traverse": "^7.27.7", "@babel/types": "^7.27.7", "@tanstack/router-core": "1.140.0", "@tanstack/router-generator": "1.140.0", "@tanstack/router-utils": "1.140.0", "@tanstack/virtual-file-routes": "1.140.0", "babel-dead-code-elimination": "^1.0.10", "chokidar": "^3.6.0", "unplugin": "^2.1.2", "zod": "^3.24.2" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", "@tanstack/react-router": "^1.140.0", "vite": ">=5.0.0 || >=6.0.0 || >=7.0.0", "vite-plugin-solid": "^2.11.10", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-hUOOYTPLFS3LvGoPoQNk3BY3ZvPlVIgxnJT3JMJMdstLMT2RUYha3ddsaamZd4ONUSWmt+7N5OXmiG0v4XmzMw=="], 964 853 965 - "@tanstack/router-utils": ["@tanstack/router-utils@1.139.0", "", { "dependencies": { "@babel/core": "^7.27.4", "@babel/generator": "^7.27.5", "@babel/parser": "^7.27.5", "@babel/preset-typescript": "^7.27.1", "ansis": "^4.1.0", "diff": "^8.0.2", "pathe": "^2.0.3", "tinyglobby": "^0.2.15" } }, "sha512-jT7D6NimWqoFSkid4vCno8gvTyfL1+NHpgm3es0B2UNhKKRV3LngOGilm1m6v8Qvk/gy6Fh/tvB+s+hBl6GhOg=="], 854 + "@tanstack/router-utils": ["@tanstack/router-utils@1.140.0", "", { "dependencies": { "@babel/core": "^7.27.4", "@babel/generator": "^7.27.5", "@babel/parser": "^7.27.5", "@babel/preset-typescript": "^7.27.1", "ansis": "^4.1.0", "diff": "^8.0.2", "pathe": "^2.0.3", "tinyglobby": "^0.2.15" } }, "sha512-gobraqMjkR5OO4nNbnwursGo08Idla6Yu30RspIA9IR1hv4WPJlxIyRWJcKjiQeXGyu5TuekLPUOHM46oood7w=="], 966 855 967 856 "@tanstack/store": ["@tanstack/store@0.8.0", "", {}, "sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ=="], 968 857 969 - "@tanstack/virtual-file-routes": ["@tanstack/virtual-file-routes@1.139.0", "", {}, "sha512-9PImF1d1tovTUIpjFVa0W7Fwj/MHif7BaaczgJJfbv3sDt1Gh+oW9W9uCw9M3ndEJynnp5ZD/TTs0RGubH5ssg=="], 858 + "@tanstack/virtual-file-routes": ["@tanstack/virtual-file-routes@1.140.0", "", {}, "sha512-LVmd19QkxV3x40oHkuTii9ey3l5XDV+X8locO2p5zfVDUC+N58H2gA7cDUtVc9qtImncnz3WxQkO/6kM3PMx2w=="], 970 859 971 860 "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], 972 861 ··· 1070 959 1071 960 "@vitejs/plugin-react": ["@vitejs/plugin-react@5.1.1", "", { "dependencies": { "@babel/core": "^7.28.5", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.47", "@types/babel__core": "^7.20.5", "react-refresh": "^0.18.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-WQfkSw0QbQ5aJ2CHYw23ZGkqnRwqKHD/KYsMeTkZzPT4Jcf0DcBxBtwMJxnu6E7oxw5+JC6ZAiePgh28uJ1HBA=="], 1072 961 1073 - "@vitejs/plugin-react-swc": ["@vitejs/plugin-react-swc@3.11.0", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-beta.27", "@swc/core": "^1.12.11" }, "peerDependencies": { "vite": "^4 || ^5 || ^6 || ^7" } }, "sha512-YTJCGFdNMHCMfjODYtxRNVAYmTWQ1Lb8PulP/2/f/oEEtglw8oKxKIZmmRkyXrVrHfsKOaVkAc3NT9/dMutO5w=="], 1074 - 1075 - "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], 1076 - 1077 962 "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], 1078 963 1079 964 "acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="], ··· 1088 973 1089 974 "ansis": ["ansis@4.2.0", "", {}, "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig=="], 1090 975 1091 - "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], 1092 - 1093 976 "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], 1094 977 1095 978 "app": ["app@workspace:apps/app"], 1096 - 1097 - "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], 1098 979 1099 980 "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], 1100 981 ··· 1124 1005 1125 1006 "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], 1126 1007 1127 - "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], 1128 - 1129 1008 "atomic-sleep": ["atomic-sleep@1.0.0", "", {}, "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="], 1130 1009 1131 - "autoprefixer": ["autoprefixer@10.4.22", "", { "dependencies": { "browserslist": "^4.27.0", "caniuse-lite": "^1.0.30001754", "fraction.js": "^5.3.4", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg=="], 1132 - 1133 1010 "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], 1134 1011 1135 1012 "axe-core": ["axe-core@4.11.0", "", {}, "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ=="], 1136 - 1137 - "axios": ["axios@1.13.2", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA=="], 1138 1013 1139 1014 "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], 1140 1015 ··· 1143 1018 "babel-plugin-react-compiler": ["babel-plugin-react-compiler@1.0.0", "", { "dependencies": { "@babel/types": "^7.26.0" } }, "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw=="], 1144 1019 1145 1020 "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], 1146 - 1147 - "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], 1148 1021 1149 1022 "baseline-browser-mapping": ["baseline-browser-mapping@2.8.31", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-a28v2eWrrRWPpJSzxc+mKwm0ZtVx/G8SepdQZDArnXYU/XS+IF6mp8aB/4E+hH1tyGCoDo3KlUCdlSxGDsRkAw=="], 1150 1023 1151 1024 "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], 1152 1025 1153 - "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], 1154 - 1155 1026 "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], 1156 1027 1157 1028 "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], 1158 1029 1159 1030 "browserslist": ["browserslist@4.28.0", "", { "dependencies": { "baseline-browser-mapping": "^2.8.25", "caniuse-lite": "^1.0.30001754", "electron-to-chromium": "^1.5.249", "node-releases": "^2.0.27", "update-browserslist-db": "^1.1.4" }, "bin": { "browserslist": "cli.js" } }, "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ=="], 1160 - 1161 - "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], 1162 1031 1163 1032 "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], 1164 1033 ··· 1174 1043 1175 1044 "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], 1176 1045 1177 - "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="], 1178 - 1179 - "caniuse-api": ["caniuse-api@3.0.0", "", { "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", "lodash.memoize": "^4.1.2", "lodash.uniq": "^4.5.0" } }, "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw=="], 1180 - 1181 1046 "caniuse-lite": ["caniuse-lite@1.0.30001757", "", {}, "sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ=="], 1182 - 1183 - "cbor-extract": ["cbor-extract@2.2.0", "", { "dependencies": { "node-gyp-build-optional-packages": "5.1.1" }, "optionalDependencies": { "@cbor-extract/cbor-extract-darwin-arm64": "2.2.0", "@cbor-extract/cbor-extract-darwin-x64": "2.2.0", "@cbor-extract/cbor-extract-linux-arm": "2.2.0", "@cbor-extract/cbor-extract-linux-arm64": "2.2.0", "@cbor-extract/cbor-extract-linux-x64": "2.2.0", "@cbor-extract/cbor-extract-win32-x64": "2.2.0" }, "bin": { "download-cbor-prebuilds": "bin/download-prebuilds.js" } }, "sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA=="], 1184 - 1185 - "cbor-x": ["cbor-x@1.6.0", "", { "optionalDependencies": { "cbor-extract": "^2.2.0" } }, "sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg=="], 1186 - 1187 - "cborg": ["cborg@1.10.2", "", { "bin": { "cborg": "cli.js" } }, "sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug=="], 1188 1047 1189 1048 "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], 1190 1049 ··· 1211 1070 "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], 1212 1071 1213 1072 "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], 1214 - 1215 - "colord": ["colord@2.9.3", "", {}, "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw=="], 1216 1073 1217 1074 "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], 1218 1075 1219 - "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], 1220 - 1221 - "commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], 1222 - 1223 1076 "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], 1224 1077 1225 1078 "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], ··· 1230 1083 1231 1084 "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], 1232 1085 1233 - "css-declaration-sorter": ["css-declaration-sorter@7.3.0", "", { "peerDependencies": { "postcss": "^8.0.9" } }, "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ=="], 1234 - 1235 - "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], 1236 - 1237 - "css-tree": ["css-tree@3.1.0", "", { "dependencies": { "mdn-data": "2.12.2", "source-map-js": "^1.0.1" } }, "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w=="], 1238 - 1239 - "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="], 1240 - 1241 - "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], 1242 - 1243 - "cssnano": ["cssnano@7.1.2", "", { "dependencies": { "cssnano-preset-default": "^7.0.10", "lilconfig": "^3.1.3" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-HYOPBsNvoiFeR1eghKD5C3ASm64v9YVyJB4Ivnl2gqKoQYvjjN/G0rztvKQq8OxocUtC6sjqY8jwYngIB4AByA=="], 1244 - 1245 - "cssnano-preset-default": ["cssnano-preset-default@7.0.10", "", { "dependencies": { "browserslist": "^4.27.0", "css-declaration-sorter": "^7.2.0", "cssnano-utils": "^5.0.1", "postcss-calc": "^10.1.1", "postcss-colormin": "^7.0.5", "postcss-convert-values": "^7.0.8", "postcss-discard-comments": "^7.0.5", "postcss-discard-duplicates": "^7.0.2", "postcss-discard-empty": "^7.0.1", "postcss-discard-overridden": "^7.0.1", "postcss-merge-longhand": "^7.0.5", "postcss-merge-rules": "^7.0.7", "postcss-minify-font-values": "^7.0.1", "postcss-minify-gradients": "^7.0.1", "postcss-minify-params": "^7.0.5", "postcss-minify-selectors": "^7.0.5", "postcss-normalize-charset": "^7.0.1", "postcss-normalize-display-values": "^7.0.1", "postcss-normalize-positions": "^7.0.1", "postcss-normalize-repeat-style": "^7.0.1", "postcss-normalize-string": "^7.0.1", "postcss-normalize-timing-functions": "^7.0.1", "postcss-normalize-unicode": "^7.0.5", "postcss-normalize-url": "^7.0.1", "postcss-normalize-whitespace": "^7.0.1", "postcss-ordered-values": "^7.0.2", "postcss-reduce-initial": "^7.0.5", "postcss-reduce-transforms": "^7.0.1", "postcss-svgo": "^7.1.0", "postcss-unique-selectors": "^7.0.4" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-6ZBjW0Lf1K1Z+0OKUAUpEN62tSXmYChXWi2NAA0afxEVsj9a+MbcB1l5qel6BHJHmULai2fCGRthCeKSFbScpA=="], 1246 - 1247 - "cssnano-utils": ["cssnano-utils@5.0.1", "", { "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg=="], 1248 - 1249 - "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="], 1250 - 1251 1086 "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], 1252 1087 1253 1088 "damerau-levenshtein": ["damerau-levenshtein@1.0.8", "", {}, "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="], ··· 1270 1105 1271 1106 "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], 1272 1107 1273 - "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], 1274 - 1275 1108 "detect-libc": ["detect-libc@2.0.2", "", {}, "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw=="], 1276 1109 1277 1110 "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], 1278 - 1279 - "didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="], 1280 1111 1281 1112 "diff": ["diff@8.0.2", "", {}, "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg=="], 1282 1113 1283 - "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], 1284 - 1285 1114 "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], 1286 1115 1287 - "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], 1288 - 1289 - "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], 1290 - 1291 - "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], 1292 - 1293 - "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], 1294 - 1295 1116 "drizzle-kit": ["drizzle-kit@0.29.1", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.19.7", "esbuild-register": "^3.5.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-OvHL8RVyYiPR3LLRE3SHdcON8xGXl+qMfR9uTTnFWBPIqVk/3NWYZPb7nfpM1Bhix3H+BsxqPyyagG7YZ+Z63A=="], 1296 1117 1297 1118 "drizzle-orm": ["drizzle-orm@0.44.7", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-quIpnYznjU9lHshEOAYLoZ9s3jweleHlZIAWR/jX9gAWNg/JhQ1wj0KGRf7/Zm+obRrYd9GjPVJg790QY9N5AQ=="], ··· 1306 1127 1307 1128 "enhanced-resolve": ["enhanced-resolve@5.18.3", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww=="], 1308 1129 1309 - "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], 1310 - 1311 1130 "env-paths": ["env-paths@3.0.0", "", {}, "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A=="], 1312 1131 1313 1132 "es-abstract": ["es-abstract@1.24.0", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg=="], ··· 1350 1169 1351 1170 "eslint-plugin-react": ["eslint-plugin-react@7.37.5", "", { "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA=="], 1352 1171 1353 - "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.2.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg=="], 1172 + "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@7.0.1", "", { "dependencies": { "@babel/core": "^7.24.4", "@babel/parser": "^7.24.4", "hermes-parser": "^0.25.1", "zod": "^3.25.0 || ^4.0.0", "zod-validation-error": "^3.5.0 || ^4.0.0" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA=="], 1354 1173 1355 1174 "eslint-plugin-react-refresh": ["eslint-plugin-react-refresh@0.4.24", "", { "peerDependencies": { "eslint": ">=8.40" } }, "sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w=="], 1356 1175 ··· 1374 1193 1375 1194 "event-target-polyfill": ["event-target-polyfill@0.0.4", "", {}, "sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ=="], 1376 1195 1377 - "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], 1378 - 1379 - "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], 1380 - 1381 1196 "fast-copy": ["fast-copy@3.0.2", "", {}, "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ=="], 1382 1197 1383 1198 "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], ··· 1387 1202 "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], 1388 1203 1389 1204 "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], 1390 - 1391 - "fast-redact": ["fast-redact@3.5.0", "", {}, "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A=="], 1392 1205 1393 1206 "fast-safe-stringify": ["fast-safe-stringify@2.1.1", "", {}, "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="], 1394 1207 ··· 1410 1223 1411 1224 "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], 1412 1225 1413 - "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], 1414 - 1415 1226 "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], 1416 1227 1417 - "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], 1418 - 1419 1228 "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="], 1420 1229 1421 1230 "forwarded-parse": ["forwarded-parse@2.1.2", "", {}, "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw=="], 1422 1231 1423 - "fraction.js": ["fraction.js@5.3.4", "", {}, "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ=="], 1424 - 1425 1232 "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], 1426 1233 1427 1234 "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], ··· 1452 1259 1453 1260 "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], 1454 1261 1455 - "globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], 1262 + "globals": ["globals@16.5.0", "", {}, "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ=="], 1456 1263 1457 1264 "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], 1458 1265 ··· 1489 1296 "hono": ["hono@4.10.7", "", {}, "sha512-icXIITfw/07Q88nLSkB9aiUrd8rYzSweK681Kjo/TSggaGbOX4RRyxxm71v+3PC8C/j+4rlxGeoTRxQDkaJkUw=="], 1490 1297 1491 1298 "iconv-lite": ["iconv-lite@0.7.0", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ=="], 1492 - 1493 - "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], 1494 1299 1495 1300 "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], 1496 1301 ··· 1630 1435 1631 1436 "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.2", "", { "os": "win32", "cpu": "x64" }, "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw=="], 1632 1437 1633 - "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], 1634 - 1635 - "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], 1636 - 1637 1438 "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], 1638 1439 1639 - "lodash.memoize": ["lodash.memoize@4.1.2", "", {}, "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="], 1640 - 1641 1440 "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], 1642 - 1643 - "lodash.uniq": ["lodash.uniq@4.5.0", "", {}, "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="], 1644 1441 1645 1442 "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], 1646 1443 1647 - "lru-cache": ["lru-cache@11.2.2", "", {}, "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg=="], 1444 + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], 1648 1445 1649 - "lucide-react": ["lucide-react@0.464.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" } }, "sha512-eCx1qClbnw5qRqB2Z1AFFp71wdJXEwhPp5ii8LviyvHb7o/7eMXFiTyDHh7JpjM9BO9pC6ZUp/c7mCwwxbPIcg=="], 1446 + "lucide-react": ["lucide-react@0.556.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-iOb8dRk7kLaYBZhR2VlV1CeJGxChBgUthpSP8wom9jfj79qovgG6qcSdiy6vkoREKPnbUYzJsCn4o4PtG3Iy+A=="], 1650 1447 1651 1448 "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], 1652 1449 1653 1450 "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], 1654 1451 1655 - "mdn-data": ["mdn-data@2.12.2", "", {}, "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA=="], 1656 - 1657 1452 "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], 1658 1453 1659 1454 "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], 1660 1455 1661 - "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], 1662 - 1663 - "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], 1664 - 1665 1456 "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], 1666 1457 1667 1458 "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], ··· 1680 1471 1681 1472 "mute-stream": ["mute-stream@2.0.0", "", {}, "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA=="], 1682 1473 1683 - "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], 1684 - 1685 1474 "nanoid": ["nanoid@5.1.6", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg=="], 1686 1475 1687 1476 "napi-postinstall": ["napi-postinstall@0.3.4", "", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ=="], ··· 1696 1485 1697 1486 "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], 1698 1487 1699 - "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.1.1", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-test": "build-test.js", "node-gyp-build-optional-packages-optional": "optional.js" } }, "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw=="], 1700 - 1701 1488 "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], 1702 1489 1703 1490 "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], 1704 - 1705 - "normalize-range": ["normalize-range@0.1.2", "", {}, "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="], 1706 - 1707 - "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], 1708 1491 1709 1492 "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], 1710 1493 1711 - "object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="], 1712 - 1713 1494 "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], 1714 1495 1715 1496 "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], ··· 1774 1555 1775 1556 "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], 1776 1557 1777 - "pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="], 1778 - 1779 1558 "pino": ["pino@9.14.0", "", { "dependencies": { "@pinojs/redact": "^0.4.0", "atomic-sleep": "^1.0.0", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w=="], 1780 1559 1781 1560 "pino-abstract-transport": ["pino-abstract-transport@2.0.0", "", { "dependencies": { "split2": "^4.0.0" } }, "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw=="], ··· 1783 1562 "pino-pretty": ["pino-pretty@13.1.2", "", { "dependencies": { "colorette": "^2.0.7", "dateformat": "^4.6.3", "fast-copy": "^3.0.2", "fast-safe-stringify": "^2.1.1", "help-me": "^5.0.0", "joycon": "^3.1.1", "minimist": "^1.2.6", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pump": "^3.0.0", "secure-json-parse": "^4.0.0", "sonic-boom": "^4.0.1", "strip-json-comments": "^5.0.2" }, "bin": { "pino-pretty": "bin.js" } }, "sha512-3cN0tCakkT4f3zo9RXDIhy6GTvtYD6bK4CRBLN9j3E/ePqN1tugAXD5rGVfoChW6s0hiek+eyYlLNqc/BG7vBQ=="], 1784 1563 1785 1564 "pino-std-serializers": ["pino-std-serializers@7.0.0", "", {}, "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA=="], 1786 - 1787 - "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], 1788 1565 1789 1566 "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], 1790 1567 1791 1568 "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], 1792 1569 1793 - "postcss-calc": ["postcss-calc@10.1.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.38" } }, "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw=="], 1794 - 1795 - "postcss-colormin": ["postcss-colormin@7.0.5", "", { "dependencies": { "browserslist": "^4.27.0", "caniuse-api": "^3.0.0", "colord": "^2.9.3", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-ekIBP/nwzRWhEMmIxHHbXHcMdzd1HIUzBECaj5KEdLz9DVP2HzT065sEhvOx1dkLjYW7jyD0CngThx6bpFi2fA=="], 1796 - 1797 - "postcss-convert-values": ["postcss-convert-values@7.0.8", "", { "dependencies": { "browserslist": "^4.27.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-+XNKuPfkHTCEo499VzLMYn94TiL3r9YqRE3Ty+jP7UX4qjewUONey1t7CG21lrlTLN07GtGM8MqFVp86D4uKJg=="], 1798 - 1799 - "postcss-discard-comments": ["postcss-discard-comments@7.0.5", "", { "dependencies": { "postcss-selector-parser": "^7.1.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-IR2Eja8WfYgN5n32vEGSctVQ1+JARfu4UH8M7bgGh1bC+xI/obsPJXaBpQF7MAByvgwZinhpHpdrmXtvVVlKcQ=="], 1800 - 1801 - "postcss-discard-duplicates": ["postcss-discard-duplicates@7.0.2", "", { "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w=="], 1802 - 1803 - "postcss-discard-empty": ["postcss-discard-empty@7.0.1", "", { "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg=="], 1804 - 1805 - "postcss-discard-overridden": ["postcss-discard-overridden@7.0.1", "", { "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg=="], 1806 - 1807 - "postcss-import": ["postcss-import@15.1.0", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="], 1808 - 1809 - "postcss-js": ["postcss-js@4.1.0", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw=="], 1810 - 1811 - "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="], 1812 - 1813 - "postcss-merge-longhand": ["postcss-merge-longhand@7.0.5", "", { "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^7.0.5" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw=="], 1814 - 1815 - "postcss-merge-rules": ["postcss-merge-rules@7.0.7", "", { "dependencies": { "browserslist": "^4.27.0", "caniuse-api": "^3.0.0", "cssnano-utils": "^5.0.1", "postcss-selector-parser": "^7.1.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-njWJrd/Ms6XViwowaaCc+/vqhPG3SmXn725AGrnl+BgTuRPEacjiLEaGq16J6XirMJbtKkTwnt67SS+e2WGoew=="], 1816 - 1817 - "postcss-minify-font-values": ["postcss-minify-font-values@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ=="], 1818 - 1819 - "postcss-minify-gradients": ["postcss-minify-gradients@7.0.1", "", { "dependencies": { "colord": "^2.9.3", "cssnano-utils": "^5.0.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A=="], 1820 - 1821 - "postcss-minify-params": ["postcss-minify-params@7.0.5", "", { "dependencies": { "browserslist": "^4.27.0", "cssnano-utils": "^5.0.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-FGK9ky02h6Ighn3UihsyeAH5XmLEE2MSGH5Tc4tXMFtEDx7B+zTG6hD/+/cT+fbF7PbYojsmmWjyTwFwW1JKQQ=="], 1822 - 1823 - "postcss-minify-selectors": ["postcss-minify-selectors@7.0.5", "", { "dependencies": { "cssesc": "^3.0.0", "postcss-selector-parser": "^7.1.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug=="], 1824 - 1825 - "postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="], 1826 - 1827 - "postcss-normalize-charset": ["postcss-normalize-charset@7.0.1", "", { "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ=="], 1828 - 1829 - "postcss-normalize-display-values": ["postcss-normalize-display-values@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ=="], 1830 - 1831 - "postcss-normalize-positions": ["postcss-normalize-positions@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ=="], 1832 - 1833 - "postcss-normalize-repeat-style": ["postcss-normalize-repeat-style@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ=="], 1834 - 1835 - "postcss-normalize-string": ["postcss-normalize-string@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ=="], 1836 - 1837 - "postcss-normalize-timing-functions": ["postcss-normalize-timing-functions@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg=="], 1838 - 1839 - "postcss-normalize-unicode": ["postcss-normalize-unicode@7.0.5", "", { "dependencies": { "browserslist": "^4.27.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-X6BBwiRxVaFHrb2WyBMddIeB5HBjJcAaUHyhLrM2FsxSq5TFqcHSsK7Zu1otag+o0ZphQGJewGH1tAyrD0zX1Q=="], 1840 - 1841 - "postcss-normalize-url": ["postcss-normalize-url@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ=="], 1842 - 1843 - "postcss-normalize-whitespace": ["postcss-normalize-whitespace@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA=="], 1844 - 1845 - "postcss-ordered-values": ["postcss-ordered-values@7.0.2", "", { "dependencies": { "cssnano-utils": "^5.0.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw=="], 1846 - 1847 - "postcss-reduce-initial": ["postcss-reduce-initial@7.0.5", "", { "dependencies": { "browserslist": "^4.27.0", "caniuse-api": "^3.0.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-RHagHLidG8hTZcnr4FpyMB2jtgd/OcyAazjMhoy5qmWJOx1uxKh4ntk0Pb46ajKM0rkf32lRH4C8c9qQiPR6IA=="], 1848 - 1849 - "postcss-reduce-transforms": ["postcss-reduce-transforms@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g=="], 1850 - 1851 - "postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], 1852 - 1853 - "postcss-svgo": ["postcss-svgo@7.1.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0", "svgo": "^4.0.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-KnAlfmhtoLz6IuU3Sij2ycusNs4jPW+QoFE5kuuUOK8awR6tMxZQrs5Ey3BUz7nFCzT3eqyFgqkyrHiaU2xx3w=="], 1854 - 1855 - "postcss-unique-selectors": ["postcss-unique-selectors@7.0.4", "", { "dependencies": { "postcss-selector-parser": "^7.1.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ=="], 1856 - 1857 - "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], 1858 - 1859 1570 "postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], 1860 1571 1861 1572 "postgres-bytea": ["postgres-bytea@1.0.0", "", {}, "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w=="], ··· 1867 1578 "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], 1868 1579 1869 1580 "prettier": ["prettier@3.6.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="], 1870 - 1871 - "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], 1872 1581 1873 1582 "process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], 1874 1583 ··· 1876 1585 1877 1586 "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], 1878 1587 1879 - "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], 1880 - 1881 1588 "pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="], 1882 1589 1883 1590 "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], ··· 1886 1593 1887 1594 "quick-format-unescaped": ["quick-format-unescaped@4.0.4", "", {}, "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="], 1888 1595 1889 - "react": ["react@19.0.0", "", {}, "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ=="], 1596 + "react": ["react@19.2.0", "", {}, "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ=="], 1890 1597 1891 - "react-dom": ["react-dom@19.0.0", "", { "dependencies": { "scheduler": "^0.25.0" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ=="], 1892 - 1893 - "react-hook-form": ["react-hook-form@7.66.1", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-2KnjpgG2Rhbi+CIiIBQQ9Df6sMGH5ExNyFl4Hw9qO7pIqMBR8Bvu9RQyjl3JM4vehzCh9soiNUM/xYMswb2EiA=="], 1598 + "react-dom": ["react-dom@19.2.0", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.0" } }, "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ=="], 1894 1599 1895 1600 "react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], 1896 1601 ··· 1902 1607 1903 1608 "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], 1904 1609 1905 - "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="], 1906 - 1907 - "readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], 1908 - 1909 1610 "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], 1910 1611 1911 1612 "real-require": ["real-require@0.2.0", "", {}, "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg=="], ··· 1930 1631 1931 1632 "rimraf": ["rimraf@6.1.2", "", { "dependencies": { "glob": "^13.0.0", "package-json-from-dist": "^1.0.1" }, "bin": { "rimraf": "dist/esm/bin.mjs" } }, "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g=="], 1932 1633 1933 - "rollup": ["rollup@4.53.3", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.53.3", "@rollup/rollup-android-arm64": "4.53.3", "@rollup/rollup-darwin-arm64": "4.53.3", "@rollup/rollup-darwin-x64": "4.53.3", "@rollup/rollup-freebsd-arm64": "4.53.3", "@rollup/rollup-freebsd-x64": "4.53.3", "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", "@rollup/rollup-linux-arm-musleabihf": "4.53.3", "@rollup/rollup-linux-arm64-gnu": "4.53.3", "@rollup/rollup-linux-arm64-musl": "4.53.3", "@rollup/rollup-linux-loong64-gnu": "4.53.3", "@rollup/rollup-linux-ppc64-gnu": "4.53.3", "@rollup/rollup-linux-riscv64-gnu": "4.53.3", "@rollup/rollup-linux-riscv64-musl": "4.53.3", "@rollup/rollup-linux-s390x-gnu": "4.53.3", "@rollup/rollup-linux-x64-gnu": "4.53.3", "@rollup/rollup-linux-x64-musl": "4.53.3", "@rollup/rollup-openharmony-arm64": "4.53.3", "@rollup/rollup-win32-arm64-msvc": "4.53.3", "@rollup/rollup-win32-ia32-msvc": "4.53.3", "@rollup/rollup-win32-x64-gnu": "4.53.3", "@rollup/rollup-win32-x64-msvc": "4.53.3", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA=="], 1634 + "rolldown": ["rolldown@1.0.0-beta.50", "", { "dependencies": { "@oxc-project/types": "=0.97.0", "@rolldown/pluginutils": "1.0.0-beta.50" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-beta.50", "@rolldown/binding-darwin-arm64": "1.0.0-beta.50", "@rolldown/binding-darwin-x64": "1.0.0-beta.50", "@rolldown/binding-freebsd-x64": "1.0.0-beta.50", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.50", "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.50", "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.50", "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.50", "@rolldown/binding-linux-x64-musl": "1.0.0-beta.50", "@rolldown/binding-openharmony-arm64": "1.0.0-beta.50", "@rolldown/binding-wasm32-wasi": "1.0.0-beta.50", "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.50", "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.50", "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.50" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-JFULvCNl/anKn99eKjOSEubi0lLmNqQDAjyEMME2T4CwezUDL0i6t1O9xZsu2OMehPnV2caNefWpGF+8TnzB6A=="], 1934 1635 1935 1636 "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], 1936 1637 1937 1638 "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], 1938 - 1939 - "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], 1940 1639 1941 1640 "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], 1942 1641 ··· 1946 1645 1947 1646 "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], 1948 1647 1949 - "sax": ["sax@1.4.3", "", {}, "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ=="], 1950 - 1951 - "scheduler": ["scheduler@0.25.0", "", {}, "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA=="], 1648 + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], 1952 1649 1953 1650 "secure-json-parse": ["secure-json-parse@4.1.0", "", {}, "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA=="], 1954 1651 ··· 2014 1711 2015 1712 "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], 2016 1713 2017 - "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], 2018 - 2019 1714 "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], 2020 1715 2021 1716 "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], ··· 2024 1719 2025 1720 "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], 2026 1721 2027 - "stylehacks": ["stylehacks@7.0.7", "", { "dependencies": { "browserslist": "^4.27.0", "postcss-selector-parser": "^7.1.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-bJkD0JkEtbRrMFtwgpJyBbFIwfDDONQ1Ov3sDLZQP8HuJ73kBOyx66H4bOcAbVWmnfLdvQ0AJwXxOMkpujcO6g=="], 2028 - 2029 - "sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="], 2030 - 2031 1722 "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], 2032 1723 2033 1724 "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], 2034 1725 2035 - "svgo": ["svgo@4.0.0", "", { "dependencies": { "commander": "^11.1.0", "css-select": "^5.1.0", "css-tree": "^3.0.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", "sax": "^1.4.1" }, "bin": "./bin/svgo.js" }, "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw=="], 2036 - 2037 - "tailwind-merge": ["tailwind-merge@2.6.0", "", {}, "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA=="], 1726 + "tailwind-merge": ["tailwind-merge@3.4.0", "", {}, "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g=="], 2038 1727 2039 - "tailwindcss": ["tailwindcss@3.4.18", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.7", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ=="], 2040 - 2041 - "tailwindcss-animate": ["tailwindcss-animate@1.0.7", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA=="], 1728 + "tailwindcss": ["tailwindcss@4.1.17", "", {}, "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q=="], 2042 1729 2043 1730 "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="], 2044 1731 ··· 2047 1734 "temporal-polyfill": ["temporal-polyfill@0.3.0", "", { "dependencies": { "temporal-spec": "0.3.0" } }, "sha512-qNsTkX9K8hi+FHDfHmf22e/OGuXmfBm9RqNismxBrnSmZVJKegQ+HYYXT+R7Ha8F/YSm2Y34vmzD4cxMu2u95g=="], 2048 1735 2049 1736 "temporal-spec": ["temporal-spec@0.3.0", "", {}, "sha512-n+noVpIqz4hYgFSMOSiINNOUOMFtV5cZQNCmmszA6GiVFVRt3G7AqVyhXjhCSmowvQn+NsGn+jMDMKJYHd3bSQ=="], 2050 - 2051 - "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], 2052 - 2053 - "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], 2054 1737 2055 1738 "thread-stream": ["thread-stream@3.1.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A=="], 2056 1739 ··· 2064 1747 2065 1748 "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], 2066 1749 2067 - "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], 2068 - 2069 1750 "tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], 2070 1751 2071 1752 "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], 2072 1753 2073 - "tsx": ["tsx@4.20.6", "", { "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg=="], 1754 + "tsx": ["tsx@4.21.0", "", { "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw=="], 2074 1755 2075 1756 "turbo": ["turbo@2.6.1", "", { "optionalDependencies": { "turbo-darwin-64": "2.6.1", "turbo-darwin-arm64": "2.6.1", "turbo-linux-64": "2.6.1", "turbo-linux-arm64": "2.6.1", "turbo-windows-64": "2.6.1", "turbo-windows-arm64": "2.6.1" }, "bin": { "turbo": "bin/turbo" } }, "sha512-qBwXXuDT3rA53kbNafGbT5r++BrhRgx3sAo0cHoDAeG9g1ItTmUMgltz3Hy7Hazy1ODqNpR+C7QwqL6DYB52yA=="], 2076 1757 ··· 2130 1811 2131 1812 "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], 2132 1813 2133 - "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], 2134 - 2135 - "vite": ["vite@7.2.4", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w=="], 1814 + "vite": ["rolldown-vite@7.2.5", "", { "dependencies": { "@oxc-project/runtime": "0.97.0", "fdir": "^6.5.0", "lightningcss": "^1.30.2", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rolldown": "1.0.0-beta.50", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "esbuild": "^0.25.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-u09tdk/huMiN8xwoiBbig197jKdCamQTtOruSalOzbqGje3jdHiV0njQlAW0YvzoahkirFePNQ4RYlfnRQpXZA=="], 2136 1815 2137 1816 "vscode-jsonrpc": ["vscode-jsonrpc@8.2.0", "", {}, "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="], 2138 1817 ··· 2143 1822 "vscode-languageserver-textdocument": ["vscode-languageserver-textdocument@1.0.12", "", {}, "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA=="], 2144 1823 2145 1824 "vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="], 1825 + 1826 + "web": ["web@workspace:apps/web"], 2146 1827 2147 1828 "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], 2148 1829 ··· 2200 1881 2201 1882 "@atproto-labs/simple-store-memory/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], 2202 1883 2203 - "@atproto/common/@atproto/common-web": ["@atproto/common-web@0.4.3", "", { "dependencies": { "graphemer": "^1.4.0", "multiformats": "^9.9.0", "uint8arrays": "3.0.0", "zod": "^3.23.8" } }, "sha512-nRDINmSe4VycJzPo6fP/hEltBcULFxt9Kw7fQk6405FyAWZiTluYHlXOnU7GkQfeUK44OENG1qFTBcmCJ7e8pg=="], 2204 - 2205 - "@atproto/common/pino": ["pino@8.21.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^1.2.0", "pino-std-serializers": "^6.0.0", "process-warning": "^3.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^3.7.0", "thread-stream": "^2.6.0" }, "bin": { "pino": "bin.js" } }, "sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q=="], 2206 - 2207 1884 "@atproto/lex-data/@atproto/syntax": ["@atproto/syntax@0.4.2", "", {}, "sha512-X9XSRPinBy/0VQ677j8VXlBsYSsUXaiqxWVpGGxJYsAhugdQRb0jqaVKJFtm6RskeNkV6y9xclSUi9UYG/COrA=="], 2208 - 2209 - "@atproto/lexicon/@atproto/common-web": ["@atproto/common-web@0.4.3", "", { "dependencies": { "graphemer": "^1.4.0", "multiformats": "^9.9.0", "uint8arrays": "3.0.0", "zod": "^3.23.8" } }, "sha512-nRDINmSe4VycJzPo6fP/hEltBcULFxt9Kw7fQk6405FyAWZiTluYHlXOnU7GkQfeUK44OENG1qFTBcmCJ7e8pg=="], 2210 1885 2211 1886 "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 2212 1887 2213 - "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], 2214 - 2215 1888 "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 2216 1889 2217 1890 "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 2218 1891 2219 1892 "@cookware/database/@libsql/client": ["@libsql/client@0.15.15", "", { "dependencies": { "@libsql/core": "^0.15.14", "@libsql/hrana-client": "^0.7.0", "js-base64": "^3.7.5", "libsql": "^0.5.22", "promise-limit": "^2.7.0" } }, "sha512-twC0hQxPNHPKfeOv3sNT6u2pturQjLcI+CnpTM0SjRpocEGgfiZ7DWKXLNnsothjyJmDqEsBQJ5ztq9Wlu470w=="], 2220 1893 2221 - "@cookware/web/@atcute/bluesky": ["@atcute/bluesky@1.0.15", "", { "peerDependencies": { "@atcute/client": "^1.0.0 || ^2.0.0" } }, "sha512-+EFiybmKQ97aBAgtaD+cKRJER5AMn3cZMkEwEg/pDdWyzxYJ9m1UgemmLdTgI8VrxPufKqdXS2nl7uO7TY6BPA=="], 2222 - 2223 - "@cookware/web/@atcute/oauth-browser-client": ["@atcute/oauth-browser-client@2.0.1", "", { "dependencies": { "@atcute/client": "^4.0.5", "@atcute/identity": "^1.1.1", "@atcute/identity-resolver": "^1.1.4", "@atcute/lexicons": "^1.2.2", "@atcute/multibase": "^1.1.6", "@atcute/uint8array": "^1.0.5", "nanoid": "^5.1.5" } }, "sha512-lG021GkeORG06zfFf4bH85egObjBEKHNgAWHvbtY/E2dX4wxo88hf370pJDx8acdnuUJLJ2VKPikJtZwo4Heeg=="], 2224 - 2225 - "@cookware/web/typescript": ["typescript@5.6.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="], 1894 + "@cookware/tsconfig/@types/bun": ["@types/bun@1.3.4", "", { "dependencies": { "bun-types": "1.3.4" } }, "sha512-EEPTKXHP+zKGPkhRLv+HI0UEX8/o+65hqARxLy8Ov5rIxMBPNTjeZww00CIihrIQGEQBYg+0roO5qOnS/7boGA=="], 2226 1895 2227 1896 "@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="], 2228 1897 ··· 2256 1925 2257 1926 "@radix-ui/react-arrow/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], 2258 1927 2259 - "@radix-ui/react-collapsible/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], 2260 - 2261 - "@radix-ui/react-collapsible/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], 2262 - 2263 1928 "@radix-ui/react-collection/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], 2264 1929 2265 1930 "@radix-ui/react-collection/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], ··· 2306 1971 2307 1972 "@tailwindcss/node/jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], 2308 1973 2309 - "@tailwindcss/node/tailwindcss": ["tailwindcss@4.1.17", "", {}, "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q=="], 2310 - 2311 1974 "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.7.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg=="], 2312 1975 2313 1976 "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.7.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA=="], ··· 2320 1983 2321 1984 "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], 2322 1985 2323 - "@tailwindcss/postcss/tailwindcss": ["tailwindcss@4.1.17", "", {}, "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q=="], 2324 - 2325 - "@tanstack/react-query-devtools/@tanstack/query-devtools": ["@tanstack/query-devtools@5.91.0", "", {}, "sha512-uNWkqWTiIKCv8Iaahb7bftmDaZVkBetB+l+OQhQeCEZAedyqxw2eyaRUc8sAQ2LzD843tVdYL6bzOtRWJHJSbQ=="], 2326 - 2327 1986 "@types/pg-pool/@types/pg": ["@types/pg@8.6.1", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^2.2.0" } }, "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w=="], 2328 1987 2329 1988 "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], 2330 1989 2331 1990 "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], 2332 1991 2333 - "@vitejs/plugin-react-swc/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="], 1992 + "@unrs/resolver-binding-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="], 2334 1993 2335 1994 "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], 2336 1995 ··· 2338 1997 2339 1998 "app/@atproto/oauth-client-node": ["@atproto/oauth-client-node@0.3.13", "", { "dependencies": { "@atproto-labs/did-resolver": "0.2.4", "@atproto-labs/handle-resolver-node": "0.1.23", "@atproto-labs/simple-store": "0.3.0", "@atproto/did": "0.2.3", "@atproto/jwk": "0.6.0", "@atproto/jwk-jose": "0.1.11", "@atproto/jwk-webcrypto": "0.2.0", "@atproto/oauth-client": "0.5.11", "@atproto/oauth-types": "0.5.2" } }, "sha512-k2qT5QM6Mj5I412IZOnktShmI1A5YbwLmLM4BkeEcbcOm7kU1Cr/H/zUC/zniCIj641ZudiXU80Bsyw4A6tejA=="], 2340 1999 2341 - "app/@tanstack/react-query": ["@tanstack/react-query@5.90.12", "", { "dependencies": { "@tanstack/query-core": "5.90.12" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-graRZspg7EoEaw0a8faiUASCyJrqjKPdqJ9EwuDRUF9mEYJ1YPczI9H+/agJ0mOJkPCJDk0lsz5QTrLZ/jQ2rg=="], 2342 - 2343 - "app/@tanstack/react-query-devtools": ["@tanstack/react-query-devtools@5.91.1", "", { "dependencies": { "@tanstack/query-devtools": "5.91.1" }, "peerDependencies": { "@tanstack/react-query": "^5.90.10", "react": "^18 || ^19" } }, "sha512-tRnJYwEbH0kAOuToy8Ew7bJw1lX3AjkkgSlf/vzb+NpnqmHPdWM+lA2DSdGQSLi1SU0PDRrrCI1vnZnci96CsQ=="], 2344 - 2345 2000 "app/@types/node": ["@types/node@20.19.25", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ=="], 2346 2001 2347 - "app/lucide-react": ["lucide-react@0.556.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-iOb8dRk7kLaYBZhR2VlV1CeJGxChBgUthpSP8wom9jfj79qovgG6qcSdiy6vkoREKPnbUYzJsCn4o4PtG3Iy+A=="], 2348 - 2349 - "app/react": ["react@19.2.0", "", {}, "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ=="], 2350 - 2351 - "app/react-dom": ["react-dom@19.2.0", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.0" } }, "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ=="], 2352 - 2353 - "app/tailwind-merge": ["tailwind-merge@3.4.0", "", {}, "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g=="], 2354 - 2355 - "app/tailwindcss": ["tailwindcss@4.1.17", "", {}, "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q=="], 2356 - 2357 2002 "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 2358 - 2359 - "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], 2360 2003 2361 2004 "eslint/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], 2362 2005 2363 - "eslint-config-next/eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@7.0.1", "", { "dependencies": { "@babel/core": "^7.24.4", "@babel/parser": "^7.24.4", "hermes-parser": "^0.25.1", "zod": "^3.25.0 || ^4.0.0", "zod-validation-error": "^3.5.0 || ^4.0.0" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA=="], 2364 - 2365 2006 "eslint-config-next/globals": ["globals@16.4.0", "", {}, "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw=="], 2366 2007 2367 2008 "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], ··· 2384 2025 2385 2026 "lightningcss/detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], 2386 2027 2028 + "lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], 2029 + 2387 2030 "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], 2388 2031 2389 2032 "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], 2390 2033 2391 2034 "p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], 2392 2035 2393 - "postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], 2394 - 2395 - "postcss-calc/postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="], 2036 + "path-scurry/lru-cache": ["lru-cache@11.2.2", "", {}, "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg=="], 2396 2037 2397 - "postcss-discard-comments/postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="], 2398 - 2399 - "postcss-merge-rules/postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="], 2400 - 2401 - "postcss-minify-selectors/postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="], 2402 - 2403 - "postcss-unique-selectors/postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="], 2038 + "postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], 2404 2039 2405 2040 "readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], 2406 2041 2407 2042 "recast/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], 2043 + 2044 + "rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.50", "", {}, "sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA=="], 2408 2045 2409 2046 "sharp/detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], 2410 2047 ··· 2416 2053 2417 2054 "string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], 2418 2055 2419 - "stylehacks/postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="], 2420 - 2421 - "svgo/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], 2422 - 2423 2056 "tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], 2424 2057 2425 - "tsx/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], 2058 + "tsx/esbuild": ["esbuild@0.27.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.1", "@esbuild/android-arm": "0.27.1", "@esbuild/android-arm64": "0.27.1", "@esbuild/android-x64": "0.27.1", "@esbuild/darwin-arm64": "0.27.1", "@esbuild/darwin-x64": "0.27.1", "@esbuild/freebsd-arm64": "0.27.1", "@esbuild/freebsd-x64": "0.27.1", "@esbuild/linux-arm": "0.27.1", "@esbuild/linux-arm64": "0.27.1", "@esbuild/linux-ia32": "0.27.1", "@esbuild/linux-loong64": "0.27.1", "@esbuild/linux-mips64el": "0.27.1", "@esbuild/linux-ppc64": "0.27.1", "@esbuild/linux-riscv64": "0.27.1", "@esbuild/linux-s390x": "0.27.1", "@esbuild/linux-x64": "0.27.1", "@esbuild/netbsd-arm64": "0.27.1", "@esbuild/netbsd-x64": "0.27.1", "@esbuild/openbsd-arm64": "0.27.1", "@esbuild/openbsd-x64": "0.27.1", "@esbuild/openharmony-arm64": "0.27.1", "@esbuild/sunos-x64": "0.27.1", "@esbuild/win32-arm64": "0.27.1", "@esbuild/win32-ia32": "0.27.1", "@esbuild/win32-x64": "0.27.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA=="], 2426 2059 2427 - "vite/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], 2060 + "web/@types/bun": ["@types/bun@1.3.4", "", { "dependencies": { "bun-types": "1.3.4" } }, "sha512-EEPTKXHP+zKGPkhRLv+HI0UEX8/o+65hqARxLy8Ov5rIxMBPNTjeZww00CIihrIQGEQBYg+0roO5qOnS/7boGA=="], 2428 2061 2429 2062 "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], 2430 2063 2431 2064 "@atcute/oauth-browser-client/@atcute/identity-resolver/@atcute/util-fetch": ["@atcute/util-fetch@1.0.4", "", { "dependencies": { "@badrap/valita": "^0.4.6" } }, "sha512-sIU9Qk0dE8PLEXSfhy+gIJV+HpiiknMytCI2SqLlqd0vgZUtEKI/EQfP+23LHWvP+CLCzVDOa6cpH045OlmNBg=="], 2432 2065 2433 - "@atproto/common/pino/pino-abstract-transport": ["pino-abstract-transport@1.2.0", "", { "dependencies": { "readable-stream": "^4.0.0", "split2": "^4.0.0" } }, "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q=="], 2434 - 2435 - "@atproto/common/pino/pino-std-serializers": ["pino-std-serializers@6.2.2", "", {}, "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA=="], 2436 - 2437 - "@atproto/common/pino/process-warning": ["process-warning@3.0.0", "", {}, "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ=="], 2438 - 2439 - "@atproto/common/pino/sonic-boom": ["sonic-boom@3.8.1", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg=="], 2440 - 2441 - "@atproto/common/pino/thread-stream": ["thread-stream@2.7.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw=="], 2442 - 2443 - "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], 2444 - 2445 2066 "@cookware/database/@libsql/client/@libsql/core": ["@libsql/core@0.15.15", "", { "dependencies": { "js-base64": "^3.7.5" } }, "sha512-C88Z6UKl+OyuKKPwz224riz02ih/zHYI3Ho/LAcVOgjsunIRZoBw7fjRfaH9oPMmSNeQfhGklSG2il1URoOIsA=="], 2446 2067 2447 2068 "@cookware/database/@libsql/client/libsql": ["libsql@0.5.22", "", { "dependencies": { "@neon-rs/load": "^0.0.4", "detect-libc": "2.0.2" }, "optionalDependencies": { "@libsql/darwin-arm64": "0.5.22", "@libsql/darwin-x64": "0.5.22", "@libsql/linux-arm-gnueabihf": "0.5.22", "@libsql/linux-arm-musleabihf": "0.5.22", "@libsql/linux-arm64-gnu": "0.5.22", "@libsql/linux-arm64-musl": "0.5.22", "@libsql/linux-x64-gnu": "0.5.22", "@libsql/linux-x64-musl": "0.5.22", "@libsql/win32-x64-msvc": "0.5.22" }, "os": [ "linux", "win32", "darwin", ], "cpu": [ "arm", "x64", "arm64", ] }, "sha512-NscWthMQt7fpU8lqd7LXMvT9pi+KhhmTHAJWUB/Lj6MWa0MKFv0F2V4C6WKKpjCVZl0VwcDz4nOI3CyaT1DDiA=="], 2448 2069 2449 - "@cookware/web/@atcute/bluesky/@atcute/client": ["@atcute/client@4.0.5", "", { "dependencies": { "@atcute/identity": "^1.1.1", "@atcute/lexicons": "^1.2.2" } }, "sha512-R8Qen8goGmEkynYGg2m6XFlVmz0GTDvQ+9w+4QqOob+XMk8/WDpF4aImev7WKEde/rV2gjcqW7zM8E6W9NShDA=="], 2450 - 2451 - "@cookware/web/@atcute/oauth-browser-client/@atcute/client": ["@atcute/client@4.0.5", "", { "dependencies": { "@atcute/identity": "^1.1.1", "@atcute/lexicons": "^1.2.2" } }, "sha512-R8Qen8goGmEkynYGg2m6XFlVmz0GTDvQ+9w+4QqOob+XMk8/WDpF4aImev7WKEde/rV2gjcqW7zM8E6W9NShDA=="], 2452 - 2453 - "@cookware/web/@atcute/oauth-browser-client/@atcute/uint8array": ["@atcute/uint8array@1.0.5", "", {}, "sha512-XLWWxoR2HNl2qU+FCr0rp1APwJXci7HnzbOQLxK55OaMNBXZ19+xNC5ii4QCsThsDxa4JS/JTzuiQLziITWf2Q=="], 2070 + "@cookware/tsconfig/@types/bun/bun-types": ["bun-types@1.3.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ=="], 2454 2071 2455 2072 "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="], 2456 2073 ··· 2510 2127 2511 2128 "@radix-ui/react-arrow/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], 2512 2129 2513 - "@radix-ui/react-collapsible/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], 2514 - 2515 2130 "@radix-ui/react-dismissable-layer/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], 2516 2131 2517 2132 "@radix-ui/react-dropdown-menu/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], ··· 2548 2163 2549 2164 "app/@atproto/oauth-client-node/@atproto/oauth-types": ["@atproto/oauth-types@0.5.2", "", { "dependencies": { "@atproto/did": "0.2.3", "@atproto/jwk": "0.6.0", "zod": "^3.23.8" } }, "sha512-9DCDvtvCanTwAaU5UakYDO0hzcOITS3RutK5zfLytE5Y9unj0REmTDdN8Xd8YCfUJl7T/9pYpf04Uyq7bFTASg=="], 2550 2165 2551 - "app/@tanstack/react-query/@tanstack/query-core": ["@tanstack/query-core@5.90.12", "", {}, "sha512-T1/8t5DhV/SisWjDnaiU2drl6ySvsHj1bHBCWNXd+/T+Hh1cf6JodyEYMd5sgwm+b/mETT4EV3H+zCVczCU5hg=="], 2552 - 2553 - "app/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], 2554 - 2555 - "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], 2556 - 2557 2166 "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], 2558 2167 2559 2168 "next/postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], 2560 2169 2561 - "tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], 2170 + "tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA=="], 2562 2171 2563 - "tsx/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], 2172 + "tsx/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.1", "", { "os": "android", "cpu": "arm" }, "sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg=="], 2564 2173 2565 - "tsx/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], 2174 + "tsx/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.1", "", { "os": "android", "cpu": "arm64" }, "sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ=="], 2566 2175 2567 - "tsx/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], 2176 + "tsx/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.1", "", { "os": "android", "cpu": "x64" }, "sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ=="], 2568 2177 2569 - "tsx/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], 2178 + "tsx/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ=="], 2570 2179 2571 - "tsx/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], 2180 + "tsx/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ=="], 2572 2181 2573 - "tsx/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], 2182 + "tsx/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg=="], 2574 2183 2575 - "tsx/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], 2184 + "tsx/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ=="], 2576 2185 2577 - "tsx/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], 2186 + "tsx/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.1", "", { "os": "linux", "cpu": "arm" }, "sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA=="], 2578 2187 2579 - "tsx/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], 2188 + "tsx/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q=="], 2580 2189 2581 - "tsx/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], 2190 + "tsx/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw=="], 2582 2191 2583 - "tsx/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], 2192 + "tsx/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.1", "", { "os": "linux", "cpu": "none" }, "sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg=="], 2584 2193 2585 - "tsx/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], 2194 + "tsx/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.1", "", { "os": "linux", "cpu": "none" }, "sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA=="], 2586 2195 2587 - "tsx/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], 2196 + "tsx/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ=="], 2588 2197 2589 - "tsx/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], 2198 + "tsx/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.1", "", { "os": "linux", "cpu": "none" }, "sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ=="], 2590 2199 2591 - "tsx/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], 2200 + "tsx/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw=="], 2592 2201 2593 - "tsx/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], 2202 + "tsx/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.1", "", { "os": "linux", "cpu": "x64" }, "sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA=="], 2594 2203 2595 - "tsx/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], 2204 + "tsx/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.1", "", { "os": "none", "cpu": "x64" }, "sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg=="], 2596 2205 2597 - "tsx/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], 2206 + "tsx/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg=="], 2598 2207 2599 - "tsx/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], 2208 + "tsx/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA=="], 2600 2209 2601 - "tsx/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], 2602 - 2603 - "tsx/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], 2604 - 2605 - "tsx/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], 2606 - 2607 - "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], 2608 - 2609 - "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], 2610 - 2611 - "vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], 2210 + "tsx/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg=="], 2612 2211 2613 - "vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], 2614 - 2615 - "vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], 2212 + "tsx/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ=="], 2616 2213 2617 - "vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], 2214 + "tsx/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.1", "", { "os": "win32", "cpu": "x64" }, "sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw=="], 2618 2215 2619 - "vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], 2620 - 2621 - "vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], 2622 - 2623 - "vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], 2624 - 2625 - "vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], 2626 - 2627 - "vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], 2628 - 2629 - "vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], 2630 - 2631 - "vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], 2632 - 2633 - "vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], 2634 - 2635 - "vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], 2636 - 2637 - "vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], 2638 - 2639 - "vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], 2640 - 2641 - "vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], 2642 - 2643 - "vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], 2644 - 2645 - "vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], 2646 - 2647 - "vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], 2648 - 2649 - "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], 2650 - 2651 - "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], 2216 + "web/@types/bun/bun-types": ["bun-types@1.3.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ=="], 2652 2217 2653 2218 "@cookware/database/@libsql/client/libsql/@libsql/darwin-arm64": ["@libsql/darwin-arm64@0.5.22", "", { "os": "darwin", "cpu": "arm64" }, "sha512-4B8ZlX3nIDPndfct7GNe0nI3Yw6ibocEicWdC4fvQbSs/jdq/RC2oCsoJxJ4NzXkvktX70C1J4FcmmoBy069UA=="], 2654 2219 ··· 2663 2228 "@cookware/database/@libsql/client/libsql/@libsql/linux-x64-musl": ["@libsql/linux-x64-musl@0.5.22", "", { "os": "linux", "cpu": "x64" }, "sha512-UZ4Xdxm4pu3pQXjvfJiyCzZop/9j/eA2JjmhMaAhe3EVLH2g11Fy4fwyUp9sT1QJYR1kpc2JLuybPM0kuXv/Tg=="], 2664 2229 2665 2230 "@cookware/database/@libsql/client/libsql/@libsql/win32-x64-msvc": ["@libsql/win32-x64-msvc@0.5.22", "", { "os": "win32", "cpu": "x64" }, "sha512-Fj0j8RnBpo43tVZUVoNK6BV/9AtDUM5S7DF3LB4qTYg1LMSZqi3yeCneUTLJD6XomQJlZzbI4mst89yspVSAnA=="], 2231 + 2232 + "@cookware/tsconfig/@types/bun/bun-types/@types/node": ["@types/node@24.10.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-WOhQTZ4G8xZ1tjJTvKOpyEVSGgOTvJAfDK3FNFgELyaTpzhdgHVHeqW8V+UJvzF5BT+/B54T/1S2K6gd9c7bbA=="], 2666 2233 2667 2234 "@inquirer/core/wrap-ansi/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], 2668 2235 ··· 2682 2249 2683 2250 "app/@atproto/oauth-client-node/@atproto/oauth-client/@atproto/xrpc": ["@atproto/xrpc@0.7.7", "", { "dependencies": { "@atproto/lexicon": "^0.6.0", "zod": "^3.23.8" } }, "sha512-K1ZyO/BU8JNtXX5dmPp7b5UrkLMMqpsIa/Lrj5D3Su+j1Xwq1m6QJ2XJ1AgjEjkI1v4Muzm7klianLE6XGxtmA=="], 2684 2251 2252 + "web/@types/bun/bun-types/@types/node": ["@types/node@24.10.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-WOhQTZ4G8xZ1tjJTvKOpyEVSGgOTvJAfDK3FNFgELyaTpzhdgHVHeqW8V+UJvzF5BT+/B54T/1S2K6gd9c7bbA=="], 2253 + 2254 + "@cookware/tsconfig/@types/bun/bun-types/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], 2255 + 2685 2256 "app/@atproto/oauth-client-node/@atproto-labs/did-resolver/@atproto-labs/simple-store-memory/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], 2686 2257 2687 2258 "app/@atproto/oauth-client-node/@atproto-labs/handle-resolver-node/@atproto-labs/handle-resolver/@atproto-labs/simple-store-memory": ["@atproto-labs/simple-store-memory@0.1.4", "", { "dependencies": { "@atproto-labs/simple-store": "0.3.0", "lru-cache": "^10.2.0" } }, "sha512-3mKY4dP8I7yKPFj9VKpYyCRzGJOi5CEpOLPlRhoJyLmgs3J4RzDrjn323Oakjz2Aj2JzRU/AIvWRAZVhpYNJHw=="], ··· 2689 2260 "app/@atproto/oauth-client-node/@atproto/oauth-client/@atproto-labs/simple-store-memory/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], 2690 2261 2691 2262 "app/@atproto/oauth-client-node/@atproto/oauth-client/@atproto/xrpc/@atproto/lexicon": ["@atproto/lexicon@0.6.0", "", { "dependencies": { "@atproto/common-web": "^0.4.7", "@atproto/syntax": "^0.4.2", "iso-datestring-validator": "^2.2.2", "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-5veb8aD+J5M0qszLJ+73KSFsFrJBgAY/nM1TSAJvGY7fNc9ZAT+PSUlmIyrdye9YznAZ07yktalls/TwNV7cHQ=="], 2263 + 2264 + "web/@types/bun/bun-types/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], 2692 2265 2693 2266 "app/@atproto/oauth-client-node/@atproto-labs/handle-resolver-node/@atproto-labs/handle-resolver/@atproto-labs/simple-store-memory/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], 2694 2267
+2 -2
libs/database/lib/schema.ts
··· 1 1 import { customType, index, integer, primaryKey, pgTable, text, jsonb, varchar } from "drizzle-orm/pg-core"; 2 2 import { BlueRecipesFeedRecipe } from "@cookware/lexicons"; 3 - import { Cid, isCid, ResourceUri, type AtprotoDid } from "@atcute/lexicons/syntax"; 4 - import { Blob, LegacyBlob } from "@atcute/lexicons"; 3 + import { type Cid, isCid, type ResourceUri, type AtprotoDid } from "@atcute/lexicons/syntax"; 4 + import type { Blob, LegacyBlob } from "@atcute/lexicons"; 5 5 import { relations, sql, type SQL } from "drizzle-orm"; 6 6 import { isBlob, isCidLink, isLegacyBlob } from "@atcute/lexicons/interfaces"; 7 7
+2 -1
libs/lexicons/tsconfig.json
··· 2 2 "extends": "@cookware/tsconfig/base.json", 3 3 "include": ["lib", "scripts"], 4 4 "compilerOptions": { 5 - "noEmit": true 5 + "noEmit": true, 6 + "types": ["bun"] 6 7 } 7 8 }
+13 -5
libs/tsconfig/base.json
··· 1 + /* vim:ft=jsonc */ 1 2 { 2 3 "$schema": "https://json.schemastore.org/tsconfig", 3 4 "display": "Default", ··· 8 9 "incremental": false, 9 10 "isolatedModules": true, 10 11 "lib": ["es2022", "DOM", "DOM.Iterable"], 11 - "module": "NodeNext", 12 - "moduleDetection": "force", 13 - "moduleResolution": "NodeNext", 14 - "noUncheckedIndexedAccess": true, 12 + "module": "nodenext", 13 + "moduleResolution": "nodenext", 14 + "verbatimModuleSyntax": true, 15 15 "resolveJsonModule": true, 16 16 "skipLibCheck": true, 17 17 "strict": true, 18 - "target": "ES2022" 18 + "target": "ES2022", 19 + 20 + /* Rules */ 21 + "noUncheckedIndexedAccess": true, 22 + "noUnusedLocals": true, 23 + "noUnusedParameters": true, 24 + "erasableSyntaxOnly": true, 25 + "noFallthroughCasesInSwitch": true, 26 + "noUncheckedSideEffectImports": true 19 27 } 20 28 }
+3 -3
libs/tsconfig/react.json
··· 1 + /* vim:ft=jsonc */ 1 2 { 2 3 "$schema": "https://json.schemastore.org/tsconfig", 3 - "display": "Next.js", 4 4 "extends": "./base.json", 5 5 "compilerOptions": { 6 6 "module": "ESNext", 7 7 "moduleResolution": "Bundler", 8 8 "allowJs": true, 9 - "jsx": "preserve", 10 - "noEmit": true 9 + "jsx": "react-jsx", 10 + "noEmit": true, 11 11 } 12 12 }
+4 -1
package.json
··· 3 3 "private": true, 4 4 "packageManager": "bun@1.3.3", 5 5 "devDependencies": { 6 + "@tanstack/react-router-devtools": "^1.140.0", 7 + "@tanstack/router-plugin": "^1.140.0", 6 8 "turbo": "^2.3.3", 7 9 "typescript": "^5.9.3" 8 10 }, ··· 26 28 } 27 29 }, 28 30 "dependencies": { 29 - "@atcute/oauth-browser-client": "^2.0.2" 31 + "@atcute/oauth-browser-client": "^2.0.2", 32 + "@tanstack/react-router": "^1.140.0" 30 33 } 31 34 }