From dc7d80f80242786cb652a8751a655317462ba882 Mon Sep 17 00:00:00 2001 From: Zach <86675944+zwgnr@users.noreply.github.com> Date: Sun, 5 Oct 2025 22:01:41 -0400 Subject: [PATCH 1/4] init shadcn --- .changeset/README.md | 8 - .changeset/config.json | 11 - .github/workflows/release.yml | 41 - .github/workflows/sync-components.yml | 8 +- package.json | 13 +- packages/components/package.json | 8 +- packages/components/registry.json | 2422 +++++++++++++++++ .../components/scripts/gen-registry-json.ts | 185 ++ packages/components/scripts/gen-registry.ts | 277 -- .../src/core/date-picker/date-picker.tsx | 2 +- packages/components/src/core/table/table.tsx | 4 +- packages/components/src/index.ts | 12 - packages/components/src/registry.ts | 460 ---- packages/components/tsconfig.json | 6 +- packages/mcp/CHANGELOG.md | 24 - packages/mcp/README.md | 3 - packages/mcp/package.json | 47 - packages/mcp/src/index.ts | 241 -- .../mcp/src/tools/get-component-template.ts | 29 - packages/mcp/src/tools/get-registry.ts | 47 - packages/mcp/src/tools/init-baselayer.ts | 112 - packages/mcp/tsconfig.json | 19 - packages/mcp/tsup.config.ts | 17 - packages/registry/src/schema.ts | 100 +- pnpm-lock.yaml | 2422 ++++++++++------- web/app/.well-known/baselayer/route.ts | 110 - web/app/api/examples/[name]/route.ts | 27 + web/app/docs/content/intro.mdx | 26 +- web/app/docs/content/mcp.mdx | 35 - web/app/docs/content/styles.mdx | 9 +- web/app/docs/content/usage.mdx | 96 +- web/app/llms.txt/route.ts | 169 +- web/app/page.tsx | 17 +- web/app/r/[...segments]/route.ts | 45 + web/components.json | 25 + web/components/component-metadata.tsx | 46 +- web/components/css-content-display.tsx | 10 - web/components/sidebar.tsx | 3 +- web/lib/component-data.ts | 38 +- web/lib/navigation.ts | 2 +- web/next.config.ts | 26 +- web/public/build-info.json | 5 - web/public/r/accordion.json | 96 + web/public/r/badge.json | 93 + web/public/r/breadcrumbs.json | 93 + web/public/r/button.json | 94 + web/public/r/calendar.json | 95 + web/public/r/card.json | 95 + web/public/r/checkbox.json | 94 + web/public/r/combobox.json | 95 + web/public/r/command.json | 96 + web/public/r/date-field.json | 95 + web/public/r/date-picker.json | 98 + web/public/r/index.json | 1044 +++++++ web/public/r/input.json | 94 + web/public/r/menu.json | 94 + web/public/r/meter.json | 94 + web/public/r/modal.json | 93 + web/public/r/popover.json | 94 + web/public/r/radio-group.json | 95 + web/public/r/registry.json | 2422 +++++++++++++++++ web/public/r/select.json | 95 + web/public/r/slider.json | 95 + web/public/r/switch.json | 95 + web/public/r/table.json | 98 + web/public/r/tabs.json | 95 + web/public/r/tag-group.json | 96 + web/public/r/time-field.json | 95 + web/public/r/toggle.json | 95 + web/public/r/tooltip.json | 95 + web/public/registry.json | 385 --- web/public/tailwind.css | 93 - web/public/templates/accordion.txt | 87 - web/public/templates/badge.txt | 26 - web/public/templates/breadcrumbs.txt | 53 - web/public/templates/button.txt | 58 - web/public/templates/calendar.txt | 133 - web/public/templates/card.txt | 85 - web/public/templates/checkbox.txt | 97 - web/public/templates/combobox.txt | 95 - web/public/templates/command.txt | 191 -- web/public/templates/date-field.txt | 53 - web/public/templates/date-picker.txt | 157 -- web/public/templates/date-range-picker.txt | 91 - web/public/templates/input.txt | 49 - web/public/templates/menu.txt | 80 - web/public/templates/meter.txt | 39 - web/public/templates/modal.txt | 47 - web/public/templates/popover.txt | 30 - web/public/templates/radio-group.txt | 64 - web/public/templates/select.txt | 155 -- web/public/templates/slider.txt | 60 - web/public/templates/switch.txt | 36 - web/public/templates/table.txt | 121 - web/public/templates/tabs.txt | 72 - web/public/templates/tag-group.txt | 82 - web/public/templates/time-field.txt | 57 - web/public/templates/toggle.txt | 43 - web/public/templates/tooltip.txt | 29 - web/tsconfig.json | 3 +- 100 files changed, 10458 insertions(+), 5253 deletions(-) delete mode 100644 .changeset/README.md delete mode 100644 .changeset/config.json delete mode 100644 .github/workflows/release.yml create mode 100644 packages/components/registry.json create mode 100644 packages/components/scripts/gen-registry-json.ts delete mode 100644 packages/components/scripts/gen-registry.ts delete mode 100644 packages/components/src/registry.ts delete mode 100644 packages/mcp/CHANGELOG.md delete mode 100644 packages/mcp/README.md delete mode 100644 packages/mcp/package.json delete mode 100644 packages/mcp/src/index.ts delete mode 100644 packages/mcp/src/tools/get-component-template.ts delete mode 100644 packages/mcp/src/tools/get-registry.ts delete mode 100644 packages/mcp/src/tools/init-baselayer.ts delete mode 100644 packages/mcp/tsconfig.json delete mode 100644 packages/mcp/tsup.config.ts delete mode 100644 web/app/.well-known/baselayer/route.ts create mode 100644 web/app/api/examples/[name]/route.ts delete mode 100644 web/app/docs/content/mcp.mdx create mode 100644 web/app/r/[...segments]/route.ts create mode 100644 web/components.json delete mode 100644 web/components/css-content-display.tsx delete mode 100644 web/public/build-info.json create mode 100644 web/public/r/accordion.json create mode 100644 web/public/r/badge.json create mode 100644 web/public/r/breadcrumbs.json create mode 100644 web/public/r/button.json create mode 100644 web/public/r/calendar.json create mode 100644 web/public/r/card.json create mode 100644 web/public/r/checkbox.json create mode 100644 web/public/r/combobox.json create mode 100644 web/public/r/command.json create mode 100644 web/public/r/date-field.json create mode 100644 web/public/r/date-picker.json create mode 100644 web/public/r/index.json create mode 100644 web/public/r/input.json create mode 100644 web/public/r/menu.json create mode 100644 web/public/r/meter.json create mode 100644 web/public/r/modal.json create mode 100644 web/public/r/popover.json create mode 100644 web/public/r/radio-group.json create mode 100644 web/public/r/registry.json create mode 100644 web/public/r/select.json create mode 100644 web/public/r/slider.json create mode 100644 web/public/r/switch.json create mode 100644 web/public/r/table.json create mode 100644 web/public/r/tabs.json create mode 100644 web/public/r/tag-group.json create mode 100644 web/public/r/time-field.json create mode 100644 web/public/r/toggle.json create mode 100644 web/public/r/tooltip.json delete mode 100644 web/public/registry.json delete mode 100644 web/public/tailwind.css delete mode 100644 web/public/templates/accordion.txt delete mode 100644 web/public/templates/badge.txt delete mode 100644 web/public/templates/breadcrumbs.txt delete mode 100644 web/public/templates/button.txt delete mode 100644 web/public/templates/calendar.txt delete mode 100644 web/public/templates/card.txt delete mode 100644 web/public/templates/checkbox.txt delete mode 100644 web/public/templates/combobox.txt delete mode 100644 web/public/templates/command.txt delete mode 100644 web/public/templates/date-field.txt delete mode 100644 web/public/templates/date-picker.txt delete mode 100644 web/public/templates/date-range-picker.txt delete mode 100644 web/public/templates/input.txt delete mode 100644 web/public/templates/menu.txt delete mode 100644 web/public/templates/meter.txt delete mode 100644 web/public/templates/modal.txt delete mode 100644 web/public/templates/popover.txt delete mode 100644 web/public/templates/radio-group.txt delete mode 100644 web/public/templates/select.txt delete mode 100644 web/public/templates/slider.txt delete mode 100644 web/public/templates/switch.txt delete mode 100644 web/public/templates/table.txt delete mode 100644 web/public/templates/tabs.txt delete mode 100644 web/public/templates/tag-group.txt delete mode 100644 web/public/templates/time-field.txt delete mode 100644 web/public/templates/toggle.txt delete mode 100644 web/public/templates/tooltip.txt diff --git a/.changeset/README.md b/.changeset/README.md deleted file mode 100644 index e5b6d8d6..00000000 --- a/.changeset/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Changesets - -Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works -with multi-package repos, or single-package repos to help you version and publish your code. You can -find the full documentation for it [in our repository](https://github.com/changesets/changesets) - -We have a quick list of common questions to get you started engaging with this project in -[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/config.json b/.changeset/config.json deleted file mode 100644 index 2be13d43..00000000 --- a/.changeset/config.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json", - "changelog": "@changesets/cli/changelog", - "commit": false, - "fixed": [], - "linked": [], - "access": "public", - "baseBranch": "main", - "updateInternalDependencies": "patch", - "ignore": [] -} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 3b046807..00000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: Release - -on: - push: - branches: - - main - -concurrency: ${{ github.workflow }}-${{ github.ref }} - -jobs: - release: - name: Release - runs-on: ubuntu-latest - permissions: - contents: write - pull-requests: write - steps: - - name: Checkout Repo - uses: actions/checkout@v3 - - - name: Setup Node.js 20.x - uses: actions/setup-node@v3 - with: - node-version: 20.x - - - name: Install pnpm - uses: pnpm/action-setup@v4 - with: - version: 10.12.1 - - - name: Install Dependencies - run: pnpm install - - - name: Create Release Pull Request or Publish to npm - id: changesets - uses: changesets/action@v1 - with: - publish: pnpm release - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/sync-components.yml b/.github/workflows/sync-components.yml index c3734eab..542c46a5 100644 --- a/.github/workflows/sync-components.yml +++ b/.github/workflows/sync-components.yml @@ -42,8 +42,8 @@ jobs: - name: Check for registry drift run: | - # Check only registry.json and templates, exclude build-info.json (which changes every build) - if git diff --quiet web/public/registry.json web/public/templates/ web/public/tailwind.css; then + # Check registry.json and generated shadcn registry files + if git diff --quiet packages/components/registry.json web/public/r/; then echo "✅ Registry is in sync" else echo "❌ Registry out of sync! Generated files differ from committed files." @@ -52,10 +52,10 @@ jobs: echo " pnpm --filter @baselayer/components build" echo "" echo "Changed files:" - git diff --name-only web/public/registry.json web/public/templates/ web/public/tailwind.css + git diff --name-only packages/components/registry.json web/public/r/ echo "" echo "Diff:" - git diff web/public/registry.json web/public/templates/ web/public/tailwind.css + git diff packages/components/registry.json web/public/r/ exit 1 fi diff --git a/package.json b/package.json index a9804914..16e9117c 100644 --- a/package.json +++ b/package.json @@ -1,23 +1,18 @@ { "name": "baselayer", "private": true, - "version": "1.9.0", + "version": "2.0.0", "description": "Beautiful, accessible, and AI optimized React components for the web.", "scripts": { "build": "turbo build", "dev": "turbo dev", "lint": "turbo lint", "clean": "turbo clean", - "type-check": "turbo type-check", - "changeset": "changeset", - "changeset:version": "changeset version", - "changeset:publish": "changeset publish", - "changeset:status": "changeset status", - "release": "pnpm build && pnpm --filter @baselayer-dev/mcp build && pnpm changeset:publish" + "type-check": "turbo type-check" }, "devDependencies": { - "@biomejs/biome": "2.0.6", - "@changesets/cli": "^2.29.5", + "@biomejs/biome": "2.2.5", + "shadcn": "3.4.0", "turbo": "^2.5.4" }, "packageManager": "pnpm@10.12.1", diff --git a/packages/components/package.json b/packages/components/package.json index 5f75bcde..3bd823c3 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -6,13 +6,13 @@ "main": "./src/index.ts", "types": "./src/index.ts", "files": [ - "src", - "templates" + "src" ], "scripts": { - "build": "tsc && tsx scripts/gen-registry.ts", + "build": "tsc && pnpm generate:registry && pnpm registry:build", "dev": "tsc --watch", - "generate:registry": "tsx scripts/gen-registry.ts" + "generate:registry": "tsx scripts/gen-registry-json.ts", + "registry:build": "shadcn build --cwd . --output ../../web/public/r" }, "dependencies": { "@baselayer/registry": "workspace:*", diff --git a/packages/components/registry.json b/packages/components/registry.json new file mode 100644 index 00000000..5a78a295 --- /dev/null +++ b/packages/components/registry.json @@ -0,0 +1,2422 @@ +{ + "name": "@baselayer", + "$schema": "https://ui.shadcn.com/schema/registry.json", + "homepage": "https://baselayer.dev", + "items": [ + { + "name": "accordion", + "type": "registry:ui", + "title": "accordion", + "description": "An accordion allows users to toggle the display of sections of content. Each accordion consists of a header with a title and content area.", + "author": "BaseLayer", + "categories": [ + "layout" + ], + "files": [ + { + "path": "src/core/accordion/accordion.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "disclosure", + "collapsible", + "expandable", + "content" + ] + } + }, + { + "name": "badge", + "type": "registry:ui", + "title": "badge", + "description": "A badge is a small label that can be used to display information or status.", + "author": "BaseLayer", + "categories": [ + "display" + ], + "files": [ + { + "path": "src/core/badge/badge.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "status" + ] + } + }, + { + "name": "breadcrumbs", + "type": "registry:ui", + "title": "breadcrumbs", + "description": "Breadcrumbs display a heirarchy of links to the current page or resource in an application.", + "author": "BaseLayer", + "categories": [ + "navigation" + ], + "files": [ + { + "path": "src/core/breadcrumbs/breadcrumbs.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "navigation" + ] + } + }, + { + "name": "button", + "type": "registry:ui", + "title": "button", + "description": "A button allows a user to perform an action, with mouse, touch, and keyboard interactions.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/button/button.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive" + ] + } + }, + { + "name": "calendar", + "type": "registry:ui", + "title": "calendar", + "description": "A calendar displays one or more date grids and allows users to select either a single date or a contiguous range of dates.", + "author": "BaseLayer", + "categories": [ + "data-entry" + ], + "files": [ + { + "path": "src/core/calendar/calendar.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "date-time" + ] + } + }, + { + "name": "card", + "type": "registry:ui", + "title": "card", + "description": "Displays a card with header, content, and footer.", + "author": "BaseLayer", + "categories": [ + "layout" + ], + "files": [ + { + "path": "src/core/card/card.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "layout", + "container", + "display" + ] + } + }, + { + "name": "checkbox", + "type": "registry:ui", + "title": "checkbox", + "description": "A checkbox allows a user to select multiple items from a list of individual items, or to mark one individual item as selected.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/checkbox/checkbox.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive" + ] + } + }, + { + "name": "combobox", + "type": "registry:ui", + "title": "combobox", + "description": "A combo box combines a text input with a listbox, allowing users to filter a list of options to items matching a query.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/combobox/combobox.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "picker" + ] + } + }, + { + "name": "command", + "type": "registry:ui", + "title": "command", + "description": "A command palette that allows users to quickly search and execute commands using keyboard shortcuts.", + "author": "BaseLayer", + "categories": [ + "navigation" + ], + "files": [ + { + "path": "src/core/command/command.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "beta", + "tags": [ + "search", + "navigation", + "keyboard", + "palette" + ] + } + }, + { + "name": "date-field", + "type": "registry:ui", + "title": "date-field", + "description": "A date field allows users to enter and edit date and time values using a keyboard. Each part of a date value is displayed in an individually editable segment.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/date-field/date-field.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "date" + ] + } + }, + { + "name": "date-picker", + "type": "registry:ui", + "title": "date-picker", + "description": "A date picker combines one or more DateFields with a calendar popover, allowing users to enter or select a single date/time or a range.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/date-picker/date-picker.tsx", + "type": "registry:component" + } + ], + "registryDependencies": [ + "calendar" + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "date-time" + ] + } + }, + { + "name": "input", + "type": "registry:ui", + "title": "input", + "description": "Allows a user to enter a plain text value with a keyboard.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/input/input.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive" + ] + } + }, + { + "name": "menu", + "type": "registry:ui", + "title": "menu", + "description": "A menu displays a list of actions or options that a user can choose.", + "author": "BaseLayer", + "categories": [ + "pickers" + ], + "files": [ + { + "path": "src/core/menu/menu.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "interactive", + "navigation" + ] + } + }, + { + "name": "meter", + "type": "registry:ui", + "title": "meter", + "description": "A meter represents a quantity within a known range, or a fractional value.", + "author": "BaseLayer", + "categories": [ + "data-display" + ], + "files": [ + { + "path": "src/core/meter/meter.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "data-display", + "progress" + ] + } + }, + { + "name": "modal", + "type": "registry:ui", + "title": "modal", + "description": "A modal is an overlay element which blocks interaction with elements outside it.", + "author": "BaseLayer", + "categories": [ + "overlays" + ], + "files": [ + { + "path": "src/core/modal/modal.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "overlay" + ] + } + }, + { + "name": "popover", + "type": "registry:ui", + "title": "popover", + "description": "A popover is an overlay element positioned relative to a trigger.", + "author": "BaseLayer", + "categories": [ + "overlays" + ], + "files": [ + { + "path": "src/core/popover/popover.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "overlay", + "interactive" + ] + } + }, + { + "name": "radio-group", + "type": "registry:ui", + "title": "radio-group", + "description": "A radio group allows a user to select a single option from a list of mutually exclusive options.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/radio-group/radio-group.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "selection" + ] + } + }, + { + "name": "select", + "type": "registry:ui", + "title": "select", + "description": "A select displays a collapsible list of options and allows a user to select one of them.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/select/select.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "picker" + ] + } + }, + { + "name": "slider", + "type": "registry:ui", + "title": "slider", + "description": "A slider allows a user to select one or more values within a range.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/slider/slider.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "range" + ] + } + }, + { + "name": "switch", + "type": "registry:ui", + "title": "switch", + "description": "A switch allows a user to turn a setting on or off.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/switch/switch.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "toggle" + ] + } + }, + { + "name": "table", + "type": "registry:ui", + "title": "table", + "description": "A table displays data in rows and columns and enables a user to navigate its contents via directional navigation keys, and optionally supports row selection and sorting.", + "author": "BaseLayer", + "categories": [ + "data-display" + ], + "files": [ + { + "path": "src/core/table/table.tsx", + "type": "registry:component" + } + ], + "registryDependencies": [ + "button", + "checkbox" + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "data-display", + "interactive" + ] + } + }, + { + "name": "tabs", + "type": "registry:ui", + "title": "tabs", + "description": "Tabs organize content into multiple sections and allow users to navigate between them.", + "author": "BaseLayer", + "categories": [ + "navigation" + ], + "files": [ + { + "path": "src/core/tabs/tabs.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "navigation", + "interactive", + "layout" + ] + } + }, + { + "name": "tag-group", + "type": "registry:ui", + "title": "tag-group", + "description": "A tag group is a focusable list of labels, categories, keywords, filters, or other items, with support for keyboard navigation, selection, and removal.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/tag-group/tag-group.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "selection", + "filtering" + ] + } + }, + { + "name": "time-field", + "type": "registry:ui", + "title": "time-field", + "description": "A time field allows users to enter and edit time values using a keyboard. Each part of a time value is displayed in an individually editable segment.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/time-field/time-field.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "time" + ] + } + }, + { + "name": "toggle", + "type": "registry:ui", + "title": "toggle", + "description": "A toggle button allows a user to toggle a selection on or off, for example switching between two states or modes.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/toggle/toggle.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "toggle" + ] + } + }, + { + "name": "tooltip", + "type": "registry:ui", + "title": "tooltip", + "description": "A tooltip displays a description of an element on hover or focus.", + "author": "BaseLayer", + "categories": [ + "overlays" + ], + "files": [ + { + "path": "src/core/tooltip/tooltip.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "overlay", + "interactive", + "help" + ] + } + } + ] +} \ No newline at end of file diff --git a/packages/components/scripts/gen-registry-json.ts b/packages/components/scripts/gen-registry-json.ts new file mode 100644 index 00000000..f730b734 --- /dev/null +++ b/packages/components/scripts/gen-registry-json.ts @@ -0,0 +1,185 @@ +/** biome-ignore-all lint/suspicious/noAssignInExpressions: skip */ +import type { Registry, RegistryItem } from "@baselayer/registry"; +import glob from "fast-glob"; + +import { existsSync, readFileSync, writeFileSync } from "node:fs"; + +const COMPONENTS_DIR = "src/core"; +const OUTPUT_FILE = "registry.json"; + +async function generateRegistryJson() { + console.log("Discovering components..."); + + // Find all component directories with meta.json files + const metaFiles = await glob(`${COMPONENTS_DIR}/*/meta.json`); + + console.log(`Found ${metaFiles.length} components`); + + const registryItems: RegistryItem[] = []; + + for (const metaFilePath of metaFiles) { + try { + const component = await processComponent(metaFilePath); + if (component) { + registryItems.push(component); + console.log(`Processed ${component.name}`); + } + } catch (error) { + console.error(`Failed to process ${metaFilePath}:`, error); + } + } + + // Sort components by name for consistent output + registryItems.sort((a, b) => a.name.localeCompare(b.name)); + + const registry: Registry = { + name: "@baselayer", + $schema: "https://ui.shadcn.com/schema/registry.json", + homepage: "https://baselayer.dev", + items: registryItems, + }; + + const jsonContent = JSON.stringify(registry, null, 2); + writeFileSync(OUTPUT_FILE, jsonContent); + console.log( + `Generated registry.json with ${registryItems.length} components`, + ); + console.log(`\nNext step: Run 'pnpm registry:build' to generate final files`); +} + +async function processComponent( + metaFilePath: string, +): Promise { + // Extract component id from path (e.g., src/core/button/meta.json -> button) + const componentId = metaFilePath.split("/").slice(-2, -1)[0]; + + // Read component metadata + const metaContent = readFileSync(metaFilePath, "utf8"); + const meta = JSON.parse(metaContent); + + // Read component source file + const sourceFile = `${COMPONENTS_DIR}/${componentId}/${componentId}.tsx`; + if (!existsSync(sourceFile)) { + console.warn(`Source file not found: ${sourceFile}`); + return null; + } + + const sourceContent = readFileSync(sourceFile, "utf8"); + + // Detect registry dependencies (imports from other components in registry) + const registryDependencies: string[] = []; + // Match both relative imports and alias imports + const relativeImportRegex = /from\s+["']\.\.\/([^/"']+)\/\1["']/g; + const aliasImportRegex = /from\s+["']@\/components\/ui\/([^/"']+)\/\1["']/g; + + let match: RegExpExecArray | null; + + // Check relative imports + while ((match = relativeImportRegex.exec(sourceContent)) !== null) { + const depComponentId = match[1]; + if (depComponentId !== componentId) { + registryDependencies.push(depComponentId); + } + } + + // Check alias imports + while ((match = aliasImportRegex.exec(sourceContent)) !== null) { + const depComponentId = match[1]; + if (depComponentId !== componentId) { + registryDependencies.push(depComponentId); + } + } + + return { + name: componentId, + type: "registry:ui", + title: meta.name, + description: meta.description, + author: "BaseLayer", + categories: [meta.category], + files: [ + { + path: `src/core/${componentId}/${componentId}.tsx`, + type: "registry:component", + }, + ], + // Add registry dependencies (other components this depends on in registry) + ...(registryDependencies.length > 0 && { registryDependencies }), + // Add dependencies + dependencies: [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css", + ], + tailwind: { + config: { + content: ["./components/**/*.{ts,tsx}"], + theme: { + extend: {}, + }, + }, + }, + // CSS variables + cssVars: { + theme: { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)", + }, + light: { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff", + }, + dark: { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)", + }, + }, + // CSS imports and custom CSS + css: { + "@import \"tw-animate-css\"": {}, + }, + meta: { + status: meta.status, + tags: meta.tags, + }, + }; +} + +generateRegistryJson().catch(console.error); diff --git a/packages/components/scripts/gen-registry.ts b/packages/components/scripts/gen-registry.ts deleted file mode 100644 index 294706eb..00000000 --- a/packages/components/scripts/gen-registry.ts +++ /dev/null @@ -1,277 +0,0 @@ -import type { - ComponentMeta, - ComponentRegistry, - ComponentRegistryEntry, -} from "@baselayer/registry"; -import glob from "fast-glob"; - -import { copyFileSync, existsSync, readFileSync, writeFileSync } from "node:fs"; -import { join } from "node:path"; - -const COMPONENTS_DIR = "src/core"; -const TEMPLATES_DIR = "../../web/public/templates"; -const OUTPUT_REGISTRY_TS = "src/registry.ts"; -const OUTPUT_REGISTRY_JSON = "../../web/public/registry.json"; -const OUTPUT_BUILD_INFO = "../../web/public/build-info.json"; -const TAILWIND_SOURCE = "src/tailwind.css"; -const TAILWIND_OUTPUT = "../../web/public/tailwind.css"; - -interface ComponentWithTemplate extends ComponentRegistryEntry { - templateContent: string; -} - -async function copySourceToTemplates(metaFiles: string[]): Promise { - console.log("📋 Copying source components to templates..."); - - for (const metaFilePath of metaFiles) { - const componentId = metaFilePath.split("/").slice(-2, -1)[0]; - const sourceFile = `${COMPONENTS_DIR}/${componentId}/${componentId}.tsx`; - const templateFile = join(TEMPLATES_DIR, `${componentId}.txt`); - - try { - if (existsSync(sourceFile)) { - copyFileSync(sourceFile, templateFile); - console.log(`✅ Copied ${componentId}.tsx → templates/${componentId}.txt`); - } else { - console.warn(`⚠️ Source file not found: ${sourceFile}`); - } - } catch (error) { - console.error(`❌ Failed to copy ${componentId}:`, error); - } - } -} - -async function generateRegistry(): Promise { - console.log("🔍 Discovering components..."); - - // Find all component directories with meta.json files - const metaFiles = await glob(`${COMPONENTS_DIR}/*/meta.json`); - - console.log(`📦 Found ${metaFiles.length} components`); - - // First, copy source components to templates - await copySourceToTemplates(metaFiles); - - const components: ComponentWithTemplate[] = []; - - for (const metaFilePath of metaFiles) { - try { - const component = await processComponent(metaFilePath); - if (component) { - components.push(component); - console.log(`✅ Processed ${component.id}`); - } - } catch (error) { - console.error(`❌ Failed to process ${metaFilePath}:`, error); - } - } - - // Sort components by id for consistent output - components.sort((a, b) => a.id.localeCompare(b.id)); - - // Get package version - const packageJson = JSON.parse(readFileSync("package.json", "utf8")); - const version = packageJson.version; - - // Read tailwind.css content - const tailwindContent = readFileSync(TAILWIND_SOURCE, "utf8"); - - const registry: ComponentRegistry = { - version, - components: components.map(({ templateContent, ...comp }) => comp), - }; - - // Generate build info for provenance tracking - await generateBuildInfo(components, version); - - // Generate TypeScript registry file with inlined templates and CSS - await generateRegistryTS(registry, components, tailwindContent); - - // Generate JSON registry file - await generateRegistryJSON(registry); - - // Copy tailwind.css to public directory - await copyTailwindCSS(); - - console.log(`🎉 Generated registry with ${components.length} components`); -} - -async function processComponent( - metaFilePath: string, -): Promise { - // Extract component id from path (e.g., src/core/button/meta.json -> button) - const componentId = metaFilePath.split("/").slice(-2, -1)[0]; - - // Read component metadata - const metaContent = readFileSync(metaFilePath, "utf8"); - const meta: ComponentMeta = JSON.parse(metaContent); - - // Read template file content - const templatePath = join(TEMPLATES_DIR, `${componentId}.txt`); - if (!existsSync(templatePath)) { - console.warn( - `⚠️ Template file not found for ${componentId}: ${templatePath}`, - ); - return null; - } - - const templateContent = readFileSync(templatePath, "utf8"); - - return { - id: componentId, - template: `/templates/${componentId}.txt`, - templateContent, - meta: { - name: meta.name, - category: meta.category, - status: meta.status, - description: meta.description, - tags: meta.tags, - }, - }; -} - -async function generateRegistryTS( - registry: ComponentRegistry, - componentsWithTemplates: ComponentWithTemplate[], - tailwindContent: string, -): Promise { - const componentsArray = registry.components - .map( - (comp) => - ` ${JSON.stringify(comp, null, 4).replace(/^/gm, " ").trim()}`, - ) - .join(",\n"); - - const componentIds = registry.components - .map((comp) => `"${comp.id}"`) - .join(" | "); - - const templateMap = componentsWithTemplates - .map((comp) => ` "${comp.id}": ${JSON.stringify(comp.templateContent)}`) - .join(",\n"); - - const registryContent = `// Auto-generated registry from registry data -// Do not edit manually - regenerate with 'pnpm build' - -import type { ComponentRegistry, ComponentRegistryEntry } from '@baselayer/registry'; - -const registry: ComponentRegistry = { - "version": "${registry.version}", - "components": [ -${componentsArray} - ] -}; - -const templateContents: Record = { -${templateMap} -}; - -const tailwindCSS = ${JSON.stringify(tailwindContent)}; - -export default registry; - -// Helper functions -export type ComponentId = ${componentIds || "string"}; - -export function getComponent(id: ComponentId): ComponentRegistryEntry | null { - return registry.components.find(comp => comp.id === id) || null; -} - -export function getComponentsByCategory(category: string): ComponentRegistryEntry[] { - return registry.components.filter(comp => comp.meta.category === category); -} - -export function getComponentsByStatus(status: string): ComponentRegistryEntry[] { - return registry.components.filter(comp => comp.meta.status === status); -} - -export function searchComponents(query: string): ComponentRegistryEntry[] { - const lowercaseQuery = query.toLowerCase(); - return registry.components.filter(comp => - comp.id.toLowerCase().includes(lowercaseQuery) || - comp.meta.name.toLowerCase().includes(lowercaseQuery) || - comp.meta.description.toLowerCase().includes(lowercaseQuery) || - comp.meta.tags.some(tag => tag.toLowerCase().includes(lowercaseQuery)) - ); -} - -export function getComponentTemplate(id: ComponentId): string | null { - return templateContents[id] || null; -} - -export function getTailwindCSS(): string { - return tailwindCSS; -} - -export { registry }; -export const COMPONENTS = registry.components; -export type { ComponentRegistry, ComponentRegistryEntry }; -`; - - writeFileSync(OUTPUT_REGISTRY_TS, registryContent); - console.log("📝 Generated registry.ts with inlined templates and CSS"); -} - -async function generateRegistryJSON( - registry: ComponentRegistry, -): Promise { - const jsonContent = JSON.stringify(registry, null, 2); - writeFileSync(OUTPUT_REGISTRY_JSON, jsonContent); - console.log("📝 Generated registry.json"); -} - -async function generateBuildInfo( - components: ComponentWithTemplate[], - version: string, -): Promise { - // Generate content hash for registry content verification - const crypto = await import("node:crypto"); - const contentToHash = JSON.stringify({ - version, - components: components.map((comp) => ({ - id: comp.id, - template: comp.template, - meta: comp.meta, - templateContent: comp.templateContent, - })), - }); - const registrySHA256 = crypto - .createHash("sha256") - .update(contentToHash) - .digest("hex") - .substring(0, 16); - - // Get git commit hash - let gitCommit: string; - try { - const { execSync } = await import("node:child_process"); - gitCommit = execSync("git rev-parse HEAD", { - encoding: "utf8", - }).trim(); - } catch { - gitCommit = "unknown"; - } - - const buildInfo = { - git: gitCommit, - builtAt: new Date().toISOString(), - registrySHA256, - }; - - const buildInfoContent = JSON.stringify(buildInfo, null, 2); - writeFileSync(OUTPUT_BUILD_INFO, buildInfoContent); - console.log("📝 Generated build-info.json"); -} - -async function copyTailwindCSS(): Promise { - try { - copyFileSync(TAILWIND_SOURCE, TAILWIND_OUTPUT); - console.log("📝 Copied tailwind.css to public directory"); - } catch (error) { - console.error("❌ Failed to copy tailwind.css:", error); - } -} - -// Run the generator -generateRegistry().catch(console.error); diff --git a/packages/components/src/core/date-picker/date-picker.tsx b/packages/components/src/core/date-picker/date-picker.tsx index 8945e949..8c180a1f 100644 --- a/packages/components/src/core/date-picker/date-picker.tsx +++ b/packages/components/src/core/date-picker/date-picker.tsx @@ -22,7 +22,7 @@ import { tv } from "tailwind-variants"; import { ChevronDown } from "lucide-react"; -import { Calendar, RangeCalendar } from "../calendar/calendar"; +import { Calendar, RangeCalendar } from "@/components/ui/calendar/calendar"; const baseStyles = tv({ slots: { diff --git a/packages/components/src/core/table/table.tsx b/packages/components/src/core/table/table.tsx index 364178e2..3877d9b5 100644 --- a/packages/components/src/core/table/table.tsx +++ b/packages/components/src/core/table/table.tsx @@ -19,8 +19,8 @@ import { tv } from "tailwind-variants"; import { Menu } from "lucide-react"; -import { Button } from "../button/button"; -import { Checkbox } from "../checkbox/checkbox"; +import { Button } from "@/components/ui/button/button"; +import { Checkbox } from "@/components/ui/checkbox/checkbox"; const table = tv({ slots: { diff --git a/packages/components/src/index.ts b/packages/components/src/index.ts index 16ce43b9..c1234cb2 100644 --- a/packages/components/src/index.ts +++ b/packages/components/src/index.ts @@ -1,14 +1,2 @@ export * from "./core"; export * from "./examples"; -// Registry -export { - COMPONENTS, - type ComponentId, - getComponent, - getComponentsByCategory, - getComponentsByStatus, - getComponentTemplate, - getTailwindCSS, - registry, - searchComponents, -} from "./registry"; diff --git a/packages/components/src/registry.ts b/packages/components/src/registry.ts deleted file mode 100644 index 948cc02a..00000000 --- a/packages/components/src/registry.ts +++ /dev/null @@ -1,460 +0,0 @@ -// Auto-generated registry from registry data -// Do not edit manually - regenerate with 'pnpm build' - -import type { ComponentRegistry, ComponentRegistryEntry } from '@baselayer/registry'; - -const registry: ComponentRegistry = { - "version": "2.0.2", - "components": [ - { - "id": "accordion", - "template": "/templates/accordion.txt", - "meta": { - "name": "accordion", - "category": "layout", - "status": "stable", - "description": "An accordion allows users to toggle the display of sections of content. Each accordion consists of a header with a title and content area.", - "tags": [ - "disclosure", - "collapsible", - "expandable", - "content" - ] - } - }, - { - "id": "badge", - "template": "/templates/badge.txt", - "meta": { - "name": "badge", - "category": "display", - "status": "stable", - "description": "A badge is a small label that can be used to display information or status.", - "tags": [ - "status" - ] - } - }, - { - "id": "breadcrumbs", - "template": "/templates/breadcrumbs.txt", - "meta": { - "name": "breadcrumbs", - "category": "navigation", - "status": "stable", - "description": "Breadcrumbs display a heirarchy of links to the current page or resource in an application.", - "tags": [ - "navigation" - ] - } - }, - { - "id": "button", - "template": "/templates/button.txt", - "meta": { - "name": "button", - "category": "forms", - "status": "stable", - "description": "A button allows a user to perform an action, with mouse, touch, and keyboard interactions.", - "tags": [ - "form", - "interactive" - ] - } - }, - { - "id": "calendar", - "template": "/templates/calendar.txt", - "meta": { - "name": "calendar", - "category": "data-entry", - "status": "stable", - "description": "A calendar displays one or more date grids and allows users to select either a single date or a contiguous range of dates.", - "tags": [ - "form", - "interactive", - "date-time" - ] - } - }, - { - "id": "card", - "template": "/templates/card.txt", - "meta": { - "name": "card", - "category": "layout", - "status": "stable", - "description": "Displays a card with header, content, and footer.", - "tags": [ - "layout", - "container", - "display" - ] - } - }, - { - "id": "checkbox", - "template": "/templates/checkbox.txt", - "meta": { - "name": "checkbox", - "category": "forms", - "status": "stable", - "description": "A checkbox allows a user to select multiple items from a list of individual items, or to mark one individual item as selected.", - "tags": [ - "form", - "interactive" - ] - } - }, - { - "id": "combobox", - "template": "/templates/combobox.txt", - "meta": { - "name": "combobox", - "category": "forms", - "status": "stable", - "description": "A combo box combines a text input with a listbox, allowing users to filter a list of options to items matching a query.", - "tags": [ - "form", - "interactive", - "picker" - ] - } - }, - { - "id": "command", - "template": "/templates/command.txt", - "meta": { - "name": "command", - "category": "navigation", - "status": "beta", - "description": "A command palette that allows users to quickly search and execute commands using keyboard shortcuts.", - "tags": [ - "search", - "navigation", - "keyboard", - "palette" - ] - } - }, - { - "id": "date-field", - "template": "/templates/date-field.txt", - "meta": { - "name": "date-field", - "category": "forms", - "status": "stable", - "description": "A date field allows users to enter and edit date and time values using a keyboard. Each part of a date value is displayed in an individually editable segment.", - "tags": [ - "form", - "interactive", - "date" - ] - } - }, - { - "id": "date-picker", - "template": "/templates/date-picker.txt", - "meta": { - "name": "date-picker", - "category": "forms", - "status": "stable", - "description": "A date picker combines one or more DateFields with a calendar popover, allowing users to enter or select a single date/time or a range.", - "tags": [ - "form", - "interactive", - "date-time" - ] - } - }, - { - "id": "input", - "template": "/templates/input.txt", - "meta": { - "name": "input", - "category": "forms", - "status": "stable", - "description": "Allows a user to enter a plain text value with a keyboard.", - "tags": [ - "form", - "interactive" - ] - } - }, - { - "id": "menu", - "template": "/templates/menu.txt", - "meta": { - "name": "menu", - "category": "pickers", - "status": "stable", - "description": "A menu displays a list of actions or options that a user can choose.", - "tags": [ - "interactive", - "navigation" - ] - } - }, - { - "id": "meter", - "template": "/templates/meter.txt", - "meta": { - "name": "meter", - "category": "data-display", - "status": "stable", - "description": "A meter represents a quantity within a known range, or a fractional value.", - "tags": [ - "data-display", - "progress" - ] - } - }, - { - "id": "modal", - "template": "/templates/modal.txt", - "meta": { - "name": "modal", - "category": "overlays", - "status": "stable", - "description": "A modal is an overlay element which blocks interaction with elements outside it.", - "tags": [ - "overlay" - ] - } - }, - { - "id": "popover", - "template": "/templates/popover.txt", - "meta": { - "name": "popover", - "category": "overlays", - "status": "stable", - "description": "A popover is an overlay element positioned relative to a trigger.", - "tags": [ - "overlay", - "interactive" - ] - } - }, - { - "id": "radio-group", - "template": "/templates/radio-group.txt", - "meta": { - "name": "radio-group", - "category": "forms", - "status": "stable", - "description": "A radio group allows a user to select a single option from a list of mutually exclusive options.", - "tags": [ - "form", - "interactive", - "selection" - ] - } - }, - { - "id": "select", - "template": "/templates/select.txt", - "meta": { - "name": "select", - "category": "forms", - "status": "stable", - "description": "A select displays a collapsible list of options and allows a user to select one of them.", - "tags": [ - "form", - "interactive", - "picker" - ] - } - }, - { - "id": "slider", - "template": "/templates/slider.txt", - "meta": { - "name": "slider", - "category": "forms", - "status": "stable", - "description": "A slider allows a user to select one or more values within a range.", - "tags": [ - "form", - "interactive", - "range" - ] - } - }, - { - "id": "switch", - "template": "/templates/switch.txt", - "meta": { - "name": "switch", - "category": "forms", - "status": "stable", - "description": "A switch allows a user to turn a setting on or off.", - "tags": [ - "form", - "interactive", - "toggle" - ] - } - }, - { - "id": "table", - "template": "/templates/table.txt", - "meta": { - "name": "table", - "category": "data-display", - "status": "stable", - "description": "A table displays data in rows and columns and enables a user to navigate its contents via directional navigation keys, and optionally supports row selection and sorting.", - "tags": [ - "data-display", - "interactive" - ] - } - }, - { - "id": "tabs", - "template": "/templates/tabs.txt", - "meta": { - "name": "tabs", - "category": "navigation", - "status": "stable", - "description": "Tabs organize content into multiple sections and allow users to navigate between them.", - "tags": [ - "navigation", - "interactive", - "layout" - ] - } - }, - { - "id": "tag-group", - "template": "/templates/tag-group.txt", - "meta": { - "name": "tag-group", - "category": "forms", - "status": "stable", - "description": "A tag group is a focusable list of labels, categories, keywords, filters, or other items, with support for keyboard navigation, selection, and removal.", - "tags": [ - "form", - "interactive", - "selection", - "filtering" - ] - } - }, - { - "id": "time-field", - "template": "/templates/time-field.txt", - "meta": { - "name": "time-field", - "category": "forms", - "status": "stable", - "description": "A time field allows users to enter and edit time values using a keyboard. Each part of a time value is displayed in an individually editable segment.", - "tags": [ - "form", - "interactive", - "time" - ] - } - }, - { - "id": "toggle", - "template": "/templates/toggle.txt", - "meta": { - "name": "toggle", - "category": "forms", - "status": "stable", - "description": "A toggle button allows a user to toggle a selection on or off, for example switching between two states or modes.", - "tags": [ - "form", - "interactive", - "toggle" - ] - } - }, - { - "id": "tooltip", - "template": "/templates/tooltip.txt", - "meta": { - "name": "tooltip", - "category": "overlays", - "status": "stable", - "description": "A tooltip displays a description of an element on hover or focus.", - "tags": [ - "overlay", - "interactive", - "help" - ] - } - } - ] -}; - -const templateContents: Record = { - "accordion": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport {\n\tButton,\n\tDisclosure,\n\tDisclosureGroup,\n\ttype DisclosureGroupProps,\n\tDisclosurePanel,\n\ttype DisclosureProps,\n\tHeading,\n} from \"react-aria-components\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nimport { Minus, Plus } from \"lucide-react\";\n\nconst accordion = tv({\n\tslots: {\n\t\troot: \"group w-full\",\n\t\tgroup: \"flex flex-col gap-3\",\n\t\tbutton:\n\t\t\t\"flex w-full items-center justify-between gap-6 rounded-2xl border border-border bg-surface-2 p-4 data-[focus-visible]:outline-none data-[focus-visible]:ring-2 data-[focus-visible]:ring-focus data-[focus-visible]:ring-offset-2 data-[focus-visible]:ring-offset-surface group-data-[expanded]:rounded-b-none group-data-[expanded]:border-b-0\",\n\t\ticon: \"size-4 shrink-0 fill-none transition-transform duration-200\",\n\t\tpanel:\n\t\t\t\"rounded-b-2xl border-border bg-surface-2 px-4 text-muted-foreground text-sm group-data-[expanded]:border-x group-data-[expanded]:border-b group-data-[expanded]:pb-4\",\n\t},\n});\n\nconst styles = accordion();\n\ntype AccordionVariantProps = VariantProps;\n\ninterface AccordionProps\n\textends AccordionVariantProps,\n\t\tOmit {\n\tclassName?: string;\n\ttitle?: string;\n\tchildren?: ReactNode;\n}\n\nconst Accordion = ({\n\tclassName,\n\ttitle,\n\tchildren,\n\t...props\n}: AccordionProps) => {\n\treturn (\n\t\t\n\t\t\t{({ isExpanded }) => (\n\t\t\t\t<>\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{children}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t)}\n\t\t\n\t);\n};\n\ninterface AccordionGroupProps extends DisclosureGroupProps {\n\tclassName?: string;\n\tchildren: ReactNode;\n}\n\nconst AccordionGroup = ({\n\tclassName,\n\tchildren,\n\t...props\n}: AccordionGroupProps) => (\n\t\n\t\t{children}\n\t\n);\n\nexport { Accordion, AccordionGroup };\nexport type { AccordionProps, AccordionGroupProps };\n", - "badge": "import type { HTMLAttributes } from \"react\";\n\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nexport const badge = tv({\n\tbase: \"flex items-center justify-center rounded-4xl px-3 py-2 font-semibold text-xs\",\n\tvariants: {\n\t\tvariant: {\n\t\t\tattention: \"bg-gradient-to-r from-pink-500 to-purple-500 text-white\",\n\t\t\tneutral: \"bg-secondary text-secondary-fg\",\n\t\t\tdanger: \"bg-danger text-danger-fg\",\n\t\t},\n\t},\n\tdefaultVariants: {\n\t\tvariant: \"attention\",\n\t},\n});\n\ntype BadgeProps = VariantProps & HTMLAttributes;\n\nconst Badge = ({ className, variant, ...props }: BadgeProps) => (\n\t\n);\n\nexport { Badge };\nexport type { BadgeProps };\n", - "breadcrumbs": "\"use client\";\n\nimport {\n\tBreadcrumbs as AriaBreadcrumbs,\n\ttype BreadcrumbsProps as AriaBreadcrumbsProps,\n\tBreadcrumb,\n\ttype BreadcrumbProps,\n\tLink,\n\ttype LinkProps,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst breadcrumbs = tv({\n\tslots: {\n\t\troot: \"m-0 flex list-none items-center gap-2 p-0 font-md\",\n\t\tlink: \"relative cursor-pointer rounded-md text-fg outline-none ring-focus data-[hovered]:underline data-[focus-visible]:ring-2 [&[aria-current]]:font-extrabold [&[aria-current]]:text-fg\",\n\t\titem: \"flex items-center gap-2\",\n\t},\n});\n\nconst styles = breadcrumbs();\n\nconst Breadcrumbs = ({\n\tchildren,\n\tclassName,\n\t...props\n}: AriaBreadcrumbsProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst BreadcrumbsLink = ({\n\tchildren,\n\tclassName,\n\t...props\n}: LinkProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst BreadcrumbsItem = ({\n\tchildren,\n\tclassName,\n\t...props\n}: BreadcrumbProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nexport { BreadcrumbsItem, BreadcrumbsLink, Breadcrumbs };", - "button": "\"use client\";\n\nimport {\n\tButton as AriaButton,\n\ttype ButtonProps as AriaButtonProps,\n} from \"react-aria-components\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nconst button = tv({\n\tbase: \"inline-flex appearance-none items-center justify-center rounded-full font-semibold outline-none ring-focus ring-offset-3 ring-offset-surface transition-transform duration-100 disabled:pointer-events-none disabled:opacity-50 data-[focus-visible]:ring-2\",\n\tvariants: {\n\t\tvariant: {\n\t\t\tprimary:\n\t\t\t\t\"bg-primary text-primary-fg data-[hovered]:bg-primary/80\",\n\t\t\tsecondary:\n\t\t\t\t\"border border-border text-fg data-[hovered]:border-secondary data-[hovered]:bg-secondary\",\n\t\t\tghost:\n\t\t\t\t\"bg-transparent text-fg data-[hovered]:bg-secondary data-[hovered]:text-secondary-fg\",\n\t\t\tdanger:\n\t\t\t\t\"border border-transparent bg-danger text-danger-fg data-[hovered]:bg-danger/80\",\n\t\t},\n\t\tsize: {\n\t\t\tsm: \"px-2 py-1.5 text-sm\",\n\t\t\tmd: \"px-4 py-2.5 text-base\",\n\t\t\tlg: \"px-6 py-3.5 font-bold text-lg\",\n\t\t\ticon: \"size-9\",\n\t\t},\n\t},\n\tdefaultVariants: {\n\t\tvariant: \"primary\",\n\t\tsize: \"md\",\n\t},\n});\n\ntype ButtonVariantProps = VariantProps;\n\ninterface ButtonProps\n\textends Omit,\n\t\tButtonVariantProps {\n\tclassName?: string;\n}\n\nconst Button = ({\n\tclassName,\n\tsize,\n\tvariant,\n\tchildren,\n\t...props\n}: ButtonProps) => (\n\t\n\t\t{children}\n\t\n);\n\nButton.displayName = \"Button\";\n\nexport { Button };\nexport type { ButtonProps };\n", - "calendar": "\"use client\";\n\nimport {\n\tCalendar as AriaCalendar,\n\ttype CalendarProps as AriaCalendarProps,\n\tRangeCalendar as AriaRangeCalendar,\n\ttype RangeCalendarProps as AriaRangeCalendarProps,\n\tButton,\n\tCalendarCell,\n\tCalendarGrid,\n\tCalendarGridBody,\n\tCalendarGridHeader,\n\tCalendarHeaderCell,\n\ttype DateValue,\n\tHeading,\n\tText,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\n\nconst baseStyles = tv({\n\tslots: {\n\t\troot: \"w-fit max-w-full rounded-2xl border border-border bg-surface p-4 text-fg\",\n\t\theader: \"flex w-full items-center gap-1 pb-4\",\n\t\theading: \"flex-1 text-center font-bold\",\n\t\theaderCell: \"pb-2 text-fg-muted text-sm\",\n\t\tmonthButton:\n\t\t\t\"flex appearance-none items-center justify-center rounded-full p-2 text-center outline-none ring-focus data-[hovered]:bg-secondary data-[focus-visible]:ring-2\",\n\t},\n});\n\nconst calendar = tv({\n\textend: baseStyles,\n\tslots: {\n\t\tcell: \"flex size-9 cursor-default items-center justify-center rounded-full border-border text-center text-sm outline-focus outline-offset-2 data-[hovered]:bg-secondary data-[pressed]:bg-secondary data-[selected]:bg-primary data-[selected]:text-primary-fg data-[unavailable]:text-fg-muted data-[unavailable]:line-through data-[focus-visible]:outline-2 data-[focus-visible]:outline-focus [&[data-outside-month]]:hidden\",\n\t},\n});\n\nconst rangeCalendar = tv({\n\textend: baseStyles,\n\tslots: {\n\t\tcell: \"flex size-9 cursor-default items-center justify-center rounded-full text-center text-sm outline-none outline-offset-2 data-[selected]:rounded-none data-[hovered]:bg-secondary data-[pressed]:bg-secondary data-[selected]:bg-primary data-[selected]:text-primary-fg data-[unavailable]:text-fg-muted data-[unavailable]:line-through data-[focus-visible]:ring-2 data-[focus-visible]:ring-focus data-[focus-visible]:ring-offset-2 [&[data-outside-month]]:hidden [&[data-selection-end]]:rounded-r-full [&[data-selection-start]]:rounded-l-full\",\n\t},\n});\n\nconst styles = calendar();\nconst rangeStyles = rangeCalendar();\n\ninterface CalendarProps\n\textends Omit, \"className\"> {\n\terrorMessage?: string;\n\tclassName?: string;\n}\n\nconst Calendar = ({\n\tclassName,\n\terrorMessage,\n\t...props\n}: CalendarProps) => (\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
\n\t\t\n\t\t\t\n\t\t\t\t{(day) => (\n\t\t\t\t\t\n\t\t\t\t\t\t{day}\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t\t\n\t\t\t\t{(date) => }\n\t\t\t\n\t\t\n\t\t{errorMessage && (\n\t\t\t\n\t\t\t\t{errorMessage}\n\t\t\t\n\t\t)}\n\t
\n);\n\ninterface RangeCalendarProps\n\textends Omit, \"className\"> {\n\terrorMessage?: string;\n\tclassName?: string;\n}\n\nconst RangeCalendar = ({\n\tclassName,\n\terrorMessage,\n\t...props\n}: RangeCalendarProps) => (\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
\n\t\t\n\t\t\t\n\t\t\t\t{(day) => (\n\t\t\t\t\t\n\t\t\t\t\t\t{day}\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t\t\n\t\t\t\t{(date) => }\n\t\t\t\n\t\t\n\t\t{errorMessage && (\n\t\t\t\n\t\t\t\t{errorMessage}\n\t\t\t\n\t\t)}\n\t
\n);\n\nexport { Calendar, RangeCalendar };\nexport type { CalendarProps, RangeCalendarProps };\n", - "card": "\"use client\";\n\nimport type { HTMLAttributes } from \"react\";\n\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nconst card = tv({\n\tslots: {\n\t\troot: \"rounded-2xl border-2 bg-surface text-fg\",\n\t\theader: \"flex flex-col space-y-1.5 p-6\",\n\t\ttitle: \"font-semibold text-2xl leading-none tracking-tight\",\n\t\tdescription: \"text-fg-muted text-sm\",\n\t\tcontent: \"p-6 pt-0\",\n\t\tfooter: \"flex items-center p-6 pt-0\",\n\t},\n\tvariants: {\n\t\tvariant: {\n\t\t\toutlined: {\n\t\t\t\troot: \"border border-border/50\",\n\t\t\t},\n\t\t\tfilled: {\n\t\t\t\troot: \"border-surface-2 bg-surface-2\",\n\t\t\t},\n\t\t},\n\t},\n\tdefaultVariants: {\n\t\tvariant: \"outlined\",\n\t},\n});\n\nconst styles = card();\n\ntype CardVariantProps = VariantProps;\n\ninterface CardProps extends HTMLAttributes, CardVariantProps {\n\tclassName?: string;\n\ttitle?: string;\n\tdescription?: string;\n}\n\ninterface CardHeaderProps extends HTMLAttributes {\n\tclassName?: string;\n}\n\ninterface CardContentProps extends HTMLAttributes {\n\tclassName?: string;\n}\n\ninterface CardFooterProps extends HTMLAttributes {\n\tclassName?: string;\n}\n\nconst Card = ({\n\tclassName,\n\tvariant,\n\ttitle,\n\tdescription,\n\tchildren,\n\t...props\n}: CardProps) => (\n\t
\n\t\t{(title || description) && (\n\t\t\t
\n\t\t\t\t{title &&

{title}

}\n\t\t\t\t{description &&

{description}

}\n\t\t\t
\n\t\t)}\n\t\t{children}\n\t
\n);\n\nconst CardHeader = ({ className, ...props }: CardHeaderProps) => (\n\t
\n);\n\nconst CardContent = ({ className, ...props }: CardContentProps) => (\n\t
\n);\n\nconst CardFooter = ({ className, ...props }: CardFooterProps) => (\n\t
\n);\n\nexport { Card, CardHeader, CardContent, CardFooter };\nexport type { CardProps, CardHeaderProps, CardContentProps, CardFooterProps };\n", - "checkbox": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport {\n\ttype CheckboxProps as AriaCheckBoxProps,\n\tCheckbox as AriaCheckbox,\n\tCheckboxGroup as AriaCheckboxGroup,\n\ttype CheckboxGroupProps as AriaCheckboxGroupProps,\n\tFieldError,\n\tText,\n\ttype ValidationResult,\n} from \"react-aria-components\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nimport { Check } from \"lucide-react\";\n\nconst checkbox = tv({\n\tbase: \"group flex items-center justify-center gap-2 py-1 text-fg\",\n});\n\nconst checkboxGroup = tv({\n\tbase: \"flex flex-col gap-2\",\n});\n\ntype CheckboxVariantProps = VariantProps;\n\ninterface CheckboxProps extends CheckboxVariantProps, AriaCheckBoxProps {\n\tclassName?: string;\n\tchildren: ReactNode;\n\tdescription?: string;\n\terrorMessage?: string | ((validation: ValidationResult) => string);\n}\n\nconst Checkbox = ({\n\tclassName,\n\terrorMessage,\n\tchildren,\n\tdescription,\n\t...props\n}: CheckboxProps) => {\n\treturn (\n\t\t\n\t\t\t{({ isSelected }) => (\n\t\t\t\t<>\n\t\t\t\t\t
\n\t\t\t\t\t\t{isSelected && }\n\t\t\t\t\t
\n\t\t\t\t\t{children}\n\t\t\t\t\t{description && (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t\t\n\t\t\t\t\t\t{errorMessage}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t)}\n\t\t
\n\t);\n};\n\ninterface CheckboxGroupProps extends AriaCheckboxGroupProps {\n\tclassName?: string;\n\tlabel?: string;\n\tchildren: ReactNode;\n\tdescription?: string;\n\terrorMessage?: string | ((validation: ValidationResult) => string);\n}\n\nconst CheckboxGroup = ({\n\tclassName,\n\tlabel,\n\tdescription,\n\terrorMessage,\n\tchildren,\n\t...props\n}: CheckboxGroupProps) => (\n\t\n\t\t{label && (\n\t\t\t\n\t\t\t\t{label}\n\t\t\t\n\t\t)}\n\t\t{children}\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage}\n\t\n);\n\nexport { Checkbox, CheckboxGroup };\nexport type { CheckboxProps, CheckboxGroupProps };\n", - "combobox": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport {\n\tComboBox as AriaComboBox,\n\ttype ComboBoxProps as AriaComboBoxProps,\n\tButton,\n\tFieldError,\n\tInput,\n\tLabel,\n\tListBox,\n\tListBoxItem,\n\ttype ListBoxItemProps,\n\tPopover,\n\tText,\n\ttype ValidationResult,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nimport { CheckIcon, ChevronsUpDown } from \"lucide-react\";\n\nconst combobox = tv({\n\tslots: {\n\t\troot: \"group max-h-inherit w-full overflow-auto p-1 outline-none\",\n\t\tinput:\n\t\t\t\"w-full rounded-lg border border-border bg-surface px-4 py-1.5 align-middle font-semibold text-fg outline-none ring-fg transition-all group-data-[focused]:border-transparent group-data-[focused]:bg-surface group-data-[focused]:ring-2\",\n\t\tbutton:\n\t\t\t\"absolute right-2 flex appearance-none items-center justify-center rounded-full border-0 outline-none ring-focus ring-offset-2 ring-offset-surface data-[focus-visible]:ring-2\",\n\t\tpopover:\n\t\t\t\"w-[var(--trigger-width)] rounded-xl border border-border/25 bg-surface p-1 text-fg shadow-lg outline-none\",\n\t\titem: \"relative m-1 flex cursor-default flex-col rounded-lg p-2 font-semibold outline-none data-[disabled]:cursor-not-allowed data-[focused]:bg-secondary data-[disabled]:text-fg-disabled\",\n\t},\n});\n\nconst styles = combobox();\n\ninterface ComboBoxProps\n\textends Omit, \"className\"> {\n\tclassName?: string;\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string | ((validation: ValidationResult) => string);\n}\n\nconst ComboBox = ({\n\tlabel,\n\tclassName,\n\tdescription,\n\terrorMessage,\n\tchildren,\n\t...props\n}: ComboBoxProps) => (\n\t\n\t\t{label && }\n\t\t
\n\t\t\t\n\t\t\t\n\t\t
\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage}\n\t\t\n\t\t\t{children}\n\t\t\n\t\n);\n\ninterface ComboBoxItemProps\n\textends Omit {\n\tchildren: ReactNode;\n\tclassName?: string;\n}\n\nconst ComboBoxItem = ({ className, ...props }: ComboBoxItemProps) => (\n\t\n\t\t{({ isSelected }) => (\n\t\t\t
\n\t\t\t\t{props.children}\n\t\t\t\t{isSelected && }\n\t\t\t
\n\t\t)}\n\t
\n);\n\nexport { ComboBox, ComboBoxItem };\nexport type { ComboBoxProps, ListBoxItemProps as ComboBoxItemProps };", - "command": "\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useEffect, useState } from \"react\";\n\nimport {\n\tButton as AriaButton,\n\tDialog as AriaDialog,\n\tDialogTrigger as AriaDialogTrigger,\n\tModal as AriaModal,\n\tAutocomplete,\n\tInput,\n\tMenu,\n\tMenuItem,\n\ttype MenuItemProps,\n\tModalOverlay,\n\ttype ModalOverlayProps,\n\tTextField,\n\tuseFilter,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nimport { Search } from \"lucide-react\";\n\nconst command = tv({\n\tslots: {\n\t\ttrigger:\n\t\t\t\"flex w-full items-center justify-between rounded-full bg-secondary px-4 py-2 font-semibold text-fg outline-none ring-primary ring-offset-2 ring-offset-surface transition-colors data-[hovered]:bg-secondary/75 data-[focus-visible]:ring-2\",\n\t\toverlay:\n\t\t\t\"data-[entering]:fade-in data-[exiting]:fade-out fixed inset-0 z-50 flex min-h-full items-start justify-center bg-zinc-500/25 p-4 text-center data-[entering]:animate-in data-[exiting]:animate-out data-[entering]:duration-300 data-[exiting]:duration-200 sm:items-center\",\n\t\tmodal:\n\t\t\t\"data-[entering]:zoom-in-95 data-[exiting]:zoom-out-95 data-[entering]:animate-in data-[exiting]:animate-out data-[entering]:duration-300 data-[exiting]:duration-200\",\n\t\tdialog:\n\t\t\t\"flex min-h-96 min-w-80 max-w-full flex-col gap-1 rounded-2xl bg-surface p-2 shadow-lg outline-none md:w-lg\",\n\t\tinput:\n\t\t\t\"rounded-lg border-b-2 border-none bg-transparent px-3 py-2 text-base text-fg leading-5 outline-none placeholder:text-fg-muted\",\n\t\tmenu: \"mt-2 h-80 overflow-auto\",\n\t\titem: \"group flex min-h-12 w-full cursor-default items-center rounded-lg px-3 py-2 text-fg outline-none data-[focused]:bg-secondary data-[pressed]:bg-surface-3 data-[focused]:text-focus-fg\",\n\t\tkbd: \"ml-auto rounded border border-border bg-surface-2 px-2 py-1 font-semibold text-fg-muted text-xs\",\n\t},\n});\n\nconst styles = command();\n\ninterface CommandItem {\n\tid: string;\n\tlabel: string;\n\tshortcut?: string;\n\ticon?: ComponentType<{ className?: string }>;\n\tonSelect?: () => void;\n}\n\ninterface CommandProps extends Omit {\n\tclassName?: string;\n\ttrigger?: ReactNode;\n\tcommands: CommandItem[];\n\tplaceholder?: string;\n\ttriggerKey?: string;\n\tonCommandSelect?: (command: CommandItem) => void;\n\tonSearchChange?: (search: string) => void;\n}\n\nconst Command = ({\n\tclassName,\n\ttrigger,\n\tcommands,\n\tplaceholder = \"Search commands…\",\n\ttriggerKey = \"k\",\n\tonCommandSelect,\n\tonSearchChange,\n\t...props\n}: CommandProps) => {\n\tconst [isOpen, setOpen] = useState(false);\n\tconst [isMac, setIsMac] = useState(true);\n\tconst { contains } = useFilter({ sensitivity: \"base\" });\n\n\tuseEffect(() => {\n\t\tsetIsMac(/Mac/.test(navigator?.platform || \"\"));\n\t}, []);\n\n\tuseEffect(() => {\n\t\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t\tif (\n\t\t\t\te.key.toLowerCase() === triggerKey.toLowerCase() &&\n\t\t\t\t(isMac ? e.metaKey : e.ctrlKey)\n\t\t\t) {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetOpen((prev) => !prev);\n\t\t\t} else if (e.key === \"Escape\") {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetOpen(false);\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown);\n\t\treturn () => document.removeEventListener(\"keydown\", handleKeyDown);\n\t}, [isMac, triggerKey]);\n\n\tconst handleCommandSelect = (command: CommandItem) => {\n\t\tcommand.onSelect?.();\n\t\tonCommandSelect?.(command);\n\t\tsetOpen(false);\n\t};\n\n\treturn (\n\t\t\n\t\t\t{trigger || (\n\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\tSearch\n\t\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t{isMac ? \"⌘\" : \"Ctrl\"} {triggerKey.toUpperCase()}\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t)}\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t true : contains}>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{({ label, shortcut, icon: Icon, ...command }) => (\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\thandleCommandSelect({\n\t\t\t\t\t\t\t\t\t\t\t\tlabel,\n\t\t\t\t\t\t\t\t\t\t\t\tshortcut,\n\t\t\t\t\t\t\t\t\t\t\t\ticon: Icon,\n\t\t\t\t\t\t\t\t\t\t\t\t...command,\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t{Icon && (\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t{shortcut && (\n\t\t\t\t\t\t\t\t\t\t\t{shortcut}\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n};\n\ninterface CommandMenuItemProps extends Omit {\n\tclassName?: string;\n\tchildren: ReactNode;\n}\n\nconst CommandMenuItem = ({\n\tclassName,\n\tchildren,\n\t...props\n}: CommandMenuItemProps) => (\n\t\n\t\t{children}\n\t\n);\n\nconst CommandTrigger = AriaDialogTrigger;\n\nexport { Command, CommandMenuItem, CommandTrigger };\nexport type { CommandProps, CommandMenuItemProps, CommandItem };\n", - "date-field": "\"use client\";\n\nimport type {\n\tDateFieldProps as AriaDateFieldProps,\n\tDateValue,\n} from \"react-aria-components\";\nimport {\n\tDateField as AriaDateField,\n\tDateInput,\n\tDateSegment,\n\tFieldError,\n\tLabel,\n\tText,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst dateField = tv({\n\tslots: {\n\t\tinput:\n\t\t\t\"flex min-h-11 min-w-48 appearance-none items-center rounded-lg border border-border bg-surface px-3 py-0.5 outline-none ring-primary transition-all data-[disabled]:cursor-not-allowed data-[focus-within]:border-transparent data-[disabled]:border-none data-[disabled]:bg-primary/10 data-[focus-within]:bg-surface data-[disabled]:text-fg-disabled data-[focus-within]:ring-2 [&::placeholder]:text-sm\",\n\t\tsegmentStyles:\n\t\t\t\"rounded-md p-1 text-end outline-none focus:text-primary-fg data-[focused]:bg-primary data-[placeholder]:text-fg-muted data-[type='literal']:text-fg-muted data-[placeholder]:focus:text-primary-fg\",\n\t},\n});\n\nconst styles = dateField();\n\ninterface DateFieldProps extends AriaDateFieldProps {\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string;\n}\n\nconst DateField = ({\n\tlabel,\n\tdescription,\n\terrorMessage,\n\t...props\n}: DateFieldProps) => (\n\t\n\t\t{label && }\n\t\t\n\t\t\t{(segment) => (\n\t\t\t\t\n\t\t\t)}\n\t\t\n\t\t{description && {description}}\n\t\t{errorMessage}\n\t\n);\n\nexport { DateField };\nexport type { DateFieldProps };\n", - "date-picker": "\"use client\";\n\nimport type {\n\tDatePickerProps as AriaDatePickerProps,\n\tDateRangePickerProps as AriaDateRangePickerProps,\n} from \"react-aria-components\";\nimport {\n\tDatePicker as AriaDatePicker,\n\tDateRangePicker as AriaDateRangePicker,\n\tButton,\n\tDateInput,\n\tDateSegment,\n\ttype DateValue,\n\tDialog,\n\tFieldError,\n\tGroup,\n\tLabel,\n\tPopover,\n\tText,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nimport { ChevronDown } from \"lucide-react\";\n\nimport { Calendar, RangeCalendar } from \"../calendar/calendar\";\n\nconst baseStyles = tv({\n\tslots: {\n\t\tinput:\n\t\t\t\"appearance-none rounded-lg px-3 py-1.5 outline-none ring-primary transition-all\",\n\t\tpopover:\n\t\t\t\"overflow-auto rounded-2xl data-[entering]:animate-fade data-[exiting]:animate-fadeOut\",\n\t},\n});\n\nconst datePicker = tv({\n\textend: baseStyles,\n\tslots: {\n\t\tgroup:\n\t\t\t\"relative flex min-h-11 w-auto min-w-48 items-center rounded-lg border border-border bg-surface transition-all data-[focus-within]:border-transparent data-[focus-within]:bg-surface data-[focus-within]:ring-2 data-[focus-within]:ring-primary data-[focus-within]:ring-offset-surface\",\n\t\tdateSegment:\n\t\t\t\"min-w-16 rounded-md p-1 text-end outline-none focus:bg-primary focus:text-primary-fg data-[placeholder]:text-fg-muted data-[type='literal']:text-fg-muted data-[placeholder]:focus:text-primary-fg\",\n\t},\n});\n\nconst dateRangePicker = tv({\n\textend: baseStyles,\n\tslots: {\n\t\tgroup:\n\t\t\t\"relative flex min-h-11 w-full flex-wrap items-center rounded-lg border border-border bg-surface transition-all data-[focus-within]:border-transparent data-[focus-within]:bg-surface data-[focus-within]:ring-2 data-[focus-within]:ring-primary data-[focus-within]:ring-offset-surface\",\n\t\tdateSegment:\n\t\t\t\"rounded-md p-1 text-end outline-none focus:bg-primary focus:text-primary-fg data-[placeholder]:text-fg-muted data-[type='literal']:text-fg-muted data-[placeholder]:focus:text-primary-fg\",\n\t\tseparator: \"px-2 text-fg-muted\",\n\t},\n});\n\nconst styles = datePicker();\nconst rangeStyles = dateRangePicker();\n\ninterface DatePickerProps extends AriaDatePickerProps {\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string;\n}\n\nconst DatePicker = ({\n\tclassName,\n\tlabel,\n\tdescription,\n\terrorMessage,\n\tchildren,\n\t...props\n}: DatePickerProps) => (\n\t\n\t\t{label && }\n\t\t\n\t\t\t\n\t\t\t\t{(segment) => (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t\t\n\t\t\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n);\n\ninterface DateRangePickerProps\n\textends AriaDateRangePickerProps {\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string;\n\tclassName?: string;\n}\n\nconst DateRangePicker = ({\n\tclassName,\n\tlabel,\n\tdescription,\n\terrorMessage,\n\tchildren,\n\t...props\n}: DateRangePickerProps) => (\n\t\n\t\t{label && }\n\t\t\n\t\t\t\n\t\t\t\t{(segment) => (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t\t\n\t\t\t\t–\n\t\t\t\n\t\t\t\n\t\t\t\t{(segment) => (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t\t\n\t\t\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n);\n\nexport { DatePicker, DateRangePicker };\nexport type { DatePickerProps, DateRangePickerProps };\n", - "input": "\"use client\";\n\nimport type {\n\tTextFieldProps as AriaTextFieldProps,\n\tValidationResult,\n} from \"react-aria-components\";\nimport {\n\tInput as AriaInput,\n\tTextField as AriaTextField,\n\tFieldError,\n\tLabel,\n\tText,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst input = tv({\n\tbase: \"min-h-11 appearance-none rounded-lg border border-border bg-surface px-3 py-1 text-fg outline-none ring-primary transition-all data-[disabled]:cursor-not-allowed data-[focused]:border-transparent data-[disabled]:bg-primary/10 data-[disabled]:text-fg-disabled data-[focused]:ring-2 [&::placeholder]:text-fg-muted [&::placeholder]:text-sm\",\n});\n\ninterface InputProps extends Omit {\n\tclassName?: string;\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string | ((validation: ValidationResult) => string);\n\tplaceholder?: string;\n}\n\nconst Input = ({\n\tlabel,\n\tdescription,\n\terrorMessage,\n\tplaceholder,\n\tclassName,\n\t...props\n}: InputProps) => (\n\t\n\t\t{label && }\n\t\t\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage}\n\t\n);\n\nexport { Input };\nexport type { InputProps };\n", - "menu": "\"use client\";\n\nimport type { HTMLAttributes } from \"react\";\n\nimport {\n\tHeader as AriaHeader,\n\tMenu as AriaMenu,\n\tMenuItem as AriaMenuItem,\n\tMenuSection as AriaMenuSection,\n\tMenuTrigger as AriaMenuTrigger,\n\ttype MenuItemProps,\n\ttype MenuProps,\n\tPopover,\n\tSeparator,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nexport const menu = tv({\n\tslots: {\n\t\tmenuPopover:\n\t\t\t\"data-[entering]:fade-in data-[exiting]:fade-out overflow-auto rounded-2xl border border-border/25 bg-surface shadow-xl data-[entering]:animate-in data-[exiting]:animate-out\",\n\t\theader: \"p-2 font-semibold\",\n\t\tcontent: \"flex h-fit min-w-56 flex-col gap-2 p-3 outline-none\",\n\t\titem: \"relative flex cursor-default justify-between rounded-lg p-3 font-semibold outline-none data-[disabled]:cursor-not-allowed data-[focused]:bg-secondary data-[disabled]:text-fg-disabled\",\n\t\tseparator: \"h-[1px] bg-border\",\n\t},\n});\n\nconst { menuPopover, content, header, item, separator } = menu();\n\nconst MenuTrigger = AriaMenuTrigger;\nconst MenuSection = AriaMenuSection;\n\nconst MenuContent = ({\n\tchildren,\n\tclassName,\n\t...props\n}: MenuProps & { className?: string }) => (\n\t\n\t\t\n\t\t\t{children}\n\t\t\n\t\n);\n\nconst MenuItem = ({\n\tchildren,\n\tclassName,\n\t...props\n}: MenuItemProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst MenuHeader = ({\n\tchildren,\n\tclassName,\n\t...props\n}: HTMLAttributes & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst MenuSeperator = ({\n\tclassName,\n\t...props\n}: HTMLAttributes & { className?: string }) => (\n\t\n);\n\nexport {\n\tMenuContent,\n\tMenuHeader,\n\tMenuItem,\n\tMenuSeperator,\n\tMenuTrigger,\n\tMenuSection,\n};\n", - "meter": "\"use client\";\n\nimport {\n\tMeter as AriaMeter,\n\ttype MeterProps as AriaMeterProps,\n\tLabel,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst bar = tv({\n\tbase: \"h-4 overflow-hidden rounded-2xl bg-surface-2\",\n});\n\ninterface MeterProps extends Omit {\n\tlabel?: string;\n\tclassName?: string;\n}\n\nconst Meter = ({ label, className, ...props }: MeterProps) => (\n\t\n\t\t{({ percentage, valueText }) => (\n\t\t\t<>\n\t\t\t\t
\n\t\t\t\t\t{label && }\n\t\t\t\t\t{valueText}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\n\t\t)}\n\t
\n);\n\nexport { Meter };\nexport type { MeterProps };\n", - "modal": "\"use client\";\n\nimport {\n\tDialog as AriaDialog,\n\tDialogTrigger as AriaDialogTrigger,\n\tModal as AriaModal,\n\ttype DialogProps,\n\tModalOverlay,\n\ttype ModalOverlayProps,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nexport const modal = tv({\n\tslots: {\n\t\tdialog: \"flex w-full flex-col gap-6 outline-none\",\n\t\tmodalStyles:\n\t\t\t\"fade-in w-full rounded-2xl bg-surface p-6 text-fg outline-none data-[entering]:animate-in md:w-md\",\n\t},\n});\n\nconst styles = modal();\n\ninterface ModalProps extends Omit {\n\tclassName?: string;\n}\n\nconst Modal = ({ children, className, ...props }: ModalProps) => (\n\t\n\t\t\n\t\t\t{children}\n\t\t\n\t\n);\n\nconst Dialog = ({ children, className, ...props }: DialogProps) => (\n\t\n\t\t{children}\n\t\n);\n\nconst ModalTrigger = AriaDialogTrigger;\n\nexport { Modal, Dialog, ModalTrigger };\nexport type { ModalProps, DialogProps };", - "popover": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport {\n\tDialogTrigger as AriaDialogTrigger,\n\tPopover as AriaPopover,\n\ttype PopoverProps as AriaPopoverProps,\n\tDialog,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nexport const popover = tv({\n\tbase: \"data-[entering]:fade-in data-[exiting]:fade-out m-1 max-w-lg rounded-2xl border border-border/25 bg-surface p-2 text-fg shadow-lg outline-none data-[entering]:animate-in data-[exiting]:animate-out\",\n});\n\ninterface DialogProps extends Omit {\n\tchildren: ReactNode;\n\tclassName?: string;\n}\n\nconst PopoverTrigger = AriaDialogTrigger;\n\nconst Popover = ({ children, className, ...props }: DialogProps) => (\n\t\n\t\t{children}\n\t\n);\n\nexport { Popover, PopoverTrigger };\n", - "radio-group": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport type {\n RadioGroupProps as AriaRadioGroupProps,\n RadioProps,\n ValidationResult,\n} from \"react-aria-components\";\nimport {\n Radio as AriaRadio,\n RadioGroup as AriaRadioGroup,\n FieldError,\n Text,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst radioGroup = tv({\n slots: {\n radio:\n \"flex items-center gap-4 text-fg before:block before:h-5 before:w-5 before:rounded-full before:border before:border-border before:ring-focus before:ring-offset-2 before:ring-offset-surface before:transition-all data-[selected]:before:border-4 data-[selected]:before:border-primary data-[focus-visible]:before:ring-2\",\n group: \"flex flex-col gap-4 text-fg\",\n },\n});\n\nconst { group, radio } = radioGroup();\n\ninterface RadioGroupProps extends Omit {\n className?: string;\n children?: ReactNode;\n label?: string;\n description?: string;\n errorMessage?: string | ((validation: ValidationResult) => string)\n}\n\nconst RadioGroup = ({\n className,\n label,\n description,\n errorMessage,\n children,\n ...props\n}: RadioGroupProps) => (\n \n {label}\n {children}\n {description && {description}}\n {errorMessage}\n \n);\n\nconst Radio = ({\n children,\n className,\n ...props\n}: RadioProps & {\n className?: string;\n}) => (\n \n {children}\n \n);\n\nexport { RadioGroup, Radio }; ", - "select": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport type {\n\tSelectProps as AriaSelectProps,\n\tListBoxItemProps,\n\tValidationResult,\n} from \"react-aria-components\";\nimport {\n\tSelect as AriaSelect,\n\tAutocomplete,\n\tButton,\n\tFieldError,\n\tInput,\n\tLabel,\n\tListBox,\n\tListBoxItem,\n\tPopover,\n\tSearchField,\n\tSelectValue,\n\tText,\n\tuseFilter,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nimport { CheckIcon, ChevronDown, Search } from \"lucide-react\";\n\nconst select = tv({\n\tslots: {\n\t\tgroup: \"group flex flex-col gap-1\",\n\t\tbutton:\n\t\t\t\"group flex w-fit items-center justify-between gap-4 rounded-full border border-border bg-surface px-4 py-2.75 align-middle font-semibold text-fg text-sm outline-none ring-fg transition-all data-[hovered]:bg-surface-2 group-data-[focus-visible]:border-transparent group-data-[open]:bg-surface-2 group-data-[focus-visible]:ring-2\",\n\t\titem: \"relative m-1 flex cursor-default flex-col rounded-lg p-2 font-semibold outline-none data-[disabled]:cursor-not-allowed data-[focused]:bg-secondary data-[disabled]:text-fg-disabled\",\n\t\tsearchField:\n\t\t\t\"group m-1 flex items-center rounded-full border border-border bg-surface px-2 py-1.5\",\n\t\tsearchInput:\n\t\t\t\"flex-1 bg-transparent text-fg outline-none placeholder:text-fg-muted\",\n\t\tsearchIcon: \"mr-2 size-4 text-fg-muted\",\n\t\tclearButton:\n\t\t\t\"ml-2 rounded p-0.5 text-fg-muted transition-colors hover:bg-surface-2 hover:text-fg group-empty:invisible\",\n\t\tpopover:\n\t\t\t\"min-w-[var(--trigger-width)] rounded-xl border border-border/25 bg-surface p-1 text-fg shadow-lg outline-none\",\n\t},\n});\n\nconst styles = select();\n\ninterface SelectProps\n\textends Omit, \"className\"> {\n\tclassName?: string;\n\tpopoverClassName?: string;\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string | ((validation: ValidationResult) => string);\n}\n\nconst Select = ({\n\tlabel,\n\tclassName,\n\tdescription,\n\terrorMessage,\n\tpopoverClassName,\n\tchildren,\n\t...props\n}: SelectProps) => (\n\t\n\t\t{label && }\n\t\t\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage}\n\t\t\n\t\t\t{children}\n\t\t\n\t\n);\n\ninterface SelectItemProps\n\textends Omit {\n\tchildren: ReactNode;\n\tclassName?: string;\n}\n\nconst SelectItem = ({ className, ...props }: SelectItemProps) => (\n\t\n\t\t{({ isSelected }) => (\n\t\t\t
\n\t\t\t\t{props.children}\n\t\t\t\t{isSelected && }\n\t\t\t
\n\t\t)}\n\t
\n);\n\ninterface SearchableSelectProps\n\textends SelectProps {\n\tsearchPlaceholder?: string;\n}\n\nconst SearchableSelect = ({\n\tlabel,\n\tclassName,\n\tdescription,\n\terrorMessage,\n\tsearchPlaceholder = \"Search...\",\n\tchildren,\n\tpopoverClassName,\n\t...props\n}: SearchableSelectProps) => {\n\tconst { contains } = useFilter({ sensitivity: \"base\" });\n\n\treturn (\n\t\t\n\t\t\t{label && }\n\t\t\t\n\t\t\t{description && (\n\t\t\t\t\n\t\t\t\t\t{description}\n\t\t\t\t\n\t\t\t)}\n\t\t\t{errorMessage}\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{children}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport { Select, SelectItem, SearchableSelect };\nexport type { SelectProps, SelectItemProps, SearchableSelectProps };\n", - "slider": "\"use client\";\n\nimport {\n\tSlider as AriaSlider,\n\tSliderThumb as AriaSliderThumb,\n\tSliderTrack as AriaSliderTrack,\n\tLabel,\n\ttype LabelProps,\n\tSliderOutput,\n\ttype SliderProps,\n\ttype SliderThumbProps,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst slider = tv({\n\tslots: {\n\t\troot: \"grid w-64 auto-cols-fr grid-cols-1 text-fg-muted\",\n\t\tthumb:\n\t\t\t\"h-5 w-5 rounded-full bg-primary ring-focus ring-offset-2 ring-offset-surface data-[dragging]:outline-2 data-[focus-visible]:ring-2\",\n\t\ttrack:\n\t\t\t\"before:-translate-y-1/2 relative col-span-2 col-start-1 w-full before:absolute before:top-1/2 before:h-0.5 before:w-full before:transform before:bg-secondary\",\n\t},\n});\n\nconst { root, thumb, track } = slider();\n\nconst SliderRoot = ({\n\tchildren,\n\tclassName,\n\t...props\n}: SliderProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst SliderThumb = ({\n\tchildren,\n\tclassName,\n\t...props\n}: SliderThumbProps & { className?: string }) => (\n\t\n\t\t\n\t\n);\n\nconst SliderLabel = ({\n\tchildren,\n\tclassName,\n\t...props\n}: LabelProps & { className?: string }) => (\n\t
\n\t\t\n\t\t\n\t
\n);\n\nexport { SliderRoot, SliderThumb, SliderLabel };\n", - "switch": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport {\n\tSwitch as AriaSwitch,\n\ttype SwitchProps as AriaSwitchProps,\n\tLabel,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst switchStyles = tv({\n\tslots: {\n\t\troot: \"group flex items-center gap-2 transition-none duration-200\",\n\t\tindicator:\n\t\t\t\"h-6 w-10 cursor-pointer rounded-xl bg-secondary duration-200 before:mx-[3px] before:mt-[3px] before:block before:size-4.5 before:rounded-2xl before:bg-surface before:transition-all data-[selected]:bg-primary group-data-[selected]:bg-primary group-data-[focus-visible]:ring-2 group-data-[focus-visible]:ring-focus group-data-[focus-visible]:ring-offset-2 group-data-[focus-visible]:ring-offset-surface group-data-[selected]:before:translate-x-4\",\n\t\tlabel: \"font-semibold text-fg text-sm\",\n\t},\t\n});\n\nconst styles = switchStyles();\n\ninterface SwitchProps extends AriaSwitchProps {\n\tchildren?: ReactNode;\n\tclassName?: string;\n}\n\n const Switch = ({ className, children, ...restProps }: SwitchProps) => (\n\t\n\t\t
\n\t\t\n\t\n);\n\nexport { Switch };\nexport type { SwitchProps };", - "table": "\"use client\";\n\nimport {\n\tColumn as AriaColumn,\n\tTable as AriaTable,\n\tTableBody as AriaTableBody,\n\tTableHeader as AriaTableheader,\n\tCell,\n\ttype CellProps,\n\tCollection,\n\ttype ColumnProps,\n\tRow,\n\ttype RowProps,\n\ttype TableHeaderProps,\n\ttype TableProps,\n\tuseTableOptions,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nimport { Menu } from \"lucide-react\";\n\nimport { Button } from \"../button/button\";\nimport { Checkbox } from \"../checkbox/checkbox\";\n\nconst table = tv({\n\tslots: {\n\t\troot: \"table min-h-[100px] border-separate border-spacing-0 rounded-xl border border-border p-4 outline-none\",\n\t\tcolumn: \"border-border border-b-2 px-4 py-1 text-left outline-none\",\n\t\theader: \"text-fg after:table-row after:h-[2px]\",\n\t\tlabel: \"text-fg-3\",\n\t\trow: \"relative cursor-default rounded-xl text-fg outline-none ring-focus data-[focus-visible]:ring-2\",\n\t\tcell: \"px-4 py-2 outline-none ring-focus data-[focus-visible]:ring-2\",\n\t},\n});\n\nconst styles = table();\n\nconst TableBody = AriaTableBody;\n\nconst Table = ({\n\tchildren,\n\tclassName,\n\t...props\n}: TableProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst TableCell = ({\n\tchildren,\n\tclassName,\n\t...props\n}: CellProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst TableColumn = ({\n\tchildren,\n\tclassName,\n\t...props\n}: ColumnProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst TableHeader = ({\n\tchildren,\n\tclassName,\n\tcolumns,\n\t...props\n}: TableHeaderProps & { className?: string }) => {\n\tconst { selectionBehavior, selectionMode, allowsDragging } =\n\t\tuseTableOptions();\n\treturn (\n\t\t\n\t\t\t{/* Add extra columns for drag and drop and selection. */}\n\t\t\t{allowsDragging && }\n\t\t\t{selectionBehavior === \"toggle\" && (\n\t\t\t\t\n\t\t\t\t\t{selectionMode === \"multiple\" && (\n\t\t\t\t\t\t \n\t\t\t\t\t)}\n\t\t\t\t\n\t\t\t)}\n\t\t\t{children}\n\t\t\n\t);\n};\n\nconst TableRow = ({\n\tchildren,\n\tclassName,\n\tcolumns,\n\tid,\n\t...props\n}: RowProps & { className?: string }) => {\n\tconst { selectionBehavior, allowsDragging } = useTableOptions();\n\treturn (\n\t\t\n\t\t\t{allowsDragging && (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t)}\n\t\t\t{selectionBehavior === \"toggle\" && (\n\t\t\t\t\n\t\t\t\t\t \n\t\t\t\t\n\t\t\t)}\n\t\t\t{children}\n\t\t\n\t);\n};\n\nexport { TableColumn, Table, TableBody, TableCell, TableHeader, TableRow };\n", - "tabs": "\"use client\";\n\nimport {\n\tTab as AriaTab,\n\tTabList as AriaTabList,\n\ttype TabListProps as AriaTabListProps,\n\tTabPanel as AriaTabPanel,\n\ttype TabPanelProps as AriaTabPanelProps,\n\ttype TabProps as AriaTabProps,\n\ttype TabsProps as AriaTabsProps,\n\tTabs as AriaTabsRoot,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst tabs = tv({\n\tslots: {\n\t\troot: \"flex w-full flex-col items-start\",\n\t\tlist: \"relative inline-flex items-center justify-between gap-6 rounded-md p-1\",\n\t\ttab: \"relative flex w-fit cursor-pointer justify-center rounded-2xl border-primary pb-0.5 font-semibold text-fg-muted outline-none ring-focus ring-offset-2 ring-offset-surface transition-colors duration-200 aria-selected:cursor-default aria-selected:rounded-none aria-selected:border-b-2 aria-selected:pb-0 aria-selected:text-primary aria-selected:hover:bg-transparent data-[hovered]:text-primary data-[focus-visible]:ring-2\",\n\t\tpanel:\n\t\t\t\"mt-4 w-96 rounded-xl p-4 outline-none ring-focus data-[focus-visible]:ring-2\",\n\t},\n});\n\nconst styles = tabs();\n\ninterface TabsProps extends Omit {\n\tclassName?: string;\n}\n\nconst TabsRoot = ({ children, className, ...props }: TabsProps) => (\n\t\n\t\t{children}\n\t\n);\n\ninterface TabListProps extends Omit, \"className\"> {\n\tclassName?: string;\n}\n\nconst TabList = ({\n\tchildren,\n\tclassName,\n\t...props\n}: TabListProps) => (\n\t\n\t\t{children}\n\t\n);\n\ninterface TabProps extends Omit {\n\tclassName?: string;\n}\n\nconst Tab = ({ children, className, ...props }: TabProps) => (\n\t\n\t\t{children}\n\t\n);\n\ninterface TabPanelProps extends Omit {\n\tclassName?: string;\n}\n\nconst TabPanel = ({ children, className, ...props }: TabPanelProps) => (\n\t\n\t\t{children}\n\t\n);\n\nexport { Tab, TabList, TabPanel, TabsRoot };\nexport type { TabsProps, TabListProps, TabProps, TabPanelProps }; ", - "tag-group": "\"use client\";\n\nimport {\n\tTag as AriaTag,\n\tTagGroup as AriaTagGroup,\n\ttype TagGroupProps as AriaTagGroupProps,\n\ttype TagProps as AriaTagProps,\n\tLabel,\n\tTagList,\n\ttype TagListProps,\n\tText,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst tagGroup = tv({\n\tslots: {\n\t\troot: \"flex flex-col gap-2 text-sm\",\n\t\tlist: \"flex flex-wrap gap-2\",\n\t\ttag: \"flex cursor-default items-center rounded-full border border-border px-2 py-1 outline-none ring-focus ring-offset-2 ring-offset-surface aria-selected:border-primary aria-selected:bg-primary aria-selected:text-primary-fg data-[focus-visible]:ring-2\",\n\t},\n});\n\nconst styles = tagGroup();\n\ninterface TagGroupProps\n\textends Omit,\n\t\tPick, \"items\" | \"children\" | \"renderEmptyState\"> {\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string;\n}\n\nconst TagGroup = ({\n\tlabel,\n\tclassName,\n\tdescription,\n\terrorMessage,\n\titems,\n\tchildren,\n\trenderEmptyState,\n\t...props\n}: TagGroupProps) => (\n\t\n\t\t{label && }\n\t\t\n\t\t\t{children}\n\t\t\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage && (\n\t\t\t\n\t\t\t\t{errorMessage}\n\t\t\t\n\t\t)}\n\t\n);\n\nconst Tag = ({\n\tchildren,\n\tclassName,\n\t...props\n}: AriaTagProps & { className?: string }) => {\n\tconst textValue = typeof children === \"string\" ? children : undefined;\n\treturn (\n\t\t\n\t\t\t{children}\n\t\t\n\t);\n};\n\nexport { Tag, TagGroup };\n", - "time-field": "\"use client\";\n\nimport type {\n\tTimeFieldProps as AriaTimeFieldProps,\n\tTimeValue,\n} from \"react-aria-components\";\nimport {\n\tTimeField as AriaTimeField,\n\tDateInput,\n\tDateSegment,\n\tFieldError,\n\tLabel,\n\tText,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst timeField = tv({\n\tslots: {\n\t\tinput:\n\t\t\t\"appearance-none rounded-lg border border-border bg-surface px-3 py-1.75 outline-none ring-primary transition-all data-[disabled]:cursor-not-allowed data-[focus-within]:border-transparent data-[disabled]:bg-primary/10 data-[focus-within]:bg-surface data-[disabled]:text-fg-disabled data-[focus-within]:ring-2 [&::placeholder]:text-sm [&::placeholder]:focus:text-primary-fg\",\n\t\tsegmentStyles:\n\t\t\t\"rounded-md p-1 text-end outline-none focus:bg-primary focus:text-primary-fg data-[placeholder]:text-fg-muted data-[type='literal']:text-fg-muted\",\n\t},\n});\n\nconst styles = timeField();\n\ninterface TimeFieldProps extends AriaTimeFieldProps {\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string;\n}\n\nconst TimeField = ({\n\tlabel,\n\tdescription,\n\terrorMessage,\n\t...props\n}: TimeFieldProps) => (\n\t\n\t\t{label && }\n\t\t\n\t\t\t{(segment) => (\n\t\t\t\t\n\t\t\t)}\n\t\t\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage}\n\t\n);\n\nexport { TimeField };\nexport type { TimeFieldProps };\n", - "toggle": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport {\n\tToggleButton,\n\tToggleButtonGroup,\n\ttype ToggleButtonGroupProps,\n\ttype ToggleButtonProps,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst toggle = tv({\n\tbase: \"inline-flex appearance-none items-center justify-center rounded-full bg-surface-2 px-4 py-1 font-medium outline-none ring-focus ring-offset-2 ring-offset-surface transition-transform duration-100 disabled:pointer-events-none disabled:opacity-50 data-[selected]:bg-primary data-[selected]:text-primary-fg data-[focus-visible]:ring-2\",\n});\n\nconst toggleGroup = tv({\n\tbase: \"flex min-h-11 gap-1 rounded-full border border-border bg-surface-2 p-1\",\n});\n\ninterface ToggleProps extends Omit {\n\tclassName?: string;\n}\n\nconst Toggle = ({ className, children, ...props }: ToggleProps) => (\n\t\n\t\t{children}\n\t\n);\n\ninterface ToggleGroupProps extends ToggleButtonGroupProps {\n\tclassName?: string;\n\tchildren: ReactNode;\n}\n\nconst ToggleGroup = ({ className, children, ...props }: ToggleGroupProps) => (\n\t\n\t\t{children}\n\t\n);\n\nexport { Toggle, ToggleGroup };\nexport type { ToggleProps, ToggleGroupProps };\n", - "tooltip": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport {\n\tTooltip as AriaTooltip,\n\ttype TooltipProps as AriaTooltipProps,\n\tTooltipTrigger as AriaTooltipTrigger,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst tooltip = tv({\n\tbase: \"[&[data-entering]]:fade-in [&[data-exiting]]:fade-out m-1 max-w-sm rounded-full border border-border bg-surface px-4 py-2 text-fg shadow-xl outline-none [&[data-entering]]:animate-fade-in [&[data-exiting]]:animate-fade-out\",\n});\n\nconst TooltipTrigger = AriaTooltipTrigger;\n\ninterface TooltipProps extends Omit {\n\tclassName?: string;\n\tchildren: ReactNode;\n}\n\nconst Tooltip = ({ children, className, ...props }: TooltipProps) => (\n\t\n\t\t{children}\n\t\n);\n\nexport { Tooltip, TooltipTrigger };\n" -}; - -const tailwindCSS = "@variant dark ([data-theme=\"dark\"] &);\n\n:root {\n /* SURFACES (neutrals & elevation) */\n --surface: oklch(98.5% 0 0); /* app/page background */\n --surface-2: oklch(97% 0 0); /* card / raised */\n\n /* CONTENT (foreground) */\n --fg: oklch(14.5% 0 0); /* primary reading text */\n --fg-muted: oklch(55.6% 0 0); /* secondary text, captions */\n --fg-inverse: oklch(98.5% 0 0); /* text on dark */\n --fg-disabled: oklch(70.8% 0 0); /* explicit disabled state text */\n\n /* OUTLINES & DIVIDERS */\n --border: oklch(87% 0 0); /* generic 1px rules, inputs */\n --focus: oklch(68.5% 0.169 237.323); /* focus ring / a11y outline */\n\n /* INTERACTIVE ROLES (paired bg / fg ) */\n --primary: oklch(14.5% 0 0);\n --primary-fg: oklch(98.5% 0 0);\n\n --secondary: oklch(92.2% 0 0);\n --secondary-fg: oklch(14.5% 0 0);\n\n /* STATUS / FUNCTIONAL */\n \n --danger: oklch(63.7% 0.237 25.331);\n --danger-fg: #ffffff;\n}\n\n[data-theme='dark'] {\n /* SURFACES (neutrals & elevation) */\n --surface: oklch(14.5% 0 0); /* app/page background */\n --surface-2: oklch(20.5% 0 0); /* card / raised */\n\n /* CONTENT (foreground) */\n --fg: oklch(98.5% 0.001 106.423); /* primary reading text */\n --fg-muted: oklch(55.6% 0 0); /* secondary text, captions */\n --fg-inverse: oklch(98.5% 0 0); /* text on dark */\n --fg-disabled: oklch(37.1% 0 0); /* explicit disabled state text */\n\n /* OUTLINES & DIVIDERS */\n --border: oklch(37.1% 0 0); /* generic 1px rules, inputs */\n --focus: oklch(68.5% 0.169 237.323); /* focus ring / a11y outline */\n\n /* INTERACTIVE ROLES (paired bg / fg ) */\n --primary: oklch(98.5% 0 0);\n --primary-fg: oklch(14.5% 0 0);\n\n --secondary: oklch(26.9% 0 0);\n --secondary-fg: oklch(98.5% 0 0);\n\n /* STATUS / FUNCTIONAL */\n \n --danger: oklch(63.7% 0.237 25.331);\n --danger-fg: oklch(98.5% 0 0);\n}\n\n@theme {\n --color-surface: var(--surface);\n --color-surface-2: var(--surface-2);\n --color-fg: var(--fg);\n --color-fg-muted: var(--fg-muted);\n --color-fg-disabled: var(--fg-disabled);\n --color-fg-inverse: var(--fg-inverse);\n --color-border: var(--border);\n --color-focus: var(--focus);\n --color-primary: var(--primary);\n --color-primary-fg: var(--primary-fg);\n --color-secondary: var(--secondary);\n --color-secondary-fg: var(--secondary-fg);\n --color-danger: var(--danger);\n --color-danger-fg: var(--danger-fg);\n}\n\n /* clears the ‘X’ from Internet Explorer */\n input[type=\"search\"]::-ms-clear {\n display: none;\n width: 0;\n height: 0;\n }\n input[type=\"search\"]::-ms-reveal {\n display: none;\n width: 0;\n height: 0;\n }\n /* clears the ‘X’ from Chrome */\n input[type=\"search\"]::-webkit-search-decoration,\n input[type=\"search\"]::-webkit-search-cancel-button,\n input[type=\"search\"]::-webkit-search-results-button,\n input[type=\"search\"]::-webkit-search-results-decoration {\n display: none;\n } \n"; - -export default registry; - -// Helper functions -export type ComponentId = "accordion" | "badge" | "breadcrumbs" | "button" | "calendar" | "card" | "checkbox" | "combobox" | "command" | "date-field" | "date-picker" | "input" | "menu" | "meter" | "modal" | "popover" | "radio-group" | "select" | "slider" | "switch" | "table" | "tabs" | "tag-group" | "time-field" | "toggle" | "tooltip"; - -export function getComponent(id: ComponentId): ComponentRegistryEntry | null { - return registry.components.find(comp => comp.id === id) || null; -} - -export function getComponentsByCategory(category: string): ComponentRegistryEntry[] { - return registry.components.filter(comp => comp.meta.category === category); -} - -export function getComponentsByStatus(status: string): ComponentRegistryEntry[] { - return registry.components.filter(comp => comp.meta.status === status); -} - -export function searchComponents(query: string): ComponentRegistryEntry[] { - const lowercaseQuery = query.toLowerCase(); - return registry.components.filter(comp => - comp.id.toLowerCase().includes(lowercaseQuery) || - comp.meta.name.toLowerCase().includes(lowercaseQuery) || - comp.meta.description.toLowerCase().includes(lowercaseQuery) || - comp.meta.tags.some(tag => tag.toLowerCase().includes(lowercaseQuery)) - ); -} - -export function getComponentTemplate(id: ComponentId): string | null { - return templateContents[id] || null; -} - -export function getTailwindCSS(): string { - return tailwindCSS; -} - -export { registry }; -export const COMPONENTS = registry.components; -export type { ComponentRegistry, ComponentRegistryEntry }; diff --git a/packages/components/tsconfig.json b/packages/components/tsconfig.json index 6be47ed4..d45e8f64 100644 --- a/packages/components/tsconfig.json +++ b/packages/components/tsconfig.json @@ -16,7 +16,11 @@ "jsx": "react-jsx", "declaration": true, "outDir": "./dist", - "rootDir": "./src" + "rootDir": "./src", + "baseUrl": ".", + "paths": { + "@/components/ui/*": ["src/core/*"] + } }, "include": [ "src/**/*" diff --git a/packages/mcp/CHANGELOG.md b/packages/mcp/CHANGELOG.md deleted file mode 100644 index 79310763..00000000 --- a/packages/mcp/CHANGELOG.md +++ /dev/null @@ -1,24 +0,0 @@ -# @baselayer-dev/mcp - -## 2.0.2 - -### Patch Changes - -- 83f6917: bundle registry - -## 2.0.1 - -### Patch Changes - -- ffabb87: add bin - -## 2.0.0 - -### Major Changes - -- 7204382: v2 - -### Patch Changes - -- Updated dependencies [7204382] - - @baselayer/registry@2.0.0 diff --git a/packages/mcp/README.md b/packages/mcp/README.md deleted file mode 100644 index e6ef724b..00000000 --- a/packages/mcp/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# BaseLayer MCP Server - -A Model Context Protocol (MCP) server for installing BaseLayer components directly into your project. diff --git a/packages/mcp/package.json b/packages/mcp/package.json deleted file mode 100644 index ffc95325..00000000 --- a/packages/mcp/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "@baselayer-dev/mcp", - "version": "2.0.2", - "type": "module", - "description": "BaseLayer MCP Server", - "main": "build/index.js", - "types": "build/index.d.ts", - "bin": { - "mcp": "build/index.js" - }, - "files": [ - "build", - "README.md" - ], - "scripts": { - "build": "tsup", - "dev": "NODE_ENV=development tsx src/index.ts", - "start": "node build/index.js", - "type-check": "tsc --noEmit", - "lint": "echo 'No linting configured'", - "clean": "rm -rf build" - }, - "dependencies": { - "@modelcontextprotocol/sdk": "^1.13.2", - "zod": "^3.25.67" - }, - "devDependencies": { - "@baselayer/registry": "workspace:*", - "@types/node": "catalog:", - "tsup": "^8.5.0", - "tsx": "^4.20.3", - "typescript": "catalog:" - }, - "keywords": [ - "mcp", - "baselayer", - "components" - ], - "author": "zwgnr", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/zwgnr/BaseLayer.git", - "directory": "packages/mcp" - }, - "homepage": "https://github.com/zwgnr/BaseLayer#readme" -} \ No newline at end of file diff --git a/packages/mcp/src/index.ts b/packages/mcp/src/index.ts deleted file mode 100644 index e28b5ad8..00000000 --- a/packages/mcp/src/index.ts +++ /dev/null @@ -1,241 +0,0 @@ -import type { ComponentRegistryEntry } from "@baselayer/registry"; -import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import { z } from "zod"; - -import { getComponentTemplate } from "./tools/get-component-template.js"; -import { getRegistry } from "./tools/get-registry.js"; -import { initBaselayer } from "./tools/init-baselayer.js"; - -// Helper function to convert PascalCase/camelCase to kebab-case -function toKebabCase(str: string): string { - return str.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase(); -} - -const server = new McpServer({ - name: "baselayer-mcp-server", - version: "2.0.0", -}); - -server.registerTool( - "searchComponents", - { - title: "Search Components", - description: - "Search and discover BaseLayer components by name, description, tags, category, or status.", - inputSchema: {}, - }, - async (args) => { - try { - const registry = await getRegistry(); - - return { - content: [ - { - type: "text", - text: `Here are all BaseLayer components:\n\n${JSON.stringify(registry, null, 2)}\n\nSearch through these components based on the user's request: ${JSON.stringify(args)}`, - }, - ], - }; - } catch (error) { - return { - content: [ - { - type: "text", - text: `Failed to get components: ${error instanceof Error ? error.message : String(error)}`, - }, - ], - isError: true, - }; - } - }, -); - -// Get component for installation -server.registerTool( - "installComponents", - { - title: "Install Components", - description: - "Get BaseLayer component code and installation instructions for one or multiple components.", - inputSchema: { - componentNames: z - .array(z.string()) - .describe( - 'Array of component IDs to install (e.g., ["button", "input"])', - ), - }, - }, - async (args) => { - const { componentNames } = args; - - try { - if (!componentNames || componentNames.length === 0) { - throw new Error("Please provide at least one component name"); - } - - const registry = await getRegistry(); - - // First, validate all components exist and collect metadata - const componentsToFetch = []; - for (const componentId of componentNames) { - const component = registry.components.find( - (c: ComponentRegistryEntry) => c.id === componentId.toLowerCase(), - ); - - if (!component) { - const availableComponents = registry.components - .filter((c: ComponentRegistryEntry) => c?.id) - .map((c: ComponentRegistryEntry) => c.id) - .join(", "); - throw new Error( - `Component '${componentId}' not found. Available components: ${availableComponents}`, - ); - } - - const name = component?.meta?.name || component?.id; - componentsToFetch.push({ component, name }); - } - - // Fetch all component templates in parallel - const componentCodes = await Promise.all( - componentsToFetch.map(({ component }) => - getComponentTemplate(component.id), - ), - ); - - // Combine results - const componentResults = componentsToFetch.map((comp, index) => ({ - ...comp, - componentCode: componentCodes[index], - })); - - const componentSections = componentResults - .map( - ({ name, componentCode }) => - `## ${name} - -Create \`components/base/${toKebabCase(name)}.tsx\`: -\`\`\`tsx -${componentCode} -\`\`\` - -**Usage**: -- be sure to import the component from the correct path with the @/ prefix: -\`\`\`tsx -import { ${name} } from '@/components/base/${toKebabCase(name)}'; -<${name} /> -\`\`\``, - ) - .join("\n\n---\n\n"); - - return { - content: [ - { - type: "text", - text: `Successfully fetched ${componentResults.length} component${componentResults.length > 1 ? "s" : ""} - -Installation Steps: -1. Create each component file as shown below - -${componentSections}`, - }, - ], - }; - } catch (error) { - const errorMessage = - error instanceof Error ? error.message : String(error); - console.error(`Failed to fetch components:`, errorMessage); - - return { - content: [ - { - type: "text", - text: `Failed to fetch components: ${errorMessage} - -Troubleshooting: -• Make sure you can access BaseLayer at https://baselayer.dev - } -• Check that the component IDs are correct (use \`searchComponents\`)`, - }, - ], - isError: true, - }; - } - }, -); - -// Initialize BaseLayer in a project -server.registerTool( - "setupBaseLayer", - { - title: "Setup BaseLayer", - description: - "Initialises Baselayer in this repo. **Call this tool *only* if the *user explicitly requests setup*", - inputSchema: {}, - }, - async () => { - try { - const result = await initBaselayer(); - - if (!result.success) { - return { - content: [ - { - type: "text", - text: result.instructions, - }, - ], - isError: true, - }; - } - - return { - content: [ - { - type: "text", - text: result.instructions, - }, - ], - }; - } catch (error) { - const errorMessage = - error instanceof Error ? error.message : String(error); - console.error(`BaseLayer setup failed:`, errorMessage); - - return { - content: [ - { - type: "text", - text: `Failed to fetch BaseLayer setup: ${errorMessage} - -Troubleshooting: -• Ensure you can access BaseLayer at https://baselayer.dev - } -• Check your internet connection -• Try again in a few moments`, - }, - ], - isError: true, - }; - } - }, -); - -process.on("SIGINT", async () => { - await server.close(); - process.exit(0); -}); - -async function main() { - try { - const transport = new StdioServerTransport(); - await server.connect(transport); - console.error("BaseLayer MCP server running on stdio"); - } catch (error) { - console.error("Failed to start MCP server:", error); - process.exit(1); - } -} - -main().catch(console.error); diff --git a/packages/mcp/src/tools/get-component-template.ts b/packages/mcp/src/tools/get-component-template.ts deleted file mode 100644 index 4908f996..00000000 --- a/packages/mcp/src/tools/get-component-template.ts +++ /dev/null @@ -1,29 +0,0 @@ -// Get component template from BaseLayer static files -export async function getComponentTemplate(componentId: string) { - // Default to production, but allow dev override for local MCP development - const apiUrl = - process.env.NODE_ENV === "development" - ? "http://localhost:3000" - : "https://baselayer.dev"; - - try { - const templateUrl = `${apiUrl}/templates/${componentId}.txt`; - const response = await fetch(templateUrl); - - if (!response.ok) { - throw new Error( - `Static file returned ${response.status}: ${response.statusText}`, - ); - } - - const template = await response.text(); - return template; - } catch (error) { - console.error(`Failed to fetch component template:`, error); - throw new Error( - `Failed to fetch ${componentId} component: ${ - error instanceof Error ? error.message : String(error) - }`, - ); - } -} diff --git a/packages/mcp/src/tools/get-registry.ts b/packages/mcp/src/tools/get-registry.ts deleted file mode 100644 index e45d039d..00000000 --- a/packages/mcp/src/tools/get-registry.ts +++ /dev/null @@ -1,47 +0,0 @@ -// Get registry from BaseLayer static files -import { - type ComponentRegistry, - ComponentRegistrySchema, -} from "@baselayer/registry"; - -export async function getRegistry(): Promise { - // Default to production, but allow dev override for local MCP development - const apiUrl = - process.env.NODE_ENV === "development" - ? "http://localhost:3000" - : "https://baselayer.dev"; - - try { - const response = await fetch(`${apiUrl}/registry.json`); - - if (!response.ok) { - throw new Error( - `Static file returned ${response.status}: ${response.statusText}`, - ); - } - - const rawRegistry = await response.json(); - - // Validate the fetched registry - try { - const validatedRegistry = ComponentRegistrySchema.parse(rawRegistry); - return validatedRegistry; - } catch (validationError) { - console.error(`Registry validation failed:`, validationError); - throw new Error( - `Fetched registry does not conform to schema: ${ - validationError instanceof Error - ? validationError.message - : String(validationError) - }`, - ); - } - } catch (error) { - console.error(`Failed to fetch registry from static files:`, error); - throw new Error( - `Failed to fetch component registry: ${ - error instanceof Error ? error.message : String(error) - }`, - ); - } -} diff --git a/packages/mcp/src/tools/init-baselayer.ts b/packages/mcp/src/tools/init-baselayer.ts deleted file mode 100644 index 8f732d04..00000000 --- a/packages/mcp/src/tools/init-baselayer.ts +++ /dev/null @@ -1,112 +0,0 @@ -export async function initBaselayer(): Promise<{ - success: boolean; - tailwindCss: string; - instructions: string; - dependencies: string[]; -}> { - // Default to production, but allow dev override for local MCP development - const apiUrl = - process.env.NODE_ENV === "development" - ? "http://localhost:3000" - : "https://baselayer.dev"; - - try { - // Fetch BaseLayer CSS from static file endpoint - const response = await fetch(`${apiUrl}/tailwind.css`); - if (!response.ok) { - throw new Error( - `Static file returned ${response.status}: ${response.statusText}`, - ); - } - const tailwindCss = await response.text(); - - const dependencies = [ - "react-aria-components", - "lucide-react", - "tailwind-variants", - "tw-animate-css", - ]; - - const instructions = `Set up BaseLayer in this project by completing these steps: - -1. **Add BaseLayer CSS**: - - Find or create a global CSS file (globals.css, global.css, index.css, app.css, etc.) - - Add the following line to the file: - \`\`\`css - @import "tw-animate-css"; - \`\`\` - - Add the following content to the file: - \`\`\`css - ${tailwindCss} - \`\`\` - -2. **Update tsconfig.json**: - - Ensure it has these compilerOptions: - \`\`\`json - { - "compilerOptions": { - "baseUrl": ".", - "paths": { - "@/*": ["./*"] - } - } - } - \`\`\` - - **VITE APP SPECIFIC**: - // tsconfig.json - "compilerOptions": { - "baseUrl": ".", - "paths": { - "@/*": ["./src/*"] - } - } - } - // tsconfig.app.json - "compilerOptions": { - "baseUrl": ".", - "paths": { - "@/*": ["./src/*"] - } - } - // vite.config.ts - export default defineConfig({ - plugins: [react(), tailwindcss()], - resolve: { - alias: { - "@": path.resolve(__dirname, "./src"), - }, - }, - }) - \`\`\` - -3. **Install dependencies**: - - Install these packages: ${dependencies.join(", ")} - - Use the appropriate package manager (pnpm, yarn, or npm) - -4. **Create components/base directory**: - - In most projects this will be in the root directory of the web app - - In a vite project this will be in the src directory - -5. **Verify setup**: - - Check that the CSS file imports the BaseLayer styles - - Confirm TypeScript paths are configured - - Ensure all dependencies are installed`; - - return { - success: true, - tailwindCss, - instructions, - dependencies, - }; - } catch (error) { - const errorMessage = error instanceof Error ? error.message : String(error); - console.error(`Failed to fetch BaseLayer setup:`, errorMessage); - - return { - success: false, - tailwindCss: "", - instructions: `Failed to fetch BaseLayer CSS: ${errorMessage}`, - dependencies: [], - }; - } -} diff --git a/packages/mcp/tsconfig.json b/packages/mcp/tsconfig.json deleted file mode 100644 index 2f015537..00000000 --- a/packages/mcp/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "module": "ES2022", - "moduleResolution": "node", - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "strict": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "outDir": "./build", - "declaration": true, - "sourceMap": true, - "resolveJsonModule": true, - "baseUrl": "." - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "build"] - } \ No newline at end of file diff --git a/packages/mcp/tsup.config.ts b/packages/mcp/tsup.config.ts deleted file mode 100644 index ed76f1c3..00000000 --- a/packages/mcp/tsup.config.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { defineConfig } from "tsup"; - -export default defineConfig({ - entry: ["src/index.ts"], - format: ["esm"], - outDir: "build", - target: "node18", - bundle: true, - minify: false, - sourcemap: true, - clean: true, - banner: { - js: "#!/usr/bin/env node", - }, - external: ["@modelcontextprotocol/sdk"], - noExternal: ["@baselayer/registry"], -}); diff --git a/packages/registry/src/schema.ts b/packages/registry/src/schema.ts index d132ac8d..12a47640 100644 --- a/packages/registry/src/schema.ts +++ b/packages/registry/src/schema.ts @@ -1,54 +1,68 @@ -// Component Registry Schema Definition -// This defines the structure for machine-readable component metadata +// Registry Schema Definition +// This defines the structure for machine-readable component metadata compatible with shadcn import { z } from "zod"; -// Zod schemas -export const ComponentMetaSchema = z.object({ - name: z.string(), - category: z.string(), - status: z.enum(["alpha", "beta", "stable", "deprecated"]), - description: z.string(), - tags: z.array(z.string()), -}); - -export const ComponentRegistryEntrySchema = z.object({ - id: z.string(), - template: z.string(), - meta: ComponentMetaSchema, +// Zod schemas for shadcn registry compatibility +export const RegistryItemFileSchema = z.object({ + path: z.string(), + content: z.string().optional(), + type: z.enum([ + "registry:block", + "registry:component", + "registry:lib", + "registry:hook", + "registry:ui", + "registry:page", + "registry:file", + "registry:style", + "registry:theme", + "registry:item", + ]), + target: z.string().optional(), }); -export const ComponentRegistrySchema = z.object({ - version: z.string().regex(/^\d+\.\d+\.\d+(-[\w.-]+)?$/), - components: z.array(ComponentRegistryEntrySchema), -}); - -// Example registry schemas -export const ExampleRegistryEntrySchema = z.object({ +export const RegistryItemSchema = z.object({ name: z.string(), - type: z.literal("registry:example"), - files: z.array( - z.object({ - path: z.string(), - type: z.literal("registry:example"), - }), - ), + type: z.enum([ + "registry:block", // Complex components with multiple files + "registry:component", // Simple components + "registry:lib", // Lib and utils + "registry:hook", // Hooks + "registry:ui", // UI components and single-file primitives + "registry:page", // Page or file-based routes + "registry:file", // Miscellaneous files + "registry:style", // Registry styles (e.g. new-york) + "registry:theme", // Themes + "registry:item", // Universal registry items + ]), + title: z.string().optional(), + description: z.string().optional(), + author: z.string().optional(), + categories: z.array(z.string()).optional(), + docs: z.string().optional(), + registryDependencies: z.array(z.string()).optional(), + dependencies: z.array(z.string()).optional(), + devDependencies: z.array(z.string()).optional(), + files: z.array(RegistryItemFileSchema), + tailwind: z + .object({ + config: z.record(z.any()).optional(), + }) + .optional(), + cssVars: z.record(z.any()).optional(), + css: z.record(z.any()).optional(), + meta: z.record(z.any()).optional(), }); -export const ExamplesRegistrySchema = z.object({ - items: z.array(ExampleRegistryEntrySchema), +export const RegistrySchema = z.object({ + name: z.string(), + $schema: z.string(), + homepage: z.string().url().optional(), + items: z.array(RegistryItemSchema), }); // Derived TypeScript types -export type ComponentMeta = z.infer; -export type ComponentRegistryEntry = z.infer< - typeof ComponentRegistryEntrySchema ->; -export type ComponentRegistry = z.infer; -export type ExampleRegistryEntry = z.infer; -export type ExamplesRegistry = z.infer; - -// Type aliases for convenience -export type ComponentId = ComponentRegistryEntry["id"]; -export type ComponentCategory = ComponentMeta["category"]; -export type ComponentStatus = ComponentMeta["status"]; +export type RegistryItem = z.infer; +export type RegistryItemFile = z.infer; +export type Registry = z.infer; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4089539d..765e4da3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,11 +24,11 @@ importers: .: devDependencies: '@biomejs/biome': - specifier: 2.0.6 - version: 2.0.6 - '@changesets/cli': - specifier: ^2.29.5 - version: 2.29.5 + specifier: 2.2.5 + version: 2.2.5 + shadcn: + specifier: 3.4.0 + version: 3.4.0(@types/node@24.0.3)(typescript@5.8.3) turbo: specifier: ^2.5.4 version: 2.5.4 @@ -79,31 +79,6 @@ importers: specifier: 'catalog:' version: 5.8.3 - packages/mcp: - dependencies: - '@modelcontextprotocol/sdk': - specifier: ^1.13.2 - version: 1.13.2 - zod: - specifier: ^3.25.67 - version: 3.25.67 - devDependencies: - '@baselayer/registry': - specifier: workspace:* - version: link:../registry - '@types/node': - specifier: 'catalog:' - version: 24.0.3 - tsup: - specifier: ^8.5.0 - version: 8.5.0(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3) - tsx: - specifier: ^4.20.3 - version: 4.20.3 - typescript: - specifier: 'catalog:' - version: 5.8.3 - packages/registry: dependencies: zod: @@ -130,22 +105,22 @@ importers: version: 2.0.13 '@vercel/analytics': specifier: ^1.5.0 - version: 1.5.0(next@15.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0) + version: 1.5.0(next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0) fumadocs-core: specifier: ^15.5.5 - version: 15.5.5(@types/react@19.1.8)(next@15.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 15.5.5(@types/react@19.1.8)(next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) fumadocs-mdx: specifier: ^11.6.9 - version: 11.6.9(acorn@8.15.0)(fumadocs-core@15.5.5(@types/react@19.1.8)(next@15.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(next@15.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)) + version: 11.6.9(acorn@8.15.0)(fumadocs-core@15.5.5(@types/react@19.1.8)(next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)) geist: specifier: ^1.4.2 - version: 1.4.2(next@15.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)) + version: 1.4.2(next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)) lucide-react: specifier: ^0.525.0 version: 0.525.0(react@19.1.0) next: specifier: 15.3.4 - version: 15.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -209,120 +184,210 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@babel/runtime@7.27.6': - resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + '@antfu/ni@25.0.0': + resolution: {integrity: sha512-9q/yCljni37pkMr4sPrI3G4jqdIk074+iukc5aFJl7kmDCCsiJrbZ6zKxnES1Gwg+i9RcDZwvktl23puGslmvA==} + hasBin: true + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.4': + resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.4': + resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.28.3': + resolution: {integrity: sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.28.0': + resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.27.1': + resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.4': + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} engines: {node: '>=6.9.0'} '@base2/pretty-print-object@1.0.2': resolution: {integrity: sha512-rBha0UDfV7EmBRjWrGG7Cpwxg8WomPlo0q+R2so47ZFf9wy4YKJzLuHcVa0UGFjdcLZj/4F/1FNC46GIQhe7sA==} - '@biomejs/biome@2.0.6': - resolution: {integrity: sha512-RRP+9cdh5qwe2t0gORwXaa27oTOiQRQvrFf49x2PA1tnpsyU7FIHX4ZOFMtBC4QNtyWsN7Dqkf5EDbg4X+9iqA==} + '@biomejs/biome@2.2.5': + resolution: {integrity: sha512-zcIi+163Rc3HtyHbEO7CjeHq8DjQRs40HsGbW6vx2WI0tg8mYQOPouhvHSyEnCBAorfYNnKdR64/IxO7xQ5faw==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.0.6': - resolution: {integrity: sha512-AzdiNNjNzsE6LfqWyBvcL29uWoIuZUkndu+wwlXW13EKcBHbbKjNQEZIJKYDc6IL+p7bmWGx3v9ZtcRyIoIz5A==} + '@biomejs/cli-darwin-arm64@2.2.5': + resolution: {integrity: sha512-MYT+nZ38wEIWVcL5xLyOhYQQ7nlWD0b/4mgATW2c8dvq7R4OQjt/XGXFkXrmtWmQofaIM14L7V8qIz/M+bx5QQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.0.6': - resolution: {integrity: sha512-wJjjP4E7bO4WJmiQaLnsdXMa516dbtC6542qeRkyJg0MqMXP0fvs4gdsHhZ7p9XWTAmGIjZHFKXdsjBvKGIJJQ==} + '@biomejs/cli-darwin-x64@2.2.5': + resolution: {integrity: sha512-FLIEl73fv0R7dI10EnEiZLw+IMz3mWLnF95ASDI0kbx6DDLJjWxE5JxxBfmG+udz1hIDd3fr5wsuP7nwuTRdAg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.0.6': - resolution: {integrity: sha512-CVPEMlin3bW49sBqLBg2x016Pws7eUXA27XYDFlEtponD0luYjg2zQaMJ2nOqlkKG9fqzzkamdYxHdMDc2gZFw==} + '@biomejs/cli-linux-arm64-musl@2.2.5': + resolution: {integrity: sha512-5Ov2wgAFwqDvQiESnu7b9ufD1faRa+40uwrohgBopeY84El2TnBDoMNXx6iuQdreoFGjwW8vH6k68G21EpNERw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-arm64@2.0.6': - resolution: {integrity: sha512-ZSVf6TYo5rNMUHIW1tww+rs/krol7U5A1Is/yzWyHVZguuB0lBnIodqyFuwCNqG9aJGyk7xIMS8HG0qGUPz0SA==} + '@biomejs/cli-linux-arm64@2.2.5': + resolution: {integrity: sha512-5DjiiDfHqGgR2MS9D+AZ8kOfrzTGqLKywn8hoXpXXlJXIECGQ32t+gt/uiS2XyGBM2XQhR6ztUvbjZWeccFMoQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-x64-musl@2.0.6': - resolution: {integrity: sha512-mKHE/e954hR/hSnAcJSjkf4xGqZc/53Kh39HVW1EgO5iFi0JutTN07TSjEMg616julRtfSNJi0KNyxvc30Y4rQ==} + '@biomejs/cli-linux-x64-musl@2.2.5': + resolution: {integrity: sha512-AVqLCDb/6K7aPNIcxHaTQj01sl1m989CJIQFQEaiQkGr2EQwyOpaATJ473h+nXDUuAcREhccfRpe/tu+0wu0eQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-linux-x64@2.0.6': - resolution: {integrity: sha512-geM1MkHTV1Kh2Cs/Xzot9BOF3WBacihw6bkEmxkz4nSga8B9/hWy5BDiOG3gHDGIBa8WxT0nzsJs2f/hPqQIQw==} + '@biomejs/cli-linux-x64@2.2.5': + resolution: {integrity: sha512-fq9meKm1AEXeAWan3uCg6XSP5ObA6F/Ovm89TwaMiy1DNIwdgxPkNwxlXJX8iM6oRbFysYeGnT0OG8diCWb9ew==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-win32-arm64@2.0.6': - resolution: {integrity: sha512-290V4oSFoKaprKE1zkYVsDfAdn0An5DowZ+GIABgjoq1ndhvNxkJcpxPsiYtT7slbVe3xmlT0ncdfOsN7KruzA==} + '@biomejs/cli-win32-arm64@2.2.5': + resolution: {integrity: sha512-xaOIad4wBambwJa6mdp1FigYSIF9i7PCqRbvBqtIi9y29QtPVQ13sDGtUnsRoe6SjL10auMzQ6YAe+B3RpZXVg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.0.6': - resolution: {integrity: sha512-bfM1Bce0d69Ao7pjTjUS+AWSZ02+5UHdiAP85Th8e9yV5xzw6JrHXbL5YWlcEKQ84FIZMdDc7ncuti1wd2sdbw==} + '@biomejs/cli-win32-x64@2.2.5': + resolution: {integrity: sha512-F/jhuXCssPFAuciMhHKk00xnCAxJRS/pUzVfXYmOMUp//XW7mO6QeCjsjvnm8L4AO/dG2VOB0O+fJPiJ2uXtIw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] - '@changesets/apply-release-plan@7.0.12': - resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} - - '@changesets/assemble-release-plan@6.0.9': - resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} + '@bundled-es-modules/cookie@2.0.1': + resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==} - '@changesets/changelog-git@0.2.1': - resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} + '@bundled-es-modules/statuses@1.0.1': + resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} - '@changesets/cli@2.29.5': - resolution: {integrity: sha512-0j0cPq3fgxt2dPdFsg4XvO+6L66RC0pZybT9F4dG5TBrLA3jA/1pNkdTXH9IBBVHkgsKrNKenI3n1mPyPlIydg==} + '@dotenvx/dotenvx@1.51.0': + resolution: {integrity: sha512-CbMGzyOYSyFF7d4uaeYwO9gpSBzLTnMmSmTVpCZjvpJFV69qYbjYPpzNnCz1mb2wIvEhjWjRwQWuBzTO0jITww==} hasBin: true - '@changesets/config@3.1.1': - resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} - - '@changesets/errors@0.2.0': - resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - - '@changesets/get-dependents-graph@2.1.3': - resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} - - '@changesets/get-release-plan@4.0.13': - resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==} - - '@changesets/get-version-range-type@0.4.0': - resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - - '@changesets/git@3.0.4': - resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} - - '@changesets/logger@0.1.1': - resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} - - '@changesets/parse@0.4.1': - resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} - - '@changesets/pre@2.0.2': - resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} - - '@changesets/read@0.6.5': - resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} - - '@changesets/should-skip-package@0.1.2': - resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} - - '@changesets/types@4.1.0': - resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - - '@changesets/types@6.1.0': - resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} - - '@changesets/write@0.4.0': - resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@ecies/ciphers@0.2.4': + resolution: {integrity: sha512-t+iX+Wf5nRKyNzk8dviW3Ikb/280+aEJAnw9YXvCp2tYGPSkMki+NRY+8aNLmVFv3eNtMdvViPNOPxS8SZNP+w==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} + peerDependencies: + '@noble/ciphers': ^1.0.0 '@emnapi/runtime@1.4.3': resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} @@ -608,6 +673,41 @@ packages: cpu: [x64] os: [win32] + '@inquirer/ansi@1.0.0': + resolution: {integrity: sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA==} + engines: {node: '>=18'} + + '@inquirer/confirm@5.1.18': + resolution: {integrity: sha512-MilmWOzHa3Ks11tzvuAmFoAd/wRuaP3SwlT1IZhyMke31FKLxPiuDWcGXhU+PKveNOpAc4axzAgrgxuIJJRmLw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.2.2': + resolution: {integrity: sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.13': + resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} + engines: {node: '>=18'} + + '@inquirer/type@3.0.8': + resolution: {integrity: sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@internationalized/date@3.8.2': resolution: {integrity: sha512-/wENk7CbvLbkUvX1tu0mwq49CVkkWpkXubGel6birjRPyo6uQ4nQpnq5xZu823zRCwwn82zgHrvgF1vZyvmVgA==} @@ -628,18 +728,20 @@ packages: resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} engines: {node: 20 || >=22} - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - '@isaacs/fs-minipass@4.0.1': resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -654,17 +756,18 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@manypkg/find-root@1.1.0': - resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} - - '@manypkg/get-packages@1.1.3': - resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@mdx-js/mdx@3.1.0': resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} - '@modelcontextprotocol/sdk@1.13.2': - resolution: {integrity: sha512-Vx7qOcmoKkR3qhaQ9qf3GxiVKCEu+zfJddHv6x3dY/9P6+uIwJnmuAur5aB+4FDXf41rRrDnOEGkviX5oYZ67w==} + '@modelcontextprotocol/sdk@1.19.1': + resolution: {integrity: sha512-3Y2h3MZKjec1eAqSTBclATlX+AbC6n1LgfVzRMJLt3v6w0RCYgwLrjbxPDbhsYHt6Wdqc/aCceNJYgj448ELQQ==} + engines: {node: '>=18'} + + '@mswjs/interceptors@0.39.7': + resolution: {integrity: sha512-sURvQbbKsq5f8INV54YJgJEdk8oxBanqkTiXXd33rKmofFCwZLhLRszPduMZ9TA9b8/1CHc/IJmOlBHJk2Q5AQ==} engines: {node: '>=18'} '@next/env@15.3.4': @@ -718,6 +821,18 @@ packages: cpu: [x64] os: [win32] + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.7': + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -730,14 +845,19 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@open-draft/deferred-promise@2.2.0': + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + + '@open-draft/logger@0.3.0': + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + + '@open-draft/until@2.1.0': + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + '@orama/orama@3.1.9': resolution: {integrity: sha512-UXQYvN0DYl5EMOXX3O0Rwke+0R0Pd7PW/hOVwgpPd6KKJPb3RP74m3PEbEFjdTzZVLUW81o7herYXD2h4PVcGQ==} engines: {node: '>= 20.0.0'} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - '@react-aria/autocomplete@3.0.0-beta.6': resolution: {integrity: sha512-/i0Y1nJNSDk5k49tlApYfFCylZO597KQSMy4AbG60W6VNUw51QrmY9bzO3zdGAEVdPSuMys/72KwvV6LOpllyQ==} peerDependencies: @@ -1424,6 +1544,9 @@ packages: cpu: [x64] os: [win32] + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@shikijs/core@3.7.0': resolution: {integrity: sha512-yilc0S9HvTPyahHpcum8eonYrQtmGTU0lbtwxhA6jHv4Bm1cAdlPFRCJX4AHebkCm75aKTjjRAW+DezqD1b/cg==} @@ -1451,6 +1574,10 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + '@standard-schema/spec@1.0.0': resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} @@ -1556,6 +1683,9 @@ packages: '@ts-morph/common@0.27.0': resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -1577,9 +1707,6 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@24.0.3': resolution: {integrity: sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==} @@ -1591,6 +1718,9 @@ packages: '@types/react@19.1.8': resolution: {integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==} + '@types/statuses@2.0.6': + resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} + '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -1640,41 +1770,35 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} @@ -1683,29 +1807,22 @@ packages: bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - better-path-resolve@1.0.0: - resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} - engines: {node: '>=4'} + baseline-browser-mapping@2.8.12: + resolution: {integrity: sha512-vAPMQdnyKCBtkmQA6FMCBvU9qFIppS3nzyXnEM+Lo2IAhG4Mpjv9cCxMudhgV3YdNNJv6TNqXy97dfRVL2LmaQ==} + hasBin: true body-parser@2.2.0: resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} engines: {node: '>=18'} - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - bundle-require@5.1.0: - resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: '>=0.18' + browserslist@4.26.3: + resolution: {integrity: sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} @@ -1715,10 +1832,6 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -1727,12 +1840,23 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + caniuse-lite@1.0.30001724: resolution: {integrity: sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==} + caniuse-lite@1.0.30001748: + resolution: {integrity: sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w==} + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -1745,9 +1869,6 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -1756,13 +1877,25 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -1790,20 +1923,17 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@14.0.1: + resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} + engines: {node: '>=20'} compute-scroll-into-view@3.1.1: resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} - confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - - consola@3.4.2: - resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} - engines: {node: ^14.18.0 || >=16.10.0} - content-disposition@1.0.0: resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} engines: {node: '>= 0.6'} @@ -1812,6 +1942,9 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-signature@1.2.2: resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} @@ -1824,6 +1957,15 @@ packages: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1836,6 +1978,10 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -1851,6 +1997,18 @@ packages: decode-named-character-reference@1.2.0: resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + dedent@1.7.0: + resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -1859,10 +2017,6 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - detect-libc@2.0.4: resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} @@ -1873,26 +2027,34 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + diff@8.0.2: + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + engines: {node: '>=0.3.1'} + + dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} + engines: {node: '>=12'} dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + eciesjs@0.4.15: + resolution: {integrity: sha512-r6kEJXDKecVOCj2nLMuXK/FCPeurW33+3JRpfXVbjLja3XUYFfD9I/JBreH6sUyzcm3G/YQboBjMla6poKeSdA==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + electron-to-chromium@1.5.230: + resolution: {integrity: sha512-A6A6Fd3+gMdaed9wX83CvHYJb4UuapPD5X5SLq72VZJzxHSY0/LUweGXRWmQlh2ln7KV7iw7jnwXK7dlPoOnHQ==} + + emoji-regex@10.5.0: + resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -1901,9 +2063,12 @@ packages: resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} - enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} @@ -1928,6 +2093,10 @@ packages: engines: {node: '>=18'} hasBin: true + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -1968,19 +2137,27 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - eventsource-parser@3.0.2: - resolution: {integrity: sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA==} + eventsource-parser@3.0.6: + resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} engines: {node: '>=18.0.0'} eventsource@3.0.7: resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} engines: {node: '>=18.0.0'} - express-rate-limit@7.5.0: - resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==} + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@9.6.0: + resolution: {integrity: sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==} + engines: {node: ^18.19.0 || >=20.5.0} + + express-rate-limit@7.5.1: + resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} engines: {node: '>= 16'} peerDependencies: - express: ^4.11 || 5 || ^5.0.0-beta.1 + express: '>= 4.11' express@5.1.0: resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} @@ -1989,13 +2166,6 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - extendable-error@0.1.7: - resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2017,6 +2187,14 @@ packages: picomatch: optional: true + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -2025,16 +2203,9 @@ packages: resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} engines: {node: '>= 0.8'} - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - - fix-dts-default-cjs-exports@1.0.1: - resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} - - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} @@ -2044,13 +2215,9 @@ packages: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} - fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - - fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@11.3.2: + resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} + engines: {node: '>=14.14'} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -2099,11 +2266,29 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + fuzzysort@3.1.0: + resolution: {integrity: sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==} + + fzf@0.5.2: + resolution: {integrity: sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==} + geist@1.4.2: resolution: {integrity: sha512-OQUga/KUc8ueijck6EbtT07L4tZ5+TZgjw8PyWfxo16sL5FWk7gNViPNU8hgCFjy6bJi9yuTP+CRpywzaGN8zw==} peerDependencies: next: '>=13.2.0' + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -2112,10 +2297,22 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} + get-own-enumerable-keys@1.0.0: + resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} + engines: {node: '>=14.16'} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + get-tsconfig@4.10.1: resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} @@ -2126,14 +2323,6 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -2141,6 +2330,10 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graphql@16.11.0: + resolution: {integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -2164,6 +2357,9 @@ packages: hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + headers-polyfill@4.0.3: + resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} @@ -2171,18 +2367,26 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} - human-id@4.1.1: - resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} - hasBin: true + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -2192,6 +2396,10 @@ packages: engines: {node: '>=16.x'} hasBin: true + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -2211,6 +2419,9 @@ packages: is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} @@ -2232,10 +2443,21 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-obj@3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} + is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -2247,41 +2469,70 @@ packages: is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - is-subdir@1.2.0: - resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} - engines: {node: '>=4'} + is-regexp@3.1.0: + resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} + engines: {node: '>=12'} - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} - isexe@2.0.0: + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} jiti@2.4.2: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true - joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} lightningcss-darwin-arm64@1.30.1: resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} @@ -2347,21 +2598,9 @@ packages: resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} engines: {node: '>= 12.0.0'} - lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} - lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - lodash.castarray@4.4.0: resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} @@ -2371,22 +2610,20 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - - lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.1.0: resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} engines: {node: 20 || >=22} + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lucide-react@0.525.0: resolution: {integrity: sha512-Tm1txJ2OkymCGkvwoHt33Y2JpN5xucVq1slHcgE6Lk0WjDfjgKWor5CdVER8U6DvcfMwh4M8XxmpTiyzfmfDYQ==} peerDependencies: @@ -2462,6 +2699,9 @@ packages: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -2583,13 +2823,20 @@ packages: resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} engines: {node: '>= 0.6'} + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + minimatch@10.0.3: resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} engines: {node: 20 || >=22} - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} @@ -2604,18 +2851,22 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.7.4: - resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} - - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + msw@2.11.3: + resolution: {integrity: sha512-878imp8jxIpfzuzxYfX0qqTq1IFQz/1/RBHs/PyirSjzi+xKM/RRfIpIqHSCWjH0GxidrjhgiiXC+DWXNDvT9w==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + typescript: '>= 4.8.x' + peerDependenciesMeta: + typescript: + optional: true + + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} @@ -2653,6 +2904,26 @@ packages: sass: optional: true + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-releases@2.0.23: + resolution: {integrity: sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -2661,6 +2932,10 @@ packages: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} + object-treeify@1.1.33: + resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} + engines: {node: '>= 10'} + on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -2668,48 +2943,45 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + oniguruma-parser@0.12.1: resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} oniguruma-to-es@4.3.3: resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - - outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - - p-filter@2.1.0: - resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} - engines: {node: '>=8'} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + ora@8.2.0: + resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} + engines: {node: '>=18'} - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + outvariant@1.4.3: + resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} - p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} + package-manager-detector@1.3.0: + resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - - package-manager-detector@0.2.11: - resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} - parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -2717,28 +2989,19 @@ packages: path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - - path-to-regexp@8.2.0: - resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} - engines: {node: '>=16'} + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2751,39 +3014,10 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} - pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - - pirates@4.0.7: - resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} - engines: {node: '>= 6'} - pkce-challenge@5.0.0: resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} engines: {node: '>=16.20.0'} - pkg-types@1.3.1: - resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - - postcss-load-config@6.0.1: - resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} - engines: {node: '>= 18'} - peerDependencies: - jiti: '>=1.21.0' - postcss: '>=8.0.9' - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - jiti: - optional: true - postcss: - optional: true - tsx: - optional: true - yaml: - optional: true - postcss-selector-parser@6.0.10: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} engines: {node: '>=4'} @@ -2796,10 +3030,13 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} @@ -2816,9 +3053,6 @@ packages: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} - quansync@0.2.10: - resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -2826,9 +3060,9 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - raw-body@3.0.0: - resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} - engines: {node: '>= 0.8'} + raw-body@3.0.1: + resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==} + engines: {node: '>= 0.10'} react-aria-components@1.11.0: resolution: {integrity: sha512-+NxjfCiswbssoCNPJ1H5NEPnM2G7whM5bZSjkSUPXS3ZbbqQ1KSmSWHT34V4mrU+kpFfEZeZ/6E6GBYfugndig==} @@ -2896,14 +3130,14 @@ packages: resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} engines: {node: '>=0.10.0'} - read-yaml-file@1.1.0: - resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} - engines: {node: '>=6'} - readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + recma-build-jsx@1.0.0: resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} @@ -2946,13 +3180,24 @@ packages: remark@15.0.1: resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + rettime@0.7.0: + resolution: {integrity: sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw==} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -2981,6 +3226,10 @@ packages: scroll-into-view-if-needed@3.1.0: resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + semver@7.7.2: resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} @@ -2997,6 +3246,10 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + shadcn@3.4.0: + resolution: {integrity: sha512-2fZC7+seml8/Eq77TKRJEotJY+llQsuFK4j8cHWk1oe4Qhit/ekai4w+cyaudwKNc+eTFqldR7rLxtTGCxJZ7Q==} + hasBin: true + sharp@0.34.2: resolution: {integrity: sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3028,6 +3281,9 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -3035,31 +3291,24 @@ packages: simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + source-map@0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} - source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - spawndamnit@3.0.1: - resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} @@ -3068,33 +3317,52 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} + strict-event-emitter@0.5.1: + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + stringify-object@5.0.0: + resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} + engines: {node: '>=14.16'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + style-to-js@1.1.17: resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} @@ -3114,11 +3382,6 @@ packages: babel-plugin-macros: optional: true - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - tailwind-merge@3.3.1: resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==} @@ -3143,19 +3406,8 @@ packages: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} - term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} - engines: {node: '>=8'} - - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} tinyexec@1.0.1: resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} @@ -3164,9 +3416,12 @@ packages: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + tldts-core@7.0.16: + resolution: {integrity: sha512-XHhPmHxphLi+LGbH0G/O7dmUH9V65OY20R7vH8gETHsp5AZCjBk9l8sqmRKLaGOxnETU7XNSDUPtewAy/K6jbA==} + + tldts@7.0.16: + resolution: {integrity: sha512-5bdPHSwbKTeHmXrgecID4Ljff8rQjv7g8zKQPkCozRo2HWWni+p310FSn5ImI+9kWw9kK4lzOB5q/a6iv0IJsw==} + hasBin: true to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -3176,12 +3431,9 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true + tough-cookie@6.0.0: + resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + engines: {node: '>=16'} trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -3189,34 +3441,16 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-morph@26.0.0: resolution: {integrity: sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==} + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsup@8.5.0: - resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - '@microsoft/api-extractor': ^7.36.0 - '@swc/core': ^1 - postcss: ^8.4.12 - typescript: '>=4.5.0' - peerDependenciesMeta: - '@microsoft/api-extractor': - optional: true - '@swc/core': - optional: true - postcss: - optional: true - typescript: - optional: true - tsx@4.20.3: resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} engines: {node: '>=18.0.0'} @@ -3259,6 +3493,10 @@ packages: tw-animate-css@1.3.6: resolution: {integrity: sha512-9dy0R9UsYEGmgf26L8UcHiLmSFTHa9+D7+dAt/G/sF5dCnPePZbfgDYinc7/UzAM7g/baVrmS6m9yEpU46d+LA==} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + type-is@2.0.1: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} @@ -3268,12 +3506,13 @@ packages: engines: {node: '>=14.17'} hasBin: true - ufo@1.6.1: - resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} - undici-types@7.8.0: resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} @@ -3295,14 +3534,23 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + until-async@3.0.2: + resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -3384,34 +3632,60 @@ packages: yaml: optional: true - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@5.0.0: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} - zod-to-json-schema@3.24.5: - resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + + zod-to-json-schema@3.24.6: + resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==} peerDependencies: zod: ^3.24.1 @@ -3430,186 +3704,259 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@babel/runtime@7.27.6': {} + '@antfu/ni@25.0.0': + dependencies: + ansis: 4.2.0 + fzf: 0.5.2 + package-manager-detector: 1.3.0 + tinyexec: 1.0.1 - '@base2/pretty-print-object@1.0.2': {} + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 - '@biomejs/biome@2.0.6': - optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.0.6 - '@biomejs/cli-darwin-x64': 2.0.6 - '@biomejs/cli-linux-arm64': 2.0.6 - '@biomejs/cli-linux-arm64-musl': 2.0.6 - '@biomejs/cli-linux-x64': 2.0.6 - '@biomejs/cli-linux-x64-musl': 2.0.6 - '@biomejs/cli-win32-arm64': 2.0.6 - '@biomejs/cli-win32-x64': 2.0.6 - - '@biomejs/cli-darwin-arm64@2.0.6': - optional: true + '@babel/compat-data@7.28.4': {} + + '@babel/core@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - '@biomejs/cli-darwin-x64@2.0.6': - optional: true + '@babel/generator@7.28.3': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 - '@biomejs/cli-linux-arm64-musl@2.0.6': - optional: true + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.4 - '@biomejs/cli-linux-arm64@2.0.6': - optional: true + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.4 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.26.3 + lru-cache: 5.1.1 + semver: 6.3.1 - '@biomejs/cli-linux-x64-musl@2.0.6': - optional: true + '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.4 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - '@biomejs/cli-linux-x64@2.0.6': - optional: true + '@babel/helper-globals@7.28.0': {} - '@biomejs/cli-win32-arm64@2.0.6': - optional: true + '@babel/helper-member-expression-to-functions@7.27.1': + dependencies: + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color - '@biomejs/cli-win32-x64@2.0.6': - optional: true + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color - '@changesets/apply-release-plan@7.0.12': - dependencies: - '@changesets/config': 3.1.1 - '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.4 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - detect-indent: 6.1.0 - fs-extra: 7.0.1 - lodash.startcase: 4.4.0 - outdent: 0.5.0 - prettier: 2.8.8 - resolve-from: 5.0.0 - semver: 7.7.2 + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color - '@changesets/assemble-release-plan@6.0.9': + '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - semver: 7.7.2 + '@babel/types': 7.28.4 - '@changesets/changelog-git@0.2.1': - dependencies: - '@changesets/types': 6.1.0 - - '@changesets/cli@2.29.5': - dependencies: - '@changesets/apply-release-plan': 7.0.12 - '@changesets/assemble-release-plan': 6.0.9 - '@changesets/changelog-git': 0.2.1 - '@changesets/config': 3.1.1 - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/get-release-plan': 4.0.13 - '@changesets/git': 3.0.4 - '@changesets/logger': 0.1.1 - '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.5 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@changesets/write': 0.4.0 - '@manypkg/get-packages': 1.1.3 - ansi-colors: 4.1.3 - ci-info: 3.9.0 - enquirer: 2.4.1 - external-editor: 3.1.0 - fs-extra: 7.0.1 - mri: 1.2.0 - p-limit: 2.3.0 - package-manager-detector: 0.2.11 - picocolors: 1.1.1 - resolve-from: 5.0.0 - semver: 7.7.2 - spawndamnit: 3.0.1 - term-size: 2.2.1 + '@babel/helper-plugin-utils@7.27.1': {} - '@changesets/config@3.1.1': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.4)': dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/logger': 0.1.1 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - micromatch: 4.0.8 + '@babel/core': 7.28.4 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color - '@changesets/errors@0.2.0': + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - extendable-error: 0.1.7 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} - '@changesets/get-dependents-graph@2.1.3': + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.4': dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - picocolors: 1.1.1 - semver: 7.7.2 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 - '@changesets/get-release-plan@4.0.13': + '@babel/parser@7.28.4': dependencies: - '@changesets/assemble-release-plan': 6.0.9 - '@changesets/config': 3.1.1 - '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.5 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 + '@babel/types': 7.28.4 - '@changesets/get-version-range-type@0.4.0': {} + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - '@changesets/git@3.0.4': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.4)': dependencies: - '@changesets/errors': 0.2.0 - '@manypkg/get-packages': 1.1.3 - is-subdir: 1.2.0 - micromatch: 4.0.8 - spawndamnit: 3.0.1 + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - '@changesets/logger@0.1.1': + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.4)': dependencies: - picocolors: 1.1.1 + '@babel/core': 7.28.4 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color - '@changesets/parse@0.4.1': + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.4)': dependencies: - '@changesets/types': 6.1.0 - js-yaml: 3.14.1 + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + transitivePeerDependencies: + - supports-color - '@changesets/pre@2.0.2': + '@babel/preset-typescript@7.27.1(@babel/core@7.28.4)': dependencies: - '@changesets/errors': 0.2.0 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4) + transitivePeerDependencies: + - supports-color - '@changesets/read@0.6.5': + '@babel/template@7.27.2': dependencies: - '@changesets/git': 3.0.4 - '@changesets/logger': 0.1.1 - '@changesets/parse': 0.4.1 - '@changesets/types': 6.1.0 - fs-extra: 7.0.1 - p-filter: 2.1.0 - picocolors: 1.1.1 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 - '@changesets/should-skip-package@0.1.2': + '@babel/traverse@7.28.4': dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color - '@changesets/types@4.1.0': {} + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 - '@changesets/types@6.1.0': {} + '@base2/pretty-print-object@1.0.2': {} - '@changesets/write@0.4.0': + '@biomejs/biome@2.2.5': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.2.5 + '@biomejs/cli-darwin-x64': 2.2.5 + '@biomejs/cli-linux-arm64': 2.2.5 + '@biomejs/cli-linux-arm64-musl': 2.2.5 + '@biomejs/cli-linux-x64': 2.2.5 + '@biomejs/cli-linux-x64-musl': 2.2.5 + '@biomejs/cli-win32-arm64': 2.2.5 + '@biomejs/cli-win32-x64': 2.2.5 + + '@biomejs/cli-darwin-arm64@2.2.5': + optional: true + + '@biomejs/cli-darwin-x64@2.2.5': + optional: true + + '@biomejs/cli-linux-arm64-musl@2.2.5': + optional: true + + '@biomejs/cli-linux-arm64@2.2.5': + optional: true + + '@biomejs/cli-linux-x64-musl@2.2.5': + optional: true + + '@biomejs/cli-linux-x64@2.2.5': + optional: true + + '@biomejs/cli-win32-arm64@2.2.5': + optional: true + + '@biomejs/cli-win32-x64@2.2.5': + optional: true + + '@bundled-es-modules/cookie@2.0.1': + dependencies: + cookie: 0.7.2 + + '@bundled-es-modules/statuses@1.0.1': + dependencies: + statuses: 2.0.2 + + '@dotenvx/dotenvx@1.51.0': + dependencies: + commander: 11.1.0 + dotenv: 17.2.3 + eciesjs: 0.4.15 + execa: 5.1.1 + fdir: 6.4.6(picomatch@4.0.2) + ignore: 5.3.2 + object-treeify: 1.1.33 + picomatch: 4.0.2 + which: 4.0.0 + + '@ecies/ciphers@0.2.4(@noble/ciphers@1.3.0)': dependencies: - '@changesets/types': 6.1.0 - fs-extra: 7.0.1 - human-id: 4.1.1 - prettier: 2.8.8 + '@noble/ciphers': 1.3.0 '@emnapi/runtime@1.4.3': dependencies: @@ -3798,6 +4145,34 @@ snapshots: '@img/sharp-win32-x64@0.34.2': optional: true + '@inquirer/ansi@1.0.0': {} + + '@inquirer/confirm@5.1.18(@types/node@24.0.3)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@24.0.3) + '@inquirer/type': 3.0.8(@types/node@24.0.3) + optionalDependencies: + '@types/node': 24.0.3 + + '@inquirer/core@10.2.2(@types/node@24.0.3)': + dependencies: + '@inquirer/ansi': 1.0.0 + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@24.0.3) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.0.3 + + '@inquirer/figures@1.0.13': {} + + '@inquirer/type@3.0.8(@types/node@24.0.3)': + optionalDependencies: + '@types/node': 24.0.3 + '@internationalized/date@3.8.2': dependencies: '@swc/helpers': 0.5.15 @@ -3821,25 +4196,26 @@ snapshots: dependencies: '@isaacs/balanced-match': 4.0.1 - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - '@isaacs/fs-minipass@4.0.1': dependencies: minipass: 7.1.2 + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} @@ -3851,21 +4227,10 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@manypkg/find-root@1.1.0': + '@jridgewell/trace-mapping@0.3.31': dependencies: - '@babel/runtime': 7.27.6 - '@types/node': 12.20.55 - find-up: 4.1.0 - fs-extra: 8.1.0 - - '@manypkg/get-packages@1.1.3': - dependencies: - '@babel/runtime': 7.27.6 - '@changesets/types': 4.1.0 - '@manypkg/find-root': 1.1.0 - fs-extra: 8.1.0 - globby: 11.1.0 - read-yaml-file: 1.1.0 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 '@mdx-js/mdx@3.1.0(acorn@8.15.0)': dependencies: @@ -3897,22 +4262,32 @@ snapshots: - acorn - supports-color - '@modelcontextprotocol/sdk@1.13.2': + '@modelcontextprotocol/sdk@1.19.1': dependencies: ajv: 6.12.6 content-type: 1.0.5 cors: 2.8.5 cross-spawn: 7.0.6 eventsource: 3.0.7 + eventsource-parser: 3.0.6 express: 5.1.0 - express-rate-limit: 7.5.0(express@5.1.0) + express-rate-limit: 7.5.1(express@5.1.0) pkce-challenge: 5.0.0 - raw-body: 3.0.0 + raw-body: 3.0.1 zod: 3.25.67 - zod-to-json-schema: 3.24.5(zod@3.25.67) + zod-to-json-schema: 3.24.6(zod@3.25.67) transitivePeerDependencies: - supports-color + '@mswjs/interceptors@0.39.7': + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.3 + strict-event-emitter: 0.5.1 + '@next/env@15.3.4': {} '@next/swc-darwin-arm64@15.3.4': @@ -3939,6 +4314,14 @@ snapshots: '@next/swc-win32-x64-msvc@15.3.4': optional: true + '@noble/ciphers@1.3.0': {} + + '@noble/curves@1.9.7': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/hashes@1.8.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3951,10 +4334,16 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@orama/orama@3.1.9': {} + '@open-draft/deferred-promise@2.2.0': {} - '@pkgjs/parseargs@0.11.0': - optional: true + '@open-draft/logger@0.3.0': + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.3 + + '@open-draft/until@2.1.0': {} + + '@orama/orama@3.1.9': {} '@react-aria/autocomplete@3.0.0-beta.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: @@ -5058,6 +5447,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.44.0': optional: true + '@sec-ant/readable-stream@0.4.1': {} + '@shikijs/core@3.7.0': dependencies: '@shikijs/types': 3.7.0 @@ -5105,6 +5496,8 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} + '@sindresorhus/merge-streams@4.0.0': {} + '@standard-schema/spec@1.0.0': {} '@swc/counter@0.1.3': {} @@ -5199,6 +5592,8 @@ snapshots: minimatch: 10.0.3 path-browserify: 1.0.1 + '@types/cookie@0.6.0': {} + '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 @@ -5221,8 +5616,6 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@12.20.55': {} - '@types/node@24.0.3': dependencies: undici-types: 7.8.0 @@ -5235,15 +5628,17 @@ snapshots: dependencies: csstype: 3.1.3 + '@types/statuses@2.0.6': {} + '@types/unist@2.0.11': {} '@types/unist@3.0.3': {} '@ungap/structured-clone@1.3.0': {} - '@vercel/analytics@1.5.0(next@15.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)': + '@vercel/analytics@1.5.0(next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)': optionalDependencies: - next: 15.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 accepts@2.0.0: @@ -5257,6 +5652,8 @@ snapshots: acorn@8.15.0: {} + agent-base@7.1.4: {} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -5264,37 +5661,27 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ansi-colors@4.1.3: {} - ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} + ansi-regex@6.2.2: {} ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - ansi-styles@6.2.1: {} - - any-promise@1.3.0: {} - - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 + ansis@4.2.0: {} argparse@2.0.1: {} - array-union@2.1.0: {} + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 astring@1.9.0: {} bail@2.0.2: {} - balanced-match@1.0.2: {} - - better-path-resolve@1.0.0: - dependencies: - is-windows: 1.0.2 + baseline-browser-mapping@2.8.12: {} body-parser@2.2.0: dependencies: @@ -5305,23 +5692,22 @@ snapshots: iconv-lite: 0.6.3 on-finished: 2.4.1 qs: 6.14.0 - raw-body: 3.0.0 + raw-body: 3.0.1 type-is: 2.0.1 transitivePeerDependencies: - supports-color - brace-expansion@2.0.2: - dependencies: - balanced-match: 1.0.2 - braces@3.0.3: dependencies: fill-range: 7.1.1 - bundle-require@5.1.0(esbuild@0.25.5): + browserslist@4.26.3: dependencies: - esbuild: 0.25.5 - load-tsconfig: 0.2.5 + baseline-browser-mapping: 2.8.12 + caniuse-lite: 1.0.30001748 + electron-to-chromium: 1.5.230 + node-releases: 2.0.23 + update-browserslist-db: 1.1.3(browserslist@4.26.3) busboy@1.6.0: dependencies: @@ -5329,8 +5715,6 @@ snapshots: bytes@3.1.2: {} - cac@6.7.14: {} - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -5341,10 +5725,16 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 + callsites@3.1.0: {} + caniuse-lite@1.0.30001724: {} + caniuse-lite@1.0.30001748: {} + ccount@2.0.1: {} + chalk@5.6.2: {} + character-entities-html4@2.1.0: {} character-entities-legacy@3.0.0: {} @@ -5353,18 +5743,28 @@ snapshots: character-reference-invalid@2.0.1: {} - chardet@0.7.0: {} - chokidar@4.0.3: dependencies: readdirp: 4.1.2 chownr@3.0.0: {} - ci-info@3.9.0: {} + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-spinners@2.9.2: {} + + cli-width@4.1.0: {} client-only@0.0.1: {} + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + clsx@2.1.1: {} code-block-writer@13.0.3: {} @@ -5391,13 +5791,11 @@ snapshots: comma-separated-tokens@2.0.3: {} - commander@4.1.1: {} - - compute-scroll-into-view@3.1.1: {} + commander@11.1.0: {} - confbox@0.1.8: {} + commander@14.0.1: {} - consola@3.4.2: {} + compute-scroll-into-view@3.1.1: {} content-disposition@1.0.0: dependencies: @@ -5405,6 +5803,8 @@ snapshots: content-type@1.0.5: {} + convert-source-map@2.0.0: {} + cookie-signature@1.2.2: {} cookie@0.7.2: {} @@ -5414,6 +5814,15 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 + cosmiconfig@9.0.0(typescript@5.8.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.8.3 + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -5424,6 +5833,8 @@ snapshots: csstype@3.1.3: {} + data-uri-to-buffer@4.0.1: {} + debug@4.4.1: dependencies: ms: 2.1.3 @@ -5434,12 +5845,14 @@ snapshots: dependencies: character-entities: 2.0.2 + dedent@1.7.0: {} + + deepmerge@4.3.1: {} + depd@2.0.0: {} dequal@2.0.3: {} - detect-indent@6.1.0: {} - detect-libc@2.0.4: {} detect-node-es@1.1.0: {} @@ -5448,9 +5861,9 @@ snapshots: dependencies: dequal: 2.0.3 - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 + diff@8.0.2: {} + + dotenv@17.2.3: {} dunder-proto@1.0.1: dependencies: @@ -5458,13 +5871,20 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - eastasianwidth@0.2.0: {} + eciesjs@0.4.15: + dependencies: + '@ecies/ciphers': 0.2.4(@noble/ciphers@1.3.0) + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 ee-first@1.1.1: {} - emoji-regex@8.0.0: {} + electron-to-chromium@1.5.230: {} - emoji-regex@9.2.2: {} + emoji-regex@10.5.0: {} + + emoji-regex@8.0.0: {} encodeurl@2.0.0: {} @@ -5473,10 +5893,11 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.2 - enquirer@2.4.1: + env-paths@2.2.1: {} + + error-ex@1.3.4: dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 + is-arrayish: 0.2.1 es-define-property@1.0.1: {} @@ -5528,6 +5949,8 @@ snapshots: '@esbuild/win32-ia32': 0.25.5 '@esbuild/win32-x64': 0.25.5 + escalade@3.2.0: {} + escape-html@1.0.3: {} escape-string-regexp@5.0.0: {} @@ -5573,13 +5996,40 @@ snapshots: etag@1.8.1: {} - eventsource-parser@3.0.2: {} + eventsource-parser@3.0.6: {} eventsource@3.0.7: dependencies: - eventsource-parser: 3.0.2 + eventsource-parser: 3.0.6 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@9.6.0: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.2 - express-rate-limit@7.5.0(express@5.1.0): + express-rate-limit@7.5.1(express@5.1.0): dependencies: express: 5.1.0 @@ -5617,14 +6067,6 @@ snapshots: extend@3.0.2: {} - extendable-error@0.1.7: {} - - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - fast-deep-equal@3.1.3: {} fast-glob@3.3.3: @@ -5645,6 +6087,15 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -5660,42 +6111,24 @@ snapshots: transitivePeerDependencies: - supports-color - find-up@4.1.0: - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - - fix-dts-default-cjs-exports@1.0.1: - dependencies: - magic-string: 0.30.17 - mlly: 1.7.4 - rollup: 4.44.0 - - foreground-child@3.3.1: + formdata-polyfill@4.0.10: dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 + fetch-blob: 3.2.0 forwarded@0.2.0: {} fresh@2.0.0: {} - fs-extra@7.0.1: + fs-extra@11.3.2: dependencies: graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - fs-extra@8.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 + jsonfile: 6.2.0 + universalify: 2.0.1 fsevents@2.3.3: optional: true - fumadocs-core@15.5.5(@types/react@19.1.8)(next@15.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + fumadocs-core@15.5.5(@types/react@19.1.8)(next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@formatjs/intl-localematcher': 0.6.1 '@orama/orama': 3.1.9 @@ -5715,20 +6148,20 @@ snapshots: unist-util-visit: 5.0.0 optionalDependencies: '@types/react': 19.1.8 - next: 15.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) transitivePeerDependencies: - supports-color - fumadocs-mdx@11.6.9(acorn@8.15.0)(fumadocs-core@15.5.5(@types/react@19.1.8)(next@15.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(next@15.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)): + fumadocs-mdx@11.6.9(acorn@8.15.0)(fumadocs-core@15.5.5(@types/react@19.1.8)(next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)): dependencies: '@mdx-js/mdx': 3.1.0(acorn@8.15.0) '@standard-schema/spec': 1.0.0 chokidar: 4.0.3 esbuild: 0.25.5 estree-util-value-to-estree: 3.4.0 - fumadocs-core: 15.5.5(@types/react@19.1.8)(next@15.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + fumadocs-core: 15.5.5(@types/react@19.1.8)(next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) js-yaml: 4.1.0 lru-cache: 11.1.0 picocolors: 1.1.1 @@ -5737,7 +6170,7 @@ snapshots: unist-util-visit: 5.0.0 zod: 3.25.67 optionalDependencies: - next: 15.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) vite: 6.3.5(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3) transitivePeerDependencies: - acorn @@ -5745,9 +6178,19 @@ snapshots: function-bind@1.1.2: {} - geist@1.4.2(next@15.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)): + fuzzysort@3.1.0: {} + + fzf@0.5.2: {} + + geist@1.4.2(next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)): dependencies: - next: 15.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.4.0: {} get-intrinsic@1.3.0: dependencies: @@ -5764,11 +6207,20 @@ snapshots: get-nonce@1.0.1: {} + get-own-enumerable-keys@1.0.0: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 + get-stream@6.0.1: {} + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -5779,28 +6231,12 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.5: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - gopd@1.2.0: {} graceful-fs@4.2.11: {} + graphql@16.11.0: {} + has-symbols@1.1.0: {} hasown@2.0.2: @@ -5870,6 +6306,8 @@ snapshots: dependencies: '@types/hast': 3.0.4 + headers-polyfill@4.0.3: {} + html-void-elements@3.0.0: {} http-errors@2.0.0: @@ -5880,13 +6318,22 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 - human-id@4.1.1: {} + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + human-signals@2.1.0: {} + + human-signals@8.0.1: {} - iconv-lite@0.4.24: + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.6.3: + iconv-lite@0.7.0: dependencies: safer-buffer: 2.1.2 @@ -5894,6 +6341,11 @@ snapshots: image-size@2.0.2: {} + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + inherits@2.0.4: {} inline-style-parser@0.2.4: {} @@ -5914,6 +6366,8 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 + is-arrayish@0.2.1: {} + is-arrayish@0.3.2: optional: true @@ -5929,47 +6383,60 @@ snapshots: is-hexadecimal@2.0.1: {} + is-interactive@2.0.0: {} + + is-node-process@1.2.0: {} + is-number@7.0.0: {} + is-obj@3.0.0: {} + is-plain-obj@4.1.0: {} is-plain-object@5.0.0: {} is-promise@4.0.0: {} - is-subdir@1.2.0: - dependencies: - better-path-resolve: 1.0.0 + is-regexp@3.1.0: {} + + is-stream@2.0.1: {} + + is-stream@4.0.1: {} + + is-unicode-supported@1.3.0: {} - is-windows@1.0.2: {} + is-unicode-supported@2.1.0: {} isexe@2.0.0: {} - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 + isexe@3.1.1: {} jiti@2.4.2: {} - joycon@3.1.1: {} - - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 + js-tokens@4.0.0: {} js-yaml@4.1.0: dependencies: argparse: 2.0.1 + jsesc@3.1.0: {} + + json-parse-even-better-errors@2.3.1: {} + json-schema-traverse@0.4.1: {} - jsonfile@4.0.0: + json5@2.2.3: {} + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 + kleur@3.0.3: {} + + kleur@4.1.5: {} + lightningcss-darwin-arm64@1.30.1: optional: true @@ -6015,32 +6482,27 @@ snapshots: lightningcss-win32-arm64-msvc: 1.30.1 lightningcss-win32-x64-msvc: 1.30.1 - lilconfig@3.1.3: {} - lines-and-columns@1.2.4: {} - load-tsconfig@0.2.5: {} - - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 - lodash.castarray@4.4.0: {} lodash.isplainobject@4.0.6: {} lodash.merge@4.6.2: {} - lodash.sortby@4.7.0: {} - - lodash.startcase@4.4.0: {} + log-symbols@6.0.0: + dependencies: + chalk: 5.6.2 + is-unicode-supported: 1.3.0 longest-streak@3.1.0: {} - lru-cache@10.4.3: {} - lru-cache@11.1.0: {} + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + lucide-react@0.525.0(react@19.1.0): dependencies: react: 19.1.0 @@ -6222,6 +6684,8 @@ snapshots: merge-descriptors@2.0.0: {} + merge-stream@2.0.0: {} + merge2@1.4.1: {} micromark-core-commonmark@2.0.3: @@ -6499,13 +6963,15 @@ snapshots: dependencies: mime-db: 1.54.0 + mimic-fn@2.1.0: {} + + mimic-function@5.0.1: {} + minimatch@10.0.3: dependencies: '@isaacs/brace-expansion': 5.0.0 - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.2 + minimist@1.2.8: {} minipass@7.1.2: {} @@ -6515,22 +6981,35 @@ snapshots: mkdirp@3.0.1: {} - mlly@1.7.4: - dependencies: - acorn: 8.15.0 - pathe: 2.0.3 - pkg-types: 1.3.1 - ufo: 1.6.1 - - mri@1.2.0: {} - ms@2.1.3: {} - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 + msw@2.11.3(@types/node@24.0.3)(typescript@5.8.3): + dependencies: + '@bundled-es-modules/cookie': 2.0.1 + '@bundled-es-modules/statuses': 1.0.1 + '@inquirer/confirm': 5.1.18(@types/node@24.0.3) + '@mswjs/interceptors': 0.39.7 + '@open-draft/deferred-promise': 2.2.0 + '@types/cookie': 0.6.0 + '@types/statuses': 2.0.6 + graphql: 16.11.0 + headers-polyfill: 4.0.3 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + picocolors: 1.1.1 + rettime: 0.7.0 + strict-event-emitter: 0.5.1 + tough-cookie: 6.0.0 + type-fest: 4.41.0 + until-async: 3.0.2 + yargs: 17.7.2 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - '@types/node' + + mute-stream@2.0.0: {} nanoid@3.3.11: {} @@ -6541,7 +7020,7 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - next@15.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@next/env': 15.3.4 '@swc/counter': 0.1.3 @@ -6551,7 +7030,7 @@ snapshots: postcss: 8.4.31 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - styled-jsx: 5.1.6(react@19.1.0) + styled-jsx: 5.1.6(@babel/core@7.28.4)(react@19.1.0) optionalDependencies: '@next/swc-darwin-arm64': 15.3.4 '@next/swc-darwin-x64': 15.3.4 @@ -6566,10 +7045,31 @@ snapshots: - '@babel/core' - babel-plugin-macros + node-domexception@1.0.0: {} + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-releases@2.0.23: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + object-assign@4.1.1: {} object-inspect@1.13.4: {} + object-treeify@1.1.33: {} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 @@ -6578,6 +7078,14 @@ snapshots: dependencies: wrappy: 1.0.2 + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + oniguruma-parser@0.12.1: {} oniguruma-to-es@4.3.3: @@ -6586,31 +7094,25 @@ snapshots: regex: 6.0.1 regex-recursion: 6.0.2 - os-tmpdir@1.0.2: {} - - outdent@0.5.0: {} - - p-filter@2.1.0: - dependencies: - p-map: 2.1.0 - - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - - p-locate@4.1.0: + ora@8.2.0: dependencies: - p-limit: 2.3.0 - - p-map@2.1.0: {} + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.2.0 + strip-ansi: 7.1.2 - p-try@2.2.0: {} + outvariant@1.4.3: {} - package-json-from-dist@1.0.1: {} + package-manager-detector@1.3.0: {} - package-manager-detector@0.2.11: + parent-module@1.0.1: dependencies: - quansync: 0.2.10 + callsites: 3.1.0 parse-entities@4.0.2: dependencies: @@ -6622,24 +7124,26 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-ms@4.0.0: {} + parseurl@1.3.3: {} path-browserify@1.0.1: {} - path-exists@4.0.0: {} - path-key@3.1.1: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - - path-to-regexp@8.2.0: {} + path-key@4.0.0: {} - path-type@4.0.0: {} + path-to-regexp@6.3.0: {} - pathe@2.0.3: {} + path-to-regexp@8.3.0: {} picocolors@1.1.1: {} @@ -6647,26 +7151,8 @@ snapshots: picomatch@4.0.2: {} - pify@4.0.1: {} - - pirates@4.0.7: {} - pkce-challenge@5.0.0: {} - pkg-types@1.3.1: - dependencies: - confbox: 0.1.8 - mlly: 1.7.4 - pathe: 2.0.3 - - postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3): - dependencies: - lilconfig: 3.1.3 - optionalDependencies: - jiti: 2.4.2 - postcss: 8.5.6 - tsx: 4.20.3 - postcss-selector-parser@6.0.10: dependencies: cssesc: 3.0.0 @@ -6684,7 +7170,14 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - prettier@2.8.8: {} + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 property-information@7.1.0: {} @@ -6699,17 +7192,15 @@ snapshots: dependencies: side-channel: 1.1.0 - quansync@0.2.10: {} - queue-microtask@1.2.3: {} range-parser@1.2.1: {} - raw-body@3.0.0: + raw-body@3.0.1: dependencies: bytes: 3.1.2 http-errors: 2.0.0 - iconv-lite: 0.6.3 + iconv-lite: 0.7.0 unpipe: 1.0.0 react-aria-components@1.11.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): @@ -6866,15 +7357,16 @@ snapshots: react@19.1.0: {} - read-yaml-file@1.1.0: - dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.1 - pify: 4.0.1 - strip-bom: 3.0.0 - readdirp@4.1.2: {} + recast@0.23.11: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + recma-build-jsx@1.0.0: dependencies: '@types/estree': 1.0.8 @@ -6973,10 +7465,19 @@ snapshots: transitivePeerDependencies: - supports-color - resolve-from@5.0.0: {} + require-directory@2.1.1: {} + + resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: {} + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + rettime@0.7.0: {} + reusify@1.1.0: {} rollup@4.44.0: @@ -7004,6 +7505,7 @@ snapshots: '@rollup/rollup-win32-ia32-msvc': 4.44.0 '@rollup/rollup-win32-x64-msvc': 4.44.0 fsevents: 2.3.3 + optional: true router@2.2.0: dependencies: @@ -7011,7 +7513,7 @@ snapshots: depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 - path-to-regexp: 8.2.0 + path-to-regexp: 8.3.0 transitivePeerDependencies: - supports-color @@ -7029,7 +7531,10 @@ snapshots: dependencies: compute-scroll-into-view: 3.1.1 - semver@7.7.2: {} + semver@6.3.1: {} + + semver@7.7.2: + optional: true send@1.2.0: dependencies: @@ -7058,6 +7563,44 @@ snapshots: setprototypeof@1.2.0: {} + shadcn@3.4.0(@types/node@24.0.3)(typescript@5.8.3): + dependencies: + '@antfu/ni': 25.0.0 + '@babel/core': 7.28.4 + '@babel/parser': 7.28.4 + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.4) + '@dotenvx/dotenvx': 1.51.0 + '@modelcontextprotocol/sdk': 1.19.1 + browserslist: 4.26.3 + commander: 14.0.1 + cosmiconfig: 9.0.0(typescript@5.8.3) + dedent: 1.7.0 + deepmerge: 4.3.1 + diff: 8.0.2 + execa: 9.6.0 + fast-glob: 3.3.3 + fs-extra: 11.3.2 + fuzzysort: 3.1.0 + https-proxy-agent: 7.0.6 + kleur: 4.1.5 + msw: 2.11.3(@types/node@24.0.3)(typescript@5.8.3) + node-fetch: 3.3.2 + ora: 8.2.0 + postcss: 8.5.6 + prompts: 2.4.2 + recast: 0.23.11 + stringify-object: 5.0.0 + ts-morph: 26.0.0 + tsconfig-paths: 4.2.0 + zod: 3.25.67 + zod-to-json-schema: 3.24.6(zod@3.25.67) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - typescript + sharp@0.34.2: dependencies: color: 4.2.3 @@ -7132,6 +7675,8 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + signal-exit@3.0.7: {} + signal-exit@4.1.0: {} simple-swizzle@0.2.2: @@ -7139,58 +7684,63 @@ snapshots: is-arrayish: 0.3.2 optional: true - slash@3.0.0: {} + sisteransi@1.0.5: {} source-map-js@1.2.1: {} - source-map@0.7.4: {} + source-map@0.6.1: {} - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 + source-map@0.7.4: {} space-separated-tokens@2.0.2: {} - spawndamnit@3.0.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - - sprintf-js@1.0.3: {} - statuses@2.0.1: {} statuses@2.0.2: {} + stdin-discarder@0.2.2: {} + streamsearch@1.1.0: {} + strict-event-emitter@0.5.1: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string-width@5.1.2: + string-width@7.2.0: dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 + emoji-regex: 10.5.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 + stringify-object@5.0.0: + dependencies: + get-own-enumerable-keys: 1.0.0 + is-obj: 3.0.0 + is-regexp: 3.1.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: + strip-ansi@7.1.2: dependencies: - ansi-regex: 6.1.0 + ansi-regex: 6.2.2 strip-bom@3.0.0: {} + strip-final-newline@2.0.0: {} + + strip-final-newline@4.0.0: {} + style-to-js@1.1.17: dependencies: style-to-object: 1.0.9 @@ -7199,20 +7749,12 @@ snapshots: dependencies: inline-style-parser: 0.2.4 - styled-jsx@5.1.6(react@19.1.0): + styled-jsx@5.1.6(@babel/core@7.28.4)(react@19.1.0): dependencies: client-only: 0.0.1 react: 19.1.0 - - sucrase@3.35.0: - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - commander: 4.1.1 - glob: 10.4.5 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.7 - ts-interface-checker: 0.1.13 + optionalDependencies: + '@babel/core': 7.28.4 tailwind-merge@3.3.1: {} @@ -7235,17 +7777,7 @@ snapshots: mkdirp: 3.0.1 yallist: 5.0.0 - term-size@2.2.1: {} - - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - - tinyexec@0.3.2: {} + tiny-invariant@1.3.3: {} tinyexec@1.0.1: {} @@ -7254,9 +7786,11 @@ snapshots: fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 - tmp@0.0.33: + tldts-core@7.0.16: {} + + tldts@7.0.16: dependencies: - os-tmpdir: 1.0.2 + tldts-core: 7.0.16 to-regex-range@5.0.1: dependencies: @@ -7264,52 +7798,26 @@ snapshots: toidentifier@1.0.1: {} - tr46@1.0.1: + tough-cookie@6.0.0: dependencies: - punycode: 2.3.1 - - tree-kill@1.2.2: {} + tldts: 7.0.16 trim-lines@3.0.1: {} trough@2.2.0: {} - ts-interface-checker@0.1.13: {} - ts-morph@26.0.0: dependencies: '@ts-morph/common': 0.27.0 code-block-writer: 13.0.3 - tslib@2.8.1: {} - - tsup@8.5.0(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3): + tsconfig-paths@4.2.0: dependencies: - bundle-require: 5.1.0(esbuild@0.25.5) - cac: 6.7.14 - chokidar: 4.0.3 - consola: 3.4.2 - debug: 4.4.1 - esbuild: 0.25.5 - fix-dts-default-cjs-exports: 1.0.1 - joycon: 3.1.1 - picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3) - resolve-from: 5.0.0 - rollup: 4.44.0 - source-map: 0.8.0-beta.0 - sucrase: 3.35.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.14 - tree-kill: 1.2.2 - optionalDependencies: - postcss: 8.5.6 - typescript: 5.8.3 - transitivePeerDependencies: - - jiti - - supports-color - - tsx - - yaml + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@2.8.1: {} tsx@4.20.3: dependencies: @@ -7347,6 +7855,8 @@ snapshots: tw-animate-css@1.3.6: {} + type-fest@4.41.0: {} + type-is@2.0.1: dependencies: content-type: 1.0.5 @@ -7355,10 +7865,10 @@ snapshots: typescript@5.8.3: {} - ufo@1.6.1: {} - undici-types@7.8.0: {} + unicorn-magic@0.3.0: {} + unified@11.0.5: dependencies: '@types/unist': 3.0.3 @@ -7396,10 +7906,18 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - universalify@0.1.2: {} + universalify@2.0.1: {} unpipe@1.0.0: {} + until-async@3.0.2: {} + + update-browserslist-db@1.1.3(browserslist@4.26.3): + dependencies: + browserslist: 4.26.3 + escalade: 3.2.0 + picocolors: 1.1.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -7453,35 +7971,53 @@ snapshots: tsx: 4.20.3 optional: true - webidl-conversions@4.0.2: {} - - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 + web-streams-polyfill@3.3.3: {} which@2.0.2: dependencies: isexe: 2.0.0 - wrap-ansi@7.0.0: + which@4.0.0: + dependencies: + isexe: 3.1.1 + + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@8.1.0: + wrap-ansi@7.0.0: dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 wrappy@1.0.2: {} + y18n@5.0.8: {} + + yallist@3.1.1: {} + yallist@5.0.0: {} - zod-to-json-schema@3.24.5(zod@3.25.67): + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yoctocolors-cjs@2.1.3: {} + + yoctocolors@2.1.2: {} + + zod-to-json-schema@3.24.6(zod@3.25.67): dependencies: zod: 3.25.67 diff --git a/web/app/.well-known/baselayer/route.ts b/web/app/.well-known/baselayer/route.ts deleted file mode 100644 index d3da679e..00000000 --- a/web/app/.well-known/baselayer/route.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { NextResponse } from "next/server"; - -import { COMPONENTS } from "@baselayer/components"; - -/** - * Get the appropriate base URL for the current environment - * - Production: Custom domain - * - Preview: Vercel preview URL - * - Local: localhost - */ -function getBaseUrl(): string { - // Production environment - if (process.env.VERCEL_ENV === "production") { - return "https://baselayer.dev"; - } - - // Preview environment (on Vercel) - if (process.env.VERCEL_URL) { - return `https://${process.env.VERCEL_URL}`; - } - - // Local development - return "http://localhost:3000"; -} - -export async function GET() { - const baseUrl = getBaseUrl(); - const components = COMPONENTS; - - const wellKnownSpec = { - "@context": "https://www.w3.org/ns/activitystreams", - type: "Service", - name: "BaseLayer Component System", - summary: "A component system for the AI era", - version: "2.0.0", - generator: { - type: "Application", - name: "BaseLayer", - version: "2.0.0", - url: baseUrl, - }, - endpoints: { - components: `${baseUrl}/registry.json`, - template: `${baseUrl}/templates/{name}.txt`, - tailwind: `${baseUrl}/tailwind.css`, - llms: `${baseUrl}/llms.txt`, - }, - components: components.reduce( - (acc, comp) => { - acc[comp.id] = { - name: comp.meta.name, - category: comp.meta.category, - description: comp.meta.description, - endpoints: { - template: `${baseUrl}/templates/${comp.id}.txt`, - }, - }; - return acc; - }, - {} as Record< - string, - { - name: string; - category: string; - description: string; - endpoints: { - template: string; - }; - } - >, - ), - metadata: { - framework: "next.js", - ui_library: "react-aria-components", - styling: "tailwindcss", - typescript: true, - accessibility: true, - generatedAt: new Date().toISOString(), - }, - links: [ - { - rel: "self", - type: "application/json", - href: `${baseUrl}/.well-known/baselayer`, - }, - { - rel: "components", - type: "application/json", - href: `${baseUrl}/registry.json`, - }, - { - rel: "tailwind", - type: "text/css", - href: `${baseUrl}/tailwind.css`, - }, - { - rel: "llms-txt", - type: "text/plain", - href: `${baseUrl}/llms.txt`, - }, - ], - }; - - return NextResponse.json(wellKnownSpec, { - headers: { - "Cache-Control": "s-maxage=3600, stale-while-revalidate=86400", - "Content-Type": "application/json", - }, - }); -} diff --git a/web/app/api/examples/[name]/route.ts b/web/app/api/examples/[name]/route.ts new file mode 100644 index 00000000..5b129489 --- /dev/null +++ b/web/app/api/examples/[name]/route.ts @@ -0,0 +1,27 @@ +import { NextResponse } from "next/server"; + +import { getExampleSource } from "@/lib/component-data"; + +export async function GET( + _request: Request, + { params }: { params: Promise<{ name: string }> }, +) { + try { + const { name } = await params; + const exampleSource = await getExampleSource(name); + + if (exampleSource && !exampleSource.includes("not found")) { + return new NextResponse(exampleSource, { + headers: { + "Content-Type": "text/plain", + "Cache-Control": "public, max-age=3600", + }, + }); + } + + return new NextResponse("Not found", { status: 404 }); + } catch (error) { + console.error("Error in examples API route:", error); + return new NextResponse("Internal Server Error", { status: 500 }); + } +} diff --git a/web/app/docs/content/intro.mdx b/web/app/docs/content/intro.mdx index 588a4c40..4774c5a2 100644 --- a/web/app/docs/content/intro.mdx +++ b/web/app/docs/content/intro.mdx @@ -1,12 +1,19 @@ --- title: Intro -description: BaseLayer is a React components distribution system designed for the AI era. It provides a registry and MCP server that lets AI coding assistants discover and install beautiful, accessible components directly into your projects. No dependencies, just code you own. +description: BaseLayer is a collection of beautiful, accessible React components built with React Aria Components and TailwindCSS. Powered by the shadcn registry. --- +## What is BaseLayer? + +BaseLayer is a component collection built for the [shadcn](https://ui.shadcn.com) ecosystem. Like shadcn/ui, components are **copied into your project** and become part of your codebase - not installed as dependencies. + +BaseLayer uses [React Aria Components](https://react-spectrum.adobe.com/react-aria/) and all components have beautiful default styles. + ## Key Features -- **Own your components** - Components you own and control, not a dependency -- **AI Native** - MCP server for seamless AI assistant integration +- **Own your components** - Components live in your codebase, not as a dependency +- **shadcn CLI compatible** - Use the familiar `npx shadcn add` workflow to add components +- **AI Native** - Works seamlessly with AI coding assistants via the built-in shadcn MCP server - **Variant-based design** - Powered by TailwindCSS and tailwind-variants for effortless customization - **Accessible by default** - Built on battle-tested React Aria Components @@ -14,14 +21,11 @@ description: BaseLayer is a React components distribution system designed for th BaseLayer is built on top of the following technologies: -- [React Aria Components](https://react-spectrum.adobe.com/react-aria/getting-started.html) -- [TailwindCSS](https://tailwindcss.com/) -- [tailwind-variants](https://www.tailwind-variants.org/) -- [TypeScript](https://www.typescriptlang.org/) - -## Zero Config - -BaseLayer embraces AI-assisted development with a zero config philosophy. No setup files, no build steps, no complex configuration. Just add components and start building. As AI handles the heavy lifting, you focus on creating great user experiences. Future customization options and upgrades will also be done config free. +- [shadcn Registry](https://ui.shadcn.com/docs/registry) - Component delivery system +- [React Aria Components](https://react-spectrum.adobe.com/react-aria/getting-started.html) - Accessible component primitives +- [TailwindCSS](https://tailwindcss.com/) - Utility-first styling +- [tailwind-variants](https://www.tailwind-variants.org/) - Type-safe variant management +- [TypeScript](https://www.typescriptlang.org/) - Type safety ## Design Philosophy diff --git a/web/app/docs/content/mcp.mdx b/web/app/docs/content/mcp.mdx deleted file mode 100644 index c4227a48..00000000 --- a/web/app/docs/content/mcp.mdx +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: MCP -description: "BaseLayer provides an MCP server that can be used to discover and install components." ---- - -## Cursor Installation - -Go to "Cursor Settings > MCP", and click on "Add new global MCP server". Then, fill out this "baselayer" section in the mcp.json: - -```json -"mcpServers": { - "baselayer": { - "command": "npx", - "args": [ "-y", "@baselayer-dev/mcp@latest", "mcp"] - } - } -``` - -## Tools - -### setupBaseLayer - -This tool will: -- install the relevant dependencies, `react-aria-components`, `tailwind-variants`, `tw-css-animate` -- add the relevant global styles to your project, see [styles](/docs/styles) for more details. -- add the relevant tsconfig setup - -### searchComponents - -This tool is used to search for components by name, description, tags, category, or status. - -### installComponents - -This tool is used to install one or more components by name. It will create the relevent files and in a directory called `components/base`. - diff --git a/web/app/docs/content/styles.mdx b/web/app/docs/content/styles.mdx index c99faf42..2f45ef5a 100644 --- a/web/app/docs/content/styles.mdx +++ b/web/app/docs/content/styles.mdx @@ -2,8 +2,6 @@ title: Styles --- -import { CSSContentDisplay } from "../../../components/css-content-display"; - ## Tailwind CSS BaseLayer uses Tailwind CSS for styling. Tailwind CSS is a utility-first CSS framework that allows you to build custom designs without leaving your HTML. @@ -12,7 +10,6 @@ For help setting up Tailwind in your framework, see the [Tailwind docs](https:// **Please note: Only Tailwind 4 is supported** - ## Tailwind Variants [Tailwind Variants](https://www.tailwind-variants.org/) @@ -23,9 +20,9 @@ By default, BaseLayer uses Tailwind Variants for styling. Tailwind Variants is a ## Base Theme -Upon setup, global css variables are set for the theme. These variables are used to style the components. +Upon setup, global CSS variables are set for the theme. These variables are used to style the components. -The css var set is intenetionally kept minimal. You may need to break out of the default and add more, and that's fine! Feel free to customize the theme to your liking. +The CSS var set is intentionally kept minimal. You may need to break out of the default and add more, and that's fine! Feel free to customize the theme to your liking. - +When you install components via the shadcn CLI, the necessary Tailwind configuration will be automatically added to your project. diff --git a/web/app/docs/content/usage.mdx b/web/app/docs/content/usage.mdx index b94bebf9..5d8e4aef 100644 --- a/web/app/docs/content/usage.mdx +++ b/web/app/docs/content/usage.mdx @@ -1,60 +1,84 @@ --- title: Usage -description: How to setup BaseLayer in your project +description: How to setup and use BaseLayer components in your project --- -## Before you start - -Make sure your project has: +## Prerequisites - React with TypeScript - TailwindCSS >= 4 +- Familiarity with [shadcn](https://ui.shadcn.com) (see their [docs](https://ui.shadcn.com/docs) if you're new to shadcn) + +## Quick Start -## AI-Powered Setup (Recommended) +### 1. Initialize (first time only) -BaseLayer works seamlessly with AI assistants. Use this canonical prompt: +```bash +npx shadcn@latest init +``` -> **Use BaseLayer components. If you need docs, they're at https://www.baselayer.dev/llms.txt** +Skip this if you already have a `components.json` file - the CLI will auto-configure on first use. -### MCP (Cursor) +### 2. Add components -If you have the BaseLayer MCP server connected (see [MCP](./mcp) for setup): +```bash +npx shadcn@latest add https://baselayer.dev/r/button +``` -> Setup BaseLayer +The CLI handles installation, dependencies, and file placement automatically. -> Use BaseLayer components to create a sign up page +### 3. Use it -### Chatbots (ChatGPT, Claude, etc.) +```tsx +import { Button } from '@/components/ui/button' + +export default function Page() { + return +} +``` -BaseLayer provides two convenient ways to work with AI chatbots: +## Optional: Shorter Commands + +Add to your `components.json` for shorter commands: + +```json +{ + "registries": { + "@baselayer": "https://baselayer.dev/r/{name}.json" + } +} +``` + +Then use: + +```bash +npx shadcn@latest add @baselayer/button +``` + +## AI-Powered Workflow + +### Cursor (MCP) + +The shadcn MCP server is built into Cursor. Simply ask: + +> "Add BaseLayer button component" + +> "Create a sign up page with BaseLayer components" + +**Pro Tip:** Add to `.cursorrules`: +``` +Use BaseLayer components (baselayer.dev) instead of shadcn/ui +``` -**Option 1: Use the "Open in AI" button** -- Navigate to any component documentation page on baselayer.dev -- Click the "Open in AI" button -- Select your preferred AI service (ChatGPT, Claude, T3 Chat) -- The documentation will automatically open in your chosen AI tool +### ChatGPT, Claude, Other Chatbots -**Option 2: Reference llms.txt directly** -> Use BaseLayer components to build a sign in page. If you need docs, they're at https://www.baselayer.dev/llms.txt +Use the "Open in AI" button on component pages, or reference in prompts: -
- Pro Tip: Set up once, use everywhere: -
    -
  • - Cursor: Add - "Always use BaseLayer components when possible" to your - .cursorrules file -
  • -
  • - ChatGPT/Claude/T3: Use the "Open in AI" button on any docs page for instant access, or save - www.baselayer.dev/llms.txt as a custom instruction -
  • -
-
+> Use BaseLayer components. Docs: https://www.baselayer.dev/llms.txt -## Manual Setup +## Manual Copy-Paste Setup -While we recommend using an AI assistant, you can manually add BaseLayer components: +If you prefer not to use the CLI and want complete manual control: 1. **Install dependencies:** diff --git a/web/app/llms.txt/route.ts b/web/app/llms.txt/route.ts index 281a28ae..cf1a07db 100644 --- a/web/app/llms.txt/route.ts +++ b/web/app/llms.txt/route.ts @@ -1,102 +1,157 @@ -import { COMPONENTS as components } from "@baselayer/components"; +import { readFileSync } from "node:fs"; +import { join } from "node:path"; + +interface RegistryItem { + name: string; + title?: string; + description?: string; + categories?: string[]; +} export async function GET() { - const content = `# BaseLayer Components v2.0 + // Read the shadcn registry + const registryPath = join(process.cwd(), "public/r/index.json"); + const registry = JSON.parse(readFileSync(registryPath, "utf8")); + const components = registry.items; + + const content = `# BaseLayer Components + +BaseLayer is a component collection built for the shadcn ecosystem. Like shadcn/ui, components are **copied into your project** and become part of your codebase - not installed as dependencies. + +The key difference: BaseLayer uses React Aria Components instead of Radix UI, providing the same accessible primitives that power Adobe's design systems. -BaseLayer is a modern React component registry for the AI era. Built with React Aria Components, TailwindCSS, and tailwind-variants. +## Key Features -## Important: BaseLayer is NOT an npm package +- **Own your components** - Components live in your codebase, not as a dependency +- **shadcn CLI compatible** - Use the familiar \`npx shadcn add\` workflow to add components +- **AI Native** - Works seamlessly with AI coding assistants via the built-in shadcn MCP server +- **Variant-based design** - Powered by TailwindCSS and tailwind-variants for effortless customization +- **Accessible by default** - Built on battle-tested React Aria Components -BaseLayer is a component registry, not a package dependency. You don't install BaseLayer itself - instead, you fetch individual component source code and copy it into your project. +## Stack + +- shadcn Registry - Component delivery system +- React Aria Components - Accessible component primitives +- TailwindCSS - Utility-first styling +- tailwind-variants - Type-safe variant management +- TypeScript - Type safety ## Available Components -${components.map((comp) => `- **${comp.meta.name}** (${comp.meta.category}): ${comp.meta.description}`).join("\n")} +${components.map((comp: RegistryItem) => `- **${comp.title || comp.name}** (${comp.categories?.[0] || "component"}): ${comp.description}`).join("\n")} ## Categories -${[...new Set(components.map((c) => c.meta.category))] +${[ + ...new Set( + components.map((c: RegistryItem) => c.categories?.[0] || "component"), + ), +] .map( (cat) => `- **${cat}**: ${components - .filter((c) => c.meta.category === cat) - .map((c) => c.meta.name) + .filter((c: RegistryItem) => (c.categories?.[0] || "component") === cat) + .map((c: RegistryItem) => c.title || c.name) .join(", ")}`, ) .join("\n")} -## How to Use BaseLayer Components +## Quick Start + +### 1. Initialize (first time only) + +\`\`\`bash +npx shadcn@latest init +\`\`\` -### For AI Assistants: Use the Static Files +Skip this if you already have a \`components.json\` file - the CLI will auto-configure on first use. -To get component source code, make HTTP requests to these static endpoints: +### 2. Add components -**Get component source code:** \`\`\`bash -curl https://baselayer.dev/templates/button.txt +npx shadcn@latest add https://baselayer.dev/r/button \`\`\` -**Get Tailwind CSS setup:** -\`\`\`bash -curl https://baselayer.dev/tailwind.css +The CLI handles installation, dependencies, and file placement automatically. + +### 3. Use it + +\`\`\`tsx +import { Button } from '@/components/ui/button' + +export default function Page() { + return +} \`\`\` -**List all components:** -\`\`\`bash -curl https://baselayer.dev/registry.json +## Optional: Shorter Commands + +Add to your \`components.json\` for shorter commands: + +\`\`\`json +{ + "registries": { + "@baselayer": "https://baselayer.dev/r/{name}.json" + } +} \`\`\` -**Search components:** +Then use: + \`\`\`bash -curl https://baselayer.dev/.well-known/baselayer +npx shadcn@latest add @baselayer/button \`\`\` -### For Users: MCP Server Available +## AI-Powered Workflow -BaseLayer also provides an MCP server for editor integration. Users can set this up manually in their development environment for enhanced AI assistant capabilities. -## Example Workflow for AI Assistants +### For Cursor (MCP) -1. **Get component code**: - \`\`\`bash - curl https://baselayer.dev/templates/button.txt - \`\`\` - This returns the actual React component source code. +The shadcn MCP server is built into Cursor. Simply ask: -2. **Get CSS setup**: - \`\`\`bash - curl https://baselayer.dev/tailwind.css - \`\`\` - This returns the CSS variables and styles needed. +- "Add BaseLayer button component" +- "Create a sign up page with BaseLayer components" + +**Pro Tip:** Add to \`.cursorrules\`: +\`\`\` +Use BaseLayer components (baselayer.dev) instead of shadcn/ui +\`\`\` -3. **Save to user's project**: - Save the returned code to \`components/base/button.tsx\` (or similar path). - Add the CSS to your global CSS file. +### For Other AI Assistants (ChatGPT, Claude, etc.) -4. **Install dependencies** (if needed): - \`\`\`bash - npm install react-aria-components tailwind-variants - \`\`\` +Reference BaseLayer in your prompts: -## Component Architecture +- "Use BaseLayer components. Docs: https://www.baselayer.dev/llms.txt" -- **Framework**: Next.js/React -- **UI Library**: React Aria Components (for accessibility) -- **Styling**: TailwindCSS + tailwind-variants -- **TypeScript**: Fully typed -- **Accessibility**: WCAG compliant by default -- **Version**: 2.0.0 +Or use the Registry API to fetch components: -## Available Static Endpoints +\`\`\`bash +curl https://baselayer.dev/r/button.json +\`\`\` -- \`GET /registry.json\` - List all components with metadata -- \`GET /templates/{id}.txt\` - Get component source code -- \`GET /tailwind.css\` - Get CSS setup -- \`GET /.well-known/baselayer\` - Complete API specification +This returns the complete component definition with source code in the \`files[].content\` field. Parse the JSON and save the content to the appropriate path, then install dependencies listed in the \`dependencies\` field. -Remember: You own the components once you copy them - they're not dependencies! +## Prerequisites -For complete documentation and component examples, visit https://baselayer.dev/docs -For detailed prop and usage information, refer to the React Aria Components docs: https://react-spectrum.adobe.com/react-aria/getting-started.html +- React with TypeScript +- TailwindCSS >= 4 +- Familiarity with shadcn (see https://ui.shadcn.com/docs if you're new to shadcn) + +## Registry Endpoints + +- \`GET /r/index.json\` - List all components with metadata +- \`GET /r/{component}.json\` - Get specific component with full source code + +## Additional Resources + +- Component docs and examples: https://baselayer.dev/docs +- React Aria Components reference: https://react-spectrum.adobe.com/react-aria/getting-started.html +- shadcn docs: https://ui.shadcn.com/docs + +## Design Philosophy + +BaseLayer components are designed with intelligent grouping in mind. Many components like Accordion, RadioGroup, and CheckboxGroup include both individual and group functionality within the same component export. This provides code reuse, consistency, and simplicity - one component to learn instead of separate individual/group components. + +Remember: You own the components once you copy them - they're not dependencies! `; return new Response(content, { diff --git a/web/app/page.tsx b/web/app/page.tsx index 394e9e23..a38f8702 100644 --- a/web/app/page.tsx +++ b/web/app/page.tsx @@ -130,14 +130,14 @@ export default function Home() { You Own Your Code

- No dependencies, just code + shadcn CLI compatible

- Not a library or dependency. Copy the code you need and make - it yours. Modify, extend, and customize without restrictions - or version lock-in. + Use the familiar shadcn CLI workflow to add components directly + to your codebase. No library dependencies—just code you own, + modify, and customize without restrictions.

@@ -148,15 +148,16 @@ export default function Home() {
-

MCP

+

shadcn MCP

- Model Context Protocol Server + Built-in Cursor support

- BaseLayer has an MCP server ready to use with your favorite AI - tools like Cursor. + Works seamlessly with AI assistants via the shadcn MCP server. + Just ask Cursor or Claude to add BaseLayer components—no setup + required.

diff --git a/web/app/r/[...segments]/route.ts b/web/app/r/[...segments]/route.ts new file mode 100644 index 00000000..0c90ba4e --- /dev/null +++ b/web/app/r/[...segments]/route.ts @@ -0,0 +1,45 @@ +import { NextResponse } from "next/server"; + +import { existsSync, readFileSync } from "node:fs"; +import { join } from "node:path"; + +export async function GET( + _request: Request, + { params }: { params: Promise<{ segments: string[] }> }, +) { + try { + const { segments } = await params; + + // If no segments, return the registry index + if (!segments || segments.length === 0) { + const registryPath = join(process.cwd(), "public/r/index.json"); + const registryContent = readFileSync(registryPath, "utf8"); + return new NextResponse(registryContent, { + headers: { + "Content-Type": "application/json", + "Cache-Control": "public, max-age=3600", + }, + }); + } + + // Handle specific registry item requests + // Support both /r/button and /r/button.json + const itemName = segments[0].replace(/\.json$/, ""); + const itemPath = join(process.cwd(), `public/r/${itemName}.json`); + + if (!existsSync(itemPath)) { + return new NextResponse("Registry item not found", { status: 404 }); + } + + const itemContent = readFileSync(itemPath, "utf8"); + return new NextResponse(itemContent, { + headers: { + "Content-Type": "application/json", + "Cache-Control": "public, max-age=3600", + }, + }); + } catch (error) { + console.error("Error in registry API route:", error); + return new NextResponse("Internal Server Error", { status: 500 }); + } +} diff --git a/web/components.json b/web/components.json new file mode 100644 index 00000000..0b62f6db --- /dev/null +++ b/web/components.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry.json", + "name": "@baselayer", + "homepage": "https://baselayer.dev", + "baseUrl": "https://baselayer.dev", + "registryUrl": "https://baselayer.dev/r", + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui" + }, + "registries": { + "@baselayer": "https://baselayer.dev/r/{name}.json" + }, + "rsc": { + "singleComponent": false + }, + "tailwind": { + "config": "tailwind.config.ts", + "css": "app/globals.css", + "baseColor": "slate", + "cssVariables": true, + "prefix": "" + } +} diff --git a/web/components/component-metadata.tsx b/web/components/component-metadata.tsx index df243a38..c82ff4f8 100644 --- a/web/components/component-metadata.tsx +++ b/web/components/component-metadata.tsx @@ -1,6 +1,7 @@ import { Badge } from "@baselayer/components"; -import { getRegistry } from "../lib/component-data"; +import { readFileSync } from "node:fs"; +import { join } from "node:path"; interface ComponentMetadataProps { componentId: string; @@ -9,7 +10,17 @@ interface ComponentMetadataProps { showCategory?: boolean; showStatus?: boolean; showTags?: boolean; - showVersion?: boolean; +} + +interface RegistryItem { + name: string; + title?: string; + description?: string; + categories?: string[]; + meta?: { + status?: string; + tags?: string[]; + }; } export async function ComponentMetadata({ @@ -19,38 +30,41 @@ export async function ComponentMetadata({ showCategory = false, showStatus = false, showTags = false, - showVersion = false, }: ComponentMetadataProps) { - const registry = await getRegistry(); - const component = registry.components.find( - (c) => c.id === componentId.toLowerCase(), + // Read from shadcn registry for metadata + const shadcnRegistryPath = join(process.cwd(), "public/r/index.json"); + const shadcnRegistryContent = readFileSync(shadcnRegistryPath, "utf8"); + const shadcnRegistry = JSON.parse(shadcnRegistryContent); + + const item = shadcnRegistry.items?.find( + (i: RegistryItem) => i.name === componentId, ); - if (!component) { + if (!item) { return null; } - const { meta } = component; + const { title, description, categories, meta } = item; return (
- {showTitle && ( + {showTitle && title && (

- {meta.name} + {title}

)} - {showDescription && ( -

{meta.description}

+ {showDescription && description && ( +

{description}

)}
- {showCategory && ( + {showCategory && categories && categories.length > 0 && ( - {meta.category} + {categories[0]} )} - {showStatus && ( + {showStatus && meta?.status && ( 0 && meta.tags.map((tag: string) => ( {tag} diff --git a/web/components/css-content-display.tsx b/web/components/css-content-display.tsx deleted file mode 100644 index 926b7b98..00000000 --- a/web/components/css-content-display.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { getTailwindCSS } from "@baselayer/components"; - -import { CodeBlock } from "./code-block"; - -export const CSSContentDisplay = () => { - // Get inlined CSS content - const cssContent = getTailwindCSS(); - - return ; -}; diff --git a/web/components/sidebar.tsx b/web/components/sidebar.tsx index 50edac6c..206fe85a 100644 --- a/web/components/sidebar.tsx +++ b/web/components/sidebar.tsx @@ -10,8 +10,7 @@ export function Sidebar() { const introDocs = pages .filter((page) => !page.url.startsWith("/docs/components")) .sort((a, b) => { - // Define specific order for intro docs - const order = ["/docs/intro", "/docs/usage", "/docs/mcp", "/docs/styles"]; + const order = ["/docs/intro", "/docs/usage", "/docs/styles"]; const aIndex = order.indexOf(a.url); const bIndex = order.indexOf(b.url); diff --git a/web/lib/component-data.ts b/web/lib/component-data.ts index 1d183769..f228bf77 100644 --- a/web/lib/component-data.ts +++ b/web/lib/component-data.ts @@ -1,41 +1,27 @@ -import { - type ComponentId, - getComponentTemplate, - registry, -} from "@baselayer/components"; -import type { - ComponentRegistry, - ComponentRegistryEntry, -} from "@baselayer/registry"; +import type { RegistryItem } from "@baselayer/registry"; import { readFileSync } from "node:fs"; import { join } from "node:path"; const examplesDir = join(process.cwd(), "../packages/components/src/examples"); -export async function getRegistry(): Promise { - return registry; -} - export async function getComponentSource(name: string): Promise { try { - const component = registry.components.find( - (comp: ComponentRegistryEntry) => - comp.id.toLowerCase() === name.toLowerCase() || - comp.meta.name.toLowerCase() === name.toLowerCase(), + // Read the shadcn registry + const shadcnRegistryPath = join(process.cwd(), "public/r/index.json"); + const shadcnRegistryContent = readFileSync(shadcnRegistryPath, "utf8"); + const shadcnRegistry = JSON.parse(shadcnRegistryContent); + + // Find the component in the shadcn registry + const shadcnComponent = shadcnRegistry.items?.find( + (item: RegistryItem) => item.name === name ); - if (!component) { - return `// Component '${name}' not found in registry`; - } - - const templateContent = getComponentTemplate(component.id as ComponentId); - - if (!templateContent) { - return `// Template content not found for component '${component.id}'`; + if (shadcnComponent?.files?.[0]?.content) { + return shadcnComponent.files[0].content; } - return templateContent; + return `// Component '${name}' not found in registry`; } catch (error) { console.error(`Error loading component ${name}:`, error); return `// Error loading component: ${ diff --git a/web/lib/navigation.ts b/web/lib/navigation.ts index 923e5071..3b547c84 100644 --- a/web/lib/navigation.ts +++ b/web/lib/navigation.ts @@ -18,7 +18,7 @@ export function getPageNavigation(currentUrl: string): PageNavigation { .filter((page) => !page.url.startsWith("/docs/components")) .sort((a, b) => { // Define specific order for intro docs - const order = ["/docs/intro", "/docs/usage", "/docs/mcp", "/docs/styles"]; + const order = ["/docs/intro", "/docs/usage", "/docs/styles"]; const aIndex = order.indexOf(a.url); const bIndex = order.indexOf(b.url); diff --git a/web/next.config.ts b/web/next.config.ts index ca5cd983..1d2c0cdb 100644 --- a/web/next.config.ts +++ b/web/next.config.ts @@ -1,12 +1,24 @@ -import { createMDX } from 'fumadocs-mdx/next' -import type { NextConfig } from 'next' +import { createMDX } from "fumadocs-mdx/next"; +import type { NextConfig } from "next"; -const withMDX = createMDX() +import path from "node:path"; + +const withMDX = createMDX(); /** @type {import('next').NextConfig} */ const nextConfig: NextConfig = { - reactStrictMode: true, - pageExtensions: ['js', 'jsx', 'md', 'mdx', 'ts', 'tsx'], -} + reactStrictMode: true, + pageExtensions: ["js", "jsx", "md", "mdx", "ts", "tsx"], + webpack: (config) => { + config.resolve.alias = { + ...config.resolve.alias, + "@/components/ui": path.resolve( + __dirname, + "../packages/components/src/core", + ), + }; + return config; + }, +}; -export default withMDX(nextConfig) +export default withMDX(nextConfig); diff --git a/web/public/build-info.json b/web/public/build-info.json deleted file mode 100644 index d9d683e4..00000000 --- a/web/public/build-info.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "git": "455dfae9315cace10ef764d089c2778f634aae15", - "builtAt": "2025-08-08T01:49:22.799Z", - "registrySHA256": "1590188dcc793bbd" -} \ No newline at end of file diff --git a/web/public/r/accordion.json b/web/public/r/accordion.json new file mode 100644 index 00000000..a7c8f2c5 --- /dev/null +++ b/web/public/r/accordion.json @@ -0,0 +1,96 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "accordion", + "type": "registry:ui", + "title": "accordion", + "author": "BaseLayer", + "description": "An accordion allows users to toggle the display of sections of content. Each accordion consists of a header with a title and content area.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/accordion/accordion.tsx", + "content": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport {\n\tButton,\n\tDisclosure,\n\tDisclosureGroup,\n\ttype DisclosureGroupProps,\n\tDisclosurePanel,\n\ttype DisclosureProps,\n\tHeading,\n} from \"react-aria-components\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nimport { Minus, Plus } from \"lucide-react\";\n\nconst accordion = tv({\n\tslots: {\n\t\troot: \"group w-full\",\n\t\tgroup: \"flex flex-col gap-3\",\n\t\tbutton:\n\t\t\t\"flex w-full items-center justify-between gap-6 rounded-2xl border border-border bg-surface-2 p-4 data-[focus-visible]:outline-none data-[focus-visible]:ring-2 data-[focus-visible]:ring-focus data-[focus-visible]:ring-offset-2 data-[focus-visible]:ring-offset-surface group-data-[expanded]:rounded-b-none group-data-[expanded]:border-b-0\",\n\t\ticon: \"size-4 shrink-0 fill-none transition-transform duration-200\",\n\t\tpanel:\n\t\t\t\"rounded-b-2xl border-border bg-surface-2 px-4 text-muted-foreground text-sm group-data-[expanded]:border-x group-data-[expanded]:border-b group-data-[expanded]:pb-4\",\n\t},\n});\n\nconst styles = accordion();\n\ntype AccordionVariantProps = VariantProps;\n\ninterface AccordionProps\n\textends AccordionVariantProps,\n\t\tOmit {\n\tclassName?: string;\n\ttitle?: string;\n\tchildren?: ReactNode;\n}\n\nconst Accordion = ({\n\tclassName,\n\ttitle,\n\tchildren,\n\t...props\n}: AccordionProps) => {\n\treturn (\n\t\t\n\t\t\t{({ isExpanded }) => (\n\t\t\t\t<>\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{children}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t)}\n\t\t\n\t);\n};\n\ninterface AccordionGroupProps extends DisclosureGroupProps {\n\tclassName?: string;\n\tchildren: ReactNode;\n}\n\nconst AccordionGroup = ({\n\tclassName,\n\tchildren,\n\t...props\n}: AccordionGroupProps) => (\n\t\n\t\t{children}\n\t\n);\n\nexport { Accordion, AccordionGroup };\nexport type { AccordionProps, AccordionGroupProps };\n", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "disclosure", + "collapsible", + "expandable", + "content" + ] + }, + "categories": [ + "layout" + ] +} \ No newline at end of file diff --git a/web/public/r/badge.json b/web/public/r/badge.json new file mode 100644 index 00000000..77359341 --- /dev/null +++ b/web/public/r/badge.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "badge", + "type": "registry:ui", + "title": "badge", + "author": "BaseLayer", + "description": "A badge is a small label that can be used to display information or status.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/badge/badge.tsx", + "content": "import type { HTMLAttributes } from \"react\";\n\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nexport const badge = tv({\n\tbase: \"flex items-center justify-center rounded-4xl px-3 py-2 font-semibold text-xs\",\n\tvariants: {\n\t\tvariant: {\n\t\t\tattention: \"bg-gradient-to-r from-pink-500 to-purple-500 text-white\",\n\t\t\tneutral: \"bg-secondary text-secondary-fg\",\n\t\t\tdanger: \"bg-danger text-danger-fg\",\n\t\t},\n\t},\n\tdefaultVariants: {\n\t\tvariant: \"attention\",\n\t},\n});\n\ntype BadgeProps = VariantProps & HTMLAttributes;\n\nconst Badge = ({ className, variant, ...props }: BadgeProps) => (\n\t\n);\n\nexport { Badge };\nexport type { BadgeProps };\n", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "status" + ] + }, + "categories": [ + "display" + ] +} \ No newline at end of file diff --git a/web/public/r/breadcrumbs.json b/web/public/r/breadcrumbs.json new file mode 100644 index 00000000..31550256 --- /dev/null +++ b/web/public/r/breadcrumbs.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "breadcrumbs", + "type": "registry:ui", + "title": "breadcrumbs", + "author": "BaseLayer", + "description": "Breadcrumbs display a heirarchy of links to the current page or resource in an application.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/breadcrumbs/breadcrumbs.tsx", + "content": "\"use client\";\n\nimport {\n\tBreadcrumbs as AriaBreadcrumbs,\n\ttype BreadcrumbsProps as AriaBreadcrumbsProps,\n\tBreadcrumb,\n\ttype BreadcrumbProps,\n\tLink,\n\ttype LinkProps,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst breadcrumbs = tv({\n\tslots: {\n\t\troot: \"m-0 flex list-none items-center gap-2 p-0 font-md\",\n\t\tlink: \"relative cursor-pointer rounded-md text-fg outline-none ring-focus data-[hovered]:underline data-[focus-visible]:ring-2 [&[aria-current]]:font-extrabold [&[aria-current]]:text-fg\",\n\t\titem: \"flex items-center gap-2\",\n\t},\n});\n\nconst styles = breadcrumbs();\n\nconst Breadcrumbs = ({\n\tchildren,\n\tclassName,\n\t...props\n}: AriaBreadcrumbsProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst BreadcrumbsLink = ({\n\tchildren,\n\tclassName,\n\t...props\n}: LinkProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst BreadcrumbsItem = ({\n\tchildren,\n\tclassName,\n\t...props\n}: BreadcrumbProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nexport { BreadcrumbsItem, BreadcrumbsLink, Breadcrumbs };", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "navigation" + ] + }, + "categories": [ + "navigation" + ] +} \ No newline at end of file diff --git a/web/public/r/button.json b/web/public/r/button.json new file mode 100644 index 00000000..8c3cea11 --- /dev/null +++ b/web/public/r/button.json @@ -0,0 +1,94 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "button", + "type": "registry:ui", + "title": "button", + "author": "BaseLayer", + "description": "A button allows a user to perform an action, with mouse, touch, and keyboard interactions.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/button/button.tsx", + "content": "\"use client\";\n\nimport {\n\tButton as AriaButton,\n\ttype ButtonProps as AriaButtonProps,\n} from \"react-aria-components\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nconst button = tv({\n\tbase: \"inline-flex appearance-none items-center justify-center rounded-full font-semibold outline-none ring-focus ring-offset-3 ring-offset-surface transition-transform duration-100 disabled:pointer-events-none disabled:opacity-50 data-[focus-visible]:ring-2\",\n\tvariants: {\n\t\tvariant: {\n\t\t\tprimary:\n\t\t\t\t\"bg-primary text-primary-fg data-[hovered]:bg-primary/80\",\n\t\t\tsecondary:\n\t\t\t\t\"border border-border text-fg data-[hovered]:border-secondary data-[hovered]:bg-secondary\",\n\t\t\tghost:\n\t\t\t\t\"bg-transparent text-fg data-[hovered]:bg-secondary data-[hovered]:text-secondary-fg\",\n\t\t\tdanger:\n\t\t\t\t\"border border-transparent bg-danger text-danger-fg data-[hovered]:bg-danger/80\",\n\t\t},\n\t\tsize: {\n\t\t\tsm: \"px-2 py-1.5 text-sm\",\n\t\t\tmd: \"px-4 py-2.5 text-base\",\n\t\t\tlg: \"px-6 py-3.5 font-bold text-lg\",\n\t\t\ticon: \"size-9\",\n\t\t},\n\t},\n\tdefaultVariants: {\n\t\tvariant: \"primary\",\n\t\tsize: \"md\",\n\t},\n});\n\ntype ButtonVariantProps = VariantProps;\n\ninterface ButtonProps\n\textends Omit,\n\t\tButtonVariantProps {\n\tclassName?: string;\n}\n\nconst Button = ({\n\tclassName,\n\tsize,\n\tvariant,\n\tchildren,\n\t...props\n}: ButtonProps) => (\n\t\n\t\t{children}\n\t\n);\n\nButton.displayName = \"Button\";\n\nexport { Button };\nexport type { ButtonProps };\n", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive" + ] + }, + "categories": [ + "forms" + ] +} \ No newline at end of file diff --git a/web/public/r/calendar.json b/web/public/r/calendar.json new file mode 100644 index 00000000..e9a465e7 --- /dev/null +++ b/web/public/r/calendar.json @@ -0,0 +1,95 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "calendar", + "type": "registry:ui", + "title": "calendar", + "author": "BaseLayer", + "description": "A calendar displays one or more date grids and allows users to select either a single date or a contiguous range of dates.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/calendar/calendar.tsx", + "content": "\"use client\";\n\nimport {\n\tCalendar as AriaCalendar,\n\ttype CalendarProps as AriaCalendarProps,\n\tRangeCalendar as AriaRangeCalendar,\n\ttype RangeCalendarProps as AriaRangeCalendarProps,\n\tButton,\n\tCalendarCell,\n\tCalendarGrid,\n\tCalendarGridBody,\n\tCalendarGridHeader,\n\tCalendarHeaderCell,\n\ttype DateValue,\n\tHeading,\n\tText,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\n\nconst baseStyles = tv({\n\tslots: {\n\t\troot: \"w-fit max-w-full rounded-2xl border border-border bg-surface p-4 text-fg\",\n\t\theader: \"flex w-full items-center gap-1 pb-4\",\n\t\theading: \"flex-1 text-center font-bold\",\n\t\theaderCell: \"pb-2 text-fg-muted text-sm\",\n\t\tmonthButton:\n\t\t\t\"flex appearance-none items-center justify-center rounded-full p-2 text-center outline-none ring-focus data-[hovered]:bg-secondary data-[focus-visible]:ring-2\",\n\t},\n});\n\nconst calendar = tv({\n\textend: baseStyles,\n\tslots: {\n\t\tcell: \"flex size-9 cursor-default items-center justify-center rounded-full border-border text-center text-sm outline-focus outline-offset-2 data-[hovered]:bg-secondary data-[pressed]:bg-secondary data-[selected]:bg-primary data-[selected]:text-primary-fg data-[unavailable]:text-fg-muted data-[unavailable]:line-through data-[focus-visible]:outline-2 data-[focus-visible]:outline-focus [&[data-outside-month]]:hidden\",\n\t},\n});\n\nconst rangeCalendar = tv({\n\textend: baseStyles,\n\tslots: {\n\t\tcell: \"flex size-9 cursor-default items-center justify-center rounded-full text-center text-sm outline-none outline-offset-2 data-[selected]:rounded-none data-[hovered]:bg-secondary data-[pressed]:bg-secondary data-[selected]:bg-primary data-[selected]:text-primary-fg data-[unavailable]:text-fg-muted data-[unavailable]:line-through data-[focus-visible]:ring-2 data-[focus-visible]:ring-focus data-[focus-visible]:ring-offset-2 [&[data-outside-month]]:hidden [&[data-selection-end]]:rounded-r-full [&[data-selection-start]]:rounded-l-full\",\n\t},\n});\n\nconst styles = calendar();\nconst rangeStyles = rangeCalendar();\n\ninterface CalendarProps\n\textends Omit, \"className\"> {\n\terrorMessage?: string;\n\tclassName?: string;\n}\n\nconst Calendar = ({\n\tclassName,\n\terrorMessage,\n\t...props\n}: CalendarProps) => (\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
\n\t\t\n\t\t\t\n\t\t\t\t{(day) => (\n\t\t\t\t\t\n\t\t\t\t\t\t{day}\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t\t\n\t\t\t\t{(date) => }\n\t\t\t\n\t\t\n\t\t{errorMessage && (\n\t\t\t\n\t\t\t\t{errorMessage}\n\t\t\t\n\t\t)}\n\t
\n);\n\ninterface RangeCalendarProps\n\textends Omit, \"className\"> {\n\terrorMessage?: string;\n\tclassName?: string;\n}\n\nconst RangeCalendar = ({\n\tclassName,\n\terrorMessage,\n\t...props\n}: RangeCalendarProps) => (\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
\n\t\t\n\t\t\t\n\t\t\t\t{(day) => (\n\t\t\t\t\t\n\t\t\t\t\t\t{day}\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t\t\n\t\t\t\t{(date) => }\n\t\t\t\n\t\t\n\t\t{errorMessage && (\n\t\t\t\n\t\t\t\t{errorMessage}\n\t\t\t\n\t\t)}\n\t
\n);\n\nexport { Calendar, RangeCalendar };\nexport type { CalendarProps, RangeCalendarProps };\n", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "date-time" + ] + }, + "categories": [ + "data-entry" + ] +} \ No newline at end of file diff --git a/web/public/r/card.json b/web/public/r/card.json new file mode 100644 index 00000000..5e1477a9 --- /dev/null +++ b/web/public/r/card.json @@ -0,0 +1,95 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "card", + "type": "registry:ui", + "title": "card", + "author": "BaseLayer", + "description": "Displays a card with header, content, and footer.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/card/card.tsx", + "content": "\"use client\";\n\nimport type { HTMLAttributes } from \"react\";\n\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nconst card = tv({\n\tslots: {\n\t\troot: \"rounded-2xl border-2 bg-surface text-fg\",\n\t\theader: \"flex flex-col space-y-1.5 p-6\",\n\t\ttitle: \"font-semibold text-2xl leading-none tracking-tight\",\n\t\tdescription: \"text-fg-muted text-sm\",\n\t\tcontent: \"p-6 pt-0\",\n\t\tfooter: \"flex items-center p-6 pt-0\",\n\t},\n\tvariants: {\n\t\tvariant: {\n\t\t\toutlined: {\n\t\t\t\troot: \"border border-border/50\",\n\t\t\t},\n\t\t\tfilled: {\n\t\t\t\troot: \"border-surface-2 bg-surface-2\",\n\t\t\t},\n\t\t},\n\t},\n\tdefaultVariants: {\n\t\tvariant: \"outlined\",\n\t},\n});\n\nconst styles = card();\n\ntype CardVariantProps = VariantProps;\n\ninterface CardProps extends HTMLAttributes, CardVariantProps {\n\tclassName?: string;\n\ttitle?: string;\n\tdescription?: string;\n}\n\ninterface CardHeaderProps extends HTMLAttributes {\n\tclassName?: string;\n}\n\ninterface CardContentProps extends HTMLAttributes {\n\tclassName?: string;\n}\n\ninterface CardFooterProps extends HTMLAttributes {\n\tclassName?: string;\n}\n\nconst Card = ({\n\tclassName,\n\tvariant,\n\ttitle,\n\tdescription,\n\tchildren,\n\t...props\n}: CardProps) => (\n\t
\n\t\t{(title || description) && (\n\t\t\t
\n\t\t\t\t{title &&

{title}

}\n\t\t\t\t{description &&

{description}

}\n\t\t\t
\n\t\t)}\n\t\t{children}\n\t
\n);\n\nconst CardHeader = ({ className, ...props }: CardHeaderProps) => (\n\t
\n);\n\nconst CardContent = ({ className, ...props }: CardContentProps) => (\n\t
\n);\n\nconst CardFooter = ({ className, ...props }: CardFooterProps) => (\n\t
\n);\n\nexport { Card, CardHeader, CardContent, CardFooter };\nexport type { CardProps, CardHeaderProps, CardContentProps, CardFooterProps };\n", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "layout", + "container", + "display" + ] + }, + "categories": [ + "layout" + ] +} \ No newline at end of file diff --git a/web/public/r/checkbox.json b/web/public/r/checkbox.json new file mode 100644 index 00000000..1464c4d1 --- /dev/null +++ b/web/public/r/checkbox.json @@ -0,0 +1,94 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "checkbox", + "type": "registry:ui", + "title": "checkbox", + "author": "BaseLayer", + "description": "A checkbox allows a user to select multiple items from a list of individual items, or to mark one individual item as selected.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/checkbox/checkbox.tsx", + "content": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport {\n\ttype CheckboxProps as AriaCheckBoxProps,\n\tCheckbox as AriaCheckbox,\n\tCheckboxGroup as AriaCheckboxGroup,\n\ttype CheckboxGroupProps as AriaCheckboxGroupProps,\n\tFieldError,\n\tText,\n\ttype ValidationResult,\n} from \"react-aria-components\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nimport { Check } from \"lucide-react\";\n\nconst checkbox = tv({\n\tbase: \"group flex items-center justify-center gap-2 py-1 text-fg\",\n});\n\nconst checkboxGroup = tv({\n\tbase: \"flex flex-col gap-2\",\n});\n\ntype CheckboxVariantProps = VariantProps;\n\ninterface CheckboxProps extends CheckboxVariantProps, AriaCheckBoxProps {\n\tclassName?: string;\n\tchildren: ReactNode;\n\tdescription?: string;\n\terrorMessage?: string | ((validation: ValidationResult) => string);\n}\n\nconst Checkbox = ({\n\tclassName,\n\terrorMessage,\n\tchildren,\n\tdescription,\n\t...props\n}: CheckboxProps) => {\n\treturn (\n\t\t\n\t\t\t{({ isSelected }) => (\n\t\t\t\t<>\n\t\t\t\t\t
\n\t\t\t\t\t\t{isSelected && }\n\t\t\t\t\t
\n\t\t\t\t\t{children}\n\t\t\t\t\t{description && (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t\t\n\t\t\t\t\t\t{errorMessage}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t)}\n\t\t
\n\t);\n};\n\ninterface CheckboxGroupProps extends AriaCheckboxGroupProps {\n\tclassName?: string;\n\tlabel?: string;\n\tchildren: ReactNode;\n\tdescription?: string;\n\terrorMessage?: string | ((validation: ValidationResult) => string);\n}\n\nconst CheckboxGroup = ({\n\tclassName,\n\tlabel,\n\tdescription,\n\terrorMessage,\n\tchildren,\n\t...props\n}: CheckboxGroupProps) => (\n\t\n\t\t{label && (\n\t\t\t\n\t\t\t\t{label}\n\t\t\t\n\t\t)}\n\t\t{children}\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage}\n\t\n);\n\nexport { Checkbox, CheckboxGroup };\nexport type { CheckboxProps, CheckboxGroupProps };\n", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive" + ] + }, + "categories": [ + "forms" + ] +} \ No newline at end of file diff --git a/web/public/r/combobox.json b/web/public/r/combobox.json new file mode 100644 index 00000000..b77e3148 --- /dev/null +++ b/web/public/r/combobox.json @@ -0,0 +1,95 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "combobox", + "type": "registry:ui", + "title": "combobox", + "author": "BaseLayer", + "description": "A combo box combines a text input with a listbox, allowing users to filter a list of options to items matching a query.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/combobox/combobox.tsx", + "content": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport {\n\tComboBox as AriaComboBox,\n\ttype ComboBoxProps as AriaComboBoxProps,\n\tButton,\n\tFieldError,\n\tInput,\n\tLabel,\n\tListBox,\n\tListBoxItem,\n\ttype ListBoxItemProps,\n\tPopover,\n\tText,\n\ttype ValidationResult,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nimport { CheckIcon, ChevronsUpDown } from \"lucide-react\";\n\nconst combobox = tv({\n\tslots: {\n\t\troot: \"group max-h-inherit w-full overflow-auto p-1 outline-none\",\n\t\tinput:\n\t\t\t\"w-full rounded-lg border border-border bg-surface px-4 py-1.5 align-middle font-semibold text-fg outline-none ring-fg transition-all group-data-[focused]:border-transparent group-data-[focused]:bg-surface group-data-[focused]:ring-2\",\n\t\tbutton:\n\t\t\t\"absolute right-2 flex appearance-none items-center justify-center rounded-full border-0 outline-none ring-focus ring-offset-2 ring-offset-surface data-[focus-visible]:ring-2\",\n\t\tpopover:\n\t\t\t\"w-[var(--trigger-width)] rounded-xl border border-border/25 bg-surface p-1 text-fg shadow-lg outline-none\",\n\t\titem: \"relative m-1 flex cursor-default flex-col rounded-lg p-2 font-semibold outline-none data-[disabled]:cursor-not-allowed data-[focused]:bg-secondary data-[disabled]:text-fg-disabled\",\n\t},\n});\n\nconst styles = combobox();\n\ninterface ComboBoxProps\n\textends Omit, \"className\"> {\n\tclassName?: string;\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string | ((validation: ValidationResult) => string);\n}\n\nconst ComboBox = ({\n\tlabel,\n\tclassName,\n\tdescription,\n\terrorMessage,\n\tchildren,\n\t...props\n}: ComboBoxProps) => (\n\t\n\t\t{label && }\n\t\t
\n\t\t\t\n\t\t\t\n\t\t
\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage}\n\t\t\n\t\t\t{children}\n\t\t\n\t\n);\n\ninterface ComboBoxItemProps\n\textends Omit {\n\tchildren: ReactNode;\n\tclassName?: string;\n}\n\nconst ComboBoxItem = ({ className, ...props }: ComboBoxItemProps) => (\n\t\n\t\t{({ isSelected }) => (\n\t\t\t
\n\t\t\t\t{props.children}\n\t\t\t\t{isSelected && }\n\t\t\t
\n\t\t)}\n\t
\n);\n\nexport { ComboBox, ComboBoxItem };\nexport type { ComboBoxProps, ListBoxItemProps as ComboBoxItemProps };", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "picker" + ] + }, + "categories": [ + "forms" + ] +} \ No newline at end of file diff --git a/web/public/r/command.json b/web/public/r/command.json new file mode 100644 index 00000000..f1217ed1 --- /dev/null +++ b/web/public/r/command.json @@ -0,0 +1,96 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "command", + "type": "registry:ui", + "title": "command", + "author": "BaseLayer", + "description": "A command palette that allows users to quickly search and execute commands using keyboard shortcuts.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/command/command.tsx", + "content": "\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useEffect, useState } from \"react\";\n\nimport {\n\tButton as AriaButton,\n\tDialog as AriaDialog,\n\tDialogTrigger as AriaDialogTrigger,\n\tModal as AriaModal,\n\tAutocomplete,\n\tInput,\n\tMenu,\n\tMenuItem,\n\ttype MenuItemProps,\n\tModalOverlay,\n\ttype ModalOverlayProps,\n\tTextField,\n\tuseFilter,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nimport { Search } from \"lucide-react\";\n\nconst command = tv({\n\tslots: {\n\t\ttrigger:\n\t\t\t\"flex w-full items-center justify-between rounded-full bg-secondary px-4 py-2 font-semibold text-fg outline-none ring-primary ring-offset-2 ring-offset-surface transition-colors data-[hovered]:bg-secondary/75 data-[focus-visible]:ring-2\",\n\t\toverlay:\n\t\t\t\"data-[entering]:fade-in data-[exiting]:fade-out fixed inset-0 z-50 flex min-h-full items-start justify-center bg-zinc-500/25 p-4 text-center data-[entering]:animate-in data-[exiting]:animate-out data-[entering]:duration-300 data-[exiting]:duration-200 sm:items-center\",\n\t\tmodal:\n\t\t\t\"data-[entering]:zoom-in-95 data-[exiting]:zoom-out-95 data-[entering]:animate-in data-[exiting]:animate-out data-[entering]:duration-300 data-[exiting]:duration-200\",\n\t\tdialog:\n\t\t\t\"flex min-h-96 min-w-80 max-w-full flex-col gap-1 rounded-2xl bg-surface p-2 shadow-lg outline-none md:w-lg\",\n\t\tinput:\n\t\t\t\"rounded-lg border-b-2 border-none bg-transparent px-3 py-2 text-base text-fg leading-5 outline-none placeholder:text-fg-muted\",\n\t\tmenu: \"mt-2 h-80 overflow-auto\",\n\t\titem: \"group flex min-h-12 w-full cursor-default items-center rounded-lg px-3 py-2 text-fg outline-none data-[focused]:bg-secondary data-[pressed]:bg-surface-3 data-[focused]:text-focus-fg\",\n\t\tkbd: \"ml-auto rounded border border-border bg-surface-2 px-2 py-1 font-semibold text-fg-muted text-xs\",\n\t},\n});\n\nconst styles = command();\n\ninterface CommandItem {\n\tid: string;\n\tlabel: string;\n\tshortcut?: string;\n\ticon?: ComponentType<{ className?: string }>;\n\tonSelect?: () => void;\n}\n\ninterface CommandProps extends Omit {\n\tclassName?: string;\n\ttrigger?: ReactNode;\n\tcommands: CommandItem[];\n\tplaceholder?: string;\n\ttriggerKey?: string;\n\tonCommandSelect?: (command: CommandItem) => void;\n\tonSearchChange?: (search: string) => void;\n}\n\nconst Command = ({\n\tclassName,\n\ttrigger,\n\tcommands,\n\tplaceholder = \"Search commands…\",\n\ttriggerKey = \"k\",\n\tonCommandSelect,\n\tonSearchChange,\n\t...props\n}: CommandProps) => {\n\tconst [isOpen, setOpen] = useState(false);\n\tconst [isMac, setIsMac] = useState(true);\n\tconst { contains } = useFilter({ sensitivity: \"base\" });\n\n\tuseEffect(() => {\n\t\tsetIsMac(/Mac/.test(navigator?.platform || \"\"));\n\t}, []);\n\n\tuseEffect(() => {\n\t\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t\tif (\n\t\t\t\te.key.toLowerCase() === triggerKey.toLowerCase() &&\n\t\t\t\t(isMac ? e.metaKey : e.ctrlKey)\n\t\t\t) {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetOpen((prev) => !prev);\n\t\t\t} else if (e.key === \"Escape\") {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetOpen(false);\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown);\n\t\treturn () => document.removeEventListener(\"keydown\", handleKeyDown);\n\t}, [isMac, triggerKey]);\n\n\tconst handleCommandSelect = (command: CommandItem) => {\n\t\tcommand.onSelect?.();\n\t\tonCommandSelect?.(command);\n\t\tsetOpen(false);\n\t};\n\n\treturn (\n\t\t\n\t\t\t{trigger || (\n\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\tSearch\n\t\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t{isMac ? \"⌘\" : \"Ctrl\"} {triggerKey.toUpperCase()}\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t)}\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t true : contains}>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{({ label, shortcut, icon: Icon, ...command }) => (\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\thandleCommandSelect({\n\t\t\t\t\t\t\t\t\t\t\t\tlabel,\n\t\t\t\t\t\t\t\t\t\t\t\tshortcut,\n\t\t\t\t\t\t\t\t\t\t\t\ticon: Icon,\n\t\t\t\t\t\t\t\t\t\t\t\t...command,\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t{Icon && (\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t{shortcut && (\n\t\t\t\t\t\t\t\t\t\t\t{shortcut}\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n};\n\ninterface CommandMenuItemProps extends Omit {\n\tclassName?: string;\n\tchildren: ReactNode;\n}\n\nconst CommandMenuItem = ({\n\tclassName,\n\tchildren,\n\t...props\n}: CommandMenuItemProps) => (\n\t\n\t\t{children}\n\t\n);\n\nconst CommandTrigger = AriaDialogTrigger;\n\nexport { Command, CommandMenuItem, CommandTrigger };\nexport type { CommandProps, CommandMenuItemProps, CommandItem };\n", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "beta", + "tags": [ + "search", + "navigation", + "keyboard", + "palette" + ] + }, + "categories": [ + "navigation" + ] +} \ No newline at end of file diff --git a/web/public/r/date-field.json b/web/public/r/date-field.json new file mode 100644 index 00000000..9c1b0d14 --- /dev/null +++ b/web/public/r/date-field.json @@ -0,0 +1,95 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "date-field", + "type": "registry:ui", + "title": "date-field", + "author": "BaseLayer", + "description": "A date field allows users to enter and edit date and time values using a keyboard. Each part of a date value is displayed in an individually editable segment.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/date-field/date-field.tsx", + "content": "\"use client\";\n\nimport type {\n\tDateFieldProps as AriaDateFieldProps,\n\tDateValue,\n} from \"react-aria-components\";\nimport {\n\tDateField as AriaDateField,\n\tDateInput,\n\tDateSegment,\n\tFieldError,\n\tLabel,\n\tText,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst dateField = tv({\n\tslots: {\n\t\tinput:\n\t\t\t\"flex min-h-11 min-w-48 appearance-none items-center rounded-lg border border-border bg-surface px-3 py-0.5 outline-none ring-primary transition-all data-[disabled]:cursor-not-allowed data-[focus-within]:border-transparent data-[disabled]:border-none data-[disabled]:bg-primary/10 data-[focus-within]:bg-surface data-[disabled]:text-fg-disabled data-[focus-within]:ring-2 [&::placeholder]:text-sm\",\n\t\tsegmentStyles:\n\t\t\t\"rounded-md p-1 text-end outline-none focus:text-primary-fg data-[focused]:bg-primary data-[placeholder]:text-fg-muted data-[type='literal']:text-fg-muted data-[placeholder]:focus:text-primary-fg\",\n\t},\n});\n\nconst styles = dateField();\n\ninterface DateFieldProps extends AriaDateFieldProps {\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string;\n}\n\nconst DateField = ({\n\tlabel,\n\tdescription,\n\terrorMessage,\n\t...props\n}: DateFieldProps) => (\n\t\n\t\t{label && }\n\t\t\n\t\t\t{(segment) => (\n\t\t\t\t\n\t\t\t)}\n\t\t\n\t\t{description && {description}}\n\t\t{errorMessage}\n\t\n);\n\nexport { DateField };\nexport type { DateFieldProps };\n", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "date" + ] + }, + "categories": [ + "forms" + ] +} \ No newline at end of file diff --git a/web/public/r/date-picker.json b/web/public/r/date-picker.json new file mode 100644 index 00000000..79c199f3 --- /dev/null +++ b/web/public/r/date-picker.json @@ -0,0 +1,98 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "date-picker", + "type": "registry:ui", + "title": "date-picker", + "author": "BaseLayer", + "description": "A date picker combines one or more DateFields with a calendar popover, allowing users to enter or select a single date/time or a range.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "registryDependencies": [ + "calendar" + ], + "files": [ + { + "path": "src/core/date-picker/date-picker.tsx", + "content": "\"use client\";\n\nimport type {\n\tDatePickerProps as AriaDatePickerProps,\n\tDateRangePickerProps as AriaDateRangePickerProps,\n} from \"react-aria-components\";\nimport {\n\tDatePicker as AriaDatePicker,\n\tDateRangePicker as AriaDateRangePicker,\n\tButton,\n\tDateInput,\n\tDateSegment,\n\ttype DateValue,\n\tDialog,\n\tFieldError,\n\tGroup,\n\tLabel,\n\tPopover,\n\tText,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nimport { ChevronDown } from \"lucide-react\";\n\nimport { Calendar, RangeCalendar } from \"@/components/ui/calendar/calendar\";\n\nconst baseStyles = tv({\n\tslots: {\n\t\tinput:\n\t\t\t\"appearance-none rounded-lg px-3 py-1.5 outline-none ring-primary transition-all\",\n\t\tpopover:\n\t\t\t\"overflow-auto rounded-2xl data-[entering]:animate-fade data-[exiting]:animate-fadeOut\",\n\t},\n});\n\nconst datePicker = tv({\n\textend: baseStyles,\n\tslots: {\n\t\tgroup:\n\t\t\t\"relative flex min-h-11 w-auto min-w-48 items-center rounded-lg border border-border bg-surface transition-all data-[focus-within]:border-transparent data-[focus-within]:bg-surface data-[focus-within]:ring-2 data-[focus-within]:ring-primary data-[focus-within]:ring-offset-surface\",\n\t\tdateSegment:\n\t\t\t\"min-w-16 rounded-md p-1 text-end outline-none focus:bg-primary focus:text-primary-fg data-[placeholder]:text-fg-muted data-[type='literal']:text-fg-muted data-[placeholder]:focus:text-primary-fg\",\n\t},\n});\n\nconst dateRangePicker = tv({\n\textend: baseStyles,\n\tslots: {\n\t\tgroup:\n\t\t\t\"relative flex min-h-11 w-full flex-wrap items-center rounded-lg border border-border bg-surface transition-all data-[focus-within]:border-transparent data-[focus-within]:bg-surface data-[focus-within]:ring-2 data-[focus-within]:ring-primary data-[focus-within]:ring-offset-surface\",\n\t\tdateSegment:\n\t\t\t\"rounded-md p-1 text-end outline-none focus:bg-primary focus:text-primary-fg data-[placeholder]:text-fg-muted data-[type='literal']:text-fg-muted data-[placeholder]:focus:text-primary-fg\",\n\t\tseparator: \"px-2 text-fg-muted\",\n\t},\n});\n\nconst styles = datePicker();\nconst rangeStyles = dateRangePicker();\n\ninterface DatePickerProps extends AriaDatePickerProps {\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string;\n}\n\nconst DatePicker = ({\n\tclassName,\n\tlabel,\n\tdescription,\n\terrorMessage,\n\tchildren,\n\t...props\n}: DatePickerProps) => (\n\t\n\t\t{label && }\n\t\t\n\t\t\t\n\t\t\t\t{(segment) => (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t\t\n\t\t\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n);\n\ninterface DateRangePickerProps\n\textends AriaDateRangePickerProps {\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string;\n\tclassName?: string;\n}\n\nconst DateRangePicker = ({\n\tclassName,\n\tlabel,\n\tdescription,\n\terrorMessage,\n\tchildren,\n\t...props\n}: DateRangePickerProps) => (\n\t\n\t\t{label && }\n\t\t\n\t\t\t\n\t\t\t\t{(segment) => (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t\t\n\t\t\t\t–\n\t\t\t\n\t\t\t\n\t\t\t\t{(segment) => (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t\t\n\t\t\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n);\n\nexport { DatePicker, DateRangePicker };\nexport type { DatePickerProps, DateRangePickerProps };\n", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "date-time" + ] + }, + "categories": [ + "forms" + ] +} \ No newline at end of file diff --git a/web/public/r/index.json b/web/public/r/index.json new file mode 100644 index 00000000..76ea8742 --- /dev/null +++ b/web/public/r/index.json @@ -0,0 +1,1044 @@ +{ + "name": "baselayer", + "$schema": "https://ui.shadcn.com/schema/registry.json", + "homepage": "https://baselayer.dev", + "items": [ + { + "name": "accordion", + "type": "registry:ui", + "title": "accordion", + "description": "An accordion allows users to toggle the display of sections of content. Each accordion consists of a header with a title and content area.", + "author": "BaseLayer", + "categories": [ + "layout" + ], + "files": [ + { + "path": "components/base/accordion.tsx", + "content": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport {\n\tButton,\n\tDisclosure,\n\tDisclosureGroup,\n\ttype DisclosureGroupProps,\n\tDisclosurePanel,\n\ttype DisclosureProps,\n\tHeading,\n} from \"react-aria-components\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nimport { Minus, Plus } from \"lucide-react\";\n\nconst accordion = tv({\n\tslots: {\n\t\troot: \"group w-full\",\n\t\tgroup: \"flex flex-col gap-3\",\n\t\tbutton:\n\t\t\t\"flex w-full items-center justify-between gap-6 rounded-2xl border border-border bg-surface-2 p-4 data-[focus-visible]:outline-none data-[focus-visible]:ring-2 data-[focus-visible]:ring-focus data-[focus-visible]:ring-offset-2 data-[focus-visible]:ring-offset-surface group-data-[expanded]:rounded-b-none group-data-[expanded]:border-b-0\",\n\t\ticon: \"size-4 shrink-0 fill-none transition-transform duration-200\",\n\t\tpanel:\n\t\t\t\"rounded-b-2xl border-border bg-surface-2 px-4 text-muted-foreground text-sm group-data-[expanded]:border-x group-data-[expanded]:border-b group-data-[expanded]:pb-4\",\n\t},\n});\n\nconst styles = accordion();\n\ntype AccordionVariantProps = VariantProps;\n\ninterface AccordionProps\n\textends AccordionVariantProps,\n\t\tOmit {\n\tclassName?: string;\n\ttitle?: string;\n\tchildren?: ReactNode;\n}\n\nconst Accordion = ({\n\tclassName,\n\ttitle,\n\tchildren,\n\t...props\n}: AccordionProps) => {\n\treturn (\n\t\t\n\t\t\t{({ isExpanded }) => (\n\t\t\t\t<>\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{children}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t)}\n\t\t\n\t);\n};\n\ninterface AccordionGroupProps extends DisclosureGroupProps {\n\tclassName?: string;\n\tchildren: ReactNode;\n}\n\nconst AccordionGroup = ({\n\tclassName,\n\tchildren,\n\t...props\n}: AccordionGroupProps) => (\n\t\n\t\t{children}\n\t\n);\n\nexport { Accordion, AccordionGroup };\nexport type { AccordionProps, AccordionGroupProps };\n", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "disclosure", + "collapsible", + "expandable", + "content" + ] + } + }, + { + "name": "badge", + "type": "registry:ui", + "title": "badge", + "description": "A badge is a small label that can be used to display information or status.", + "author": "BaseLayer", + "categories": [ + "display" + ], + "files": [ + { + "path": "components/base/badge.tsx", + "content": "import type { HTMLAttributes } from \"react\";\n\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nexport const badge = tv({\n\tbase: \"flex items-center justify-center rounded-4xl px-3 py-2 font-semibold text-xs\",\n\tvariants: {\n\t\tvariant: {\n\t\t\tattention: \"bg-gradient-to-r from-pink-500 to-purple-500 text-white\",\n\t\t\tneutral: \"bg-secondary text-secondary-fg\",\n\t\t\tdanger: \"bg-danger text-danger-fg\",\n\t\t},\n\t},\n\tdefaultVariants: {\n\t\tvariant: \"attention\",\n\t},\n});\n\ntype BadgeProps = VariantProps & HTMLAttributes;\n\nconst Badge = ({ className, variant, ...props }: BadgeProps) => (\n\t\n);\n\nexport { Badge };\nexport type { BadgeProps };\n", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "status" + ] + } + }, + { + "name": "breadcrumbs", + "type": "registry:ui", + "title": "breadcrumbs", + "description": "Breadcrumbs display a heirarchy of links to the current page or resource in an application.", + "author": "BaseLayer", + "categories": [ + "navigation" + ], + "files": [ + { + "path": "components/base/breadcrumbs.tsx", + "content": "\"use client\";\n\nimport {\n\tBreadcrumbs as AriaBreadcrumbs,\n\ttype BreadcrumbsProps as AriaBreadcrumbsProps,\n\tBreadcrumb,\n\ttype BreadcrumbProps,\n\tLink,\n\ttype LinkProps,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst breadcrumbs = tv({\n\tslots: {\n\t\troot: \"m-0 flex list-none items-center gap-2 p-0 font-md\",\n\t\tlink: \"relative cursor-pointer rounded-md text-fg outline-none ring-focus data-[hovered]:underline data-[focus-visible]:ring-2 [&[aria-current]]:font-extrabold [&[aria-current]]:text-fg\",\n\t\titem: \"flex items-center gap-2\",\n\t},\n});\n\nconst styles = breadcrumbs();\n\nconst Breadcrumbs = ({\n\tchildren,\n\tclassName,\n\t...props\n}: AriaBreadcrumbsProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst BreadcrumbsLink = ({\n\tchildren,\n\tclassName,\n\t...props\n}: LinkProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst BreadcrumbsItem = ({\n\tchildren,\n\tclassName,\n\t...props\n}: BreadcrumbProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nexport { BreadcrumbsItem, BreadcrumbsLink, Breadcrumbs };", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "navigation" + ] + } + }, + { + "name": "button", + "type": "registry:ui", + "title": "button", + "description": "A button allows a user to perform an action, with mouse, touch, and keyboard interactions.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "components/base/button.tsx", + "content": "\"use client\";\n\nimport {\n\tButton as AriaButton,\n\ttype ButtonProps as AriaButtonProps,\n} from \"react-aria-components\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nconst button = tv({\n\tbase: \"inline-flex appearance-none items-center justify-center rounded-full font-semibold outline-none ring-focus ring-offset-3 ring-offset-surface transition-transform duration-100 disabled:pointer-events-none disabled:opacity-50 data-[focus-visible]:ring-2\",\n\tvariants: {\n\t\tvariant: {\n\t\t\tprimary:\n\t\t\t\t\"bg-primary text-primary-fg data-[hovered]:bg-primary/80\",\n\t\t\tsecondary:\n\t\t\t\t\"border border-border text-fg data-[hovered]:border-secondary data-[hovered]:bg-secondary\",\n\t\t\tghost:\n\t\t\t\t\"bg-transparent text-fg data-[hovered]:bg-secondary data-[hovered]:text-secondary-fg\",\n\t\t\tdanger:\n\t\t\t\t\"border border-transparent bg-danger text-danger-fg data-[hovered]:bg-danger/80\",\n\t\t},\n\t\tsize: {\n\t\t\tsm: \"px-2 py-1.5 text-sm\",\n\t\t\tmd: \"px-4 py-2.5 text-base\",\n\t\t\tlg: \"px-6 py-3.5 font-bold text-lg\",\n\t\t\ticon: \"size-9\",\n\t\t},\n\t},\n\tdefaultVariants: {\n\t\tvariant: \"primary\",\n\t\tsize: \"md\",\n\t},\n});\n\ntype ButtonVariantProps = VariantProps;\n\ninterface ButtonProps\n\textends Omit,\n\t\tButtonVariantProps {\n\tclassName?: string;\n}\n\nconst Button = ({\n\tclassName,\n\tsize,\n\tvariant,\n\tchildren,\n\t...props\n}: ButtonProps) => (\n\t\n\t\t{children}\n\t\n);\n\nButton.displayName = \"Button\";\n\nexport { Button };\nexport type { ButtonProps };\n", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive" + ] + } + }, + { + "name": "calendar", + "type": "registry:ui", + "title": "calendar", + "description": "A calendar displays one or more date grids and allows users to select either a single date or a contiguous range of dates.", + "author": "BaseLayer", + "categories": [ + "data-entry" + ], + "files": [ + { + "path": "components/base/calendar.tsx", + "content": "\"use client\";\n\nimport {\n\tCalendar as AriaCalendar,\n\ttype CalendarProps as AriaCalendarProps,\n\tRangeCalendar as AriaRangeCalendar,\n\ttype RangeCalendarProps as AriaRangeCalendarProps,\n\tButton,\n\tCalendarCell,\n\tCalendarGrid,\n\tCalendarGridBody,\n\tCalendarGridHeader,\n\tCalendarHeaderCell,\n\ttype DateValue,\n\tHeading,\n\tText,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\n\nconst baseStyles = tv({\n\tslots: {\n\t\troot: \"w-fit max-w-full rounded-2xl border border-border bg-surface p-4 text-fg\",\n\t\theader: \"flex w-full items-center gap-1 pb-4\",\n\t\theading: \"flex-1 text-center font-bold\",\n\t\theaderCell: \"pb-2 text-fg-muted text-sm\",\n\t\tmonthButton:\n\t\t\t\"flex appearance-none items-center justify-center rounded-full p-2 text-center outline-none ring-focus data-[hovered]:bg-secondary data-[focus-visible]:ring-2\",\n\t},\n});\n\nconst calendar = tv({\n\textend: baseStyles,\n\tslots: {\n\t\tcell: \"flex size-9 cursor-default items-center justify-center rounded-full border-border text-center text-sm outline-focus outline-offset-2 data-[hovered]:bg-secondary data-[pressed]:bg-secondary data-[selected]:bg-primary data-[selected]:text-primary-fg data-[unavailable]:text-fg-muted data-[unavailable]:line-through data-[focus-visible]:outline-2 data-[focus-visible]:outline-focus [&[data-outside-month]]:hidden\",\n\t},\n});\n\nconst rangeCalendar = tv({\n\textend: baseStyles,\n\tslots: {\n\t\tcell: \"flex size-9 cursor-default items-center justify-center rounded-full text-center text-sm outline-none outline-offset-2 data-[selected]:rounded-none data-[hovered]:bg-secondary data-[pressed]:bg-secondary data-[selected]:bg-primary data-[selected]:text-primary-fg data-[unavailable]:text-fg-muted data-[unavailable]:line-through data-[focus-visible]:ring-2 data-[focus-visible]:ring-focus data-[focus-visible]:ring-offset-2 [&[data-outside-month]]:hidden [&[data-selection-end]]:rounded-r-full [&[data-selection-start]]:rounded-l-full\",\n\t},\n});\n\nconst styles = calendar();\nconst rangeStyles = rangeCalendar();\n\ninterface CalendarProps\n\textends Omit, \"className\"> {\n\terrorMessage?: string;\n\tclassName?: string;\n}\n\nconst Calendar = ({\n\tclassName,\n\terrorMessage,\n\t...props\n}: CalendarProps) => (\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
\n\t\t\n\t\t\t\n\t\t\t\t{(day) => (\n\t\t\t\t\t\n\t\t\t\t\t\t{day}\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t\t\n\t\t\t\t{(date) => }\n\t\t\t\n\t\t\n\t\t{errorMessage && (\n\t\t\t\n\t\t\t\t{errorMessage}\n\t\t\t\n\t\t)}\n\t
\n);\n\ninterface RangeCalendarProps\n\textends Omit, \"className\"> {\n\terrorMessage?: string;\n\tclassName?: string;\n}\n\nconst RangeCalendar = ({\n\tclassName,\n\terrorMessage,\n\t...props\n}: RangeCalendarProps) => (\n\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
\n\t\t\n\t\t\t\n\t\t\t\t{(day) => (\n\t\t\t\t\t\n\t\t\t\t\t\t{day}\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t\t\n\t\t\t\t{(date) => }\n\t\t\t\n\t\t\n\t\t{errorMessage && (\n\t\t\t\n\t\t\t\t{errorMessage}\n\t\t\t\n\t\t)}\n\t
\n);\n\nexport { Calendar, RangeCalendar };\nexport type { CalendarProps, RangeCalendarProps };\n", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "date-time" + ] + } + }, + { + "name": "card", + "type": "registry:ui", + "title": "card", + "description": "Displays a card with header, content, and footer.", + "author": "BaseLayer", + "categories": [ + "layout" + ], + "files": [ + { + "path": "components/base/card.tsx", + "content": "\"use client\";\n\nimport type { HTMLAttributes } from \"react\";\n\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nconst card = tv({\n\tslots: {\n\t\troot: \"rounded-2xl border-2 bg-surface text-fg\",\n\t\theader: \"flex flex-col space-y-1.5 p-6\",\n\t\ttitle: \"font-semibold text-2xl leading-none tracking-tight\",\n\t\tdescription: \"text-fg-muted text-sm\",\n\t\tcontent: \"p-6 pt-0\",\n\t\tfooter: \"flex items-center p-6 pt-0\",\n\t},\n\tvariants: {\n\t\tvariant: {\n\t\t\toutlined: {\n\t\t\t\troot: \"border border-border/50\",\n\t\t\t},\n\t\t\tfilled: {\n\t\t\t\troot: \"border-surface-2 bg-surface-2\",\n\t\t\t},\n\t\t},\n\t},\n\tdefaultVariants: {\n\t\tvariant: \"outlined\",\n\t},\n});\n\nconst styles = card();\n\ntype CardVariantProps = VariantProps;\n\ninterface CardProps extends HTMLAttributes, CardVariantProps {\n\tclassName?: string;\n\ttitle?: string;\n\tdescription?: string;\n}\n\ninterface CardHeaderProps extends HTMLAttributes {\n\tclassName?: string;\n}\n\ninterface CardContentProps extends HTMLAttributes {\n\tclassName?: string;\n}\n\ninterface CardFooterProps extends HTMLAttributes {\n\tclassName?: string;\n}\n\nconst Card = ({\n\tclassName,\n\tvariant,\n\ttitle,\n\tdescription,\n\tchildren,\n\t...props\n}: CardProps) => (\n\t
\n\t\t{(title || description) && (\n\t\t\t
\n\t\t\t\t{title &&

{title}

}\n\t\t\t\t{description &&

{description}

}\n\t\t\t
\n\t\t)}\n\t\t{children}\n\t
\n);\n\nconst CardHeader = ({ className, ...props }: CardHeaderProps) => (\n\t
\n);\n\nconst CardContent = ({ className, ...props }: CardContentProps) => (\n\t
\n);\n\nconst CardFooter = ({ className, ...props }: CardFooterProps) => (\n\t
\n);\n\nexport { Card, CardHeader, CardContent, CardFooter };\nexport type { CardProps, CardHeaderProps, CardContentProps, CardFooterProps };\n", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "layout", + "container", + "display" + ] + } + }, + { + "name": "checkbox", + "type": "registry:ui", + "title": "checkbox", + "description": "A checkbox allows a user to select multiple items from a list of individual items, or to mark one individual item as selected.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "components/base/checkbox.tsx", + "content": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport {\n\ttype CheckboxProps as AriaCheckBoxProps,\n\tCheckbox as AriaCheckbox,\n\tCheckboxGroup as AriaCheckboxGroup,\n\ttype CheckboxGroupProps as AriaCheckboxGroupProps,\n\tFieldError,\n\tText,\n\ttype ValidationResult,\n} from \"react-aria-components\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nimport { Check } from \"lucide-react\";\n\nconst checkbox = tv({\n\tbase: \"group flex items-center justify-center gap-2 py-1 text-fg\",\n});\n\nconst checkboxGroup = tv({\n\tbase: \"flex flex-col gap-2\",\n});\n\ntype CheckboxVariantProps = VariantProps;\n\ninterface CheckboxProps extends CheckboxVariantProps, AriaCheckBoxProps {\n\tclassName?: string;\n\tchildren: ReactNode;\n\tdescription?: string;\n\terrorMessage?: string | ((validation: ValidationResult) => string);\n}\n\nconst Checkbox = ({\n\tclassName,\n\terrorMessage,\n\tchildren,\n\tdescription,\n\t...props\n}: CheckboxProps) => {\n\treturn (\n\t\t\n\t\t\t{({ isSelected }) => (\n\t\t\t\t<>\n\t\t\t\t\t
\n\t\t\t\t\t\t{isSelected && }\n\t\t\t\t\t
\n\t\t\t\t\t{children}\n\t\t\t\t\t{description && (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t\t\n\t\t\t\t\t\t{errorMessage}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t)}\n\t\t
\n\t);\n};\n\ninterface CheckboxGroupProps extends AriaCheckboxGroupProps {\n\tclassName?: string;\n\tlabel?: string;\n\tchildren: ReactNode;\n\tdescription?: string;\n\terrorMessage?: string | ((validation: ValidationResult) => string);\n}\n\nconst CheckboxGroup = ({\n\tclassName,\n\tlabel,\n\tdescription,\n\terrorMessage,\n\tchildren,\n\t...props\n}: CheckboxGroupProps) => (\n\t\n\t\t{label && (\n\t\t\t\n\t\t\t\t{label}\n\t\t\t\n\t\t)}\n\t\t{children}\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage}\n\t\n);\n\nexport { Checkbox, CheckboxGroup };\nexport type { CheckboxProps, CheckboxGroupProps };\n", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive" + ] + } + }, + { + "name": "combobox", + "type": "registry:ui", + "title": "combobox", + "description": "A combo box combines a text input with a listbox, allowing users to filter a list of options to items matching a query.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "components/base/combobox.tsx", + "content": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport {\n\tComboBox as AriaComboBox,\n\ttype ComboBoxProps as AriaComboBoxProps,\n\tButton,\n\tFieldError,\n\tInput,\n\tLabel,\n\tListBox,\n\tListBoxItem,\n\ttype ListBoxItemProps,\n\tPopover,\n\tText,\n\ttype ValidationResult,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nimport { CheckIcon, ChevronsUpDown } from \"lucide-react\";\n\nconst combobox = tv({\n\tslots: {\n\t\troot: \"group max-h-inherit w-full overflow-auto p-1 outline-none\",\n\t\tinput:\n\t\t\t\"w-full rounded-lg border border-border bg-surface px-4 py-1.5 align-middle font-semibold text-fg outline-none ring-fg transition-all group-data-[focused]:border-transparent group-data-[focused]:bg-surface group-data-[focused]:ring-2\",\n\t\tbutton:\n\t\t\t\"absolute right-2 flex appearance-none items-center justify-center rounded-full border-0 outline-none ring-focus ring-offset-2 ring-offset-surface data-[focus-visible]:ring-2\",\n\t\tpopover:\n\t\t\t\"w-[var(--trigger-width)] rounded-xl border border-border/25 bg-surface p-1 text-fg shadow-lg outline-none\",\n\t\titem: \"relative m-1 flex cursor-default flex-col rounded-lg p-2 font-semibold outline-none data-[disabled]:cursor-not-allowed data-[focused]:bg-secondary data-[disabled]:text-fg-disabled\",\n\t},\n});\n\nconst styles = combobox();\n\ninterface ComboBoxProps\n\textends Omit, \"className\"> {\n\tclassName?: string;\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string | ((validation: ValidationResult) => string);\n}\n\nconst ComboBox = ({\n\tlabel,\n\tclassName,\n\tdescription,\n\terrorMessage,\n\tchildren,\n\t...props\n}: ComboBoxProps) => (\n\t\n\t\t{label && }\n\t\t
\n\t\t\t\n\t\t\t\n\t\t
\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage}\n\t\t\n\t\t\t{children}\n\t\t\n\t\n);\n\ninterface ComboBoxItemProps\n\textends Omit {\n\tchildren: ReactNode;\n\tclassName?: string;\n}\n\nconst ComboBoxItem = ({ className, ...props }: ComboBoxItemProps) => (\n\t\n\t\t{({ isSelected }) => (\n\t\t\t
\n\t\t\t\t{props.children}\n\t\t\t\t{isSelected && }\n\t\t\t
\n\t\t)}\n\t
\n);\n\nexport { ComboBox, ComboBoxItem };\nexport type { ComboBoxProps, ListBoxItemProps as ComboBoxItemProps };", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "picker" + ] + } + }, + { + "name": "command", + "type": "registry:ui", + "title": "command", + "description": "A command palette that allows users to quickly search and execute commands using keyboard shortcuts.", + "author": "BaseLayer", + "categories": [ + "navigation" + ], + "files": [ + { + "path": "components/base/command.tsx", + "content": "\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useEffect, useState } from \"react\";\n\nimport {\n\tButton as AriaButton,\n\tDialog as AriaDialog,\n\tDialogTrigger as AriaDialogTrigger,\n\tModal as AriaModal,\n\tAutocomplete,\n\tInput,\n\tMenu,\n\tMenuItem,\n\ttype MenuItemProps,\n\tModalOverlay,\n\ttype ModalOverlayProps,\n\tTextField,\n\tuseFilter,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nimport { Search } from \"lucide-react\";\n\nconst command = tv({\n\tslots: {\n\t\ttrigger:\n\t\t\t\"flex w-full items-center justify-between rounded-full bg-secondary px-4 py-2 font-semibold text-fg outline-none ring-primary ring-offset-2 ring-offset-surface transition-colors data-[hovered]:bg-secondary/75 data-[focus-visible]:ring-2\",\n\t\toverlay:\n\t\t\t\"data-[entering]:fade-in data-[exiting]:fade-out fixed inset-0 z-50 flex min-h-full items-start justify-center bg-zinc-500/25 p-4 text-center data-[entering]:animate-in data-[exiting]:animate-out data-[entering]:duration-300 data-[exiting]:duration-200 sm:items-center\",\n\t\tmodal:\n\t\t\t\"data-[entering]:zoom-in-95 data-[exiting]:zoom-out-95 data-[entering]:animate-in data-[exiting]:animate-out data-[entering]:duration-300 data-[exiting]:duration-200\",\n\t\tdialog:\n\t\t\t\"flex min-h-96 min-w-80 max-w-full flex-col gap-1 rounded-2xl bg-surface p-2 shadow-lg outline-none md:w-lg\",\n\t\tinput:\n\t\t\t\"rounded-lg border-b-2 border-none bg-transparent px-3 py-2 text-base text-fg leading-5 outline-none placeholder:text-fg-muted\",\n\t\tmenu: \"mt-2 h-80 overflow-auto\",\n\t\titem: \"group flex min-h-12 w-full cursor-default items-center rounded-lg px-3 py-2 text-fg outline-none data-[focused]:bg-secondary data-[pressed]:bg-surface-3 data-[focused]:text-focus-fg\",\n\t\tkbd: \"ml-auto rounded border border-border bg-surface-2 px-2 py-1 font-semibold text-fg-muted text-xs\",\n\t},\n});\n\nconst styles = command();\n\ninterface CommandItem {\n\tid: string;\n\tlabel: string;\n\tshortcut?: string;\n\ticon?: ComponentType<{ className?: string }>;\n\tonSelect?: () => void;\n}\n\ninterface CommandProps extends Omit {\n\tclassName?: string;\n\ttrigger?: ReactNode;\n\tcommands: CommandItem[];\n\tplaceholder?: string;\n\ttriggerKey?: string;\n\tonCommandSelect?: (command: CommandItem) => void;\n\tonSearchChange?: (search: string) => void;\n}\n\nconst Command = ({\n\tclassName,\n\ttrigger,\n\tcommands,\n\tplaceholder = \"Search commands…\",\n\ttriggerKey = \"k\",\n\tonCommandSelect,\n\tonSearchChange,\n\t...props\n}: CommandProps) => {\n\tconst [isOpen, setOpen] = useState(false);\n\tconst [isMac, setIsMac] = useState(true);\n\tconst { contains } = useFilter({ sensitivity: \"base\" });\n\n\tuseEffect(() => {\n\t\tsetIsMac(/Mac/.test(navigator?.platform || \"\"));\n\t}, []);\n\n\tuseEffect(() => {\n\t\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t\tif (\n\t\t\t\te.key.toLowerCase() === triggerKey.toLowerCase() &&\n\t\t\t\t(isMac ? e.metaKey : e.ctrlKey)\n\t\t\t) {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetOpen((prev) => !prev);\n\t\t\t} else if (e.key === \"Escape\") {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetOpen(false);\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown);\n\t\treturn () => document.removeEventListener(\"keydown\", handleKeyDown);\n\t}, [isMac, triggerKey]);\n\n\tconst handleCommandSelect = (command: CommandItem) => {\n\t\tcommand.onSelect?.();\n\t\tonCommandSelect?.(command);\n\t\tsetOpen(false);\n\t};\n\n\treturn (\n\t\t\n\t\t\t{trigger || (\n\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\tSearch\n\t\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t{isMac ? \"⌘\" : \"Ctrl\"} {triggerKey.toUpperCase()}\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t)}\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t true : contains}>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{({ label, shortcut, icon: Icon, ...command }) => (\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\thandleCommandSelect({\n\t\t\t\t\t\t\t\t\t\t\t\tlabel,\n\t\t\t\t\t\t\t\t\t\t\t\tshortcut,\n\t\t\t\t\t\t\t\t\t\t\t\ticon: Icon,\n\t\t\t\t\t\t\t\t\t\t\t\t...command,\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t{Icon && (\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t{shortcut && (\n\t\t\t\t\t\t\t\t\t\t\t{shortcut}\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n};\n\ninterface CommandMenuItemProps extends Omit {\n\tclassName?: string;\n\tchildren: ReactNode;\n}\n\nconst CommandMenuItem = ({\n\tclassName,\n\tchildren,\n\t...props\n}: CommandMenuItemProps) => (\n\t\n\t\t{children}\n\t\n);\n\nconst CommandTrigger = AriaDialogTrigger;\n\nexport { Command, CommandMenuItem, CommandTrigger };\nexport type { CommandProps, CommandMenuItemProps, CommandItem };\n", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "beta", + "tags": [ + "search", + "navigation", + "keyboard", + "palette" + ] + } + }, + { + "name": "date-field", + "type": "registry:ui", + "title": "date-field", + "description": "A date field allows users to enter and edit date and time values using a keyboard. Each part of a date value is displayed in an individually editable segment.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "components/base/date-field.tsx", + "content": "\"use client\";\n\nimport type {\n\tDateFieldProps as AriaDateFieldProps,\n\tDateValue,\n} from \"react-aria-components\";\nimport {\n\tDateField as AriaDateField,\n\tDateInput,\n\tDateSegment,\n\tFieldError,\n\tLabel,\n\tText,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst dateField = tv({\n\tslots: {\n\t\tinput:\n\t\t\t\"flex min-h-11 min-w-48 appearance-none items-center rounded-lg border border-border bg-surface px-3 py-0.5 outline-none ring-primary transition-all data-[disabled]:cursor-not-allowed data-[focus-within]:border-transparent data-[disabled]:border-none data-[disabled]:bg-primary/10 data-[focus-within]:bg-surface data-[disabled]:text-fg-disabled data-[focus-within]:ring-2 [&::placeholder]:text-sm\",\n\t\tsegmentStyles:\n\t\t\t\"rounded-md p-1 text-end outline-none focus:text-primary-fg data-[focused]:bg-primary data-[placeholder]:text-fg-muted data-[type='literal']:text-fg-muted data-[placeholder]:focus:text-primary-fg\",\n\t},\n});\n\nconst styles = dateField();\n\ninterface DateFieldProps extends AriaDateFieldProps {\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string;\n}\n\nconst DateField = ({\n\tlabel,\n\tdescription,\n\terrorMessage,\n\t...props\n}: DateFieldProps) => (\n\t\n\t\t{label && }\n\t\t\n\t\t\t{(segment) => (\n\t\t\t\t\n\t\t\t)}\n\t\t\n\t\t{description && {description}}\n\t\t{errorMessage}\n\t\n);\n\nexport { DateField };\nexport type { DateFieldProps };\n", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "date" + ] + } + }, + { + "name": "date-picker", + "type": "registry:ui", + "title": "date-picker", + "description": "A date picker combines one or more DateFields with a calendar popover, allowing users to enter or select a single date/time or a range.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "components/base/date-picker.tsx", + "content": "\"use client\";\n\nimport type {\n\tDatePickerProps as AriaDatePickerProps,\n\tDateRangePickerProps as AriaDateRangePickerProps,\n} from \"react-aria-components\";\nimport {\n\tDatePicker as AriaDatePicker,\n\tDateRangePicker as AriaDateRangePicker,\n\tButton,\n\tDateInput,\n\tDateSegment,\n\ttype DateValue,\n\tDialog,\n\tFieldError,\n\tGroup,\n\tLabel,\n\tPopover,\n\tText,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nimport { ChevronDown } from \"lucide-react\";\n\nimport { Calendar, RangeCalendar } from \"../calendar/calendar\";\n\nconst baseStyles = tv({\n\tslots: {\n\t\tinput:\n\t\t\t\"appearance-none rounded-lg px-3 py-1.5 outline-none ring-primary transition-all\",\n\t\tpopover:\n\t\t\t\"overflow-auto rounded-2xl data-[entering]:animate-fade data-[exiting]:animate-fadeOut\",\n\t},\n});\n\nconst datePicker = tv({\n\textend: baseStyles,\n\tslots: {\n\t\tgroup:\n\t\t\t\"relative flex min-h-11 w-auto min-w-48 items-center rounded-lg border border-border bg-surface transition-all data-[focus-within]:border-transparent data-[focus-within]:bg-surface data-[focus-within]:ring-2 data-[focus-within]:ring-primary data-[focus-within]:ring-offset-surface\",\n\t\tdateSegment:\n\t\t\t\"min-w-16 rounded-md p-1 text-end outline-none focus:bg-primary focus:text-primary-fg data-[placeholder]:text-fg-muted data-[type='literal']:text-fg-muted data-[placeholder]:focus:text-primary-fg\",\n\t},\n});\n\nconst dateRangePicker = tv({\n\textend: baseStyles,\n\tslots: {\n\t\tgroup:\n\t\t\t\"relative flex min-h-11 w-full flex-wrap items-center rounded-lg border border-border bg-surface transition-all data-[focus-within]:border-transparent data-[focus-within]:bg-surface data-[focus-within]:ring-2 data-[focus-within]:ring-primary data-[focus-within]:ring-offset-surface\",\n\t\tdateSegment:\n\t\t\t\"rounded-md p-1 text-end outline-none focus:bg-primary focus:text-primary-fg data-[placeholder]:text-fg-muted data-[type='literal']:text-fg-muted data-[placeholder]:focus:text-primary-fg\",\n\t\tseparator: \"px-2 text-fg-muted\",\n\t},\n});\n\nconst styles = datePicker();\nconst rangeStyles = dateRangePicker();\n\ninterface DatePickerProps extends AriaDatePickerProps {\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string;\n}\n\nconst DatePicker = ({\n\tclassName,\n\tlabel,\n\tdescription,\n\terrorMessage,\n\tchildren,\n\t...props\n}: DatePickerProps) => (\n\t\n\t\t{label && }\n\t\t\n\t\t\t\n\t\t\t\t{(segment) => (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t\t\n\t\t\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n);\n\ninterface DateRangePickerProps\n\textends AriaDateRangePickerProps {\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string;\n\tclassName?: string;\n}\n\nconst DateRangePicker = ({\n\tclassName,\n\tlabel,\n\tdescription,\n\terrorMessage,\n\tchildren,\n\t...props\n}: DateRangePickerProps) => (\n\t\n\t\t{label && }\n\t\t\n\t\t\t\n\t\t\t\t{(segment) => (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t\t\n\t\t\t\t–\n\t\t\t\n\t\t\t\n\t\t\t\t{(segment) => (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t\t\n\t\t\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n);\n\nexport { DatePicker, DateRangePicker };\nexport type { DatePickerProps, DateRangePickerProps };\n", + "type": "registry:component" + } + ], + "registryDependencies": [ + "calendar" + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "date-time" + ] + } + }, + { + "name": "input", + "type": "registry:ui", + "title": "input", + "description": "Allows a user to enter a plain text value with a keyboard.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "components/base/input.tsx", + "content": "\"use client\";\n\nimport type {\n\tTextFieldProps as AriaTextFieldProps,\n\tValidationResult,\n} from \"react-aria-components\";\nimport {\n\tInput as AriaInput,\n\tTextField as AriaTextField,\n\tFieldError,\n\tLabel,\n\tText,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst input = tv({\n\tbase: \"min-h-11 appearance-none rounded-lg border border-border bg-surface px-3 py-1 text-fg outline-none ring-primary transition-all data-[disabled]:cursor-not-allowed data-[focused]:border-transparent data-[disabled]:bg-primary/10 data-[disabled]:text-fg-disabled data-[focused]:ring-2 [&::placeholder]:text-fg-muted [&::placeholder]:text-sm\",\n});\n\ninterface InputProps extends Omit {\n\tclassName?: string;\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string | ((validation: ValidationResult) => string);\n\tplaceholder?: string;\n}\n\nconst Input = ({\n\tlabel,\n\tdescription,\n\terrorMessage,\n\tplaceholder,\n\tclassName,\n\t...props\n}: InputProps) => (\n\t\n\t\t{label && }\n\t\t\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage}\n\t\n);\n\nexport { Input };\nexport type { InputProps };\n", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive" + ] + } + }, + { + "name": "menu", + "type": "registry:ui", + "title": "menu", + "description": "A menu displays a list of actions or options that a user can choose.", + "author": "BaseLayer", + "categories": [ + "pickers" + ], + "files": [ + { + "path": "components/base/menu.tsx", + "content": "\"use client\";\n\nimport type { HTMLAttributes } from \"react\";\n\nimport {\n\tHeader as AriaHeader,\n\tMenu as AriaMenu,\n\tMenuItem as AriaMenuItem,\n\tMenuSection as AriaMenuSection,\n\tMenuTrigger as AriaMenuTrigger,\n\ttype MenuItemProps,\n\ttype MenuProps,\n\tPopover,\n\tSeparator,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nexport const menu = tv({\n\tslots: {\n\t\tmenuPopover:\n\t\t\t\"data-[entering]:fade-in data-[exiting]:fade-out overflow-auto rounded-2xl border border-border/25 bg-surface shadow-xl data-[entering]:animate-in data-[exiting]:animate-out\",\n\t\theader: \"p-2 font-semibold\",\n\t\tcontent: \"flex h-fit min-w-56 flex-col gap-2 p-3 outline-none\",\n\t\titem: \"relative flex cursor-default justify-between rounded-lg p-3 font-semibold outline-none data-[disabled]:cursor-not-allowed data-[focused]:bg-secondary data-[disabled]:text-fg-disabled\",\n\t\tseparator: \"h-[1px] bg-border\",\n\t},\n});\n\nconst { menuPopover, content, header, item, separator } = menu();\n\nconst MenuTrigger = AriaMenuTrigger;\nconst MenuSection = AriaMenuSection;\n\nconst MenuContent = ({\n\tchildren,\n\tclassName,\n\t...props\n}: MenuProps & { className?: string }) => (\n\t\n\t\t\n\t\t\t{children}\n\t\t\n\t\n);\n\nconst MenuItem = ({\n\tchildren,\n\tclassName,\n\t...props\n}: MenuItemProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst MenuHeader = ({\n\tchildren,\n\tclassName,\n\t...props\n}: HTMLAttributes & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst MenuSeperator = ({\n\tclassName,\n\t...props\n}: HTMLAttributes & { className?: string }) => (\n\t\n);\n\nexport {\n\tMenuContent,\n\tMenuHeader,\n\tMenuItem,\n\tMenuSeperator,\n\tMenuTrigger,\n\tMenuSection,\n};\n", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "interactive", + "navigation" + ] + } + }, + { + "name": "meter", + "type": "registry:ui", + "title": "meter", + "description": "A meter represents a quantity within a known range, or a fractional value.", + "author": "BaseLayer", + "categories": [ + "data-display" + ], + "files": [ + { + "path": "components/base/meter.tsx", + "content": "\"use client\";\n\nimport {\n\tMeter as AriaMeter,\n\ttype MeterProps as AriaMeterProps,\n\tLabel,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst bar = tv({\n\tbase: \"h-4 overflow-hidden rounded-2xl bg-surface-2\",\n});\n\ninterface MeterProps extends Omit {\n\tlabel?: string;\n\tclassName?: string;\n}\n\nconst Meter = ({ label, className, ...props }: MeterProps) => (\n\t\n\t\t{({ percentage, valueText }) => (\n\t\t\t<>\n\t\t\t\t
\n\t\t\t\t\t{label && }\n\t\t\t\t\t{valueText}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\n\t\t)}\n\t
\n);\n\nexport { Meter };\nexport type { MeterProps };\n", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "data-display", + "progress" + ] + } + }, + { + "name": "modal", + "type": "registry:ui", + "title": "modal", + "description": "A modal is an overlay element which blocks interaction with elements outside it.", + "author": "BaseLayer", + "categories": [ + "overlays" + ], + "files": [ + { + "path": "components/base/modal.tsx", + "content": "\"use client\";\n\nimport {\n\tDialog as AriaDialog,\n\tDialogTrigger as AriaDialogTrigger,\n\tModal as AriaModal,\n\ttype DialogProps,\n\tModalOverlay,\n\ttype ModalOverlayProps,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nexport const modal = tv({\n\tslots: {\n\t\tdialog: \"flex w-full flex-col gap-6 outline-none\",\n\t\tmodalStyles:\n\t\t\t\"fade-in w-full rounded-2xl bg-surface p-6 text-fg outline-none data-[entering]:animate-in md:w-md\",\n\t},\n});\n\nconst styles = modal();\n\ninterface ModalProps extends Omit {\n\tclassName?: string;\n}\n\nconst Modal = ({ children, className, ...props }: ModalProps) => (\n\t\n\t\t\n\t\t\t{children}\n\t\t\n\t\n);\n\nconst Dialog = ({ children, className, ...props }: DialogProps) => (\n\t\n\t\t{children}\n\t\n);\n\nconst ModalTrigger = AriaDialogTrigger;\n\nexport { Modal, Dialog, ModalTrigger };\nexport type { ModalProps, DialogProps };", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "overlay" + ] + } + }, + { + "name": "popover", + "type": "registry:ui", + "title": "popover", + "description": "A popover is an overlay element positioned relative to a trigger.", + "author": "BaseLayer", + "categories": [ + "overlays" + ], + "files": [ + { + "path": "components/base/popover.tsx", + "content": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport {\n\tDialogTrigger as AriaDialogTrigger,\n\tPopover as AriaPopover,\n\ttype PopoverProps as AriaPopoverProps,\n\tDialog,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nexport const popover = tv({\n\tbase: \"data-[entering]:fade-in data-[exiting]:fade-out m-1 max-w-lg rounded-2xl border border-border/25 bg-surface p-2 text-fg shadow-lg outline-none data-[entering]:animate-in data-[exiting]:animate-out\",\n});\n\ninterface DialogProps extends Omit {\n\tchildren: ReactNode;\n\tclassName?: string;\n}\n\nconst PopoverTrigger = AriaDialogTrigger;\n\nconst Popover = ({ children, className, ...props }: DialogProps) => (\n\t\n\t\t{children}\n\t\n);\n\nexport { Popover, PopoverTrigger };\n", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "overlay", + "interactive" + ] + } + }, + { + "name": "radio-group", + "type": "registry:ui", + "title": "radio-group", + "description": "A radio group allows a user to select a single option from a list of mutually exclusive options.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "components/base/radio-group.tsx", + "content": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport type {\n RadioGroupProps as AriaRadioGroupProps,\n RadioProps,\n ValidationResult,\n} from \"react-aria-components\";\nimport {\n Radio as AriaRadio,\n RadioGroup as AriaRadioGroup,\n FieldError,\n Text,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst radioGroup = tv({\n slots: {\n radio:\n \"flex items-center gap-4 text-fg before:block before:h-5 before:w-5 before:rounded-full before:border before:border-border before:ring-focus before:ring-offset-2 before:ring-offset-surface before:transition-all data-[selected]:before:border-4 data-[selected]:before:border-primary data-[focus-visible]:before:ring-2\",\n group: \"flex flex-col gap-4 text-fg\",\n },\n});\n\nconst { group, radio } = radioGroup();\n\ninterface RadioGroupProps extends Omit {\n className?: string;\n children?: ReactNode;\n label?: string;\n description?: string;\n errorMessage?: string | ((validation: ValidationResult) => string)\n}\n\nconst RadioGroup = ({\n className,\n label,\n description,\n errorMessage,\n children,\n ...props\n}: RadioGroupProps) => (\n \n {label}\n {children}\n {description && {description}}\n {errorMessage}\n \n);\n\nconst Radio = ({\n children,\n className,\n ...props\n}: RadioProps & {\n className?: string;\n}) => (\n \n {children}\n \n);\n\nexport { RadioGroup, Radio }; ", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "selection" + ] + } + }, + { + "name": "select", + "type": "registry:ui", + "title": "select", + "description": "A select displays a collapsible list of options and allows a user to select one of them.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "components/base/select.tsx", + "content": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport type {\n\tSelectProps as AriaSelectProps,\n\tListBoxItemProps,\n\tValidationResult,\n} from \"react-aria-components\";\nimport {\n\tSelect as AriaSelect,\n\tAutocomplete,\n\tButton,\n\tFieldError,\n\tInput,\n\tLabel,\n\tListBox,\n\tListBoxItem,\n\tPopover,\n\tSearchField,\n\tSelectValue,\n\tText,\n\tuseFilter,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nimport { CheckIcon, ChevronDown, Search } from \"lucide-react\";\n\nconst select = tv({\n\tslots: {\n\t\tgroup: \"group flex flex-col gap-1\",\n\t\tbutton:\n\t\t\t\"group flex w-fit items-center justify-between gap-4 rounded-full border border-border bg-surface px-4 py-2.75 align-middle font-semibold text-fg text-sm outline-none ring-fg transition-all data-[hovered]:bg-surface-2 group-data-[focus-visible]:border-transparent group-data-[open]:bg-surface-2 group-data-[focus-visible]:ring-2\",\n\t\titem: \"relative m-1 flex cursor-default flex-col rounded-lg p-2 font-semibold outline-none data-[disabled]:cursor-not-allowed data-[focused]:bg-secondary data-[disabled]:text-fg-disabled\",\n\t\tsearchField:\n\t\t\t\"group m-1 flex items-center rounded-full border border-border bg-surface px-2 py-1.5\",\n\t\tsearchInput:\n\t\t\t\"flex-1 bg-transparent text-fg outline-none placeholder:text-fg-muted\",\n\t\tsearchIcon: \"mr-2 size-4 text-fg-muted\",\n\t\tclearButton:\n\t\t\t\"ml-2 rounded p-0.5 text-fg-muted transition-colors hover:bg-surface-2 hover:text-fg group-empty:invisible\",\n\t\tpopover:\n\t\t\t\"min-w-[var(--trigger-width)] rounded-xl border border-border/25 bg-surface p-1 text-fg shadow-lg outline-none\",\n\t},\n});\n\nconst styles = select();\n\ninterface SelectProps\n\textends Omit, \"className\"> {\n\tclassName?: string;\n\tpopoverClassName?: string;\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string | ((validation: ValidationResult) => string);\n}\n\nconst Select = ({\n\tlabel,\n\tclassName,\n\tdescription,\n\terrorMessage,\n\tpopoverClassName,\n\tchildren,\n\t...props\n}: SelectProps) => (\n\t\n\t\t{label && }\n\t\t\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage}\n\t\t\n\t\t\t{children}\n\t\t\n\t\n);\n\ninterface SelectItemProps\n\textends Omit {\n\tchildren: ReactNode;\n\tclassName?: string;\n}\n\nconst SelectItem = ({ className, ...props }: SelectItemProps) => (\n\t\n\t\t{({ isSelected }) => (\n\t\t\t
\n\t\t\t\t{props.children}\n\t\t\t\t{isSelected && }\n\t\t\t
\n\t\t)}\n\t
\n);\n\ninterface SearchableSelectProps\n\textends SelectProps {\n\tsearchPlaceholder?: string;\n}\n\nconst SearchableSelect = ({\n\tlabel,\n\tclassName,\n\tdescription,\n\terrorMessage,\n\tsearchPlaceholder = \"Search...\",\n\tchildren,\n\tpopoverClassName,\n\t...props\n}: SearchableSelectProps) => {\n\tconst { contains } = useFilter({ sensitivity: \"base\" });\n\n\treturn (\n\t\t\n\t\t\t{label && }\n\t\t\t\n\t\t\t{description && (\n\t\t\t\t\n\t\t\t\t\t{description}\n\t\t\t\t\n\t\t\t)}\n\t\t\t{errorMessage}\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{children}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport { Select, SelectItem, SearchableSelect };\nexport type { SelectProps, SelectItemProps, SearchableSelectProps };\n", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "picker" + ] + } + }, + { + "name": "slider", + "type": "registry:ui", + "title": "slider", + "description": "A slider allows a user to select one or more values within a range.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "components/base/slider.tsx", + "content": "\"use client\";\n\nimport {\n\tSlider as AriaSlider,\n\tSliderThumb as AriaSliderThumb,\n\tSliderTrack as AriaSliderTrack,\n\tLabel,\n\ttype LabelProps,\n\tSliderOutput,\n\ttype SliderProps,\n\ttype SliderThumbProps,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst slider = tv({\n\tslots: {\n\t\troot: \"grid w-64 auto-cols-fr grid-cols-1 text-fg-muted\",\n\t\tthumb:\n\t\t\t\"h-5 w-5 rounded-full bg-primary ring-focus ring-offset-2 ring-offset-surface data-[dragging]:outline-2 data-[focus-visible]:ring-2\",\n\t\ttrack:\n\t\t\t\"before:-translate-y-1/2 relative col-span-2 col-start-1 w-full before:absolute before:top-1/2 before:h-0.5 before:w-full before:transform before:bg-secondary\",\n\t},\n});\n\nconst { root, thumb, track } = slider();\n\nconst SliderRoot = ({\n\tchildren,\n\tclassName,\n\t...props\n}: SliderProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst SliderThumb = ({\n\tchildren,\n\tclassName,\n\t...props\n}: SliderThumbProps & { className?: string }) => (\n\t\n\t\t\n\t\n);\n\nconst SliderLabel = ({\n\tchildren,\n\tclassName,\n\t...props\n}: LabelProps & { className?: string }) => (\n\t
\n\t\t\n\t\t\n\t
\n);\n\nexport { SliderRoot, SliderThumb, SliderLabel };\n", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "range" + ] + } + }, + { + "name": "switch", + "type": "registry:ui", + "title": "switch", + "description": "A switch allows a user to turn a setting on or off.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "components/base/switch.tsx", + "content": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport {\n\tSwitch as AriaSwitch,\n\ttype SwitchProps as AriaSwitchProps,\n\tLabel,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst switchStyles = tv({\n\tslots: {\n\t\troot: \"group flex items-center gap-2 transition-none duration-200\",\n\t\tindicator:\n\t\t\t\"h-6 w-10 cursor-pointer rounded-xl bg-secondary duration-200 before:mx-[3px] before:mt-[3px] before:block before:size-4.5 before:rounded-2xl before:bg-surface before:transition-all data-[selected]:bg-primary group-data-[selected]:bg-primary group-data-[focus-visible]:ring-2 group-data-[focus-visible]:ring-focus group-data-[focus-visible]:ring-offset-2 group-data-[focus-visible]:ring-offset-surface group-data-[selected]:before:translate-x-4\",\n\t\tlabel: \"font-semibold text-fg text-sm\",\n\t},\t\n});\n\nconst styles = switchStyles();\n\ninterface SwitchProps extends AriaSwitchProps {\n\tchildren?: ReactNode;\n\tclassName?: string;\n}\n\n const Switch = ({ className, children, ...restProps }: SwitchProps) => (\n\t\n\t\t
\n\t\t\n\t\n);\n\nexport { Switch };\nexport type { SwitchProps };", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "toggle" + ] + } + }, + { + "name": "table", + "type": "registry:ui", + "title": "table", + "description": "A table displays data in rows and columns and enables a user to navigate its contents via directional navigation keys, and optionally supports row selection and sorting.", + "author": "BaseLayer", + "categories": [ + "data-display" + ], + "files": [ + { + "path": "components/base/table.tsx", + "content": "\"use client\";\n\nimport {\n\tColumn as AriaColumn,\n\tTable as AriaTable,\n\tTableBody as AriaTableBody,\n\tTableHeader as AriaTableheader,\n\tCell,\n\ttype CellProps,\n\tCollection,\n\ttype ColumnProps,\n\tRow,\n\ttype RowProps,\n\ttype TableHeaderProps,\n\ttype TableProps,\n\tuseTableOptions,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nimport { Menu } from \"lucide-react\";\n\nimport { Button } from \"../button/button\";\nimport { Checkbox } from \"../checkbox/checkbox\";\n\nconst table = tv({\n\tslots: {\n\t\troot: \"table min-h-[100px] border-separate border-spacing-0 rounded-xl border border-border p-4 outline-none\",\n\t\tcolumn: \"border-border border-b-2 px-4 py-1 text-left outline-none\",\n\t\theader: \"text-fg after:table-row after:h-[2px]\",\n\t\tlabel: \"text-fg-3\",\n\t\trow: \"relative cursor-default rounded-xl text-fg outline-none ring-focus data-[focus-visible]:ring-2\",\n\t\tcell: \"px-4 py-2 outline-none ring-focus data-[focus-visible]:ring-2\",\n\t},\n});\n\nconst styles = table();\n\nconst TableBody = AriaTableBody;\n\nconst Table = ({\n\tchildren,\n\tclassName,\n\t...props\n}: TableProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst TableCell = ({\n\tchildren,\n\tclassName,\n\t...props\n}: CellProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst TableColumn = ({\n\tchildren,\n\tclassName,\n\t...props\n}: ColumnProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst TableHeader = ({\n\tchildren,\n\tclassName,\n\tcolumns,\n\t...props\n}: TableHeaderProps & { className?: string }) => {\n\tconst { selectionBehavior, selectionMode, allowsDragging } =\n\t\tuseTableOptions();\n\treturn (\n\t\t\n\t\t\t{/* Add extra columns for drag and drop and selection. */}\n\t\t\t{allowsDragging && }\n\t\t\t{selectionBehavior === \"toggle\" && (\n\t\t\t\t\n\t\t\t\t\t{selectionMode === \"multiple\" && (\n\t\t\t\t\t\t \n\t\t\t\t\t)}\n\t\t\t\t\n\t\t\t)}\n\t\t\t{children}\n\t\t\n\t);\n};\n\nconst TableRow = ({\n\tchildren,\n\tclassName,\n\tcolumns,\n\tid,\n\t...props\n}: RowProps & { className?: string }) => {\n\tconst { selectionBehavior, allowsDragging } = useTableOptions();\n\treturn (\n\t\t\n\t\t\t{allowsDragging && (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t)}\n\t\t\t{selectionBehavior === \"toggle\" && (\n\t\t\t\t\n\t\t\t\t\t \n\t\t\t\t\n\t\t\t)}\n\t\t\t{children}\n\t\t\n\t);\n};\n\nexport { TableColumn, Table, TableBody, TableCell, TableHeader, TableRow };\n", + "type": "registry:component" + } + ], + "registryDependencies": [ + "button", + "checkbox" + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "data-display", + "interactive" + ] + } + }, + { + "name": "tabs", + "type": "registry:ui", + "title": "tabs", + "description": "Tabs organize content into multiple sections and allow users to navigate between them.", + "author": "BaseLayer", + "categories": [ + "navigation" + ], + "files": [ + { + "path": "components/base/tabs.tsx", + "content": "\"use client\";\n\nimport {\n\tTab as AriaTab,\n\tTabList as AriaTabList,\n\ttype TabListProps as AriaTabListProps,\n\tTabPanel as AriaTabPanel,\n\ttype TabPanelProps as AriaTabPanelProps,\n\ttype TabProps as AriaTabProps,\n\ttype TabsProps as AriaTabsProps,\n\tTabs as AriaTabsRoot,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst tabs = tv({\n\tslots: {\n\t\troot: \"flex w-full flex-col items-start\",\n\t\tlist: \"relative inline-flex items-center justify-between gap-6 rounded-md p-1\",\n\t\ttab: \"relative flex w-fit cursor-pointer justify-center rounded-2xl border-primary pb-0.5 font-semibold text-fg-muted outline-none ring-focus ring-offset-2 ring-offset-surface transition-colors duration-200 aria-selected:cursor-default aria-selected:rounded-none aria-selected:border-b-2 aria-selected:pb-0 aria-selected:text-primary aria-selected:hover:bg-transparent data-[hovered]:text-primary data-[focus-visible]:ring-2\",\n\t\tpanel:\n\t\t\t\"mt-4 w-96 rounded-xl p-4 outline-none ring-focus data-[focus-visible]:ring-2\",\n\t},\n});\n\nconst styles = tabs();\n\ninterface TabsProps extends Omit {\n\tclassName?: string;\n}\n\nconst TabsRoot = ({ children, className, ...props }: TabsProps) => (\n\t\n\t\t{children}\n\t\n);\n\ninterface TabListProps extends Omit, \"className\"> {\n\tclassName?: string;\n}\n\nconst TabList = ({\n\tchildren,\n\tclassName,\n\t...props\n}: TabListProps) => (\n\t\n\t\t{children}\n\t\n);\n\ninterface TabProps extends Omit {\n\tclassName?: string;\n}\n\nconst Tab = ({ children, className, ...props }: TabProps) => (\n\t\n\t\t{children}\n\t\n);\n\ninterface TabPanelProps extends Omit {\n\tclassName?: string;\n}\n\nconst TabPanel = ({ children, className, ...props }: TabPanelProps) => (\n\t\n\t\t{children}\n\t\n);\n\nexport { Tab, TabList, TabPanel, TabsRoot };\nexport type { TabsProps, TabListProps, TabProps, TabPanelProps }; ", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "navigation", + "interactive", + "layout" + ] + } + }, + { + "name": "tag-group", + "type": "registry:ui", + "title": "tag-group", + "description": "A tag group is a focusable list of labels, categories, keywords, filters, or other items, with support for keyboard navigation, selection, and removal.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "components/base/tag-group.tsx", + "content": "\"use client\";\n\nimport {\n\tTag as AriaTag,\n\tTagGroup as AriaTagGroup,\n\ttype TagGroupProps as AriaTagGroupProps,\n\ttype TagProps as AriaTagProps,\n\tLabel,\n\tTagList,\n\ttype TagListProps,\n\tText,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst tagGroup = tv({\n\tslots: {\n\t\troot: \"flex flex-col gap-2 text-sm\",\n\t\tlist: \"flex flex-wrap gap-2\",\n\t\ttag: \"flex cursor-default items-center rounded-full border border-border px-2 py-1 outline-none ring-focus ring-offset-2 ring-offset-surface aria-selected:border-primary aria-selected:bg-primary aria-selected:text-primary-fg data-[focus-visible]:ring-2\",\n\t},\n});\n\nconst styles = tagGroup();\n\ninterface TagGroupProps\n\textends Omit,\n\t\tPick, \"items\" | \"children\" | \"renderEmptyState\"> {\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string;\n}\n\nconst TagGroup = ({\n\tlabel,\n\tclassName,\n\tdescription,\n\terrorMessage,\n\titems,\n\tchildren,\n\trenderEmptyState,\n\t...props\n}: TagGroupProps) => (\n\t\n\t\t{label && }\n\t\t\n\t\t\t{children}\n\t\t\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage && (\n\t\t\t\n\t\t\t\t{errorMessage}\n\t\t\t\n\t\t)}\n\t\n);\n\nconst Tag = ({\n\tchildren,\n\tclassName,\n\t...props\n}: AriaTagProps & { className?: string }) => {\n\tconst textValue = typeof children === \"string\" ? children : undefined;\n\treturn (\n\t\t\n\t\t\t{children}\n\t\t\n\t);\n};\n\nexport { Tag, TagGroup };\n", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "selection", + "filtering" + ] + } + }, + { + "name": "time-field", + "type": "registry:ui", + "title": "time-field", + "description": "A time field allows users to enter and edit time values using a keyboard. Each part of a time value is displayed in an individually editable segment.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "components/base/time-field.tsx", + "content": "\"use client\";\n\nimport type {\n\tTimeFieldProps as AriaTimeFieldProps,\n\tTimeValue,\n} from \"react-aria-components\";\nimport {\n\tTimeField as AriaTimeField,\n\tDateInput,\n\tDateSegment,\n\tFieldError,\n\tLabel,\n\tText,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst timeField = tv({\n\tslots: {\n\t\tinput:\n\t\t\t\"appearance-none rounded-lg border border-border bg-surface px-3 py-1.75 outline-none ring-primary transition-all data-[disabled]:cursor-not-allowed data-[focus-within]:border-transparent data-[disabled]:bg-primary/10 data-[focus-within]:bg-surface data-[disabled]:text-fg-disabled data-[focus-within]:ring-2 [&::placeholder]:text-sm [&::placeholder]:focus:text-primary-fg\",\n\t\tsegmentStyles:\n\t\t\t\"rounded-md p-1 text-end outline-none focus:bg-primary focus:text-primary-fg data-[placeholder]:text-fg-muted data-[type='literal']:text-fg-muted\",\n\t},\n});\n\nconst styles = timeField();\n\ninterface TimeFieldProps extends AriaTimeFieldProps {\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string;\n}\n\nconst TimeField = ({\n\tlabel,\n\tdescription,\n\terrorMessage,\n\t...props\n}: TimeFieldProps) => (\n\t\n\t\t{label && }\n\t\t\n\t\t\t{(segment) => (\n\t\t\t\t\n\t\t\t)}\n\t\t\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage}\n\t\n);\n\nexport { TimeField };\nexport type { TimeFieldProps };\n", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "time" + ] + } + }, + { + "name": "toggle", + "type": "registry:ui", + "title": "toggle", + "description": "A toggle button allows a user to toggle a selection on or off, for example switching between two states or modes.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "components/base/toggle.tsx", + "content": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport {\n\tToggleButton,\n\tToggleButtonGroup,\n\ttype ToggleButtonGroupProps,\n\ttype ToggleButtonProps,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst toggle = tv({\n\tbase: \"inline-flex appearance-none items-center justify-center rounded-full bg-surface-2 px-4 py-1 font-medium outline-none ring-focus ring-offset-2 ring-offset-surface transition-transform duration-100 disabled:pointer-events-none disabled:opacity-50 data-[selected]:bg-primary data-[selected]:text-primary-fg data-[focus-visible]:ring-2\",\n});\n\nconst toggleGroup = tv({\n\tbase: \"flex min-h-11 gap-1 rounded-full border border-border bg-surface-2 p-1\",\n});\n\ninterface ToggleProps extends Omit {\n\tclassName?: string;\n}\n\nconst Toggle = ({ className, children, ...props }: ToggleProps) => (\n\t\n\t\t{children}\n\t\n);\n\ninterface ToggleGroupProps extends ToggleButtonGroupProps {\n\tclassName?: string;\n\tchildren: ReactNode;\n}\n\nconst ToggleGroup = ({ className, children, ...props }: ToggleGroupProps) => (\n\t\n\t\t{children}\n\t\n);\n\nexport { Toggle, ToggleGroup };\nexport type { ToggleProps, ToggleGroupProps };\n", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "toggle" + ] + } + }, + { + "name": "tooltip", + "type": "registry:ui", + "title": "tooltip", + "description": "A tooltip displays a description of an element on hover or focus.", + "author": "BaseLayer", + "categories": [ + "overlays" + ], + "files": [ + { + "path": "components/base/tooltip.tsx", + "content": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport {\n\tTooltip as AriaTooltip,\n\ttype TooltipProps as AriaTooltipProps,\n\tTooltipTrigger as AriaTooltipTrigger,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst tooltip = tv({\n\tbase: \"[&[data-entering]]:fade-in [&[data-exiting]]:fade-out m-1 max-w-sm rounded-full border border-border bg-surface px-4 py-2 text-fg shadow-xl outline-none [&[data-entering]]:animate-fade-in [&[data-exiting]]:animate-fade-out\",\n});\n\nconst TooltipTrigger = AriaTooltipTrigger;\n\ninterface TooltipProps extends Omit {\n\tclassName?: string;\n\tchildren: ReactNode;\n}\n\nconst Tooltip = ({ children, className, ...props }: TooltipProps) => (\n\t\n\t\t{children}\n\t\n);\n\nexport { Tooltip, TooltipTrigger };\n", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "meta": { + "status": "stable", + "tags": [ + "overlay", + "interactive", + "help" + ] + } + } + ] +} \ No newline at end of file diff --git a/web/public/r/input.json b/web/public/r/input.json new file mode 100644 index 00000000..32010f2c --- /dev/null +++ b/web/public/r/input.json @@ -0,0 +1,94 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "input", + "type": "registry:ui", + "title": "input", + "author": "BaseLayer", + "description": "Allows a user to enter a plain text value with a keyboard.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/input/input.tsx", + "content": "\"use client\";\n\nimport type {\n\tTextFieldProps as AriaTextFieldProps,\n\tValidationResult,\n} from \"react-aria-components\";\nimport {\n\tInput as AriaInput,\n\tTextField as AriaTextField,\n\tFieldError,\n\tLabel,\n\tText,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst input = tv({\n\tbase: \"min-h-11 appearance-none rounded-lg border border-border bg-surface px-3 py-1 text-fg outline-none ring-primary transition-all data-[disabled]:cursor-not-allowed data-[focused]:border-transparent data-[disabled]:bg-primary/10 data-[disabled]:text-fg-disabled data-[focused]:ring-2 [&::placeholder]:text-fg-muted [&::placeholder]:text-sm\",\n});\n\ninterface InputProps extends Omit {\n\tclassName?: string;\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string | ((validation: ValidationResult) => string);\n\tplaceholder?: string;\n}\n\nconst Input = ({\n\tlabel,\n\tdescription,\n\terrorMessage,\n\tplaceholder,\n\tclassName,\n\t...props\n}: InputProps) => (\n\t\n\t\t{label && }\n\t\t\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage}\n\t\n);\n\nexport { Input };\nexport type { InputProps };\n", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive" + ] + }, + "categories": [ + "forms" + ] +} \ No newline at end of file diff --git a/web/public/r/menu.json b/web/public/r/menu.json new file mode 100644 index 00000000..87d2652c --- /dev/null +++ b/web/public/r/menu.json @@ -0,0 +1,94 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "menu", + "type": "registry:ui", + "title": "menu", + "author": "BaseLayer", + "description": "A menu displays a list of actions or options that a user can choose.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/menu/menu.tsx", + "content": "\"use client\";\n\nimport type { HTMLAttributes } from \"react\";\n\nimport {\n\tHeader as AriaHeader,\n\tMenu as AriaMenu,\n\tMenuItem as AriaMenuItem,\n\tMenuSection as AriaMenuSection,\n\tMenuTrigger as AriaMenuTrigger,\n\ttype MenuItemProps,\n\ttype MenuProps,\n\tPopover,\n\tSeparator,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nexport const menu = tv({\n\tslots: {\n\t\tmenuPopover:\n\t\t\t\"data-[entering]:fade-in data-[exiting]:fade-out overflow-auto rounded-2xl border border-border/25 bg-surface shadow-xl data-[entering]:animate-in data-[exiting]:animate-out\",\n\t\theader: \"p-2 font-semibold\",\n\t\tcontent: \"flex h-fit min-w-56 flex-col gap-2 p-3 outline-none\",\n\t\titem: \"relative flex cursor-default justify-between rounded-lg p-3 font-semibold outline-none data-[disabled]:cursor-not-allowed data-[focused]:bg-secondary data-[disabled]:text-fg-disabled\",\n\t\tseparator: \"h-[1px] bg-border\",\n\t},\n});\n\nconst { menuPopover, content, header, item, separator } = menu();\n\nconst MenuTrigger = AriaMenuTrigger;\nconst MenuSection = AriaMenuSection;\n\nconst MenuContent = ({\n\tchildren,\n\tclassName,\n\t...props\n}: MenuProps & { className?: string }) => (\n\t\n\t\t\n\t\t\t{children}\n\t\t\n\t\n);\n\nconst MenuItem = ({\n\tchildren,\n\tclassName,\n\t...props\n}: MenuItemProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst MenuHeader = ({\n\tchildren,\n\tclassName,\n\t...props\n}: HTMLAttributes & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst MenuSeperator = ({\n\tclassName,\n\t...props\n}: HTMLAttributes & { className?: string }) => (\n\t\n);\n\nexport {\n\tMenuContent,\n\tMenuHeader,\n\tMenuItem,\n\tMenuSeperator,\n\tMenuTrigger,\n\tMenuSection,\n};\n", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "interactive", + "navigation" + ] + }, + "categories": [ + "pickers" + ] +} \ No newline at end of file diff --git a/web/public/r/meter.json b/web/public/r/meter.json new file mode 100644 index 00000000..567b6116 --- /dev/null +++ b/web/public/r/meter.json @@ -0,0 +1,94 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "meter", + "type": "registry:ui", + "title": "meter", + "author": "BaseLayer", + "description": "A meter represents a quantity within a known range, or a fractional value.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/meter/meter.tsx", + "content": "\"use client\";\n\nimport {\n\tMeter as AriaMeter,\n\ttype MeterProps as AriaMeterProps,\n\tLabel,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst bar = tv({\n\tbase: \"h-4 overflow-hidden rounded-2xl bg-surface-2\",\n});\n\ninterface MeterProps extends Omit {\n\tlabel?: string;\n\tclassName?: string;\n}\n\nconst Meter = ({ label, className, ...props }: MeterProps) => (\n\t\n\t\t{({ percentage, valueText }) => (\n\t\t\t<>\n\t\t\t\t
\n\t\t\t\t\t{label && }\n\t\t\t\t\t{valueText}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\n\t\t)}\n\t
\n);\n\nexport { Meter };\nexport type { MeterProps };\n", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "data-display", + "progress" + ] + }, + "categories": [ + "data-display" + ] +} \ No newline at end of file diff --git a/web/public/r/modal.json b/web/public/r/modal.json new file mode 100644 index 00000000..fd852bfa --- /dev/null +++ b/web/public/r/modal.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "modal", + "type": "registry:ui", + "title": "modal", + "author": "BaseLayer", + "description": "A modal is an overlay element which blocks interaction with elements outside it.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/modal/modal.tsx", + "content": "\"use client\";\n\nimport {\n\tDialog as AriaDialog,\n\tDialogTrigger as AriaDialogTrigger,\n\tModal as AriaModal,\n\ttype DialogProps,\n\tModalOverlay,\n\ttype ModalOverlayProps,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nexport const modal = tv({\n\tslots: {\n\t\tdialog: \"flex w-full flex-col gap-6 outline-none\",\n\t\tmodalStyles:\n\t\t\t\"fade-in w-full rounded-2xl bg-surface p-6 text-fg outline-none data-[entering]:animate-in md:w-md\",\n\t},\n});\n\nconst styles = modal();\n\ninterface ModalProps extends Omit {\n\tclassName?: string;\n}\n\nconst Modal = ({ children, className, ...props }: ModalProps) => (\n\t\n\t\t\n\t\t\t{children}\n\t\t\n\t\n);\n\nconst Dialog = ({ children, className, ...props }: DialogProps) => (\n\t\n\t\t{children}\n\t\n);\n\nconst ModalTrigger = AriaDialogTrigger;\n\nexport { Modal, Dialog, ModalTrigger };\nexport type { ModalProps, DialogProps };", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "overlay" + ] + }, + "categories": [ + "overlays" + ] +} \ No newline at end of file diff --git a/web/public/r/popover.json b/web/public/r/popover.json new file mode 100644 index 00000000..6b61a107 --- /dev/null +++ b/web/public/r/popover.json @@ -0,0 +1,94 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "popover", + "type": "registry:ui", + "title": "popover", + "author": "BaseLayer", + "description": "A popover is an overlay element positioned relative to a trigger.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/popover/popover.tsx", + "content": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport {\n\tDialogTrigger as AriaDialogTrigger,\n\tPopover as AriaPopover,\n\ttype PopoverProps as AriaPopoverProps,\n\tDialog,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nexport const popover = tv({\n\tbase: \"data-[entering]:fade-in data-[exiting]:fade-out m-1 max-w-lg rounded-2xl border border-border/25 bg-surface p-2 text-fg shadow-lg outline-none data-[entering]:animate-in data-[exiting]:animate-out\",\n});\n\ninterface DialogProps extends Omit {\n\tchildren: ReactNode;\n\tclassName?: string;\n}\n\nconst PopoverTrigger = AriaDialogTrigger;\n\nconst Popover = ({ children, className, ...props }: DialogProps) => (\n\t\n\t\t{children}\n\t\n);\n\nexport { Popover, PopoverTrigger };\n", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "overlay", + "interactive" + ] + }, + "categories": [ + "overlays" + ] +} \ No newline at end of file diff --git a/web/public/r/radio-group.json b/web/public/r/radio-group.json new file mode 100644 index 00000000..f60c9713 --- /dev/null +++ b/web/public/r/radio-group.json @@ -0,0 +1,95 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "radio-group", + "type": "registry:ui", + "title": "radio-group", + "author": "BaseLayer", + "description": "A radio group allows a user to select a single option from a list of mutually exclusive options.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/radio-group/radio-group.tsx", + "content": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport type {\n RadioGroupProps as AriaRadioGroupProps,\n RadioProps,\n ValidationResult,\n} from \"react-aria-components\";\nimport {\n Radio as AriaRadio,\n RadioGroup as AriaRadioGroup,\n FieldError,\n Text,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst radioGroup = tv({\n slots: {\n radio:\n \"flex items-center gap-4 text-fg before:block before:h-5 before:w-5 before:rounded-full before:border before:border-border before:ring-focus before:ring-offset-2 before:ring-offset-surface before:transition-all data-[selected]:before:border-4 data-[selected]:before:border-primary data-[focus-visible]:before:ring-2\",\n group: \"flex flex-col gap-4 text-fg\",\n },\n});\n\nconst { group, radio } = radioGroup();\n\ninterface RadioGroupProps extends Omit {\n className?: string;\n children?: ReactNode;\n label?: string;\n description?: string;\n errorMessage?: string | ((validation: ValidationResult) => string)\n}\n\nconst RadioGroup = ({\n className,\n label,\n description,\n errorMessage,\n children,\n ...props\n}: RadioGroupProps) => (\n \n {label}\n {children}\n {description && {description}}\n {errorMessage}\n \n);\n\nconst Radio = ({\n children,\n className,\n ...props\n}: RadioProps & {\n className?: string;\n}) => (\n \n {children}\n \n);\n\nexport { RadioGroup, Radio }; ", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "selection" + ] + }, + "categories": [ + "forms" + ] +} \ No newline at end of file diff --git a/web/public/r/registry.json b/web/public/r/registry.json new file mode 100644 index 00000000..5a78a295 --- /dev/null +++ b/web/public/r/registry.json @@ -0,0 +1,2422 @@ +{ + "name": "@baselayer", + "$schema": "https://ui.shadcn.com/schema/registry.json", + "homepage": "https://baselayer.dev", + "items": [ + { + "name": "accordion", + "type": "registry:ui", + "title": "accordion", + "description": "An accordion allows users to toggle the display of sections of content. Each accordion consists of a header with a title and content area.", + "author": "BaseLayer", + "categories": [ + "layout" + ], + "files": [ + { + "path": "src/core/accordion/accordion.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "disclosure", + "collapsible", + "expandable", + "content" + ] + } + }, + { + "name": "badge", + "type": "registry:ui", + "title": "badge", + "description": "A badge is a small label that can be used to display information or status.", + "author": "BaseLayer", + "categories": [ + "display" + ], + "files": [ + { + "path": "src/core/badge/badge.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "status" + ] + } + }, + { + "name": "breadcrumbs", + "type": "registry:ui", + "title": "breadcrumbs", + "description": "Breadcrumbs display a heirarchy of links to the current page or resource in an application.", + "author": "BaseLayer", + "categories": [ + "navigation" + ], + "files": [ + { + "path": "src/core/breadcrumbs/breadcrumbs.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "navigation" + ] + } + }, + { + "name": "button", + "type": "registry:ui", + "title": "button", + "description": "A button allows a user to perform an action, with mouse, touch, and keyboard interactions.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/button/button.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive" + ] + } + }, + { + "name": "calendar", + "type": "registry:ui", + "title": "calendar", + "description": "A calendar displays one or more date grids and allows users to select either a single date or a contiguous range of dates.", + "author": "BaseLayer", + "categories": [ + "data-entry" + ], + "files": [ + { + "path": "src/core/calendar/calendar.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "date-time" + ] + } + }, + { + "name": "card", + "type": "registry:ui", + "title": "card", + "description": "Displays a card with header, content, and footer.", + "author": "BaseLayer", + "categories": [ + "layout" + ], + "files": [ + { + "path": "src/core/card/card.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "layout", + "container", + "display" + ] + } + }, + { + "name": "checkbox", + "type": "registry:ui", + "title": "checkbox", + "description": "A checkbox allows a user to select multiple items from a list of individual items, or to mark one individual item as selected.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/checkbox/checkbox.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive" + ] + } + }, + { + "name": "combobox", + "type": "registry:ui", + "title": "combobox", + "description": "A combo box combines a text input with a listbox, allowing users to filter a list of options to items matching a query.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/combobox/combobox.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "picker" + ] + } + }, + { + "name": "command", + "type": "registry:ui", + "title": "command", + "description": "A command palette that allows users to quickly search and execute commands using keyboard shortcuts.", + "author": "BaseLayer", + "categories": [ + "navigation" + ], + "files": [ + { + "path": "src/core/command/command.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "beta", + "tags": [ + "search", + "navigation", + "keyboard", + "palette" + ] + } + }, + { + "name": "date-field", + "type": "registry:ui", + "title": "date-field", + "description": "A date field allows users to enter and edit date and time values using a keyboard. Each part of a date value is displayed in an individually editable segment.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/date-field/date-field.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "date" + ] + } + }, + { + "name": "date-picker", + "type": "registry:ui", + "title": "date-picker", + "description": "A date picker combines one or more DateFields with a calendar popover, allowing users to enter or select a single date/time or a range.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/date-picker/date-picker.tsx", + "type": "registry:component" + } + ], + "registryDependencies": [ + "calendar" + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "date-time" + ] + } + }, + { + "name": "input", + "type": "registry:ui", + "title": "input", + "description": "Allows a user to enter a plain text value with a keyboard.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/input/input.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive" + ] + } + }, + { + "name": "menu", + "type": "registry:ui", + "title": "menu", + "description": "A menu displays a list of actions or options that a user can choose.", + "author": "BaseLayer", + "categories": [ + "pickers" + ], + "files": [ + { + "path": "src/core/menu/menu.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "interactive", + "navigation" + ] + } + }, + { + "name": "meter", + "type": "registry:ui", + "title": "meter", + "description": "A meter represents a quantity within a known range, or a fractional value.", + "author": "BaseLayer", + "categories": [ + "data-display" + ], + "files": [ + { + "path": "src/core/meter/meter.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "data-display", + "progress" + ] + } + }, + { + "name": "modal", + "type": "registry:ui", + "title": "modal", + "description": "A modal is an overlay element which blocks interaction with elements outside it.", + "author": "BaseLayer", + "categories": [ + "overlays" + ], + "files": [ + { + "path": "src/core/modal/modal.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "overlay" + ] + } + }, + { + "name": "popover", + "type": "registry:ui", + "title": "popover", + "description": "A popover is an overlay element positioned relative to a trigger.", + "author": "BaseLayer", + "categories": [ + "overlays" + ], + "files": [ + { + "path": "src/core/popover/popover.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "overlay", + "interactive" + ] + } + }, + { + "name": "radio-group", + "type": "registry:ui", + "title": "radio-group", + "description": "A radio group allows a user to select a single option from a list of mutually exclusive options.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/radio-group/radio-group.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "selection" + ] + } + }, + { + "name": "select", + "type": "registry:ui", + "title": "select", + "description": "A select displays a collapsible list of options and allows a user to select one of them.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/select/select.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "picker" + ] + } + }, + { + "name": "slider", + "type": "registry:ui", + "title": "slider", + "description": "A slider allows a user to select one or more values within a range.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/slider/slider.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "range" + ] + } + }, + { + "name": "switch", + "type": "registry:ui", + "title": "switch", + "description": "A switch allows a user to turn a setting on or off.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/switch/switch.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "toggle" + ] + } + }, + { + "name": "table", + "type": "registry:ui", + "title": "table", + "description": "A table displays data in rows and columns and enables a user to navigate its contents via directional navigation keys, and optionally supports row selection and sorting.", + "author": "BaseLayer", + "categories": [ + "data-display" + ], + "files": [ + { + "path": "src/core/table/table.tsx", + "type": "registry:component" + } + ], + "registryDependencies": [ + "button", + "checkbox" + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "data-display", + "interactive" + ] + } + }, + { + "name": "tabs", + "type": "registry:ui", + "title": "tabs", + "description": "Tabs organize content into multiple sections and allow users to navigate between them.", + "author": "BaseLayer", + "categories": [ + "navigation" + ], + "files": [ + { + "path": "src/core/tabs/tabs.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "navigation", + "interactive", + "layout" + ] + } + }, + { + "name": "tag-group", + "type": "registry:ui", + "title": "tag-group", + "description": "A tag group is a focusable list of labels, categories, keywords, filters, or other items, with support for keyboard navigation, selection, and removal.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/tag-group/tag-group.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "selection", + "filtering" + ] + } + }, + { + "name": "time-field", + "type": "registry:ui", + "title": "time-field", + "description": "A time field allows users to enter and edit time values using a keyboard. Each part of a time value is displayed in an individually editable segment.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/time-field/time-field.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "time" + ] + } + }, + { + "name": "toggle", + "type": "registry:ui", + "title": "toggle", + "description": "A toggle button allows a user to toggle a selection on or off, for example switching between two states or modes.", + "author": "BaseLayer", + "categories": [ + "forms" + ], + "files": [ + { + "path": "src/core/toggle/toggle.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "toggle" + ] + } + }, + { + "name": "tooltip", + "type": "registry:ui", + "title": "tooltip", + "description": "A tooltip displays a description of an element on hover or focus.", + "author": "BaseLayer", + "categories": [ + "overlays" + ], + "files": [ + { + "path": "src/core/tooltip/tooltip.tsx", + "type": "registry:component" + } + ], + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "overlay", + "interactive", + "help" + ] + } + } + ] +} \ No newline at end of file diff --git a/web/public/r/select.json b/web/public/r/select.json new file mode 100644 index 00000000..1dfb0bd8 --- /dev/null +++ b/web/public/r/select.json @@ -0,0 +1,95 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "select", + "type": "registry:ui", + "title": "select", + "author": "BaseLayer", + "description": "A select displays a collapsible list of options and allows a user to select one of them.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/select/select.tsx", + "content": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport type {\n\tSelectProps as AriaSelectProps,\n\tListBoxItemProps,\n\tValidationResult,\n} from \"react-aria-components\";\nimport {\n\tSelect as AriaSelect,\n\tAutocomplete,\n\tButton,\n\tFieldError,\n\tInput,\n\tLabel,\n\tListBox,\n\tListBoxItem,\n\tPopover,\n\tSearchField,\n\tSelectValue,\n\tText,\n\tuseFilter,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nimport { CheckIcon, ChevronDown, Search } from \"lucide-react\";\n\nconst select = tv({\n\tslots: {\n\t\tgroup: \"group flex flex-col gap-1\",\n\t\tbutton:\n\t\t\t\"group flex w-fit items-center justify-between gap-4 rounded-full border border-border bg-surface px-4 py-2.75 align-middle font-semibold text-fg text-sm outline-none ring-fg transition-all data-[hovered]:bg-surface-2 group-data-[focus-visible]:border-transparent group-data-[open]:bg-surface-2 group-data-[focus-visible]:ring-2\",\n\t\titem: \"relative m-1 flex cursor-default flex-col rounded-lg p-2 font-semibold outline-none data-[disabled]:cursor-not-allowed data-[focused]:bg-secondary data-[disabled]:text-fg-disabled\",\n\t\tsearchField:\n\t\t\t\"group m-1 flex items-center rounded-full border border-border bg-surface px-2 py-1.5\",\n\t\tsearchInput:\n\t\t\t\"flex-1 bg-transparent text-fg outline-none placeholder:text-fg-muted\",\n\t\tsearchIcon: \"mr-2 size-4 text-fg-muted\",\n\t\tclearButton:\n\t\t\t\"ml-2 rounded p-0.5 text-fg-muted transition-colors hover:bg-surface-2 hover:text-fg group-empty:invisible\",\n\t\tpopover:\n\t\t\t\"min-w-[var(--trigger-width)] rounded-xl border border-border/25 bg-surface p-1 text-fg shadow-lg outline-none\",\n\t},\n});\n\nconst styles = select();\n\ninterface SelectProps\n\textends Omit, \"className\"> {\n\tclassName?: string;\n\tpopoverClassName?: string;\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string | ((validation: ValidationResult) => string);\n}\n\nconst Select = ({\n\tlabel,\n\tclassName,\n\tdescription,\n\terrorMessage,\n\tpopoverClassName,\n\tchildren,\n\t...props\n}: SelectProps) => (\n\t\n\t\t{label && }\n\t\t\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage}\n\t\t\n\t\t\t{children}\n\t\t\n\t\n);\n\ninterface SelectItemProps\n\textends Omit {\n\tchildren: ReactNode;\n\tclassName?: string;\n}\n\nconst SelectItem = ({ className, ...props }: SelectItemProps) => (\n\t\n\t\t{({ isSelected }) => (\n\t\t\t
\n\t\t\t\t{props.children}\n\t\t\t\t{isSelected && }\n\t\t\t
\n\t\t)}\n\t
\n);\n\ninterface SearchableSelectProps\n\textends SelectProps {\n\tsearchPlaceholder?: string;\n}\n\nconst SearchableSelect = ({\n\tlabel,\n\tclassName,\n\tdescription,\n\terrorMessage,\n\tsearchPlaceholder = \"Search...\",\n\tchildren,\n\tpopoverClassName,\n\t...props\n}: SearchableSelectProps) => {\n\tconst { contains } = useFilter({ sensitivity: \"base\" });\n\n\treturn (\n\t\t\n\t\t\t{label && }\n\t\t\t\n\t\t\t{description && (\n\t\t\t\t\n\t\t\t\t\t{description}\n\t\t\t\t\n\t\t\t)}\n\t\t\t{errorMessage}\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{children}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport { Select, SelectItem, SearchableSelect };\nexport type { SelectProps, SelectItemProps, SearchableSelectProps };\n", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "picker" + ] + }, + "categories": [ + "forms" + ] +} \ No newline at end of file diff --git a/web/public/r/slider.json b/web/public/r/slider.json new file mode 100644 index 00000000..5438a64b --- /dev/null +++ b/web/public/r/slider.json @@ -0,0 +1,95 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "slider", + "type": "registry:ui", + "title": "slider", + "author": "BaseLayer", + "description": "A slider allows a user to select one or more values within a range.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/slider/slider.tsx", + "content": "\"use client\";\n\nimport {\n\tSlider as AriaSlider,\n\tSliderThumb as AriaSliderThumb,\n\tSliderTrack as AriaSliderTrack,\n\tLabel,\n\ttype LabelProps,\n\tSliderOutput,\n\ttype SliderProps,\n\ttype SliderThumbProps,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst slider = tv({\n\tslots: {\n\t\troot: \"grid w-64 auto-cols-fr grid-cols-1 text-fg-muted\",\n\t\tthumb:\n\t\t\t\"h-5 w-5 rounded-full bg-primary ring-focus ring-offset-2 ring-offset-surface data-[dragging]:outline-2 data-[focus-visible]:ring-2\",\n\t\ttrack:\n\t\t\t\"before:-translate-y-1/2 relative col-span-2 col-start-1 w-full before:absolute before:top-1/2 before:h-0.5 before:w-full before:transform before:bg-secondary\",\n\t},\n});\n\nconst { root, thumb, track } = slider();\n\nconst SliderRoot = ({\n\tchildren,\n\tclassName,\n\t...props\n}: SliderProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst SliderThumb = ({\n\tchildren,\n\tclassName,\n\t...props\n}: SliderThumbProps & { className?: string }) => (\n\t\n\t\t\n\t\n);\n\nconst SliderLabel = ({\n\tchildren,\n\tclassName,\n\t...props\n}: LabelProps & { className?: string }) => (\n\t
\n\t\t\n\t\t\n\t
\n);\n\nexport { SliderRoot, SliderThumb, SliderLabel };\n", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "range" + ] + }, + "categories": [ + "forms" + ] +} \ No newline at end of file diff --git a/web/public/r/switch.json b/web/public/r/switch.json new file mode 100644 index 00000000..9e29c0cb --- /dev/null +++ b/web/public/r/switch.json @@ -0,0 +1,95 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "switch", + "type": "registry:ui", + "title": "switch", + "author": "BaseLayer", + "description": "A switch allows a user to turn a setting on or off.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/switch/switch.tsx", + "content": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport {\n\tSwitch as AriaSwitch,\n\ttype SwitchProps as AriaSwitchProps,\n\tLabel,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst switchStyles = tv({\n\tslots: {\n\t\troot: \"group flex items-center gap-2 transition-none duration-200\",\n\t\tindicator:\n\t\t\t\"h-6 w-10 cursor-pointer rounded-xl bg-secondary duration-200 before:mx-[3px] before:mt-[3px] before:block before:size-4.5 before:rounded-2xl before:bg-surface before:transition-all data-[selected]:bg-primary group-data-[selected]:bg-primary group-data-[focus-visible]:ring-2 group-data-[focus-visible]:ring-focus group-data-[focus-visible]:ring-offset-2 group-data-[focus-visible]:ring-offset-surface group-data-[selected]:before:translate-x-4\",\n\t\tlabel: \"font-semibold text-fg text-sm\",\n\t},\t\n});\n\nconst styles = switchStyles();\n\ninterface SwitchProps extends AriaSwitchProps {\n\tchildren?: ReactNode;\n\tclassName?: string;\n}\n\n const Switch = ({ className, children, ...restProps }: SwitchProps) => (\n\t\n\t\t
\n\t\t\n\t\n);\n\nexport { Switch };\nexport type { SwitchProps };", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "toggle" + ] + }, + "categories": [ + "forms" + ] +} \ No newline at end of file diff --git a/web/public/r/table.json b/web/public/r/table.json new file mode 100644 index 00000000..674e3db5 --- /dev/null +++ b/web/public/r/table.json @@ -0,0 +1,98 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "table", + "type": "registry:ui", + "title": "table", + "author": "BaseLayer", + "description": "A table displays data in rows and columns and enables a user to navigate its contents via directional navigation keys, and optionally supports row selection and sorting.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "registryDependencies": [ + "button", + "checkbox" + ], + "files": [ + { + "path": "src/core/table/table.tsx", + "content": "\"use client\";\n\nimport {\n\tColumn as AriaColumn,\n\tTable as AriaTable,\n\tTableBody as AriaTableBody,\n\tTableHeader as AriaTableheader,\n\tCell,\n\ttype CellProps,\n\tCollection,\n\ttype ColumnProps,\n\tRow,\n\ttype RowProps,\n\ttype TableHeaderProps,\n\ttype TableProps,\n\tuseTableOptions,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nimport { Menu } from \"lucide-react\";\n\nimport { Button } from \"@/components/ui/button/button\";\nimport { Checkbox } from \"@/components/ui/checkbox/checkbox\";\n\nconst table = tv({\n\tslots: {\n\t\troot: \"table min-h-[100px] border-separate border-spacing-0 rounded-xl border border-border p-4 outline-none\",\n\t\tcolumn: \"border-border border-b-2 px-4 py-1 text-left outline-none\",\n\t\theader: \"text-fg after:table-row after:h-[2px]\",\n\t\tlabel: \"text-fg-3\",\n\t\trow: \"relative cursor-default rounded-xl text-fg outline-none ring-focus data-[focus-visible]:ring-2\",\n\t\tcell: \"px-4 py-2 outline-none ring-focus data-[focus-visible]:ring-2\",\n\t},\n});\n\nconst styles = table();\n\nconst TableBody = AriaTableBody;\n\nconst Table = ({\n\tchildren,\n\tclassName,\n\t...props\n}: TableProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst TableCell = ({\n\tchildren,\n\tclassName,\n\t...props\n}: CellProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst TableColumn = ({\n\tchildren,\n\tclassName,\n\t...props\n}: ColumnProps & { className?: string }) => (\n\t\n\t\t{children}\n\t\n);\n\nconst TableHeader = ({\n\tchildren,\n\tclassName,\n\tcolumns,\n\t...props\n}: TableHeaderProps & { className?: string }) => {\n\tconst { selectionBehavior, selectionMode, allowsDragging } =\n\t\tuseTableOptions();\n\treturn (\n\t\t\n\t\t\t{/* Add extra columns for drag and drop and selection. */}\n\t\t\t{allowsDragging && }\n\t\t\t{selectionBehavior === \"toggle\" && (\n\t\t\t\t\n\t\t\t\t\t{selectionMode === \"multiple\" && (\n\t\t\t\t\t\t \n\t\t\t\t\t)}\n\t\t\t\t\n\t\t\t)}\n\t\t\t{children}\n\t\t\n\t);\n};\n\nconst TableRow = ({\n\tchildren,\n\tclassName,\n\tcolumns,\n\tid,\n\t...props\n}: RowProps & { className?: string }) => {\n\tconst { selectionBehavior, allowsDragging } = useTableOptions();\n\treturn (\n\t\t\n\t\t\t{allowsDragging && (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t)}\n\t\t\t{selectionBehavior === \"toggle\" && (\n\t\t\t\t\n\t\t\t\t\t \n\t\t\t\t\n\t\t\t)}\n\t\t\t{children}\n\t\t\n\t);\n};\n\nexport { TableColumn, Table, TableBody, TableCell, TableHeader, TableRow };\n", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "data-display", + "interactive" + ] + }, + "categories": [ + "data-display" + ] +} \ No newline at end of file diff --git a/web/public/r/tabs.json b/web/public/r/tabs.json new file mode 100644 index 00000000..4202aca9 --- /dev/null +++ b/web/public/r/tabs.json @@ -0,0 +1,95 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "tabs", + "type": "registry:ui", + "title": "tabs", + "author": "BaseLayer", + "description": "Tabs organize content into multiple sections and allow users to navigate between them.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/tabs/tabs.tsx", + "content": "\"use client\";\n\nimport {\n\tTab as AriaTab,\n\tTabList as AriaTabList,\n\ttype TabListProps as AriaTabListProps,\n\tTabPanel as AriaTabPanel,\n\ttype TabPanelProps as AriaTabPanelProps,\n\ttype TabProps as AriaTabProps,\n\ttype TabsProps as AriaTabsProps,\n\tTabs as AriaTabsRoot,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst tabs = tv({\n\tslots: {\n\t\troot: \"flex w-full flex-col items-start\",\n\t\tlist: \"relative inline-flex items-center justify-between gap-6 rounded-md p-1\",\n\t\ttab: \"relative flex w-fit cursor-pointer justify-center rounded-2xl border-primary pb-0.5 font-semibold text-fg-muted outline-none ring-focus ring-offset-2 ring-offset-surface transition-colors duration-200 aria-selected:cursor-default aria-selected:rounded-none aria-selected:border-b-2 aria-selected:pb-0 aria-selected:text-primary aria-selected:hover:bg-transparent data-[hovered]:text-primary data-[focus-visible]:ring-2\",\n\t\tpanel:\n\t\t\t\"mt-4 w-96 rounded-xl p-4 outline-none ring-focus data-[focus-visible]:ring-2\",\n\t},\n});\n\nconst styles = tabs();\n\ninterface TabsProps extends Omit {\n\tclassName?: string;\n}\n\nconst TabsRoot = ({ children, className, ...props }: TabsProps) => (\n\t\n\t\t{children}\n\t\n);\n\ninterface TabListProps extends Omit, \"className\"> {\n\tclassName?: string;\n}\n\nconst TabList = ({\n\tchildren,\n\tclassName,\n\t...props\n}: TabListProps) => (\n\t\n\t\t{children}\n\t\n);\n\ninterface TabProps extends Omit {\n\tclassName?: string;\n}\n\nconst Tab = ({ children, className, ...props }: TabProps) => (\n\t\n\t\t{children}\n\t\n);\n\ninterface TabPanelProps extends Omit {\n\tclassName?: string;\n}\n\nconst TabPanel = ({ children, className, ...props }: TabPanelProps) => (\n\t\n\t\t{children}\n\t\n);\n\nexport { Tab, TabList, TabPanel, TabsRoot };\nexport type { TabsProps, TabListProps, TabProps, TabPanelProps }; ", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "navigation", + "interactive", + "layout" + ] + }, + "categories": [ + "navigation" + ] +} \ No newline at end of file diff --git a/web/public/r/tag-group.json b/web/public/r/tag-group.json new file mode 100644 index 00000000..afa29b9a --- /dev/null +++ b/web/public/r/tag-group.json @@ -0,0 +1,96 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "tag-group", + "type": "registry:ui", + "title": "tag-group", + "author": "BaseLayer", + "description": "A tag group is a focusable list of labels, categories, keywords, filters, or other items, with support for keyboard navigation, selection, and removal.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/tag-group/tag-group.tsx", + "content": "\"use client\";\n\nimport {\n\tTag as AriaTag,\n\tTagGroup as AriaTagGroup,\n\ttype TagGroupProps as AriaTagGroupProps,\n\ttype TagProps as AriaTagProps,\n\tLabel,\n\tTagList,\n\ttype TagListProps,\n\tText,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst tagGroup = tv({\n\tslots: {\n\t\troot: \"flex flex-col gap-2 text-sm\",\n\t\tlist: \"flex flex-wrap gap-2\",\n\t\ttag: \"flex cursor-default items-center rounded-full border border-border px-2 py-1 outline-none ring-focus ring-offset-2 ring-offset-surface aria-selected:border-primary aria-selected:bg-primary aria-selected:text-primary-fg data-[focus-visible]:ring-2\",\n\t},\n});\n\nconst styles = tagGroup();\n\ninterface TagGroupProps\n\textends Omit,\n\t\tPick, \"items\" | \"children\" | \"renderEmptyState\"> {\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string;\n}\n\nconst TagGroup = ({\n\tlabel,\n\tclassName,\n\tdescription,\n\terrorMessage,\n\titems,\n\tchildren,\n\trenderEmptyState,\n\t...props\n}: TagGroupProps) => (\n\t\n\t\t{label && }\n\t\t\n\t\t\t{children}\n\t\t\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage && (\n\t\t\t\n\t\t\t\t{errorMessage}\n\t\t\t\n\t\t)}\n\t\n);\n\nconst Tag = ({\n\tchildren,\n\tclassName,\n\t...props\n}: AriaTagProps & { className?: string }) => {\n\tconst textValue = typeof children === \"string\" ? children : undefined;\n\treturn (\n\t\t\n\t\t\t{children}\n\t\t\n\t);\n};\n\nexport { Tag, TagGroup };\n", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "selection", + "filtering" + ] + }, + "categories": [ + "forms" + ] +} \ No newline at end of file diff --git a/web/public/r/time-field.json b/web/public/r/time-field.json new file mode 100644 index 00000000..9a81f1ce --- /dev/null +++ b/web/public/r/time-field.json @@ -0,0 +1,95 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "time-field", + "type": "registry:ui", + "title": "time-field", + "author": "BaseLayer", + "description": "A time field allows users to enter and edit time values using a keyboard. Each part of a time value is displayed in an individually editable segment.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/time-field/time-field.tsx", + "content": "\"use client\";\n\nimport type {\n\tTimeFieldProps as AriaTimeFieldProps,\n\tTimeValue,\n} from \"react-aria-components\";\nimport {\n\tTimeField as AriaTimeField,\n\tDateInput,\n\tDateSegment,\n\tFieldError,\n\tLabel,\n\tText,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst timeField = tv({\n\tslots: {\n\t\tinput:\n\t\t\t\"appearance-none rounded-lg border border-border bg-surface px-3 py-1.75 outline-none ring-primary transition-all data-[disabled]:cursor-not-allowed data-[focus-within]:border-transparent data-[disabled]:bg-primary/10 data-[focus-within]:bg-surface data-[disabled]:text-fg-disabled data-[focus-within]:ring-2 [&::placeholder]:text-sm [&::placeholder]:focus:text-primary-fg\",\n\t\tsegmentStyles:\n\t\t\t\"rounded-md p-1 text-end outline-none focus:bg-primary focus:text-primary-fg data-[placeholder]:text-fg-muted data-[type='literal']:text-fg-muted\",\n\t},\n});\n\nconst styles = timeField();\n\ninterface TimeFieldProps extends AriaTimeFieldProps {\n\tlabel?: string;\n\tdescription?: string;\n\terrorMessage?: string;\n}\n\nconst TimeField = ({\n\tlabel,\n\tdescription,\n\terrorMessage,\n\t...props\n}: TimeFieldProps) => (\n\t\n\t\t{label && }\n\t\t\n\t\t\t{(segment) => (\n\t\t\t\t\n\t\t\t)}\n\t\t\n\t\t{description && (\n\t\t\t\n\t\t\t\t{description}\n\t\t\t\n\t\t)}\n\t\t{errorMessage}\n\t\n);\n\nexport { TimeField };\nexport type { TimeFieldProps };\n", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "time" + ] + }, + "categories": [ + "forms" + ] +} \ No newline at end of file diff --git a/web/public/r/toggle.json b/web/public/r/toggle.json new file mode 100644 index 00000000..5124ea24 --- /dev/null +++ b/web/public/r/toggle.json @@ -0,0 +1,95 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "toggle", + "type": "registry:ui", + "title": "toggle", + "author": "BaseLayer", + "description": "A toggle button allows a user to toggle a selection on or off, for example switching between two states or modes.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/toggle/toggle.tsx", + "content": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport {\n\tToggleButton,\n\tToggleButtonGroup,\n\ttype ToggleButtonGroupProps,\n\ttype ToggleButtonProps,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst toggle = tv({\n\tbase: \"inline-flex appearance-none items-center justify-center rounded-full bg-surface-2 px-4 py-1 font-medium outline-none ring-focus ring-offset-2 ring-offset-surface transition-transform duration-100 disabled:pointer-events-none disabled:opacity-50 data-[selected]:bg-primary data-[selected]:text-primary-fg data-[focus-visible]:ring-2\",\n});\n\nconst toggleGroup = tv({\n\tbase: \"flex min-h-11 gap-1 rounded-full border border-border bg-surface-2 p-1\",\n});\n\ninterface ToggleProps extends Omit {\n\tclassName?: string;\n}\n\nconst Toggle = ({ className, children, ...props }: ToggleProps) => (\n\t\n\t\t{children}\n\t\n);\n\ninterface ToggleGroupProps extends ToggleButtonGroupProps {\n\tclassName?: string;\n\tchildren: ReactNode;\n}\n\nconst ToggleGroup = ({ className, children, ...props }: ToggleGroupProps) => (\n\t\n\t\t{children}\n\t\n);\n\nexport { Toggle, ToggleGroup };\nexport type { ToggleProps, ToggleGroupProps };\n", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "form", + "interactive", + "toggle" + ] + }, + "categories": [ + "forms" + ] +} \ No newline at end of file diff --git a/web/public/r/tooltip.json b/web/public/r/tooltip.json new file mode 100644 index 00000000..b0792c37 --- /dev/null +++ b/web/public/r/tooltip.json @@ -0,0 +1,95 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "tooltip", + "type": "registry:ui", + "title": "tooltip", + "author": "BaseLayer", + "description": "A tooltip displays a description of an element on hover or focus.", + "dependencies": [ + "react-aria-components", + "tailwind-variants", + "lucide-react", + "tw-animate-css" + ], + "files": [ + { + "path": "src/core/tooltip/tooltip.tsx", + "content": "\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport {\n\tTooltip as AriaTooltip,\n\ttype TooltipProps as AriaTooltipProps,\n\tTooltipTrigger as AriaTooltipTrigger,\n} from \"react-aria-components\";\nimport { tv } from \"tailwind-variants\";\n\nconst tooltip = tv({\n\tbase: \"[&[data-entering]]:fade-in [&[data-exiting]]:fade-out m-1 max-w-sm rounded-full border border-border bg-surface px-4 py-2 text-fg shadow-xl outline-none [&[data-entering]]:animate-fade-in [&[data-exiting]]:animate-fade-out\",\n});\n\nconst TooltipTrigger = AriaTooltipTrigger;\n\ninterface TooltipProps extends Omit {\n\tclassName?: string;\n\tchildren: ReactNode;\n}\n\nconst Tooltip = ({ children, className, ...props }: TooltipProps) => (\n\t\n\t\t{children}\n\t\n);\n\nexport { Tooltip, TooltipTrigger };\n", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "content": [ + "./components/**/*.{ts,tsx}" + ], + "theme": { + "extend": {} + } + } + }, + "cssVars": { + "theme": { + "--color-surface": "var(--surface)", + "--color-surface-2": "var(--surface-2)", + "--color-fg": "var(--fg)", + "--color-fg-muted": "var(--fg-muted)", + "--color-fg-disabled": "var(--fg-disabled)", + "--color-fg-inverse": "var(--fg-inverse)", + "--color-border": "var(--border)", + "--color-focus": "var(--focus)", + "--color-primary": "var(--primary)", + "--color-primary-fg": "var(--primary-fg)", + "--color-secondary": "var(--secondary)", + "--color-secondary-fg": "var(--secondary-fg)", + "--color-danger": "var(--danger)", + "--color-danger-fg": "var(--danger-fg)" + }, + "light": { + "--surface": "oklch(98.5% 0 0)", + "--surface-2": "oklch(97% 0 0)", + "--fg": "oklch(14.5% 0 0)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(70.8% 0 0)", + "--border": "oklch(87% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(14.5% 0 0)", + "--primary-fg": "oklch(98.5% 0 0)", + "--secondary": "oklch(92.2% 0 0)", + "--secondary-fg": "oklch(14.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "#ffffff" + }, + "dark": { + "--surface": "oklch(14.5% 0 0)", + "--surface-2": "oklch(20.5% 0 0)", + "--fg": "oklch(98.5% 0.001 106.423)", + "--fg-muted": "oklch(55.6% 0 0)", + "--fg-inverse": "oklch(98.5% 0 0)", + "--fg-disabled": "oklch(37.1% 0 0)", + "--border": "oklch(37.1% 0 0)", + "--focus": "oklch(68.5% 0.169 237.323)", + "--primary": "oklch(98.5% 0 0)", + "--primary-fg": "oklch(14.5% 0 0)", + "--secondary": "oklch(26.9% 0 0)", + "--secondary-fg": "oklch(98.5% 0 0)", + "--danger": "oklch(63.7% 0.237 25.331)", + "--danger-fg": "oklch(98.5% 0 0)" + } + }, + "css": { + "@import \"tw-animate-css\"": {} + }, + "meta": { + "status": "stable", + "tags": [ + "overlay", + "interactive", + "help" + ] + }, + "categories": [ + "overlays" + ] +} \ No newline at end of file diff --git a/web/public/registry.json b/web/public/registry.json deleted file mode 100644 index 9de5faaf..00000000 --- a/web/public/registry.json +++ /dev/null @@ -1,385 +0,0 @@ -{ - "version": "2.0.2", - "components": [ - { - "id": "accordion", - "template": "/templates/accordion.txt", - "meta": { - "name": "accordion", - "category": "layout", - "status": "stable", - "description": "An accordion allows users to toggle the display of sections of content. Each accordion consists of a header with a title and content area.", - "tags": [ - "disclosure", - "collapsible", - "expandable", - "content" - ] - } - }, - { - "id": "badge", - "template": "/templates/badge.txt", - "meta": { - "name": "badge", - "category": "display", - "status": "stable", - "description": "A badge is a small label that can be used to display information or status.", - "tags": [ - "status" - ] - } - }, - { - "id": "breadcrumbs", - "template": "/templates/breadcrumbs.txt", - "meta": { - "name": "breadcrumbs", - "category": "navigation", - "status": "stable", - "description": "Breadcrumbs display a heirarchy of links to the current page or resource in an application.", - "tags": [ - "navigation" - ] - } - }, - { - "id": "button", - "template": "/templates/button.txt", - "meta": { - "name": "button", - "category": "forms", - "status": "stable", - "description": "A button allows a user to perform an action, with mouse, touch, and keyboard interactions.", - "tags": [ - "form", - "interactive" - ] - } - }, - { - "id": "calendar", - "template": "/templates/calendar.txt", - "meta": { - "name": "calendar", - "category": "data-entry", - "status": "stable", - "description": "A calendar displays one or more date grids and allows users to select either a single date or a contiguous range of dates.", - "tags": [ - "form", - "interactive", - "date-time" - ] - } - }, - { - "id": "card", - "template": "/templates/card.txt", - "meta": { - "name": "card", - "category": "layout", - "status": "stable", - "description": "Displays a card with header, content, and footer.", - "tags": [ - "layout", - "container", - "display" - ] - } - }, - { - "id": "checkbox", - "template": "/templates/checkbox.txt", - "meta": { - "name": "checkbox", - "category": "forms", - "status": "stable", - "description": "A checkbox allows a user to select multiple items from a list of individual items, or to mark one individual item as selected.", - "tags": [ - "form", - "interactive" - ] - } - }, - { - "id": "combobox", - "template": "/templates/combobox.txt", - "meta": { - "name": "combobox", - "category": "forms", - "status": "stable", - "description": "A combo box combines a text input with a listbox, allowing users to filter a list of options to items matching a query.", - "tags": [ - "form", - "interactive", - "picker" - ] - } - }, - { - "id": "command", - "template": "/templates/command.txt", - "meta": { - "name": "command", - "category": "navigation", - "status": "beta", - "description": "A command palette that allows users to quickly search and execute commands using keyboard shortcuts.", - "tags": [ - "search", - "navigation", - "keyboard", - "palette" - ] - } - }, - { - "id": "date-field", - "template": "/templates/date-field.txt", - "meta": { - "name": "date-field", - "category": "forms", - "status": "stable", - "description": "A date field allows users to enter and edit date and time values using a keyboard. Each part of a date value is displayed in an individually editable segment.", - "tags": [ - "form", - "interactive", - "date" - ] - } - }, - { - "id": "date-picker", - "template": "/templates/date-picker.txt", - "meta": { - "name": "date-picker", - "category": "forms", - "status": "stable", - "description": "A date picker combines one or more DateFields with a calendar popover, allowing users to enter or select a single date/time or a range.", - "tags": [ - "form", - "interactive", - "date-time" - ] - } - }, - { - "id": "input", - "template": "/templates/input.txt", - "meta": { - "name": "input", - "category": "forms", - "status": "stable", - "description": "Allows a user to enter a plain text value with a keyboard.", - "tags": [ - "form", - "interactive" - ] - } - }, - { - "id": "menu", - "template": "/templates/menu.txt", - "meta": { - "name": "menu", - "category": "pickers", - "status": "stable", - "description": "A menu displays a list of actions or options that a user can choose.", - "tags": [ - "interactive", - "navigation" - ] - } - }, - { - "id": "meter", - "template": "/templates/meter.txt", - "meta": { - "name": "meter", - "category": "data-display", - "status": "stable", - "description": "A meter represents a quantity within a known range, or a fractional value.", - "tags": [ - "data-display", - "progress" - ] - } - }, - { - "id": "modal", - "template": "/templates/modal.txt", - "meta": { - "name": "modal", - "category": "overlays", - "status": "stable", - "description": "A modal is an overlay element which blocks interaction with elements outside it.", - "tags": [ - "overlay" - ] - } - }, - { - "id": "popover", - "template": "/templates/popover.txt", - "meta": { - "name": "popover", - "category": "overlays", - "status": "stable", - "description": "A popover is an overlay element positioned relative to a trigger.", - "tags": [ - "overlay", - "interactive" - ] - } - }, - { - "id": "radio-group", - "template": "/templates/radio-group.txt", - "meta": { - "name": "radio-group", - "category": "forms", - "status": "stable", - "description": "A radio group allows a user to select a single option from a list of mutually exclusive options.", - "tags": [ - "form", - "interactive", - "selection" - ] - } - }, - { - "id": "select", - "template": "/templates/select.txt", - "meta": { - "name": "select", - "category": "forms", - "status": "stable", - "description": "A select displays a collapsible list of options and allows a user to select one of them.", - "tags": [ - "form", - "interactive", - "picker" - ] - } - }, - { - "id": "slider", - "template": "/templates/slider.txt", - "meta": { - "name": "slider", - "category": "forms", - "status": "stable", - "description": "A slider allows a user to select one or more values within a range.", - "tags": [ - "form", - "interactive", - "range" - ] - } - }, - { - "id": "switch", - "template": "/templates/switch.txt", - "meta": { - "name": "switch", - "category": "forms", - "status": "stable", - "description": "A switch allows a user to turn a setting on or off.", - "tags": [ - "form", - "interactive", - "toggle" - ] - } - }, - { - "id": "table", - "template": "/templates/table.txt", - "meta": { - "name": "table", - "category": "data-display", - "status": "stable", - "description": "A table displays data in rows and columns and enables a user to navigate its contents via directional navigation keys, and optionally supports row selection and sorting.", - "tags": [ - "data-display", - "interactive" - ] - } - }, - { - "id": "tabs", - "template": "/templates/tabs.txt", - "meta": { - "name": "tabs", - "category": "navigation", - "status": "stable", - "description": "Tabs organize content into multiple sections and allow users to navigate between them.", - "tags": [ - "navigation", - "interactive", - "layout" - ] - } - }, - { - "id": "tag-group", - "template": "/templates/tag-group.txt", - "meta": { - "name": "tag-group", - "category": "forms", - "status": "stable", - "description": "A tag group is a focusable list of labels, categories, keywords, filters, or other items, with support for keyboard navigation, selection, and removal.", - "tags": [ - "form", - "interactive", - "selection", - "filtering" - ] - } - }, - { - "id": "time-field", - "template": "/templates/time-field.txt", - "meta": { - "name": "time-field", - "category": "forms", - "status": "stable", - "description": "A time field allows users to enter and edit time values using a keyboard. Each part of a time value is displayed in an individually editable segment.", - "tags": [ - "form", - "interactive", - "time" - ] - } - }, - { - "id": "toggle", - "template": "/templates/toggle.txt", - "meta": { - "name": "toggle", - "category": "forms", - "status": "stable", - "description": "A toggle button allows a user to toggle a selection on or off, for example switching between two states or modes.", - "tags": [ - "form", - "interactive", - "toggle" - ] - } - }, - { - "id": "tooltip", - "template": "/templates/tooltip.txt", - "meta": { - "name": "tooltip", - "category": "overlays", - "status": "stable", - "description": "A tooltip displays a description of an element on hover or focus.", - "tags": [ - "overlay", - "interactive", - "help" - ] - } - } - ] -} \ No newline at end of file diff --git a/web/public/tailwind.css b/web/public/tailwind.css deleted file mode 100644 index 69257304..00000000 --- a/web/public/tailwind.css +++ /dev/null @@ -1,93 +0,0 @@ -@variant dark ([data-theme="dark"] &); - -:root { - /* SURFACES (neutrals & elevation) */ - --surface: oklch(98.5% 0 0); /* app/page background */ - --surface-2: oklch(97% 0 0); /* card / raised */ - - /* CONTENT (foreground) */ - --fg: oklch(14.5% 0 0); /* primary reading text */ - --fg-muted: oklch(55.6% 0 0); /* secondary text, captions */ - --fg-inverse: oklch(98.5% 0 0); /* text on dark */ - --fg-disabled: oklch(70.8% 0 0); /* explicit disabled state text */ - - /* OUTLINES & DIVIDERS */ - --border: oklch(87% 0 0); /* generic 1px rules, inputs */ - --focus: oklch(68.5% 0.169 237.323); /* focus ring / a11y outline */ - - /* INTERACTIVE ROLES (paired bg / fg ) */ - --primary: oklch(14.5% 0 0); - --primary-fg: oklch(98.5% 0 0); - - --secondary: oklch(92.2% 0 0); - --secondary-fg: oklch(14.5% 0 0); - - /* STATUS / FUNCTIONAL */ - - --danger: oklch(63.7% 0.237 25.331); - --danger-fg: #ffffff; -} - -[data-theme='dark'] { - /* SURFACES (neutrals & elevation) */ - --surface: oklch(14.5% 0 0); /* app/page background */ - --surface-2: oklch(20.5% 0 0); /* card / raised */ - - /* CONTENT (foreground) */ - --fg: oklch(98.5% 0.001 106.423); /* primary reading text */ - --fg-muted: oklch(55.6% 0 0); /* secondary text, captions */ - --fg-inverse: oklch(98.5% 0 0); /* text on dark */ - --fg-disabled: oklch(37.1% 0 0); /* explicit disabled state text */ - - /* OUTLINES & DIVIDERS */ - --border: oklch(37.1% 0 0); /* generic 1px rules, inputs */ - --focus: oklch(68.5% 0.169 237.323); /* focus ring / a11y outline */ - - /* INTERACTIVE ROLES (paired bg / fg ) */ - --primary: oklch(98.5% 0 0); - --primary-fg: oklch(14.5% 0 0); - - --secondary: oklch(26.9% 0 0); - --secondary-fg: oklch(98.5% 0 0); - - /* STATUS / FUNCTIONAL */ - - --danger: oklch(63.7% 0.237 25.331); - --danger-fg: oklch(98.5% 0 0); -} - -@theme { - --color-surface: var(--surface); - --color-surface-2: var(--surface-2); - --color-fg: var(--fg); - --color-fg-muted: var(--fg-muted); - --color-fg-disabled: var(--fg-disabled); - --color-fg-inverse: var(--fg-inverse); - --color-border: var(--border); - --color-focus: var(--focus); - --color-primary: var(--primary); - --color-primary-fg: var(--primary-fg); - --color-secondary: var(--secondary); - --color-secondary-fg: var(--secondary-fg); - --color-danger: var(--danger); - --color-danger-fg: var(--danger-fg); -} - - /* clears the ‘X’ from Internet Explorer */ - input[type="search"]::-ms-clear { - display: none; - width: 0; - height: 0; - } - input[type="search"]::-ms-reveal { - display: none; - width: 0; - height: 0; - } - /* clears the ‘X’ from Chrome */ - input[type="search"]::-webkit-search-decoration, - input[type="search"]::-webkit-search-cancel-button, - input[type="search"]::-webkit-search-results-button, - input[type="search"]::-webkit-search-results-decoration { - display: none; - } diff --git a/web/public/templates/accordion.txt b/web/public/templates/accordion.txt deleted file mode 100644 index 4c0054c4..00000000 --- a/web/public/templates/accordion.txt +++ /dev/null @@ -1,87 +0,0 @@ -"use client"; - -import type { ReactNode } from "react"; - -import { - Button, - Disclosure, - DisclosureGroup, - type DisclosureGroupProps, - DisclosurePanel, - type DisclosureProps, - Heading, -} from "react-aria-components"; -import { tv, type VariantProps } from "tailwind-variants"; - -import { Minus, Plus } from "lucide-react"; - -const accordion = tv({ - slots: { - root: "group w-full", - group: "flex flex-col gap-3", - button: - "flex w-full items-center justify-between gap-6 rounded-2xl border border-border bg-surface-2 p-4 data-[focus-visible]:outline-none data-[focus-visible]:ring-2 data-[focus-visible]:ring-focus data-[focus-visible]:ring-offset-2 data-[focus-visible]:ring-offset-surface group-data-[expanded]:rounded-b-none group-data-[expanded]:border-b-0", - icon: "size-4 shrink-0 fill-none transition-transform duration-200", - panel: - "rounded-b-2xl border-border bg-surface-2 px-4 text-muted-foreground text-sm group-data-[expanded]:border-x group-data-[expanded]:border-b group-data-[expanded]:pb-4", - }, -}); - -const styles = accordion(); - -type AccordionVariantProps = VariantProps; - -interface AccordionProps - extends AccordionVariantProps, - Omit { - className?: string; - title?: string; - children?: ReactNode; -} - -const Accordion = ({ - className, - title, - children, - ...props -}: AccordionProps) => { - return ( - - {({ isExpanded }) => ( - <> - - - - - {children} - - - )} - - ); -}; - -interface AccordionGroupProps extends DisclosureGroupProps { - className?: string; - children: ReactNode; -} - -const AccordionGroup = ({ - className, - children, - ...props -}: AccordionGroupProps) => ( - - {children} - -); - -export { Accordion, AccordionGroup }; -export type { AccordionProps, AccordionGroupProps }; diff --git a/web/public/templates/badge.txt b/web/public/templates/badge.txt deleted file mode 100644 index 606b068e..00000000 --- a/web/public/templates/badge.txt +++ /dev/null @@ -1,26 +0,0 @@ -import type { HTMLAttributes } from "react"; - -import { tv, type VariantProps } from "tailwind-variants"; - -export const badge = tv({ - base: "flex items-center justify-center rounded-4xl px-3 py-2 font-semibold text-xs", - variants: { - variant: { - attention: "bg-gradient-to-r from-pink-500 to-purple-500 text-white", - neutral: "bg-secondary text-secondary-fg", - danger: "bg-danger text-danger-fg", - }, - }, - defaultVariants: { - variant: "attention", - }, -}); - -type BadgeProps = VariantProps & HTMLAttributes; - -const Badge = ({ className, variant, ...props }: BadgeProps) => ( - -); - -export { Badge }; -export type { BadgeProps }; diff --git a/web/public/templates/breadcrumbs.txt b/web/public/templates/breadcrumbs.txt deleted file mode 100644 index 6a229b5b..00000000 --- a/web/public/templates/breadcrumbs.txt +++ /dev/null @@ -1,53 +0,0 @@ -"use client"; - -import { - Breadcrumbs as AriaBreadcrumbs, - type BreadcrumbsProps as AriaBreadcrumbsProps, - Breadcrumb, - type BreadcrumbProps, - Link, - type LinkProps, -} from "react-aria-components"; -import { tv } from "tailwind-variants"; - -const breadcrumbs = tv({ - slots: { - root: "m-0 flex list-none items-center gap-2 p-0 font-md", - link: "relative cursor-pointer rounded-md text-fg outline-none ring-focus data-[hovered]:underline data-[focus-visible]:ring-2 [&[aria-current]]:font-extrabold [&[aria-current]]:text-fg", - item: "flex items-center gap-2", - }, -}); - -const styles = breadcrumbs(); - -const Breadcrumbs = ({ - children, - className, - ...props -}: AriaBreadcrumbsProps & { className?: string }) => ( - - {children} - -); - -const BreadcrumbsLink = ({ - children, - className, - ...props -}: LinkProps & { className?: string }) => ( - - {children} - -); - -const BreadcrumbsItem = ({ - children, - className, - ...props -}: BreadcrumbProps & { className?: string }) => ( - - {children} - -); - -export { BreadcrumbsItem, BreadcrumbsLink, Breadcrumbs }; \ No newline at end of file diff --git a/web/public/templates/button.txt b/web/public/templates/button.txt deleted file mode 100644 index 51855afd..00000000 --- a/web/public/templates/button.txt +++ /dev/null @@ -1,58 +0,0 @@ -"use client"; - -import { - Button as AriaButton, - type ButtonProps as AriaButtonProps, -} from "react-aria-components"; -import { tv, type VariantProps } from "tailwind-variants"; - -const button = tv({ - base: "inline-flex appearance-none items-center justify-center rounded-full font-semibold outline-none ring-focus ring-offset-3 ring-offset-surface transition-transform duration-100 disabled:pointer-events-none disabled:opacity-50 data-[focus-visible]:ring-2", - variants: { - variant: { - primary: - "bg-primary text-primary-fg data-[hovered]:bg-primary/80", - secondary: - "border border-border text-fg data-[hovered]:border-secondary data-[hovered]:bg-secondary", - ghost: - "bg-transparent text-fg data-[hovered]:bg-secondary data-[hovered]:text-secondary-fg", - danger: - "border border-transparent bg-danger text-danger-fg data-[hovered]:bg-danger/80", - }, - size: { - sm: "px-2 py-1.5 text-sm", - md: "px-4 py-2.5 text-base", - lg: "px-6 py-3.5 font-bold text-lg", - icon: "size-9", - }, - }, - defaultVariants: { - variant: "primary", - size: "md", - }, -}); - -type ButtonVariantProps = VariantProps; - -interface ButtonProps - extends Omit, - ButtonVariantProps { - className?: string; -} - -const Button = ({ - className, - size, - variant, - children, - ...props -}: ButtonProps) => ( - - {children} - -); - -Button.displayName = "Button"; - -export { Button }; -export type { ButtonProps }; diff --git a/web/public/templates/calendar.txt b/web/public/templates/calendar.txt deleted file mode 100644 index c997105b..00000000 --- a/web/public/templates/calendar.txt +++ /dev/null @@ -1,133 +0,0 @@ -"use client"; - -import { - Calendar as AriaCalendar, - type CalendarProps as AriaCalendarProps, - RangeCalendar as AriaRangeCalendar, - type RangeCalendarProps as AriaRangeCalendarProps, - Button, - CalendarCell, - CalendarGrid, - CalendarGridBody, - CalendarGridHeader, - CalendarHeaderCell, - type DateValue, - Heading, - Text, -} from "react-aria-components"; -import { tv } from "tailwind-variants"; - -import { ChevronLeft, ChevronRight } from "lucide-react"; - -const baseStyles = tv({ - slots: { - root: "w-fit max-w-full rounded-2xl border border-border bg-surface p-4 text-fg", - header: "flex w-full items-center gap-1 pb-4", - heading: "flex-1 text-center font-bold", - headerCell: "pb-2 text-fg-muted text-sm", - monthButton: - "flex appearance-none items-center justify-center rounded-full p-2 text-center outline-none ring-focus data-[hovered]:bg-secondary data-[focus-visible]:ring-2", - }, -}); - -const calendar = tv({ - extend: baseStyles, - slots: { - cell: "flex size-9 cursor-default items-center justify-center rounded-full border-border text-center text-sm outline-focus outline-offset-2 data-[hovered]:bg-secondary data-[pressed]:bg-secondary data-[selected]:bg-primary data-[selected]:text-primary-fg data-[unavailable]:text-fg-muted data-[unavailable]:line-through data-[focus-visible]:outline-2 data-[focus-visible]:outline-focus [&[data-outside-month]]:hidden", - }, -}); - -const rangeCalendar = tv({ - extend: baseStyles, - slots: { - cell: "flex size-9 cursor-default items-center justify-center rounded-full text-center text-sm outline-none outline-offset-2 data-[selected]:rounded-none data-[hovered]:bg-secondary data-[pressed]:bg-secondary data-[selected]:bg-primary data-[selected]:text-primary-fg data-[unavailable]:text-fg-muted data-[unavailable]:line-through data-[focus-visible]:ring-2 data-[focus-visible]:ring-focus data-[focus-visible]:ring-offset-2 [&[data-outside-month]]:hidden [&[data-selection-end]]:rounded-r-full [&[data-selection-start]]:rounded-l-full", - }, -}); - -const styles = calendar(); -const rangeStyles = rangeCalendar(); - -interface CalendarProps - extends Omit, "className"> { - errorMessage?: string; - className?: string; -} - -const Calendar = ({ - className, - errorMessage, - ...props -}: CalendarProps) => ( - -
- - - -
- - - {(day) => ( - - {day} - - )} - - - {(date) => } - - - {errorMessage && ( - - {errorMessage} - - )} -
-); - -interface RangeCalendarProps - extends Omit, "className"> { - errorMessage?: string; - className?: string; -} - -const RangeCalendar = ({ - className, - errorMessage, - ...props -}: RangeCalendarProps) => ( - -
- - - -
- - - {(day) => ( - - {day} - - )} - - - {(date) => } - - - {errorMessage && ( - - {errorMessage} - - )} -
-); - -export { Calendar, RangeCalendar }; -export type { CalendarProps, RangeCalendarProps }; diff --git a/web/public/templates/card.txt b/web/public/templates/card.txt deleted file mode 100644 index 27ab30a7..00000000 --- a/web/public/templates/card.txt +++ /dev/null @@ -1,85 +0,0 @@ -"use client"; - -import type { HTMLAttributes } from "react"; - -import { tv, type VariantProps } from "tailwind-variants"; - -const card = tv({ - slots: { - root: "rounded-2xl border-2 bg-surface text-fg", - header: "flex flex-col space-y-1.5 p-6", - title: "font-semibold text-2xl leading-none tracking-tight", - description: "text-fg-muted text-sm", - content: "p-6 pt-0", - footer: "flex items-center p-6 pt-0", - }, - variants: { - variant: { - outlined: { - root: "border border-border/50", - }, - filled: { - root: "border-surface-2 bg-surface-2", - }, - }, - }, - defaultVariants: { - variant: "outlined", - }, -}); - -const styles = card(); - -type CardVariantProps = VariantProps; - -interface CardProps extends HTMLAttributes, CardVariantProps { - className?: string; - title?: string; - description?: string; -} - -interface CardHeaderProps extends HTMLAttributes { - className?: string; -} - -interface CardContentProps extends HTMLAttributes { - className?: string; -} - -interface CardFooterProps extends HTMLAttributes { - className?: string; -} - -const Card = ({ - className, - variant, - title, - description, - children, - ...props -}: CardProps) => ( -
- {(title || description) && ( -
- {title &&

{title}

} - {description &&

{description}

} -
- )} - {children} -
-); - -const CardHeader = ({ className, ...props }: CardHeaderProps) => ( -
-); - -const CardContent = ({ className, ...props }: CardContentProps) => ( -
-); - -const CardFooter = ({ className, ...props }: CardFooterProps) => ( -
-); - -export { Card, CardHeader, CardContent, CardFooter }; -export type { CardProps, CardHeaderProps, CardContentProps, CardFooterProps }; diff --git a/web/public/templates/checkbox.txt b/web/public/templates/checkbox.txt deleted file mode 100644 index 0ab226ff..00000000 --- a/web/public/templates/checkbox.txt +++ /dev/null @@ -1,97 +0,0 @@ -"use client"; - -import type { ReactNode } from "react"; - -import { - type CheckboxProps as AriaCheckBoxProps, - Checkbox as AriaCheckbox, - CheckboxGroup as AriaCheckboxGroup, - type CheckboxGroupProps as AriaCheckboxGroupProps, - FieldError, - Text, - type ValidationResult, -} from "react-aria-components"; -import { tv, type VariantProps } from "tailwind-variants"; - -import { Check } from "lucide-react"; - -const checkbox = tv({ - base: "group flex items-center justify-center gap-2 py-1 text-fg", -}); - -const checkboxGroup = tv({ - base: "flex flex-col gap-2", -}); - -type CheckboxVariantProps = VariantProps; - -interface CheckboxProps extends CheckboxVariantProps, AriaCheckBoxProps { - className?: string; - children: ReactNode; - description?: string; - errorMessage?: string | ((validation: ValidationResult) => string); -} - -const Checkbox = ({ - className, - errorMessage, - children, - description, - ...props -}: CheckboxProps) => { - return ( - - {({ isSelected }) => ( - <> -
- {isSelected && } -
- {children} - {description && ( - - {description} - - )} - - {errorMessage} - - - )} -
- ); -}; - -interface CheckboxGroupProps extends AriaCheckboxGroupProps { - className?: string; - label?: string; - children: ReactNode; - description?: string; - errorMessage?: string | ((validation: ValidationResult) => string); -} - -const CheckboxGroup = ({ - className, - label, - description, - errorMessage, - children, - ...props -}: CheckboxGroupProps) => ( - - {label && ( - - {label} - - )} - {children} - {description && ( - - {description} - - )} - {errorMessage} - -); - -export { Checkbox, CheckboxGroup }; -export type { CheckboxProps, CheckboxGroupProps }; diff --git a/web/public/templates/combobox.txt b/web/public/templates/combobox.txt deleted file mode 100644 index acb7e7e8..00000000 --- a/web/public/templates/combobox.txt +++ /dev/null @@ -1,95 +0,0 @@ -"use client"; - -import type { ReactNode } from "react"; - -import { - ComboBox as AriaComboBox, - type ComboBoxProps as AriaComboBoxProps, - Button, - FieldError, - Input, - Label, - ListBox, - ListBoxItem, - type ListBoxItemProps, - Popover, - Text, - type ValidationResult, -} from "react-aria-components"; -import { tv } from "tailwind-variants"; - -import { CheckIcon, ChevronsUpDown } from "lucide-react"; - -const combobox = tv({ - slots: { - root: "group max-h-inherit w-full overflow-auto p-1 outline-none", - input: - "w-full rounded-lg border border-border bg-surface px-4 py-1.5 align-middle font-semibold text-fg outline-none ring-fg transition-all group-data-[focused]:border-transparent group-data-[focused]:bg-surface group-data-[focused]:ring-2", - button: - "absolute right-2 flex appearance-none items-center justify-center rounded-full border-0 outline-none ring-focus ring-offset-2 ring-offset-surface data-[focus-visible]:ring-2", - popover: - "w-[var(--trigger-width)] rounded-xl border border-border/25 bg-surface p-1 text-fg shadow-lg outline-none", - item: "relative m-1 flex cursor-default flex-col rounded-lg p-2 font-semibold outline-none data-[disabled]:cursor-not-allowed data-[focused]:bg-secondary data-[disabled]:text-fg-disabled", - }, -}); - -const styles = combobox(); - -interface ComboBoxProps - extends Omit, "className"> { - className?: string; - label?: string; - description?: string; - errorMessage?: string | ((validation: ValidationResult) => string); -} - -const ComboBox = ({ - label, - className, - description, - errorMessage, - children, - ...props -}: ComboBoxProps) => ( - - {label && } -
- - -
- {description && ( - - {description} - - )} - {errorMessage} - - {children} - -
-); - -interface ComboBoxItemProps - extends Omit { - children: ReactNode; - className?: string; -} - -const ComboBoxItem = ({ className, ...props }: ComboBoxItemProps) => ( - - {({ isSelected }) => ( -
- {props.children} - {isSelected && } -
- )} -
-); - -export { ComboBox, ComboBoxItem }; -export type { ComboBoxProps, ListBoxItemProps as ComboBoxItemProps }; \ No newline at end of file diff --git a/web/public/templates/command.txt b/web/public/templates/command.txt deleted file mode 100644 index cb1df72f..00000000 --- a/web/public/templates/command.txt +++ /dev/null @@ -1,191 +0,0 @@ -"use client"; - -import type { ComponentType, ReactNode } from "react"; -import { useEffect, useState } from "react"; - -import { - Button as AriaButton, - Dialog as AriaDialog, - DialogTrigger as AriaDialogTrigger, - Modal as AriaModal, - Autocomplete, - Input, - Menu, - MenuItem, - type MenuItemProps, - ModalOverlay, - type ModalOverlayProps, - TextField, - useFilter, -} from "react-aria-components"; -import { tv } from "tailwind-variants"; - -import { Search } from "lucide-react"; - -const command = tv({ - slots: { - trigger: - "flex w-full items-center justify-between rounded-full bg-secondary px-4 py-2 font-semibold text-fg outline-none ring-primary ring-offset-2 ring-offset-surface transition-colors data-[hovered]:bg-secondary/75 data-[focus-visible]:ring-2", - overlay: - "data-[entering]:fade-in data-[exiting]:fade-out fixed inset-0 z-50 flex min-h-full items-start justify-center bg-zinc-500/25 p-4 text-center data-[entering]:animate-in data-[exiting]:animate-out data-[entering]:duration-300 data-[exiting]:duration-200 sm:items-center", - modal: - "data-[entering]:zoom-in-95 data-[exiting]:zoom-out-95 data-[entering]:animate-in data-[exiting]:animate-out data-[entering]:duration-300 data-[exiting]:duration-200", - dialog: - "flex min-h-96 min-w-80 max-w-full flex-col gap-1 rounded-2xl bg-surface p-2 shadow-lg outline-none md:w-lg", - input: - "rounded-lg border-b-2 border-none bg-transparent px-3 py-2 text-base text-fg leading-5 outline-none placeholder:text-fg-muted", - menu: "mt-2 h-80 overflow-auto", - item: "group flex min-h-12 w-full cursor-default items-center rounded-lg px-3 py-2 text-fg outline-none data-[focused]:bg-secondary data-[pressed]:bg-surface-3 data-[focused]:text-focus-fg", - kbd: "ml-auto rounded border border-border bg-surface-2 px-2 py-1 font-semibold text-fg-muted text-xs", - }, -}); - -const styles = command(); - -interface CommandItem { - id: string; - label: string; - shortcut?: string; - icon?: ComponentType<{ className?: string }>; - onSelect?: () => void; -} - -interface CommandProps extends Omit { - className?: string; - trigger?: ReactNode; - commands: CommandItem[]; - placeholder?: string; - triggerKey?: string; - onCommandSelect?: (command: CommandItem) => void; - onSearchChange?: (search: string) => void; -} - -const Command = ({ - className, - trigger, - commands, - placeholder = "Search commands…", - triggerKey = "k", - onCommandSelect, - onSearchChange, - ...props -}: CommandProps) => { - const [isOpen, setOpen] = useState(false); - const [isMac, setIsMac] = useState(true); - const { contains } = useFilter({ sensitivity: "base" }); - - useEffect(() => { - setIsMac(/Mac/.test(navigator?.platform || "")); - }, []); - - useEffect(() => { - const handleKeyDown = (e: KeyboardEvent) => { - if ( - e.key.toLowerCase() === triggerKey.toLowerCase() && - (isMac ? e.metaKey : e.ctrlKey) - ) { - e.preventDefault(); - setOpen((prev) => !prev); - } else if (e.key === "Escape") { - e.preventDefault(); - setOpen(false); - } - }; - - document.addEventListener("keydown", handleKeyDown); - return () => document.removeEventListener("keydown", handleKeyDown); - }, [isMac, triggerKey]); - - const handleCommandSelect = (command: CommandItem) => { - command.onSelect?.(); - onCommandSelect?.(command); - setOpen(false); - }; - - return ( - - {trigger || ( - -
- - Search -
- - {isMac ? "⌘" : "Ctrl"} {triggerKey.toUpperCase()} - -
- )} - - - - true : contains}> - - - - - {({ label, shortcut, icon: Icon, ...command }) => ( - - handleCommandSelect({ - label, - shortcut, - icon: Icon, - ...command, - }) - } - > -
- {Icon && ( - - )} - - {label} - -
- {shortcut && ( - {shortcut} - )} -
- )} -
-
-
-
-
-
- ); -}; - -interface CommandMenuItemProps extends Omit { - className?: string; - children: ReactNode; -} - -const CommandMenuItem = ({ - className, - children, - ...props -}: CommandMenuItemProps) => ( - - {children} - -); - -const CommandTrigger = AriaDialogTrigger; - -export { Command, CommandMenuItem, CommandTrigger }; -export type { CommandProps, CommandMenuItemProps, CommandItem }; diff --git a/web/public/templates/date-field.txt b/web/public/templates/date-field.txt deleted file mode 100644 index 98682573..00000000 --- a/web/public/templates/date-field.txt +++ /dev/null @@ -1,53 +0,0 @@ -"use client"; - -import type { - DateFieldProps as AriaDateFieldProps, - DateValue, -} from "react-aria-components"; -import { - DateField as AriaDateField, - DateInput, - DateSegment, - FieldError, - Label, - Text, -} from "react-aria-components"; -import { tv } from "tailwind-variants"; - -const dateField = tv({ - slots: { - input: - "flex min-h-11 min-w-48 appearance-none items-center rounded-lg border border-border bg-surface px-3 py-0.5 outline-none ring-primary transition-all data-[disabled]:cursor-not-allowed data-[focus-within]:border-transparent data-[disabled]:border-none data-[disabled]:bg-primary/10 data-[focus-within]:bg-surface data-[disabled]:text-fg-disabled data-[focus-within]:ring-2 [&::placeholder]:text-sm", - segmentStyles: - "rounded-md p-1 text-end outline-none focus:text-primary-fg data-[focused]:bg-primary data-[placeholder]:text-fg-muted data-[type='literal']:text-fg-muted data-[placeholder]:focus:text-primary-fg", - }, -}); - -const styles = dateField(); - -interface DateFieldProps extends AriaDateFieldProps { - label?: string; - description?: string; - errorMessage?: string; -} - -const DateField = ({ - label, - description, - errorMessage, - ...props -}: DateFieldProps) => ( - - {label && } - - {(segment) => ( - - )} - - {description && {description}} - {errorMessage} - -); - -export { DateField }; -export type { DateFieldProps }; diff --git a/web/public/templates/date-picker.txt b/web/public/templates/date-picker.txt deleted file mode 100644 index 8945e949..00000000 --- a/web/public/templates/date-picker.txt +++ /dev/null @@ -1,157 +0,0 @@ -"use client"; - -import type { - DatePickerProps as AriaDatePickerProps, - DateRangePickerProps as AriaDateRangePickerProps, -} from "react-aria-components"; -import { - DatePicker as AriaDatePicker, - DateRangePicker as AriaDateRangePicker, - Button, - DateInput, - DateSegment, - type DateValue, - Dialog, - FieldError, - Group, - Label, - Popover, - Text, -} from "react-aria-components"; -import { tv } from "tailwind-variants"; - -import { ChevronDown } from "lucide-react"; - -import { Calendar, RangeCalendar } from "../calendar/calendar"; - -const baseStyles = tv({ - slots: { - input: - "appearance-none rounded-lg px-3 py-1.5 outline-none ring-primary transition-all", - popover: - "overflow-auto rounded-2xl data-[entering]:animate-fade data-[exiting]:animate-fadeOut", - }, -}); - -const datePicker = tv({ - extend: baseStyles, - slots: { - group: - "relative flex min-h-11 w-auto min-w-48 items-center rounded-lg border border-border bg-surface transition-all data-[focus-within]:border-transparent data-[focus-within]:bg-surface data-[focus-within]:ring-2 data-[focus-within]:ring-primary data-[focus-within]:ring-offset-surface", - dateSegment: - "min-w-16 rounded-md p-1 text-end outline-none focus:bg-primary focus:text-primary-fg data-[placeholder]:text-fg-muted data-[type='literal']:text-fg-muted data-[placeholder]:focus:text-primary-fg", - }, -}); - -const dateRangePicker = tv({ - extend: baseStyles, - slots: { - group: - "relative flex min-h-11 w-full flex-wrap items-center rounded-lg border border-border bg-surface transition-all data-[focus-within]:border-transparent data-[focus-within]:bg-surface data-[focus-within]:ring-2 data-[focus-within]:ring-primary data-[focus-within]:ring-offset-surface", - dateSegment: - "rounded-md p-1 text-end outline-none focus:bg-primary focus:text-primary-fg data-[placeholder]:text-fg-muted data-[type='literal']:text-fg-muted data-[placeholder]:focus:text-primary-fg", - separator: "px-2 text-fg-muted", - }, -}); - -const styles = datePicker(); -const rangeStyles = dateRangePicker(); - -interface DatePickerProps extends AriaDatePickerProps { - label?: string; - description?: string; - errorMessage?: string; -} - -const DatePicker = ({ - className, - label, - description, - errorMessage, - children, - ...props -}: DatePickerProps) => ( - - {label && } - - - {(segment) => ( - - )} - - - - {description && ( - - {description} - - )} - {errorMessage} - - - - - - -); - -interface DateRangePickerProps - extends AriaDateRangePickerProps { - label?: string; - description?: string; - errorMessage?: string; - className?: string; -} - -const DateRangePicker = ({ - className, - label, - description, - errorMessage, - children, - ...props -}: DateRangePickerProps) => ( - - {label && } - - - {(segment) => ( - - )} - - - - {(segment) => ( - - )} - - - - {description && ( - - {description} - - )} - {errorMessage} - - - - - - -); - -export { DatePicker, DateRangePicker }; -export type { DatePickerProps, DateRangePickerProps }; diff --git a/web/public/templates/date-range-picker.txt b/web/public/templates/date-range-picker.txt deleted file mode 100644 index 190c4e5f..00000000 --- a/web/public/templates/date-range-picker.txt +++ /dev/null @@ -1,91 +0,0 @@ -"use client"; - -import type { - DateRangePickerProps as AriaDateRangePickerProps, - DateValue, -} from "react-aria-components"; -import { - DateRangePicker as AriaDateRangePicker, - Button, - DateInput, - DateSegment, - Dialog, - FieldError, - Group, - Label, - Popover, - RangeCalendar,Text -} from "react-aria-components"; -import { tv } from "tailwind-variants"; - -import { ChevronDown } from "lucide-react"; - -const dateRangePicker = tv({ - slots: { - group: - "relative flex w-fit flex-wrap items-center rounded-xl bg-surface-2 transition-all data-[focus-within]:bg-surface", - input: - "min-w-32 appearance-none rounded-xl bg-transparent px-3 py-1.5 font-semibold outline-none ring-primary transition-all data-[focus-within]:ring-2", - inputButton: - "absolute right-2 flex appearance-none items-center justify-center rounded-md p-1 outline-none ring-primary ring-offset-2 ring-offset-surface transition-all data-[hovered]:bg-surface-2 data-[focus-visible]:ring-2", - dateSegment: - "rounded-md p-1 text-end outline-none focus:bg-primary focus:text-primary-fg data-[type='literal']:font-semibold data-[placeholder]:text-fg-muted data-[type='literal']:text-fg-muted", - popover: - "overflow-auto rounded-2xl data-[entering]:animate-fade data-[exiting]:animate-fadeOut", - separator: "px-2 font-semibold text-fg-muted", - }, -}); - -const styles = dateRangePicker(); - -interface DateRangePickerProps - extends AriaDateRangePickerProps { - label?: string; - description?: string; - errorMessage?: string; -} - -const DateRangePicker = ({ - className, - label, - description, - errorMessage, - children, - ...props -}: DateRangePickerProps) => ( - - {label && } - - - {(segment) => ( - - )} - - - - {(segment) => ( - - )} - - - - {description && ( - - {description} - - )} - {errorMessage} - - - - - - -); - -export { DateRangePicker }; -export type { DateRangePickerProps }; \ No newline at end of file diff --git a/web/public/templates/input.txt b/web/public/templates/input.txt deleted file mode 100644 index 17327425..00000000 --- a/web/public/templates/input.txt +++ /dev/null @@ -1,49 +0,0 @@ -"use client"; - -import type { - TextFieldProps as AriaTextFieldProps, - ValidationResult, -} from "react-aria-components"; -import { - Input as AriaInput, - TextField as AriaTextField, - FieldError, - Label, - Text, -} from "react-aria-components"; -import { tv } from "tailwind-variants"; - -const input = tv({ - base: "min-h-11 appearance-none rounded-lg border border-border bg-surface px-3 py-1 text-fg outline-none ring-primary transition-all data-[disabled]:cursor-not-allowed data-[focused]:border-transparent data-[disabled]:bg-primary/10 data-[disabled]:text-fg-disabled data-[focused]:ring-2 [&::placeholder]:text-fg-muted [&::placeholder]:text-sm", -}); - -interface InputProps extends Omit { - className?: string; - label?: string; - description?: string; - errorMessage?: string | ((validation: ValidationResult) => string); - placeholder?: string; -} - -const Input = ({ - label, - description, - errorMessage, - placeholder, - className, - ...props -}: InputProps) => ( - - {label && } - - {description && ( - - {description} - - )} - {errorMessage} - -); - -export { Input }; -export type { InputProps }; diff --git a/web/public/templates/menu.txt b/web/public/templates/menu.txt deleted file mode 100644 index 1fc5515c..00000000 --- a/web/public/templates/menu.txt +++ /dev/null @@ -1,80 +0,0 @@ -"use client"; - -import type { HTMLAttributes } from "react"; - -import { - Header as AriaHeader, - Menu as AriaMenu, - MenuItem as AriaMenuItem, - MenuSection as AriaMenuSection, - MenuTrigger as AriaMenuTrigger, - type MenuItemProps, - type MenuProps, - Popover, - Separator, -} from "react-aria-components"; -import { tv } from "tailwind-variants"; - -export const menu = tv({ - slots: { - menuPopover: - "data-[entering]:fade-in data-[exiting]:fade-out overflow-auto rounded-2xl border border-border/25 bg-surface shadow-xl data-[entering]:animate-in data-[exiting]:animate-out", - header: "p-2 font-semibold", - content: "flex h-fit min-w-56 flex-col gap-2 p-3 outline-none", - item: "relative flex cursor-default justify-between rounded-lg p-3 font-semibold outline-none data-[disabled]:cursor-not-allowed data-[focused]:bg-secondary data-[disabled]:text-fg-disabled", - separator: "h-[1px] bg-border", - }, -}); - -const { menuPopover, content, header, item, separator } = menu(); - -const MenuTrigger = AriaMenuTrigger; -const MenuSection = AriaMenuSection; - -const MenuContent = ({ - children, - className, - ...props -}: MenuProps & { className?: string }) => ( - - - {children} - - -); - -const MenuItem = ({ - children, - className, - ...props -}: MenuItemProps & { className?: string }) => ( - - {children} - -); - -const MenuHeader = ({ - children, - className, - ...props -}: HTMLAttributes & { className?: string }) => ( - - {children} - -); - -const MenuSeperator = ({ - className, - ...props -}: HTMLAttributes & { className?: string }) => ( - -); - -export { - MenuContent, - MenuHeader, - MenuItem, - MenuSeperator, - MenuTrigger, - MenuSection, -}; diff --git a/web/public/templates/meter.txt b/web/public/templates/meter.txt deleted file mode 100644 index 9d18e0f1..00000000 --- a/web/public/templates/meter.txt +++ /dev/null @@ -1,39 +0,0 @@ -"use client"; - -import { - Meter as AriaMeter, - type MeterProps as AriaMeterProps, - Label, -} from "react-aria-components"; -import { tv } from "tailwind-variants"; - -const bar = tv({ - base: "h-4 overflow-hidden rounded-2xl bg-surface-2", -}); - -interface MeterProps extends Omit { - label?: string; - className?: string; -} - -const Meter = ({ label, className, ...props }: MeterProps) => ( - - {({ percentage, valueText }) => ( - <> -
- {label && } - {valueText} -
-
-
-
- - )} - -); - -export { Meter }; -export type { MeterProps }; diff --git a/web/public/templates/modal.txt b/web/public/templates/modal.txt deleted file mode 100644 index df6f1fec..00000000 --- a/web/public/templates/modal.txt +++ /dev/null @@ -1,47 +0,0 @@ -"use client"; - -import { - Dialog as AriaDialog, - DialogTrigger as AriaDialogTrigger, - Modal as AriaModal, - type DialogProps, - ModalOverlay, - type ModalOverlayProps, -} from "react-aria-components"; -import { tv } from "tailwind-variants"; - -export const modal = tv({ - slots: { - dialog: "flex w-full flex-col gap-6 outline-none", - modalStyles: - "fade-in w-full rounded-2xl bg-surface p-6 text-fg outline-none data-[entering]:animate-in md:w-md", - }, -}); - -const styles = modal(); - -interface ModalProps extends Omit { - className?: string; -} - -const Modal = ({ children, className, ...props }: ModalProps) => ( - - - {children} - - -); - -const Dialog = ({ children, className, ...props }: DialogProps) => ( - - {children} - -); - -const ModalTrigger = AriaDialogTrigger; - -export { Modal, Dialog, ModalTrigger }; -export type { ModalProps, DialogProps }; \ No newline at end of file diff --git a/web/public/templates/popover.txt b/web/public/templates/popover.txt deleted file mode 100644 index a78a3aec..00000000 --- a/web/public/templates/popover.txt +++ /dev/null @@ -1,30 +0,0 @@ -"use client"; - -import type { ReactNode } from "react"; - -import { - DialogTrigger as AriaDialogTrigger, - Popover as AriaPopover, - type PopoverProps as AriaPopoverProps, - Dialog, -} from "react-aria-components"; -import { tv } from "tailwind-variants"; - -export const popover = tv({ - base: "data-[entering]:fade-in data-[exiting]:fade-out m-1 max-w-lg rounded-2xl border border-border/25 bg-surface p-2 text-fg shadow-lg outline-none data-[entering]:animate-in data-[exiting]:animate-out", -}); - -interface DialogProps extends Omit { - children: ReactNode; - className?: string; -} - -const PopoverTrigger = AriaDialogTrigger; - -const Popover = ({ children, className, ...props }: DialogProps) => ( - - {children} - -); - -export { Popover, PopoverTrigger }; diff --git a/web/public/templates/radio-group.txt b/web/public/templates/radio-group.txt deleted file mode 100644 index 8b9d1eda..00000000 --- a/web/public/templates/radio-group.txt +++ /dev/null @@ -1,64 +0,0 @@ -"use client"; - -import type { ReactNode } from "react"; - -import type { - RadioGroupProps as AriaRadioGroupProps, - RadioProps, - ValidationResult, -} from "react-aria-components"; -import { - Radio as AriaRadio, - RadioGroup as AriaRadioGroup, - FieldError, - Text, -} from "react-aria-components"; -import { tv } from "tailwind-variants"; - -const radioGroup = tv({ - slots: { - radio: - "flex items-center gap-4 text-fg before:block before:h-5 before:w-5 before:rounded-full before:border before:border-border before:ring-focus before:ring-offset-2 before:ring-offset-surface before:transition-all data-[selected]:before:border-4 data-[selected]:before:border-primary data-[focus-visible]:before:ring-2", - group: "flex flex-col gap-4 text-fg", - }, -}); - -const { group, radio } = radioGroup(); - -interface RadioGroupProps extends Omit { - className?: string; - children?: ReactNode; - label?: string; - description?: string; - errorMessage?: string | ((validation: ValidationResult) => string) -} - -const RadioGroup = ({ - className, - label, - description, - errorMessage, - children, - ...props -}: RadioGroupProps) => ( - - {label} - {children} - {description && {description}} - {errorMessage} - -); - -const Radio = ({ - children, - className, - ...props -}: RadioProps & { - className?: string; -}) => ( - - {children} - -); - -export { RadioGroup, Radio }; \ No newline at end of file diff --git a/web/public/templates/select.txt b/web/public/templates/select.txt deleted file mode 100644 index 6a91eb00..00000000 --- a/web/public/templates/select.txt +++ /dev/null @@ -1,155 +0,0 @@ -"use client"; - -import type { ReactNode } from "react"; - -import type { - SelectProps as AriaSelectProps, - ListBoxItemProps, - ValidationResult, -} from "react-aria-components"; -import { - Select as AriaSelect, - Autocomplete, - Button, - FieldError, - Input, - Label, - ListBox, - ListBoxItem, - Popover, - SearchField, - SelectValue, - Text, - useFilter, -} from "react-aria-components"; -import { tv } from "tailwind-variants"; - -import { CheckIcon, ChevronDown, Search } from "lucide-react"; - -const select = tv({ - slots: { - group: "group flex flex-col gap-1", - button: - "group flex w-fit items-center justify-between gap-4 rounded-full border border-border bg-surface px-4 py-2.75 align-middle font-semibold text-fg text-sm outline-none ring-fg transition-all data-[hovered]:bg-surface-2 group-data-[focus-visible]:border-transparent group-data-[open]:bg-surface-2 group-data-[focus-visible]:ring-2", - item: "relative m-1 flex cursor-default flex-col rounded-lg p-2 font-semibold outline-none data-[disabled]:cursor-not-allowed data-[focused]:bg-secondary data-[disabled]:text-fg-disabled", - searchField: - "group m-1 flex items-center rounded-full border border-border bg-surface px-2 py-1.5", - searchInput: - "flex-1 bg-transparent text-fg outline-none placeholder:text-fg-muted", - searchIcon: "mr-2 size-4 text-fg-muted", - clearButton: - "ml-2 rounded p-0.5 text-fg-muted transition-colors hover:bg-surface-2 hover:text-fg group-empty:invisible", - popover: - "min-w-[var(--trigger-width)] rounded-xl border border-border/25 bg-surface p-1 text-fg shadow-lg outline-none", - }, -}); - -const styles = select(); - -interface SelectProps - extends Omit, "className"> { - className?: string; - popoverClassName?: string; - label?: string; - description?: string; - errorMessage?: string | ((validation: ValidationResult) => string); -} - -const Select = ({ - label, - className, - description, - errorMessage, - popoverClassName, - children, - ...props -}: SelectProps) => ( - - {label && } - - {description && ( - - {description} - - )} - {errorMessage} - - {children} - - -); - -interface SelectItemProps - extends Omit { - children: ReactNode; - className?: string; -} - -const SelectItem = ({ className, ...props }: SelectItemProps) => ( - - {({ isSelected }) => ( -
- {props.children} - {isSelected && } -
- )} -
-); - -interface SearchableSelectProps - extends SelectProps { - searchPlaceholder?: string; -} - -const SearchableSelect = ({ - label, - className, - description, - errorMessage, - searchPlaceholder = "Search...", - children, - popoverClassName, - ...props -}: SearchableSelectProps) => { - const { contains } = useFilter({ sensitivity: "base" }); - - return ( - - {label && } - - {description && ( - - {description} - - )} - {errorMessage} - - - - - - - - {children} - - - - - ); -}; - -export { Select, SelectItem, SearchableSelect }; -export type { SelectProps, SelectItemProps, SearchableSelectProps }; diff --git a/web/public/templates/slider.txt b/web/public/templates/slider.txt deleted file mode 100644 index 191f5bf4..00000000 --- a/web/public/templates/slider.txt +++ /dev/null @@ -1,60 +0,0 @@ -"use client"; - -import { - Slider as AriaSlider, - SliderThumb as AriaSliderThumb, - SliderTrack as AriaSliderTrack, - Label, - type LabelProps, - SliderOutput, - type SliderProps, - type SliderThumbProps, -} from "react-aria-components"; -import { tv } from "tailwind-variants"; - -const slider = tv({ - slots: { - root: "grid w-64 auto-cols-fr grid-cols-1 text-fg-muted", - thumb: - "h-5 w-5 rounded-full bg-primary ring-focus ring-offset-2 ring-offset-surface data-[dragging]:outline-2 data-[focus-visible]:ring-2", - track: - "before:-translate-y-1/2 relative col-span-2 col-start-1 w-full before:absolute before:top-1/2 before:h-0.5 before:w-full before:transform before:bg-secondary", - }, -}); - -const { root, thumb, track } = slider(); - -const SliderRoot = ({ - children, - className, - ...props -}: SliderProps & { className?: string }) => ( - - {children} - -); - -const SliderThumb = ({ - children, - className, - ...props -}: SliderThumbProps & { className?: string }) => ( - - - -); - -const SliderLabel = ({ - children, - className, - ...props -}: LabelProps & { className?: string }) => ( -
- - -
-); - -export { SliderRoot, SliderThumb, SliderLabel }; diff --git a/web/public/templates/switch.txt b/web/public/templates/switch.txt deleted file mode 100644 index edb2107c..00000000 --- a/web/public/templates/switch.txt +++ /dev/null @@ -1,36 +0,0 @@ -"use client"; - -import type { ReactNode } from "react"; - -import { - Switch as AriaSwitch, - type SwitchProps as AriaSwitchProps, - Label, -} from "react-aria-components"; -import { tv } from "tailwind-variants"; - -const switchStyles = tv({ - slots: { - root: "group flex items-center gap-2 transition-none duration-200", - indicator: - "h-6 w-10 cursor-pointer rounded-xl bg-secondary duration-200 before:mx-[3px] before:mt-[3px] before:block before:size-4.5 before:rounded-2xl before:bg-surface before:transition-all data-[selected]:bg-primary group-data-[selected]:bg-primary group-data-[focus-visible]:ring-2 group-data-[focus-visible]:ring-focus group-data-[focus-visible]:ring-offset-2 group-data-[focus-visible]:ring-offset-surface group-data-[selected]:before:translate-x-4", - label: "font-semibold text-fg text-sm", - }, -}); - -const styles = switchStyles(); - -interface SwitchProps extends AriaSwitchProps { - children?: ReactNode; - className?: string; -} - - const Switch = ({ className, children, ...restProps }: SwitchProps) => ( - -
- - -); - -export { Switch }; -export type { SwitchProps }; \ No newline at end of file diff --git a/web/public/templates/table.txt b/web/public/templates/table.txt deleted file mode 100644 index 364178e2..00000000 --- a/web/public/templates/table.txt +++ /dev/null @@ -1,121 +0,0 @@ -"use client"; - -import { - Column as AriaColumn, - Table as AriaTable, - TableBody as AriaTableBody, - TableHeader as AriaTableheader, - Cell, - type CellProps, - Collection, - type ColumnProps, - Row, - type RowProps, - type TableHeaderProps, - type TableProps, - useTableOptions, -} from "react-aria-components"; -import { tv } from "tailwind-variants"; - -import { Menu } from "lucide-react"; - -import { Button } from "../button/button"; -import { Checkbox } from "../checkbox/checkbox"; - -const table = tv({ - slots: { - root: "table min-h-[100px] border-separate border-spacing-0 rounded-xl border border-border p-4 outline-none", - column: "border-border border-b-2 px-4 py-1 text-left outline-none", - header: "text-fg after:table-row after:h-[2px]", - label: "text-fg-3", - row: "relative cursor-default rounded-xl text-fg outline-none ring-focus data-[focus-visible]:ring-2", - cell: "px-4 py-2 outline-none ring-focus data-[focus-visible]:ring-2", - }, -}); - -const styles = table(); - -const TableBody = AriaTableBody; - -const Table = ({ - children, - className, - ...props -}: TableProps & { className?: string }) => ( - - {children} - -); - -const TableCell = ({ - children, - className, - ...props -}: CellProps & { className?: string }) => ( - - {children} - -); - -const TableColumn = ({ - children, - className, - ...props -}: ColumnProps & { className?: string }) => ( - - {children} - -); - -const TableHeader = ({ - children, - className, - columns, - ...props -}: TableHeaderProps & { className?: string }) => { - const { selectionBehavior, selectionMode, allowsDragging } = - useTableOptions(); - return ( - - {/* Add extra columns for drag and drop and selection. */} - {allowsDragging && } - {selectionBehavior === "toggle" && ( - - {selectionMode === "multiple" && ( - - )} - - )} - {children} - - ); -}; - -const TableRow = ({ - children, - className, - columns, - id, - ...props -}: RowProps & { className?: string }) => { - const { selectionBehavior, allowsDragging } = useTableOptions(); - return ( - - {allowsDragging && ( - - - - )} - {selectionBehavior === "toggle" && ( - - - - )} - {children} - - ); -}; - -export { TableColumn, Table, TableBody, TableCell, TableHeader, TableRow }; diff --git a/web/public/templates/tabs.txt b/web/public/templates/tabs.txt deleted file mode 100644 index 345e2c76..00000000 --- a/web/public/templates/tabs.txt +++ /dev/null @@ -1,72 +0,0 @@ -"use client"; - -import { - Tab as AriaTab, - TabList as AriaTabList, - type TabListProps as AriaTabListProps, - TabPanel as AriaTabPanel, - type TabPanelProps as AriaTabPanelProps, - type TabProps as AriaTabProps, - type TabsProps as AriaTabsProps, - Tabs as AriaTabsRoot, -} from "react-aria-components"; -import { tv } from "tailwind-variants"; - -const tabs = tv({ - slots: { - root: "flex w-full flex-col items-start", - list: "relative inline-flex items-center justify-between gap-6 rounded-md p-1", - tab: "relative flex w-fit cursor-pointer justify-center rounded-2xl border-primary pb-0.5 font-semibold text-fg-muted outline-none ring-focus ring-offset-2 ring-offset-surface transition-colors duration-200 aria-selected:cursor-default aria-selected:rounded-none aria-selected:border-b-2 aria-selected:pb-0 aria-selected:text-primary aria-selected:hover:bg-transparent data-[hovered]:text-primary data-[focus-visible]:ring-2", - panel: - "mt-4 w-96 rounded-xl p-4 outline-none ring-focus data-[focus-visible]:ring-2", - }, -}); - -const styles = tabs(); - -interface TabsProps extends Omit { - className?: string; -} - -const TabsRoot = ({ children, className, ...props }: TabsProps) => ( - - {children} - -); - -interface TabListProps extends Omit, "className"> { - className?: string; -} - -const TabList = ({ - children, - className, - ...props -}: TabListProps) => ( - - {children} - -); - -interface TabProps extends Omit { - className?: string; -} - -const Tab = ({ children, className, ...props }: TabProps) => ( - - {children} - -); - -interface TabPanelProps extends Omit { - className?: string; -} - -const TabPanel = ({ children, className, ...props }: TabPanelProps) => ( - - {children} - -); - -export { Tab, TabList, TabPanel, TabsRoot }; -export type { TabsProps, TabListProps, TabProps, TabPanelProps }; \ No newline at end of file diff --git a/web/public/templates/tag-group.txt b/web/public/templates/tag-group.txt deleted file mode 100644 index dd716aba..00000000 --- a/web/public/templates/tag-group.txt +++ /dev/null @@ -1,82 +0,0 @@ -"use client"; - -import { - Tag as AriaTag, - TagGroup as AriaTagGroup, - type TagGroupProps as AriaTagGroupProps, - type TagProps as AriaTagProps, - Label, - TagList, - type TagListProps, - Text, -} from "react-aria-components"; -import { tv } from "tailwind-variants"; - -const tagGroup = tv({ - slots: { - root: "flex flex-col gap-2 text-sm", - list: "flex flex-wrap gap-2", - tag: "flex cursor-default items-center rounded-full border border-border px-2 py-1 outline-none ring-focus ring-offset-2 ring-offset-surface aria-selected:border-primary aria-selected:bg-primary aria-selected:text-primary-fg data-[focus-visible]:ring-2", - }, -}); - -const styles = tagGroup(); - -interface TagGroupProps - extends Omit, - Pick, "items" | "children" | "renderEmptyState"> { - label?: string; - description?: string; - errorMessage?: string; -} - -const TagGroup = ({ - label, - className, - description, - errorMessage, - items, - children, - renderEmptyState, - ...props -}: TagGroupProps) => ( - - {label && } - - {children} - - {description && ( - - {description} - - )} - {errorMessage && ( - - {errorMessage} - - )} - -); - -const Tag = ({ - children, - className, - ...props -}: AriaTagProps & { className?: string }) => { - const textValue = typeof children === "string" ? children : undefined; - return ( - - {children} - - ); -}; - -export { Tag, TagGroup }; diff --git a/web/public/templates/time-field.txt b/web/public/templates/time-field.txt deleted file mode 100644 index 699e19c5..00000000 --- a/web/public/templates/time-field.txt +++ /dev/null @@ -1,57 +0,0 @@ -"use client"; - -import type { - TimeFieldProps as AriaTimeFieldProps, - TimeValue, -} from "react-aria-components"; -import { - TimeField as AriaTimeField, - DateInput, - DateSegment, - FieldError, - Label, - Text, -} from "react-aria-components"; -import { tv } from "tailwind-variants"; - -const timeField = tv({ - slots: { - input: - "appearance-none rounded-lg border border-border bg-surface px-3 py-1.75 outline-none ring-primary transition-all data-[disabled]:cursor-not-allowed data-[focus-within]:border-transparent data-[disabled]:bg-primary/10 data-[focus-within]:bg-surface data-[disabled]:text-fg-disabled data-[focus-within]:ring-2 [&::placeholder]:text-sm [&::placeholder]:focus:text-primary-fg", - segmentStyles: - "rounded-md p-1 text-end outline-none focus:bg-primary focus:text-primary-fg data-[placeholder]:text-fg-muted data-[type='literal']:text-fg-muted", - }, -}); - -const styles = timeField(); - -interface TimeFieldProps extends AriaTimeFieldProps { - label?: string; - description?: string; - errorMessage?: string; -} - -const TimeField = ({ - label, - description, - errorMessage, - ...props -}: TimeFieldProps) => ( - - {label && } - - {(segment) => ( - - )} - - {description && ( - - {description} - - )} - {errorMessage} - -); - -export { TimeField }; -export type { TimeFieldProps }; diff --git a/web/public/templates/toggle.txt b/web/public/templates/toggle.txt deleted file mode 100644 index a700def8..00000000 --- a/web/public/templates/toggle.txt +++ /dev/null @@ -1,43 +0,0 @@ -"use client"; - -import type { ReactNode } from "react"; - -import { - ToggleButton, - ToggleButtonGroup, - type ToggleButtonGroupProps, - type ToggleButtonProps, -} from "react-aria-components"; -import { tv } from "tailwind-variants"; - -const toggle = tv({ - base: "inline-flex appearance-none items-center justify-center rounded-full bg-surface-2 px-4 py-1 font-medium outline-none ring-focus ring-offset-2 ring-offset-surface transition-transform duration-100 disabled:pointer-events-none disabled:opacity-50 data-[selected]:bg-primary data-[selected]:text-primary-fg data-[focus-visible]:ring-2", -}); - -const toggleGroup = tv({ - base: "flex min-h-11 gap-1 rounded-full border border-border bg-surface-2 p-1", -}); - -interface ToggleProps extends Omit { - className?: string; -} - -const Toggle = ({ className, children, ...props }: ToggleProps) => ( - - {children} - -); - -interface ToggleGroupProps extends ToggleButtonGroupProps { - className?: string; - children: ReactNode; -} - -const ToggleGroup = ({ className, children, ...props }: ToggleGroupProps) => ( - - {children} - -); - -export { Toggle, ToggleGroup }; -export type { ToggleProps, ToggleGroupProps }; diff --git a/web/public/templates/tooltip.txt b/web/public/templates/tooltip.txt deleted file mode 100644 index 01fd4102..00000000 --- a/web/public/templates/tooltip.txt +++ /dev/null @@ -1,29 +0,0 @@ -"use client"; - -import type { ReactNode } from "react"; - -import { - Tooltip as AriaTooltip, - type TooltipProps as AriaTooltipProps, - TooltipTrigger as AriaTooltipTrigger, -} from "react-aria-components"; -import { tv } from "tailwind-variants"; - -const tooltip = tv({ - base: "[&[data-entering]]:fade-in [&[data-exiting]]:fade-out m-1 max-w-sm rounded-full border border-border bg-surface px-4 py-2 text-fg shadow-xl outline-none [&[data-entering]]:animate-fade-in [&[data-exiting]]:animate-fade-out", -}); - -const TooltipTrigger = AriaTooltipTrigger; - -interface TooltipProps extends Omit { - className?: string; - children: ReactNode; -} - -const Tooltip = ({ children, className, ...props }: TooltipProps) => ( - - {children} - -); - -export { Tooltip, TooltipTrigger }; diff --git a/web/tsconfig.json b/web/tsconfig.json index d8b93235..b908bbf9 100644 --- a/web/tsconfig.json +++ b/web/tsconfig.json @@ -19,7 +19,8 @@ } ], "paths": { - "@/*": ["./*"] + "@/*": ["./*"], + "@/components/ui/*": ["../packages/components/src/core/*"] } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], From cd31ac6a3a1e101d6334808fd0486a511bd8b2b0 Mon Sep 17 00:00:00 2001 From: Zach <86675944+zwgnr@users.noreply.github.com> Date: Sun, 5 Oct 2025 22:05:30 -0400 Subject: [PATCH 2/4] bump some deps --- package.json | 4 +- packages/components/package.json | 2 +- packages/registry/package.json | 2 +- pnpm-lock.yaml | 465 ++++++++++++++----------------- web/package.json | 6 +- 5 files changed, 223 insertions(+), 256 deletions(-) diff --git a/package.json b/package.json index 16e9117c..cc9dfddd 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "baselayer", "private": true, - "version": "2.0.0", + "version": "2.1.0", "description": "Beautiful, accessible, and AI optimized React components for the web.", "scripts": { "build": "turbo build", @@ -13,7 +13,7 @@ "devDependencies": { "@biomejs/biome": "2.2.5", "shadcn": "3.4.0", - "turbo": "^2.5.4" + "turbo": "^2.5.8" }, "packageManager": "pnpm@10.12.1", "engines": { diff --git a/packages/components/package.json b/packages/components/package.json index 3bd823c3..d247e239 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@baselayer/components", - "version": "2.0.3", + "version": "2.1.0", "private": true, "type": "module", "main": "./src/index.ts", diff --git a/packages/registry/package.json b/packages/registry/package.json index 02d67d37..e400f468 100644 --- a/packages/registry/package.json +++ b/packages/registry/package.json @@ -1,6 +1,6 @@ { "name": "@baselayer/registry", - "version": "2.0.0", + "version": "2.1.0", "private": true, "type": "module", "main": "./dist/index.js", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 765e4da3..80495446 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,8 +30,8 @@ importers: specifier: 3.4.0 version: 3.4.0(@types/node@24.0.3)(typescript@5.8.3) turbo: - specifier: ^2.5.4 - version: 2.5.4 + specifier: ^2.5.8 + version: 2.5.8 packages/components: dependencies: @@ -105,22 +105,22 @@ importers: version: 2.0.13 '@vercel/analytics': specifier: ^1.5.0 - version: 1.5.0(next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0) + version: 1.5.0(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0) fumadocs-core: specifier: ^15.5.5 - version: 15.5.5(@types/react@19.1.8)(next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 15.5.5(@types/react@19.1.8)(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) fumadocs-mdx: specifier: ^11.6.9 - version: 11.6.9(acorn@8.15.0)(fumadocs-core@15.5.5(@types/react@19.1.8)(next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)) + version: 11.6.9(acorn@8.15.0)(fumadocs-core@15.5.5(@types/react@19.1.8)(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)) geist: - specifier: ^1.4.2 - version: 1.4.2(next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)) + specifier: ^1.5.1 + version: 1.5.1(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)) lucide-react: specifier: ^0.525.0 version: 0.525.0(react@19.1.0) next: - specifier: 15.3.4 - version: 15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: 15.5.4 + version: 15.5.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -389,8 +389,8 @@ packages: peerDependencies: '@noble/ciphers': ^1.0.0 - '@emnapi/runtime@1.4.3': - resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} '@esbuild/aix-ppc64@0.25.5': resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} @@ -557,118 +557,128 @@ packages: '@formatjs/intl-localematcher@0.6.1': resolution: {integrity: sha512-ePEgLgVCqi2BBFnTMWPfIghu6FkbZnnBVhO2sSxvLfrdFw7wCHAHiDoM2h4NRgjbaY7+B7HgOLZGkK187pZTZg==} - '@img/sharp-darwin-arm64@0.34.2': - resolution: {integrity: sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==} + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.4': + resolution: {integrity: sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.2': - resolution: {integrity: sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==} + '@img/sharp-darwin-x64@0.34.4': + resolution: {integrity: sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.1.0': - resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} + '@img/sharp-libvips-darwin-arm64@1.2.3': + resolution: {integrity: sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.1.0': - resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} + '@img/sharp-libvips-darwin-x64@1.2.3': + resolution: {integrity: sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.1.0': - resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} + '@img/sharp-libvips-linux-arm64@1.2.3': + resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.1.0': - resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} + '@img/sharp-libvips-linux-arm@1.2.3': + resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-ppc64@1.1.0': - resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==} + '@img/sharp-libvips-linux-ppc64@1.2.3': + resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==} cpu: [ppc64] os: [linux] - '@img/sharp-libvips-linux-s390x@1.1.0': - resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} + '@img/sharp-libvips-linux-s390x@1.2.3': + resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.1.0': - resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} + '@img/sharp-libvips-linux-x64@1.2.3': + resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.1.0': - resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} + '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.1.0': - resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} + '@img/sharp-libvips-linuxmusl-x64@1.2.3': + resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.34.2': - resolution: {integrity: sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==} + '@img/sharp-linux-arm64@0.34.4': + resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.34.2': - resolution: {integrity: sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==} + '@img/sharp-linux-arm@0.34.4': + resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-s390x@0.34.2': - resolution: {integrity: sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==} + '@img/sharp-linux-ppc64@0.34.4': + resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.4': + resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.34.2': - resolution: {integrity: sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==} + '@img/sharp-linux-x64@0.34.4': + resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.2': - resolution: {integrity: sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==} + '@img/sharp-linuxmusl-arm64@0.34.4': + resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.34.2': - resolution: {integrity: sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==} + '@img/sharp-linuxmusl-x64@0.34.4': + resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.34.2': - resolution: {integrity: sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==} + '@img/sharp-wasm32@0.34.4': + resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.2': - resolution: {integrity: sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==} + '@img/sharp-win32-arm64@0.34.4': + resolution: {integrity: sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.34.2': - resolution: {integrity: sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==} + '@img/sharp-win32-ia32@0.34.4': + resolution: {integrity: sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.2': - resolution: {integrity: sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==} + '@img/sharp-win32-x64@0.34.4': + resolution: {integrity: sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] @@ -770,53 +780,53 @@ packages: resolution: {integrity: sha512-sURvQbbKsq5f8INV54YJgJEdk8oxBanqkTiXXd33rKmofFCwZLhLRszPduMZ9TA9b8/1CHc/IJmOlBHJk2Q5AQ==} engines: {node: '>=18'} - '@next/env@15.3.4': - resolution: {integrity: sha512-ZkdYzBseS6UjYzz6ylVKPOK+//zLWvD6Ta+vpoye8cW11AjiQjGYVibF0xuvT4L0iJfAPfZLFidaEzAOywyOAQ==} + '@next/env@15.5.4': + resolution: {integrity: sha512-27SQhYp5QryzIT5uO8hq99C69eLQ7qkzkDPsk3N+GuS2XgOgoYEeOav7Pf8Tn4drECOVDsDg8oj+/DVy8qQL2A==} - '@next/swc-darwin-arm64@15.3.4': - resolution: {integrity: sha512-z0qIYTONmPRbwHWvpyrFXJd5F9YWLCsw3Sjrzj2ZvMYy9NPQMPZ1NjOJh4ojr4oQzcGYwgJKfidzehaNa1BpEg==} + '@next/swc-darwin-arm64@15.5.4': + resolution: {integrity: sha512-nopqz+Ov6uvorej8ndRX6HlxCYWCO3AHLfKK2TYvxoSB2scETOcfm/HSS3piPqc3A+MUgyHoqE6je4wnkjfrOA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.3.4': - resolution: {integrity: sha512-Z0FYJM8lritw5Wq+vpHYuCIzIlEMjewG2aRkc3Hi2rcbULknYL/xqfpBL23jQnCSrDUGAo/AEv0Z+s2bff9Zkw==} + '@next/swc-darwin-x64@15.5.4': + resolution: {integrity: sha512-QOTCFq8b09ghfjRJKfb68kU9k2K+2wsC4A67psOiMn849K9ZXgCSRQr0oVHfmKnoqCbEmQWG1f2h1T2vtJJ9mA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.3.4': - resolution: {integrity: sha512-l8ZQOCCg7adwmsnFm8m5q9eIPAHdaB2F3cxhufYtVo84pymwKuWfpYTKcUiFcutJdp9xGHC+F1Uq3xnFU1B/7g==} + '@next/swc-linux-arm64-gnu@15.5.4': + resolution: {integrity: sha512-eRD5zkts6jS3VfE/J0Kt1VxdFqTnMc3QgO5lFE5GKN3KDI/uUpSyK3CjQHmfEkYR4wCOl0R0XrsjpxfWEA++XA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.3.4': - resolution: {integrity: sha512-wFyZ7X470YJQtpKot4xCY3gpdn8lE9nTlldG07/kJYexCUpX1piX+MBfZdvulo+t1yADFVEuzFfVHfklfEx8kw==} + '@next/swc-linux-arm64-musl@15.5.4': + resolution: {integrity: sha512-TOK7iTxmXFc45UrtKqWdZ1shfxuL4tnVAOuuJK4S88rX3oyVV4ZkLjtMT85wQkfBrOOvU55aLty+MV8xmcJR8A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.3.4': - resolution: {integrity: sha512-gEbH9rv9o7I12qPyvZNVTyP/PWKqOp8clvnoYZQiX800KkqsaJZuOXkWgMa7ANCCh/oEN2ZQheh3yH8/kWPSEg==} + '@next/swc-linux-x64-gnu@15.5.4': + resolution: {integrity: sha512-7HKolaj+481FSW/5lL0BcTkA4Ueam9SPYWyN/ib/WGAFZf0DGAN8frNpNZYFHtM4ZstrHZS3LY3vrwlIQfsiMA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.3.4': - resolution: {integrity: sha512-Cf8sr0ufuC/nu/yQ76AnarbSAXcwG/wj+1xFPNbyNo8ltA6kw5d5YqO8kQuwVIxk13SBdtgXrNyom3ZosHAy4A==} + '@next/swc-linux-x64-musl@15.5.4': + resolution: {integrity: sha512-nlQQ6nfgN0nCO/KuyEUwwOdwQIGjOs4WNMjEUtpIQJPR2NUfmGpW2wkJln1d4nJ7oUzd1g4GivH5GoEPBgfsdw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.3.4': - resolution: {integrity: sha512-ay5+qADDN3rwRbRpEhTOreOn1OyJIXS60tg9WMYTWCy3fB6rGoyjLVxc4dR9PYjEdR2iDYsaF5h03NA+XuYPQQ==} + '@next/swc-win32-arm64-msvc@15.5.4': + resolution: {integrity: sha512-PcR2bN7FlM32XM6eumklmyWLLbu2vs+D7nJX8OAIoWy69Kef8mfiN4e8TUv2KohprwifdpFKPzIP1njuCjD0YA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.3.4': - resolution: {integrity: sha512-4kDt31Bc9DGyYs41FTL1/kNpDeHyha2TC0j5sRRoKCyrhNcfZ/nRQkAUlF27mETwm8QyHqIjHJitfcza2Iykfg==} + '@next/swc-win32-x64-msvc@15.5.4': + resolution: {integrity: sha512-1ur2tSHZj8Px/KMAthmuI9FMp/YFusMMGoRNJaRZMOlSkgvLjzosSdQI0cJAKogdHl3qXUQKL9MGaYvKwA7DXg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1581,9 +1591,6 @@ packages: '@standard-schema/spec@1.0.0': resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} @@ -1824,10 +1831,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -1844,9 +1847,6 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001724: - resolution: {integrity: sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==} - caniuse-lite@1.0.30001748: resolution: {integrity: sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w==} @@ -1913,13 +1913,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - - color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -2021,6 +2014,10 @@ packages: resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} @@ -2272,8 +2269,8 @@ packages: fzf@0.5.2: resolution: {integrity: sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==} - geist@1.4.2: - resolution: {integrity: sha512-OQUga/KUc8ueijck6EbtT07L4tZ5+TZgjw8PyWfxo16sL5FWk7gNViPNU8hgCFjy6bJi9yuTP+CRpywzaGN8zw==} + geist@1.5.1: + resolution: {integrity: sha512-mAHZxIsL2o3ZITFaBVFBnwyDOw+zNLYum6A6nIjpzCGIO8QtC3V76XF2RnZTyLx1wlDTmMDy8jg3Ib52MIjGvQ==} peerDependencies: next: '>=13.2.0' @@ -2422,9 +2419,6 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -2883,13 +2877,13 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@15.3.4: - resolution: {integrity: sha512-mHKd50C+mCjam/gcnwqL1T1vPx/XQNFlXqFIVdgQdVAFY9iIQtY0IfaVflEYzKiqjeA7B0cYYMaCrmAYFjs4rA==} + next@15.5.4: + resolution: {integrity: sha512-xH4Yjhb82sFYQfY3vbkJfgSDgXvBB6a8xPs9i35k6oZJRoQRihZH+4s9Yo2qsWpzBmZ3lPXaJ2KPXLfkvW4LnA==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 + '@playwright/test': ^1.51.1 babel-plugin-react-compiler: '*' react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 @@ -3250,8 +3244,8 @@ packages: resolution: {integrity: sha512-2fZC7+seml8/Eq77TKRJEotJY+llQsuFK4j8cHWk1oe4Qhit/ekai4w+cyaudwKNc+eTFqldR7rLxtTGCxJZ7Q==} hasBin: true - sharp@0.34.2: - resolution: {integrity: sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==} + sharp@0.34.4: + resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: @@ -3288,9 +3282,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -3321,10 +3312,6 @@ packages: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} engines: {node: '>=18'} - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - strict-event-emitter@0.5.1: resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} @@ -3456,38 +3443,38 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - turbo-darwin-64@2.5.4: - resolution: {integrity: sha512-ah6YnH2dErojhFooxEzmvsoZQTMImaruZhFPfMKPBq8sb+hALRdvBNLqfc8NWlZq576FkfRZ/MSi4SHvVFT9PQ==} + turbo-darwin-64@2.5.8: + resolution: {integrity: sha512-Dh5bCACiHO8rUXZLpKw+m3FiHtAp2CkanSyJre+SInEvEr5kIxjGvCK/8MFX8SFRjQuhjtvpIvYYZJB4AGCxNQ==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.5.4: - resolution: {integrity: sha512-2+Nx6LAyuXw2MdXb7pxqle3MYignLvS7OwtsP9SgtSBaMlnNlxl9BovzqdYAgkUW3AsYiQMJ/wBRb7d+xemM5A==} + turbo-darwin-arm64@2.5.8: + resolution: {integrity: sha512-f1H/tQC9px7+hmXn6Kx/w8Jd/FneIUnvLlcI/7RGHunxfOkKJKvsoiNzySkoHQ8uq1pJnhJ0xNGTlYM48ZaJOQ==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.5.4: - resolution: {integrity: sha512-5May2kjWbc8w4XxswGAl74GZ5eM4Gr6IiroqdLhXeXyfvWEdm2mFYCSWOzz0/z5cAgqyGidF1jt1qzUR8hTmOA==} + turbo-linux-64@2.5.8: + resolution: {integrity: sha512-hMyvc7w7yadBlZBGl/bnR6O+dJTx3XkTeyTTH4zEjERO6ChEs0SrN8jTFj1lueNXKIHh1SnALmy6VctKMGnWfw==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.5.4: - resolution: {integrity: sha512-/2yqFaS3TbfxV3P5yG2JUI79P7OUQKOUvAnx4MV9Bdz6jqHsHwc9WZPpO4QseQm+NvmgY6ICORnoVPODxGUiJg==} + turbo-linux-arm64@2.5.8: + resolution: {integrity: sha512-LQELGa7bAqV2f+3rTMRPnj5G/OHAe2U+0N9BwsZvfMvHSUbsQ3bBMWdSQaYNicok7wOZcHjz2TkESn1hYK6xIQ==} cpu: [arm64] os: [linux] - turbo-windows-64@2.5.4: - resolution: {integrity: sha512-EQUO4SmaCDhO6zYohxIjJpOKRN3wlfU7jMAj3CgcyTPvQR/UFLEKAYHqJOnJtymbQmiiM/ihX6c6W6Uq0yC7mA==} + turbo-windows-64@2.5.8: + resolution: {integrity: sha512-3YdcaW34TrN1AWwqgYL9gUqmZsMT4T7g8Y5Azz+uwwEJW+4sgcJkIi9pYFyU4ZBSjBvkfuPZkGgfStir5BBDJQ==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.5.4: - resolution: {integrity: sha512-oQ8RrK1VS8lrxkLriotFq+PiF7iiGgkZtfLKF4DDKsmdbPo0O9R2mQxm7jHLuXraRCuIQDWMIw6dpcr7Iykf4A==} + turbo-windows-arm64@2.5.8: + resolution: {integrity: sha512-eFC5XzLmgXJfnAK3UMTmVECCwuBcORrWdewoiXBnUm934DY6QN8YowC/srhNnROMpaKaqNeRpoB5FxCww3eteQ==} cpu: [arm64] os: [win32] - turbo@2.5.4: - resolution: {integrity: sha512-kc8ZibdRcuWUG1pbYSBFWqmIjynlD8Lp7IB6U3vIzvOv9VG+6Sp8bzyeBWE3Oi8XV5KsQrznyRTBPvrf99E4mA==} + turbo@2.5.8: + resolution: {integrity: sha512-5c9Fdsr9qfpT3hA0EyYSFRZj1dVVsb6KIWubA9JBYZ/9ZEAijgUEae0BBR/Xl/wekt4w65/lYLTFaP3JmwSO8w==} hasBin: true tw-animate-css@1.3.6: @@ -3958,7 +3945,7 @@ snapshots: dependencies: '@noble/ciphers': 1.3.0 - '@emnapi/runtime@1.4.3': + '@emnapi/runtime@1.5.0': dependencies: tslib: 2.8.1 optional: true @@ -4064,85 +4051,93 @@ snapshots: dependencies: tslib: 2.8.1 - '@img/sharp-darwin-arm64@0.34.2': + '@img/colour@1.0.0': + optional: true + + '@img/sharp-darwin-arm64@0.34.4': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.1.0 + '@img/sharp-libvips-darwin-arm64': 1.2.3 optional: true - '@img/sharp-darwin-x64@0.34.2': + '@img/sharp-darwin-x64@0.34.4': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.1.0 + '@img/sharp-libvips-darwin-x64': 1.2.3 optional: true - '@img/sharp-libvips-darwin-arm64@1.1.0': + '@img/sharp-libvips-darwin-arm64@1.2.3': optional: true - '@img/sharp-libvips-darwin-x64@1.1.0': + '@img/sharp-libvips-darwin-x64@1.2.3': optional: true - '@img/sharp-libvips-linux-arm64@1.1.0': + '@img/sharp-libvips-linux-arm64@1.2.3': optional: true - '@img/sharp-libvips-linux-arm@1.1.0': + '@img/sharp-libvips-linux-arm@1.2.3': optional: true - '@img/sharp-libvips-linux-ppc64@1.1.0': + '@img/sharp-libvips-linux-ppc64@1.2.3': optional: true - '@img/sharp-libvips-linux-s390x@1.1.0': + '@img/sharp-libvips-linux-s390x@1.2.3': optional: true - '@img/sharp-libvips-linux-x64@1.1.0': + '@img/sharp-libvips-linux-x64@1.2.3': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.1.0': + '@img/sharp-libvips-linuxmusl-arm64@1.2.3': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.1.0': + '@img/sharp-libvips-linuxmusl-x64@1.2.3': optional: true - '@img/sharp-linux-arm64@0.34.2': + '@img/sharp-linux-arm64@0.34.4': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.1.0 + '@img/sharp-libvips-linux-arm64': 1.2.3 optional: true - '@img/sharp-linux-arm@0.34.2': + '@img/sharp-linux-arm@0.34.4': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.1.0 + '@img/sharp-libvips-linux-arm': 1.2.3 optional: true - '@img/sharp-linux-s390x@0.34.2': + '@img/sharp-linux-ppc64@0.34.4': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.1.0 + '@img/sharp-libvips-linux-ppc64': 1.2.3 optional: true - '@img/sharp-linux-x64@0.34.2': + '@img/sharp-linux-s390x@0.34.4': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.1.0 + '@img/sharp-libvips-linux-s390x': 1.2.3 optional: true - '@img/sharp-linuxmusl-arm64@0.34.2': + '@img/sharp-linux-x64@0.34.4': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + '@img/sharp-libvips-linux-x64': 1.2.3 optional: true - '@img/sharp-linuxmusl-x64@0.34.2': + '@img/sharp-linuxmusl-arm64@0.34.4': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 optional: true - '@img/sharp-wasm32@0.34.2': + '@img/sharp-linuxmusl-x64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + optional: true + + '@img/sharp-wasm32@0.34.4': dependencies: - '@emnapi/runtime': 1.4.3 + '@emnapi/runtime': 1.5.0 optional: true - '@img/sharp-win32-arm64@0.34.2': + '@img/sharp-win32-arm64@0.34.4': optional: true - '@img/sharp-win32-ia32@0.34.2': + '@img/sharp-win32-ia32@0.34.4': optional: true - '@img/sharp-win32-x64@0.34.2': + '@img/sharp-win32-x64@0.34.4': optional: true '@inquirer/ansi@1.0.0': {} @@ -4288,30 +4283,30 @@ snapshots: outvariant: 1.4.3 strict-event-emitter: 0.5.1 - '@next/env@15.3.4': {} + '@next/env@15.5.4': {} - '@next/swc-darwin-arm64@15.3.4': + '@next/swc-darwin-arm64@15.5.4': optional: true - '@next/swc-darwin-x64@15.3.4': + '@next/swc-darwin-x64@15.5.4': optional: true - '@next/swc-linux-arm64-gnu@15.3.4': + '@next/swc-linux-arm64-gnu@15.5.4': optional: true - '@next/swc-linux-arm64-musl@15.3.4': + '@next/swc-linux-arm64-musl@15.5.4': optional: true - '@next/swc-linux-x64-gnu@15.3.4': + '@next/swc-linux-x64-gnu@15.5.4': optional: true - '@next/swc-linux-x64-musl@15.3.4': + '@next/swc-linux-x64-musl@15.5.4': optional: true - '@next/swc-win32-arm64-msvc@15.3.4': + '@next/swc-win32-arm64-msvc@15.5.4': optional: true - '@next/swc-win32-x64-msvc@15.3.4': + '@next/swc-win32-x64-msvc@15.5.4': optional: true '@noble/ciphers@1.3.0': {} @@ -5500,8 +5495,6 @@ snapshots: '@standard-schema/spec@1.0.0': {} - '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 @@ -5636,9 +5629,9 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vercel/analytics@1.5.0(next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)': + '@vercel/analytics@1.5.0(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)': optionalDependencies: - next: 15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.5.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 accepts@2.0.0: @@ -5709,10 +5702,6 @@ snapshots: node-releases: 2.0.23 update-browserslist-db: 1.1.3(browserslist@4.26.3) - busboy@1.6.0: - dependencies: - streamsearch: 1.1.0 - bytes@3.1.2: {} call-bind-apply-helpers@1.0.2: @@ -5727,8 +5716,6 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001724: {} - caniuse-lite@1.0.30001748: {} ccount@2.0.1: {} @@ -5777,18 +5764,6 @@ snapshots: color-name@1.1.4: {} - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - optional: true - - color@4.2.3: - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - optional: true - comma-separated-tokens@2.0.3: {} commander@11.1.0: {} @@ -5855,6 +5830,9 @@ snapshots: detect-libc@2.0.4: {} + detect-libc@2.1.2: + optional: true + detect-node-es@1.1.0: {} devlop@1.1.0: @@ -6128,7 +6106,7 @@ snapshots: fsevents@2.3.3: optional: true - fumadocs-core@15.5.5(@types/react@19.1.8)(next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + fumadocs-core@15.5.5(@types/react@19.1.8)(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@formatjs/intl-localematcher': 0.6.1 '@orama/orama': 3.1.9 @@ -6148,20 +6126,20 @@ snapshots: unist-util-visit: 5.0.0 optionalDependencies: '@types/react': 19.1.8 - next: 15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.5.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) transitivePeerDependencies: - supports-color - fumadocs-mdx@11.6.9(acorn@8.15.0)(fumadocs-core@15.5.5(@types/react@19.1.8)(next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)): + fumadocs-mdx@11.6.9(acorn@8.15.0)(fumadocs-core@15.5.5(@types/react@19.1.8)(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)): dependencies: '@mdx-js/mdx': 3.1.0(acorn@8.15.0) '@standard-schema/spec': 1.0.0 chokidar: 4.0.3 esbuild: 0.25.5 estree-util-value-to-estree: 3.4.0 - fumadocs-core: 15.5.5(@types/react@19.1.8)(next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + fumadocs-core: 15.5.5(@types/react@19.1.8)(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) js-yaml: 4.1.0 lru-cache: 11.1.0 picocolors: 1.1.1 @@ -6170,7 +6148,7 @@ snapshots: unist-util-visit: 5.0.0 zod: 3.25.67 optionalDependencies: - next: 15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.5.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) vite: 6.3.5(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3) transitivePeerDependencies: - acorn @@ -6182,9 +6160,9 @@ snapshots: fzf@0.5.2: {} - geist@1.4.2(next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)): + geist@1.5.1(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)): dependencies: - next: 15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.5.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) gensync@1.0.0-beta.2: {} @@ -6368,9 +6346,6 @@ snapshots: is-arrayish@0.2.1: {} - is-arrayish@0.3.2: - optional: true - is-decimal@2.0.1: {} is-extglob@2.1.1: {} @@ -7020,27 +6995,25 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - next@15.3.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - '@next/env': 15.3.4 - '@swc/counter': 0.1.3 + '@next/env': 15.5.4 '@swc/helpers': 0.5.15 - busboy: 1.6.0 - caniuse-lite: 1.0.30001724 + caniuse-lite: 1.0.30001748 postcss: 8.4.31 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) styled-jsx: 5.1.6(@babel/core@7.28.4)(react@19.1.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.3.4 - '@next/swc-darwin-x64': 15.3.4 - '@next/swc-linux-arm64-gnu': 15.3.4 - '@next/swc-linux-arm64-musl': 15.3.4 - '@next/swc-linux-x64-gnu': 15.3.4 - '@next/swc-linux-x64-musl': 15.3.4 - '@next/swc-win32-arm64-msvc': 15.3.4 - '@next/swc-win32-x64-msvc': 15.3.4 - sharp: 0.34.2 + '@next/swc-darwin-arm64': 15.5.4 + '@next/swc-darwin-x64': 15.5.4 + '@next/swc-linux-arm64-gnu': 15.5.4 + '@next/swc-linux-arm64-musl': 15.5.4 + '@next/swc-linux-x64-gnu': 15.5.4 + '@next/swc-linux-x64-musl': 15.5.4 + '@next/swc-win32-arm64-msvc': 15.5.4 + '@next/swc-win32-x64-msvc': 15.5.4 + sharp: 0.34.4 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -7601,33 +7574,34 @@ snapshots: - supports-color - typescript - sharp@0.34.2: + sharp@0.34.4: dependencies: - color: 4.2.3 - detect-libc: 2.0.4 + '@img/colour': 1.0.0 + detect-libc: 2.1.2 semver: 7.7.2 optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.2 - '@img/sharp-darwin-x64': 0.34.2 - '@img/sharp-libvips-darwin-arm64': 1.1.0 - '@img/sharp-libvips-darwin-x64': 1.1.0 - '@img/sharp-libvips-linux-arm': 1.1.0 - '@img/sharp-libvips-linux-arm64': 1.1.0 - '@img/sharp-libvips-linux-ppc64': 1.1.0 - '@img/sharp-libvips-linux-s390x': 1.1.0 - '@img/sharp-libvips-linux-x64': 1.1.0 - '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 - '@img/sharp-libvips-linuxmusl-x64': 1.1.0 - '@img/sharp-linux-arm': 0.34.2 - '@img/sharp-linux-arm64': 0.34.2 - '@img/sharp-linux-s390x': 0.34.2 - '@img/sharp-linux-x64': 0.34.2 - '@img/sharp-linuxmusl-arm64': 0.34.2 - '@img/sharp-linuxmusl-x64': 0.34.2 - '@img/sharp-wasm32': 0.34.2 - '@img/sharp-win32-arm64': 0.34.2 - '@img/sharp-win32-ia32': 0.34.2 - '@img/sharp-win32-x64': 0.34.2 + '@img/sharp-darwin-arm64': 0.34.4 + '@img/sharp-darwin-x64': 0.34.4 + '@img/sharp-libvips-darwin-arm64': 1.2.3 + '@img/sharp-libvips-darwin-x64': 1.2.3 + '@img/sharp-libvips-linux-arm': 1.2.3 + '@img/sharp-libvips-linux-arm64': 1.2.3 + '@img/sharp-libvips-linux-ppc64': 1.2.3 + '@img/sharp-libvips-linux-s390x': 1.2.3 + '@img/sharp-libvips-linux-x64': 1.2.3 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + '@img/sharp-linux-arm': 0.34.4 + '@img/sharp-linux-arm64': 0.34.4 + '@img/sharp-linux-ppc64': 0.34.4 + '@img/sharp-linux-s390x': 0.34.4 + '@img/sharp-linux-x64': 0.34.4 + '@img/sharp-linuxmusl-arm64': 0.34.4 + '@img/sharp-linuxmusl-x64': 0.34.4 + '@img/sharp-wasm32': 0.34.4 + '@img/sharp-win32-arm64': 0.34.4 + '@img/sharp-win32-ia32': 0.34.4 + '@img/sharp-win32-x64': 0.34.4 optional: true shebang-command@2.0.0: @@ -7679,11 +7653,6 @@ snapshots: signal-exit@4.1.0: {} - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 - optional: true - sisteransi@1.0.5: {} source-map-js@1.2.1: {} @@ -7700,8 +7669,6 @@ snapshots: stdin-discarder@0.2.2: {} - streamsearch@1.1.0: {} - strict-event-emitter@0.5.1: {} string-width@4.2.3: @@ -7826,32 +7793,32 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - turbo-darwin-64@2.5.4: + turbo-darwin-64@2.5.8: optional: true - turbo-darwin-arm64@2.5.4: + turbo-darwin-arm64@2.5.8: optional: true - turbo-linux-64@2.5.4: + turbo-linux-64@2.5.8: optional: true - turbo-linux-arm64@2.5.4: + turbo-linux-arm64@2.5.8: optional: true - turbo-windows-64@2.5.4: + turbo-windows-64@2.5.8: optional: true - turbo-windows-arm64@2.5.4: + turbo-windows-arm64@2.5.8: optional: true - turbo@2.5.4: + turbo@2.5.8: optionalDependencies: - turbo-darwin-64: 2.5.4 - turbo-darwin-arm64: 2.5.4 - turbo-linux-64: 2.5.4 - turbo-linux-arm64: 2.5.4 - turbo-windows-64: 2.5.4 - turbo-windows-arm64: 2.5.4 + turbo-darwin-64: 2.5.8 + turbo-darwin-arm64: 2.5.8 + turbo-linux-64: 2.5.8 + turbo-linux-arm64: 2.5.8 + turbo-windows-64: 2.5.8 + turbo-windows-arm64: 2.5.8 tw-animate-css@1.3.6: {} diff --git a/web/package.json b/web/package.json index cf1725e7..ffbc039e 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "@baselayer/web", - "version": "2.0.3", + "version": "2.1.0", "private": true, "scripts": { "dev": "next dev --turbopack", @@ -17,9 +17,9 @@ "@vercel/analytics": "^1.5.0", "fumadocs-core": "^15.5.5", "fumadocs-mdx": "^11.6.9", - "geist": "^1.4.2", + "geist": "^1.5.1", "lucide-react": "^0.525.0", - "next": "15.3.4", + "next": "15.5.4", "next-themes": "^0.4.6", "react": "^19.1.0", "react-aria-components": "catalog:", From f4beb9c5506cc8d399438778025803c2e4a86748 Mon Sep 17 00:00:00 2001 From: Zach <86675944+zwgnr@users.noreply.github.com> Date: Sun, 5 Oct 2025 22:23:47 -0400 Subject: [PATCH 3/4] fix example imports --- web/app/r/[...segments]/route.ts | 2 +- web/app/r/[[...segments]]/route.ts | 45 ++++++++++++++++++++++++++++++ web/lib/component-data.ts | 6 ++-- 3 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 web/app/r/[[...segments]]/route.ts diff --git a/web/app/r/[...segments]/route.ts b/web/app/r/[...segments]/route.ts index 0c90ba4e..c59ecaff 100644 --- a/web/app/r/[...segments]/route.ts +++ b/web/app/r/[...segments]/route.ts @@ -5,7 +5,7 @@ import { join } from "node:path"; export async function GET( _request: Request, - { params }: { params: Promise<{ segments: string[] }> }, + { params }: { params: Promise<{ segments?: string[] }> }, ) { try { const { segments } = await params; diff --git a/web/app/r/[[...segments]]/route.ts b/web/app/r/[[...segments]]/route.ts new file mode 100644 index 00000000..c59ecaff --- /dev/null +++ b/web/app/r/[[...segments]]/route.ts @@ -0,0 +1,45 @@ +import { NextResponse } from "next/server"; + +import { existsSync, readFileSync } from "node:fs"; +import { join } from "node:path"; + +export async function GET( + _request: Request, + { params }: { params: Promise<{ segments?: string[] }> }, +) { + try { + const { segments } = await params; + + // If no segments, return the registry index + if (!segments || segments.length === 0) { + const registryPath = join(process.cwd(), "public/r/index.json"); + const registryContent = readFileSync(registryPath, "utf8"); + return new NextResponse(registryContent, { + headers: { + "Content-Type": "application/json", + "Cache-Control": "public, max-age=3600", + }, + }); + } + + // Handle specific registry item requests + // Support both /r/button and /r/button.json + const itemName = segments[0].replace(/\.json$/, ""); + const itemPath = join(process.cwd(), `public/r/${itemName}.json`); + + if (!existsSync(itemPath)) { + return new NextResponse("Registry item not found", { status: 404 }); + } + + const itemContent = readFileSync(itemPath, "utf8"); + return new NextResponse(itemContent, { + headers: { + "Content-Type": "application/json", + "Cache-Control": "public, max-age=3600", + }, + }); + } catch (error) { + console.error("Error in registry API route:", error); + return new NextResponse("Internal Server Error", { status: 500 }); + } +} diff --git a/web/lib/component-data.ts b/web/lib/component-data.ts index f228bf77..38995a0e 100644 --- a/web/lib/component-data.ts +++ b/web/lib/component-data.ts @@ -14,7 +14,7 @@ export async function getComponentSource(name: string): Promise { // Find the component in the shadcn registry const shadcnComponent = shadcnRegistry.items?.find( - (item: RegistryItem) => item.name === name + (item: RegistryItem) => item.name === name, ); if (shadcnComponent?.files?.[0]?.content) { @@ -36,10 +36,10 @@ export async function getExampleSource(name: string): Promise { const exampleFilePath = join(examplesDir, `${name}.tsx`); let content = readFileSync(exampleFilePath, "utf8"); - // Transform the import path for display + // Transform the import path for display content = content.replace( /from ["']\.\.\/core\/([^/]+)\/\1["']/g, - 'from "@components/base/$1"', + 'from "@/components/ui/$1"', ); return content; From 4b9de1849fb2e28b8db9e70223cbe3f755c279ff Mon Sep 17 00:00:00 2001 From: Zach <86675944+zwgnr@users.noreply.github.com> Date: Sun, 5 Oct 2025 22:29:05 -0400 Subject: [PATCH 4/4] fix rg error var --- packages/components/src/core/radio-group/radio-group.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/components/src/core/radio-group/radio-group.tsx b/packages/components/src/core/radio-group/radio-group.tsx index 8b9d1eda..2c9fc19c 100644 --- a/packages/components/src/core/radio-group/radio-group.tsx +++ b/packages/components/src/core/radio-group/radio-group.tsx @@ -45,7 +45,7 @@ const RadioGroup = ({ {label} {children} {description && {description}} - {errorMessage} + {errorMessage} );