diff --git a/README.md b/README.md
index 461dba6a..2460de4f 100644
--- a/README.md
+++ b/README.md
@@ -120,6 +120,65 @@ figma-cli talks to your Figma Desktop in one of two ways. Claude picks one durin
---
+## Use figma-cli as an MCP server in Claude Code
+
+figma-cli ships a built-in MCP server (`src/mcp-server.js`). Register it once in your global Claude Code settings and **every project you open** gets all 21 `figma_*` tools — no shell commands, no need to open this repo.
+
+### One-time setup
+
+1. **Clone this repo** (if you haven't already):
+ ```bash
+ git clone https://github.com/alauxui/figma-cli-nixos.git ~/figma-cli-nixos
+ cd ~/figma-cli-nixos && npm install
+ ```
+
+2. **Add the MCP server to `~/.claude/settings.json`:**
+ ```json
+ "mcpServers": {
+ "figma-cli": {
+ "command": "node",
+ "args": ["/absolute/path/to/figma-cli-nixos/src/mcp-server.js"]
+ }
+ }
+ ```
+ Replace `/absolute/path/to/figma-cli-nixos` with the actual path on your machine.
+
+3. **Restart Claude Code.**
+
+That's it. Open any project and say things like:
+- "what's on the Figma canvas?" → calls `figma_canvas_info`
+- "create a button in Figma" → calls `figma_render`
+- "show me the design tokens" → calls `figma_var_list`
+- "export the design system" → calls `figma_extract`
+
+### Tools exposed
+
+| Tool | What it does |
+|------|-------------|
+| `figma_render` | Render a JSX frame on canvas |
+| `figma_render_batch` | Render multiple frames at once |
+| `figma_verify` | Screenshot a node for visual validation |
+| `figma_var_list` | List all variables/tokens |
+| `figma_tokens_preset` | Load shadcn / Tailwind / DS token presets |
+| `figma_canvas_info` | Show everything on canvas |
+| `figma_find` | Find nodes by name |
+| `figma_to_component` | Convert frame to component |
+| `figma_instantiate` | Drop an instance of an existing component |
+| `figma_spec` | Show variant axes from DESIGN.md |
+| `figma_extract` | Export file as DESIGN.md |
+| `figma_import` | Import tokens from CSS / Tailwind / JSON / Storybook |
+| `figma_export` | Export as PNG / SVG / DTCG / CSS / Tailwind |
+| `figma_blocks` | Create pre-built UI layouts (dashboards etc.) |
+| `figma_shadcn_add` | Add shadcn components |
+| `figma_a11y` | Run accessibility checks |
+| `figma_undo` | Undo last operation |
+| `figma_gradient` | Create mesh/aurora gradient backgrounds |
+| `figma_variants_from` | Combine frames into a Component Set |
+| `figma_daemon` | Check / restart the daemon |
+| `figma_connect` | Connect to Figma (Yolo or Safe mode) |
+
+---
+
## figma-cli vs the MCP servers (the question I get asked most)
People keep asking how figma-cli differs from **Figma's official MCP** and from **figma-console-mcp**. Short version: they talk to Figma through the **cloud REST API**, figma-cli talks to **Figma Desktop directly on your machine**. That one architectural choice changes everything downstream.
@@ -281,6 +340,18 @@ Prefer to keep everything on your machine? figma-cli also works with **local LLM
---
+## 🎥 Live Example: Variables + Component Handoff
+
+To show Browser Yolo mode in action end-to-end, here's a live example covering of one of the workflows:
+
+| Creating Variables | Designing Variant | Handoff |
+|---|---|---|
+|
|
|
|
+
+This demonstrates the full loop working through CDP on NixOS, from token creation to a dev-ready handoff, with no Figma Desktop involved.
+
+---
+
## For developers
Everything above is powered by a CLI that the AI calls for you. If you want to use it directly, script it, or see every command:
diff --git a/button-handoff.md b/button-handoff.md
new file mode 100644
index 00000000..ccc16236
--- /dev/null
+++ b/button-handoff.md
@@ -0,0 +1,2318 @@
+# DESIGN.md -- test-claude code
+
+
+
+## 1. Identity
+
+**In one line:** A design system using Inter with 7 unique colors extracted directly from Figma.
+
+**Signature Techniques:**
+- Consistent auto-layout spacing system
+- Component library with 15 variants across 1 component sets
+
+## 2. Structure
+
+High-level composition. Each entry: frame name, type, dimensions, auto-layout.
+
+### Page: Page 1
+
+_4 top-level frame(s)_
+
+- **CDP Yolo Test** · `FRAME` · 240×120
+- **Daemon Render Test** · `FRAME` · 200×80 · horizontal row · 1 children
+ - **It works** · `TEXT` · 63×19 · “It works”
+- **Browser Yolo works** · `FRAME` · 280×110 · vertical stack, gap 4px · 2 children
+ - **Browser Yolo works** · `TEXT` · 280×22 · “Browser Yolo works”
+ - **no plugin · no desktop · no token** · `TEXT` · 280×15 · “no plugin · no desktop · no token”
+- **Button** · `COMPONENT_SET` · 1715×43 · 15 children
+ - **Variant=Default, Size=Small** · `COMPONENT` · 63×27 · horizontal row, gap 6px, padding 6/12/6/12px · 1 children
+ - **Button** · `TEXT` · 39×15 · “Button”
+
+## 3. Color
+
+### Palette
+
+| Token | Hex | Usage count |
+|---|---|---|
+| background | `#ffffff` | 2 |
+| accent | `#3b82f5` | 1 |
+| accent-alt | `#22c55e` | 1 |
+| accent-3 | `#8b5cf6` | 1 |
+| surface | `#ede9fe` | 1 |
+| text-primary | `#18181b` | 1 |
+| background-alt | `#fafafa` | 1 |
+
+## 4. Variables
+
+Real Figma variable collections — the authoritative tokens (names, modes, values). These come straight from the file, unlike the sampled palette above. `figma-cli import` can recreate them as variables.
+
+### Collection: shadcn/primitives · 244 variables · modes: Mode 1
+
+| Variable | Type | Mode 1 |
+|---|---|---|
+| slate/50 | COLOR | `#f8fafc` |
+| slate/100 | COLOR | `#f1f5f9` |
+| slate/200 | COLOR | `#e2e8f0` |
+| slate/300 | COLOR | `#cbd5e1` |
+| slate/400 | COLOR | `#94a3b8` |
+| slate/500 | COLOR | `#64748b` |
+| slate/600 | COLOR | `#475569` |
+| slate/700 | COLOR | `#334155` |
+| slate/800 | COLOR | `#1e293b` |
+| slate/900 | COLOR | `#0f172a` |
+| slate/950 | COLOR | `#020617` |
+| gray/50 | COLOR | `#f9fafb` |
+| gray/100 | COLOR | `#f3f4f6` |
+| gray/200 | COLOR | `#e5e7eb` |
+| gray/300 | COLOR | `#d1d5db` |
+| gray/400 | COLOR | `#9ca3af` |
+| gray/500 | COLOR | `#6b7280` |
+| gray/600 | COLOR | `#4b5563` |
+| gray/700 | COLOR | `#374151` |
+| gray/800 | COLOR | `#1f2937` |
+| gray/900 | COLOR | `#111827` |
+| gray/950 | COLOR | `#030712` |
+| zinc/50 | COLOR | `#fafafa` |
+| zinc/100 | COLOR | `#f4f4f5` |
+| zinc/200 | COLOR | `#e4e4e7` |
+| zinc/300 | COLOR | `#d4d4d8` |
+| zinc/400 | COLOR | `#a1a1aa` |
+| zinc/500 | COLOR | `#71717a` |
+| zinc/600 | COLOR | `#52525b` |
+| zinc/700 | COLOR | `#3f3f46` |
+| zinc/800 | COLOR | `#27272a` |
+| zinc/900 | COLOR | `#18181b` |
+| zinc/950 | COLOR | `#09090b` |
+| neutral/50 | COLOR | `#fafafa` |
+| neutral/100 | COLOR | `#f5f5f5` |
+| neutral/200 | COLOR | `#e5e5e5` |
+| neutral/300 | COLOR | `#d4d4d4` |
+| neutral/400 | COLOR | `#a3a3a3` |
+| neutral/500 | COLOR | `#737373` |
+| neutral/600 | COLOR | `#525252` |
+| neutral/700 | COLOR | `#404040` |
+| neutral/800 | COLOR | `#262626` |
+| neutral/900 | COLOR | `#171717` |
+| neutral/950 | COLOR | `#0a0a0a` |
+| stone/50 | COLOR | `#fafaf9` |
+| stone/100 | COLOR | `#f5f5f4` |
+| stone/200 | COLOR | `#e7e5e4` |
+| stone/300 | COLOR | `#d6d3d1` |
+| stone/400 | COLOR | `#a8a29e` |
+| stone/500 | COLOR | `#78716c` |
+| stone/600 | COLOR | `#57534e` |
+| stone/700 | COLOR | `#44403c` |
+| stone/800 | COLOR | `#292524` |
+| stone/900 | COLOR | `#1c1917` |
+| stone/950 | COLOR | `#0c0a09` |
+| red/50 | COLOR | `#fef2f2` |
+| red/100 | COLOR | `#fee2e2` |
+| red/200 | COLOR | `#fecaca` |
+| red/300 | COLOR | `#fca5a5` |
+| red/400 | COLOR | `#f87171` |
+| red/500 | COLOR | `#ef4444` |
+| red/600 | COLOR | `#dc2626` |
+| red/700 | COLOR | `#b91c1c` |
+| red/800 | COLOR | `#991b1b` |
+| red/900 | COLOR | `#7f1d1d` |
+| red/950 | COLOR | `#450a0a` |
+| orange/50 | COLOR | `#fff7ed` |
+| orange/100 | COLOR | `#ffedd5` |
+| orange/200 | COLOR | `#fed7aa` |
+| orange/300 | COLOR | `#fdba74` |
+| orange/400 | COLOR | `#fb923c` |
+| orange/500 | COLOR | `#f97316` |
+| orange/600 | COLOR | `#ea580c` |
+| orange/700 | COLOR | `#c2410c` |
+| orange/800 | COLOR | `#9a3412` |
+| orange/900 | COLOR | `#7c2d12` |
+| orange/950 | COLOR | `#431407` |
+| amber/50 | COLOR | `#fffbeb` |
+| amber/100 | COLOR | `#fef3c7` |
+| amber/200 | COLOR | `#fde68a` |
+| amber/300 | COLOR | `#fcd34d` |
+| amber/400 | COLOR | `#fbbf24` |
+| amber/500 | COLOR | `#f59e0b` |
+| amber/600 | COLOR | `#d97706` |
+| amber/700 | COLOR | `#b45309` |
+| amber/800 | COLOR | `#92400e` |
+| amber/900 | COLOR | `#78350f` |
+| amber/950 | COLOR | `#451a03` |
+| yellow/50 | COLOR | `#fefce8` |
+| yellow/100 | COLOR | `#fef9c3` |
+| yellow/200 | COLOR | `#fef08a` |
+| yellow/300 | COLOR | `#fde047` |
+| yellow/400 | COLOR | `#facc15` |
+| yellow/500 | COLOR | `#eab308` |
+| yellow/600 | COLOR | `#ca8a04` |
+| yellow/700 | COLOR | `#a16207` |
+| yellow/800 | COLOR | `#854d0e` |
+| yellow/900 | COLOR | `#713f12` |
+| yellow/950 | COLOR | `#422006` |
+| lime/50 | COLOR | `#f7fee7` |
+| lime/100 | COLOR | `#ecfccb` |
+| lime/200 | COLOR | `#d9f99d` |
+| lime/300 | COLOR | `#bef264` |
+| lime/400 | COLOR | `#a3e635` |
+| lime/500 | COLOR | `#84cc16` |
+| lime/600 | COLOR | `#65a30d` |
+| lime/700 | COLOR | `#4d7c0f` |
+| lime/800 | COLOR | `#3f6212` |
+| lime/900 | COLOR | `#365314` |
+| lime/950 | COLOR | `#1a2e05` |
+| green/50 | COLOR | `#f0fdf4` |
+| green/100 | COLOR | `#dcfce7` |
+| green/200 | COLOR | `#bbf7d0` |
+| green/300 | COLOR | `#86efac` |
+| green/400 | COLOR | `#4ade80` |
+| green/500 | COLOR | `#22c55e` |
+| green/600 | COLOR | `#16a34a` |
+| green/700 | COLOR | `#15803d` |
+| green/800 | COLOR | `#166534` |
+| green/900 | COLOR | `#14532d` |
+| green/950 | COLOR | `#052e16` |
+| emerald/50 | COLOR | `#ecfdf5` |
+| emerald/100 | COLOR | `#d1fae5` |
+| emerald/200 | COLOR | `#a7f3d0` |
+| emerald/300 | COLOR | `#6ee7b7` |
+| emerald/400 | COLOR | `#34d399` |
+| emerald/500 | COLOR | `#10b981` |
+| emerald/600 | COLOR | `#059669` |
+| emerald/700 | COLOR | `#047857` |
+| emerald/800 | COLOR | `#065f46` |
+| emerald/900 | COLOR | `#064e3b` |
+| emerald/950 | COLOR | `#022c22` |
+| teal/50 | COLOR | `#f0fdfa` |
+| teal/100 | COLOR | `#ccfbf1` |
+| teal/200 | COLOR | `#99f6e4` |
+| teal/300 | COLOR | `#5eead4` |
+| teal/400 | COLOR | `#2dd4bf` |
+| teal/500 | COLOR | `#14b8a6` |
+| teal/600 | COLOR | `#0d9488` |
+| teal/700 | COLOR | `#0f766e` |
+| teal/800 | COLOR | `#115e59` |
+| teal/900 | COLOR | `#134e4a` |
+| teal/950 | COLOR | `#042f2e` |
+| cyan/50 | COLOR | `#ecfeff` |
+| cyan/100 | COLOR | `#cffafe` |
+| cyan/200 | COLOR | `#a5f3fc` |
+| cyan/300 | COLOR | `#67e8f9` |
+| cyan/400 | COLOR | `#22d3ee` |
+| cyan/500 | COLOR | `#06b6d4` |
+| cyan/600 | COLOR | `#0891b2` |
+| cyan/700 | COLOR | `#0e7490` |
+| cyan/800 | COLOR | `#155e75` |
+| cyan/900 | COLOR | `#164e63` |
+| cyan/950 | COLOR | `#083344` |
+| sky/50 | COLOR | `#f0f9ff` |
+| sky/100 | COLOR | `#e0f2fe` |
+| sky/200 | COLOR | `#bae6fd` |
+| sky/300 | COLOR | `#7dd3fc` |
+| sky/400 | COLOR | `#38bdf8` |
+| sky/500 | COLOR | `#0ea5e9` |
+| sky/600 | COLOR | `#0284c7` |
+| sky/700 | COLOR | `#0369a1` |
+| sky/800 | COLOR | `#075985` |
+| sky/900 | COLOR | `#0c4a6e` |
+| sky/950 | COLOR | `#082f49` |
+| blue/50 | COLOR | `#eff6ff` |
+| blue/100 | COLOR | `#dbeafe` |
+| blue/200 | COLOR | `#bfdbfe` |
+| blue/300 | COLOR | `#93c5fd` |
+| blue/400 | COLOR | `#60a5fa` |
+| blue/500 | COLOR | `#3b82f6` |
+| blue/600 | COLOR | `#2563eb` |
+| blue/700 | COLOR | `#1d4ed8` |
+| blue/800 | COLOR | `#1e40af` |
+| blue/900 | COLOR | `#1e3a8a` |
+| blue/950 | COLOR | `#172554` |
+| indigo/50 | COLOR | `#eef2ff` |
+| indigo/100 | COLOR | `#e0e7ff` |
+| indigo/200 | COLOR | `#c7d2fe` |
+| indigo/300 | COLOR | `#a5b4fc` |
+| indigo/400 | COLOR | `#818cf8` |
+| indigo/500 | COLOR | `#6366f1` |
+| indigo/600 | COLOR | `#4f46e5` |
+| indigo/700 | COLOR | `#4338ca` |
+| indigo/800 | COLOR | `#3730a3` |
+| indigo/900 | COLOR | `#312e81` |
+| indigo/950 | COLOR | `#1e1b4b` |
+| violet/50 | COLOR | `#f5f3ff` |
+| violet/100 | COLOR | `#ede9fe` |
+| violet/200 | COLOR | `#ddd6fe` |
+| violet/300 | COLOR | `#c4b5fd` |
+| violet/400 | COLOR | `#a78bfa` |
+| violet/500 | COLOR | `#8b5cf6` |
+| violet/600 | COLOR | `#7c3aed` |
+| violet/700 | COLOR | `#6d28d9` |
+| violet/800 | COLOR | `#5b21b6` |
+| violet/900 | COLOR | `#4c1d95` |
+| violet/950 | COLOR | `#2e1065` |
+| purple/50 | COLOR | `#faf5ff` |
+| purple/100 | COLOR | `#f3e8ff` |
+| purple/200 | COLOR | `#e9d5ff` |
+| purple/300 | COLOR | `#d8b4fe` |
+| purple/400 | COLOR | `#c084fc` |
+| purple/500 | COLOR | `#a855f7` |
+| purple/600 | COLOR | `#9333ea` |
+| purple/700 | COLOR | `#7e22ce` |
+| purple/800 | COLOR | `#6b21a8` |
+| purple/900 | COLOR | `#581c87` |
+| purple/950 | COLOR | `#3b0764` |
+| fuchsia/50 | COLOR | `#fdf4ff` |
+| fuchsia/100 | COLOR | `#fae8ff` |
+| fuchsia/200 | COLOR | `#f5d0fe` |
+| fuchsia/300 | COLOR | `#f0abfc` |
+| fuchsia/400 | COLOR | `#e879f9` |
+| fuchsia/500 | COLOR | `#d946ef` |
+| fuchsia/600 | COLOR | `#c026d3` |
+| fuchsia/700 | COLOR | `#a21caf` |
+| fuchsia/800 | COLOR | `#86198f` |
+| fuchsia/900 | COLOR | `#701a75` |
+| fuchsia/950 | COLOR | `#4a044e` |
+| pink/50 | COLOR | `#fdf2f8` |
+| pink/100 | COLOR | `#fce7f3` |
+| pink/200 | COLOR | `#fbcfe8` |
+| pink/300 | COLOR | `#f9a8d4` |
+| pink/400 | COLOR | `#f472b6` |
+| pink/500 | COLOR | `#ec4899` |
+| pink/600 | COLOR | `#db2777` |
+| pink/700 | COLOR | `#be185d` |
+| pink/800 | COLOR | `#9d174d` |
+| pink/900 | COLOR | `#831843` |
+| pink/950 | COLOR | `#500724` |
+| rose/50 | COLOR | `#fff1f2` |
+| rose/100 | COLOR | `#ffe4e6` |
+| rose/200 | COLOR | `#fecdd3` |
+| rose/300 | COLOR | `#fda4af` |
+| rose/400 | COLOR | `#fb7185` |
+| rose/500 | COLOR | `#f43f5e` |
+| rose/600 | COLOR | `#e11d48` |
+| rose/700 | COLOR | `#be123c` |
+| rose/800 | COLOR | `#9f1239` |
+| rose/900 | COLOR | `#881337` |
+| rose/950 | COLOR | `#4c0519` |
+| white | COLOR | `#ffffff` |
+| black | COLOR | `#000000` |
+
+### Collection: shadcn/semantic · 32 variables · modes: Light, Dark
+
+| Variable | Type | Light | Dark |
+|---|---|---|---|
+| background | COLOR | → var:white | → var:zinc/950 |
+| foreground | COLOR | → var:zinc/950 | → var:zinc/50 |
+| card | COLOR | → var:white | → var:zinc/950 |
+| card-foreground | COLOR | → var:zinc/950 | → var:zinc/50 |
+| popover | COLOR | → var:white | → var:zinc/950 |
+| popover-foreground | COLOR | → var:zinc/950 | → var:zinc/50 |
+| primary | COLOR | → var:zinc/900 | → var:zinc/50 |
+| primary-foreground | COLOR | → var:zinc/50 | → var:zinc/900 |
+| secondary | COLOR | → var:zinc/100 | → var:zinc/800 |
+| secondary-foreground | COLOR | → var:zinc/900 | → var:zinc/50 |
+| muted | COLOR | → var:zinc/100 | → var:zinc/800 |
+| muted-foreground | COLOR | → var:zinc/500 | → var:zinc/400 |
+| accent | COLOR | → var:zinc/100 | → var:zinc/800 |
+| accent-foreground | COLOR | → var:zinc/900 | → var:zinc/50 |
+| destructive | COLOR | → var:red/500 | → var:red/900 |
+| destructive-foreground | COLOR | → var:zinc/50 | → var:zinc/50 |
+| border | COLOR | → var:zinc/200 | → var:zinc/800 |
+| input | COLOR | → var:zinc/200 | → var:zinc/800 |
+| ring | COLOR | → var:zinc/950 | → var:zinc/300 |
+| chart-1 | COLOR | → var:orange/500 | → var:blue/500 |
+| chart-2 | COLOR | → var:teal/500 | → var:emerald/500 |
+| chart-3 | COLOR | → var:blue/500 | → var:amber/500 |
+| chart-4 | COLOR | → var:amber/500 | → var:rose/500 |
+| chart-5 | COLOR | → var:rose/500 | → var:violet/500 |
+| sidebar-background | COLOR | → var:zinc/50 | → var:zinc/950 |
+| sidebar-foreground | COLOR | → var:zinc/900 | → var:zinc/50 |
+| sidebar-primary | COLOR | → var:zinc/900 | → var:zinc/50 |
+| sidebar-primary-foreground | COLOR | → var:zinc/50 | → var:zinc/900 |
+| sidebar-accent | COLOR | → var:zinc/100 | → var:zinc/800 |
+| sidebar-accent-foreground | COLOR | → var:zinc/900 | → var:zinc/50 |
+| sidebar-border | COLOR | → var:zinc/200 | → var:zinc/800 |
+| sidebar-ring | COLOR | → var:zinc/950 | → var:zinc/300 |
+
+## 5. Typography
+
+### Fonts
+
+- Inter
+
+### Scale
+
+| Token | Family | Size | Weight | Line height |
+|---|---|---|---|---|
+| h1 | Inter | 18px | 700 | auto |
+| body-lg | Inter | 16px | 700 | auto |
+| caption | Inter | 12px | 400 | auto |
+| caption-2 | Inter | 12px | 500 | auto |
+
+## 6. Spacing & Layout
+
+### Base Unit
+
+2px
+
+### Border Radius
+
+| Token | Value |
+|---|---|
+| radius-sm | 5px |
+| radius-md | 6px |
+| radius-lg | 12px |
+| radius-lg-2 | 16px |
+
+## 7. Depth & Motion
+
+### Elevation
+
+_no shadow effects found_
+
+## 8. Components
+
+### Button
+
+Page: Page 1 · 15 variants
+
+Reuse: import existing — key `34d47c1a1700b9c1179f4b2891138e5926191a19` · node `2:316`
+
+| Property | Values |
+|---|---|
+| Variant | Default, Secondary, Outline, Ghost, Destructive |
+| Size | Small, Medium, Large |
+
+Sample variant structure:
+
+- **Variant=Default, Size=Small** · `COMPONENT` · 63×27 · horizontal row, gap 6px, padding 6/12/6/12px · 1 children
+ - **Button** · `TEXT` · 39×15 · “Button”
+
+## 9. States
+
+State tokens should be derived from the base palette above. Recommended mappings:
+
+| State | Treatment |
+|-------|-----------|
+| Hover | Lighten/darken accent by 10% |
+| Focus | 2px ring using accent color with 30% opacity |
+| Disabled | 40% opacity, no pointer events |
+| Error | Use danger color for border and text |
+
+## 10. Rules
+
+### Do
+
+- Use the 2px base unit for all spacing decisions
+- Use `#3b82f5` (accent) as the primary accent color
+- Bind colors to the tokens below instead of hardcoding hex values
+
+### Don't
+
+- Introduce new colors without adding them to the palette
+- Mix corner radii outside the radius scale
+
+## 11. Extending this system
+
+### How to reuse this DESIGN.md
+
+Import into Figma with `figma-cli import ` — colors, radii and typography become variables.
+
+### When to add a new token vs reuse
+
+Reuse the closest existing token; add a new one only when a new semantic role appears.
+
+## 12. Machine-readable tokens
+
+The block below is the canonical token map. It mirrors the tables above but is unambiguous and parseable.
+
+```json design-tokens
+{
+ "$schema": "design-tokens.v1",
+ "meta": {
+ "source": "test-claude code",
+ "generated": "2026-07-02"
+ },
+ "color": {
+ "background": "#ffffff",
+ "accent": "#3b82f5",
+ "accent-alt": "#22c55e",
+ "accent-3": "#8b5cf6",
+ "surface": "#ede9fe",
+ "text-primary": "#18181b",
+ "background-alt": "#fafafa"
+ },
+ "typography": {
+ "h1": {
+ "fontFamily": "Inter",
+ "fontSize": 18,
+ "fontWeight": 700
+ },
+ "body-lg": {
+ "fontFamily": "Inter",
+ "fontSize": 16,
+ "fontWeight": 700
+ },
+ "caption": {
+ "fontFamily": "Inter",
+ "fontSize": 12,
+ "fontWeight": 400
+ },
+ "caption-2": {
+ "fontFamily": "Inter",
+ "fontSize": 12,
+ "fontWeight": 500
+ }
+ },
+ "spacing": {
+ "base-unit": 2
+ },
+ "radius": {
+ "radius-sm": "5px",
+ "radius-md": "6px",
+ "radius-lg": "12px",
+ "radius-lg-2": "16px"
+ },
+ "shadow": {},
+ "fonts": [
+ "Inter"
+ ],
+ "variables": {
+ "shadcn/primitives": {
+ "modes": [
+ "Mode 1"
+ ],
+ "variables": {
+ "slate/50": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#f8fafc"
+ }
+ },
+ "slate/100": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#f1f5f9"
+ }
+ },
+ "slate/200": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#e2e8f0"
+ }
+ },
+ "slate/300": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#cbd5e1"
+ }
+ },
+ "slate/400": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#94a3b8"
+ }
+ },
+ "slate/500": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#64748b"
+ }
+ },
+ "slate/600": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#475569"
+ }
+ },
+ "slate/700": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#334155"
+ }
+ },
+ "slate/800": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#1e293b"
+ }
+ },
+ "slate/900": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#0f172a"
+ }
+ },
+ "slate/950": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#020617"
+ }
+ },
+ "gray/50": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#f9fafb"
+ }
+ },
+ "gray/100": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#f3f4f6"
+ }
+ },
+ "gray/200": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#e5e7eb"
+ }
+ },
+ "gray/300": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#d1d5db"
+ }
+ },
+ "gray/400": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#9ca3af"
+ }
+ },
+ "gray/500": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#6b7280"
+ }
+ },
+ "gray/600": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#4b5563"
+ }
+ },
+ "gray/700": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#374151"
+ }
+ },
+ "gray/800": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#1f2937"
+ }
+ },
+ "gray/900": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#111827"
+ }
+ },
+ "gray/950": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#030712"
+ }
+ },
+ "zinc/50": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fafafa"
+ }
+ },
+ "zinc/100": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#f4f4f5"
+ }
+ },
+ "zinc/200": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#e4e4e7"
+ }
+ },
+ "zinc/300": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#d4d4d8"
+ }
+ },
+ "zinc/400": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#a1a1aa"
+ }
+ },
+ "zinc/500": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#71717a"
+ }
+ },
+ "zinc/600": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#52525b"
+ }
+ },
+ "zinc/700": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#3f3f46"
+ }
+ },
+ "zinc/800": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#27272a"
+ }
+ },
+ "zinc/900": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#18181b"
+ }
+ },
+ "zinc/950": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#09090b"
+ }
+ },
+ "neutral/50": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fafafa"
+ }
+ },
+ "neutral/100": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#f5f5f5"
+ }
+ },
+ "neutral/200": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#e5e5e5"
+ }
+ },
+ "neutral/300": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#d4d4d4"
+ }
+ },
+ "neutral/400": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#a3a3a3"
+ }
+ },
+ "neutral/500": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#737373"
+ }
+ },
+ "neutral/600": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#525252"
+ }
+ },
+ "neutral/700": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#404040"
+ }
+ },
+ "neutral/800": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#262626"
+ }
+ },
+ "neutral/900": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#171717"
+ }
+ },
+ "neutral/950": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#0a0a0a"
+ }
+ },
+ "stone/50": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fafaf9"
+ }
+ },
+ "stone/100": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#f5f5f4"
+ }
+ },
+ "stone/200": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#e7e5e4"
+ }
+ },
+ "stone/300": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#d6d3d1"
+ }
+ },
+ "stone/400": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#a8a29e"
+ }
+ },
+ "stone/500": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#78716c"
+ }
+ },
+ "stone/600": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#57534e"
+ }
+ },
+ "stone/700": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#44403c"
+ }
+ },
+ "stone/800": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#292524"
+ }
+ },
+ "stone/900": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#1c1917"
+ }
+ },
+ "stone/950": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#0c0a09"
+ }
+ },
+ "red/50": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fef2f2"
+ }
+ },
+ "red/100": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fee2e2"
+ }
+ },
+ "red/200": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fecaca"
+ }
+ },
+ "red/300": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fca5a5"
+ }
+ },
+ "red/400": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#f87171"
+ }
+ },
+ "red/500": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#ef4444"
+ }
+ },
+ "red/600": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#dc2626"
+ }
+ },
+ "red/700": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#b91c1c"
+ }
+ },
+ "red/800": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#991b1b"
+ }
+ },
+ "red/900": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#7f1d1d"
+ }
+ },
+ "red/950": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#450a0a"
+ }
+ },
+ "orange/50": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fff7ed"
+ }
+ },
+ "orange/100": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#ffedd5"
+ }
+ },
+ "orange/200": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fed7aa"
+ }
+ },
+ "orange/300": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fdba74"
+ }
+ },
+ "orange/400": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fb923c"
+ }
+ },
+ "orange/500": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#f97316"
+ }
+ },
+ "orange/600": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#ea580c"
+ }
+ },
+ "orange/700": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#c2410c"
+ }
+ },
+ "orange/800": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#9a3412"
+ }
+ },
+ "orange/900": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#7c2d12"
+ }
+ },
+ "orange/950": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#431407"
+ }
+ },
+ "amber/50": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fffbeb"
+ }
+ },
+ "amber/100": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fef3c7"
+ }
+ },
+ "amber/200": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fde68a"
+ }
+ },
+ "amber/300": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fcd34d"
+ }
+ },
+ "amber/400": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fbbf24"
+ }
+ },
+ "amber/500": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#f59e0b"
+ }
+ },
+ "amber/600": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#d97706"
+ }
+ },
+ "amber/700": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#b45309"
+ }
+ },
+ "amber/800": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#92400e"
+ }
+ },
+ "amber/900": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#78350f"
+ }
+ },
+ "amber/950": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#451a03"
+ }
+ },
+ "yellow/50": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fefce8"
+ }
+ },
+ "yellow/100": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fef9c3"
+ }
+ },
+ "yellow/200": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fef08a"
+ }
+ },
+ "yellow/300": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fde047"
+ }
+ },
+ "yellow/400": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#facc15"
+ }
+ },
+ "yellow/500": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#eab308"
+ }
+ },
+ "yellow/600": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#ca8a04"
+ }
+ },
+ "yellow/700": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#a16207"
+ }
+ },
+ "yellow/800": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#854d0e"
+ }
+ },
+ "yellow/900": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#713f12"
+ }
+ },
+ "yellow/950": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#422006"
+ }
+ },
+ "lime/50": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#f7fee7"
+ }
+ },
+ "lime/100": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#ecfccb"
+ }
+ },
+ "lime/200": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#d9f99d"
+ }
+ },
+ "lime/300": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#bef264"
+ }
+ },
+ "lime/400": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#a3e635"
+ }
+ },
+ "lime/500": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#84cc16"
+ }
+ },
+ "lime/600": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#65a30d"
+ }
+ },
+ "lime/700": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#4d7c0f"
+ }
+ },
+ "lime/800": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#3f6212"
+ }
+ },
+ "lime/900": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#365314"
+ }
+ },
+ "lime/950": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#1a2e05"
+ }
+ },
+ "green/50": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#f0fdf4"
+ }
+ },
+ "green/100": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#dcfce7"
+ }
+ },
+ "green/200": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#bbf7d0"
+ }
+ },
+ "green/300": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#86efac"
+ }
+ },
+ "green/400": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#4ade80"
+ }
+ },
+ "green/500": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#22c55e"
+ }
+ },
+ "green/600": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#16a34a"
+ }
+ },
+ "green/700": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#15803d"
+ }
+ },
+ "green/800": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#166534"
+ }
+ },
+ "green/900": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#14532d"
+ }
+ },
+ "green/950": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#052e16"
+ }
+ },
+ "emerald/50": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#ecfdf5"
+ }
+ },
+ "emerald/100": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#d1fae5"
+ }
+ },
+ "emerald/200": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#a7f3d0"
+ }
+ },
+ "emerald/300": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#6ee7b7"
+ }
+ },
+ "emerald/400": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#34d399"
+ }
+ },
+ "emerald/500": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#10b981"
+ }
+ },
+ "emerald/600": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#059669"
+ }
+ },
+ "emerald/700": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#047857"
+ }
+ },
+ "emerald/800": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#065f46"
+ }
+ },
+ "emerald/900": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#064e3b"
+ }
+ },
+ "emerald/950": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#022c22"
+ }
+ },
+ "teal/50": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#f0fdfa"
+ }
+ },
+ "teal/100": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#ccfbf1"
+ }
+ },
+ "teal/200": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#99f6e4"
+ }
+ },
+ "teal/300": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#5eead4"
+ }
+ },
+ "teal/400": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#2dd4bf"
+ }
+ },
+ "teal/500": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#14b8a6"
+ }
+ },
+ "teal/600": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#0d9488"
+ }
+ },
+ "teal/700": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#0f766e"
+ }
+ },
+ "teal/800": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#115e59"
+ }
+ },
+ "teal/900": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#134e4a"
+ }
+ },
+ "teal/950": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#042f2e"
+ }
+ },
+ "cyan/50": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#ecfeff"
+ }
+ },
+ "cyan/100": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#cffafe"
+ }
+ },
+ "cyan/200": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#a5f3fc"
+ }
+ },
+ "cyan/300": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#67e8f9"
+ }
+ },
+ "cyan/400": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#22d3ee"
+ }
+ },
+ "cyan/500": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#06b6d4"
+ }
+ },
+ "cyan/600": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#0891b2"
+ }
+ },
+ "cyan/700": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#0e7490"
+ }
+ },
+ "cyan/800": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#155e75"
+ }
+ },
+ "cyan/900": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#164e63"
+ }
+ },
+ "cyan/950": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#083344"
+ }
+ },
+ "sky/50": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#f0f9ff"
+ }
+ },
+ "sky/100": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#e0f2fe"
+ }
+ },
+ "sky/200": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#bae6fd"
+ }
+ },
+ "sky/300": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#7dd3fc"
+ }
+ },
+ "sky/400": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#38bdf8"
+ }
+ },
+ "sky/500": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#0ea5e9"
+ }
+ },
+ "sky/600": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#0284c7"
+ }
+ },
+ "sky/700": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#0369a1"
+ }
+ },
+ "sky/800": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#075985"
+ }
+ },
+ "sky/900": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#0c4a6e"
+ }
+ },
+ "sky/950": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#082f49"
+ }
+ },
+ "blue/50": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#eff6ff"
+ }
+ },
+ "blue/100": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#dbeafe"
+ }
+ },
+ "blue/200": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#bfdbfe"
+ }
+ },
+ "blue/300": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#93c5fd"
+ }
+ },
+ "blue/400": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#60a5fa"
+ }
+ },
+ "blue/500": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#3b82f6"
+ }
+ },
+ "blue/600": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#2563eb"
+ }
+ },
+ "blue/700": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#1d4ed8"
+ }
+ },
+ "blue/800": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#1e40af"
+ }
+ },
+ "blue/900": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#1e3a8a"
+ }
+ },
+ "blue/950": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#172554"
+ }
+ },
+ "indigo/50": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#eef2ff"
+ }
+ },
+ "indigo/100": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#e0e7ff"
+ }
+ },
+ "indigo/200": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#c7d2fe"
+ }
+ },
+ "indigo/300": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#a5b4fc"
+ }
+ },
+ "indigo/400": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#818cf8"
+ }
+ },
+ "indigo/500": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#6366f1"
+ }
+ },
+ "indigo/600": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#4f46e5"
+ }
+ },
+ "indigo/700": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#4338ca"
+ }
+ },
+ "indigo/800": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#3730a3"
+ }
+ },
+ "indigo/900": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#312e81"
+ }
+ },
+ "indigo/950": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#1e1b4b"
+ }
+ },
+ "violet/50": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#f5f3ff"
+ }
+ },
+ "violet/100": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#ede9fe"
+ }
+ },
+ "violet/200": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#ddd6fe"
+ }
+ },
+ "violet/300": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#c4b5fd"
+ }
+ },
+ "violet/400": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#a78bfa"
+ }
+ },
+ "violet/500": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#8b5cf6"
+ }
+ },
+ "violet/600": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#7c3aed"
+ }
+ },
+ "violet/700": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#6d28d9"
+ }
+ },
+ "violet/800": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#5b21b6"
+ }
+ },
+ "violet/900": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#4c1d95"
+ }
+ },
+ "violet/950": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#2e1065"
+ }
+ },
+ "purple/50": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#faf5ff"
+ }
+ },
+ "purple/100": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#f3e8ff"
+ }
+ },
+ "purple/200": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#e9d5ff"
+ }
+ },
+ "purple/300": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#d8b4fe"
+ }
+ },
+ "purple/400": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#c084fc"
+ }
+ },
+ "purple/500": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#a855f7"
+ }
+ },
+ "purple/600": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#9333ea"
+ }
+ },
+ "purple/700": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#7e22ce"
+ }
+ },
+ "purple/800": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#6b21a8"
+ }
+ },
+ "purple/900": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#581c87"
+ }
+ },
+ "purple/950": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#3b0764"
+ }
+ },
+ "fuchsia/50": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fdf4ff"
+ }
+ },
+ "fuchsia/100": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fae8ff"
+ }
+ },
+ "fuchsia/200": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#f5d0fe"
+ }
+ },
+ "fuchsia/300": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#f0abfc"
+ }
+ },
+ "fuchsia/400": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#e879f9"
+ }
+ },
+ "fuchsia/500": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#d946ef"
+ }
+ },
+ "fuchsia/600": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#c026d3"
+ }
+ },
+ "fuchsia/700": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#a21caf"
+ }
+ },
+ "fuchsia/800": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#86198f"
+ }
+ },
+ "fuchsia/900": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#701a75"
+ }
+ },
+ "fuchsia/950": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#4a044e"
+ }
+ },
+ "pink/50": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fdf2f8"
+ }
+ },
+ "pink/100": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fce7f3"
+ }
+ },
+ "pink/200": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fbcfe8"
+ }
+ },
+ "pink/300": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#f9a8d4"
+ }
+ },
+ "pink/400": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#f472b6"
+ }
+ },
+ "pink/500": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#ec4899"
+ }
+ },
+ "pink/600": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#db2777"
+ }
+ },
+ "pink/700": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#be185d"
+ }
+ },
+ "pink/800": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#9d174d"
+ }
+ },
+ "pink/900": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#831843"
+ }
+ },
+ "pink/950": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#500724"
+ }
+ },
+ "rose/50": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fff1f2"
+ }
+ },
+ "rose/100": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#ffe4e6"
+ }
+ },
+ "rose/200": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fecdd3"
+ }
+ },
+ "rose/300": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fda4af"
+ }
+ },
+ "rose/400": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#fb7185"
+ }
+ },
+ "rose/500": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#f43f5e"
+ }
+ },
+ "rose/600": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#e11d48"
+ }
+ },
+ "rose/700": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#be123c"
+ }
+ },
+ "rose/800": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#9f1239"
+ }
+ },
+ "rose/900": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#881337"
+ }
+ },
+ "rose/950": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#4c0519"
+ }
+ },
+ "white": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#ffffff"
+ }
+ },
+ "black": {
+ "type": "COLOR",
+ "values": {
+ "Mode 1": "#000000"
+ }
+ }
+ }
+ },
+ "shadcn/semantic": {
+ "modes": [
+ "Light",
+ "Dark"
+ ],
+ "variables": {
+ "background": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "white"
+ },
+ "Dark": {
+ "alias": "zinc/950"
+ }
+ }
+ },
+ "foreground": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/950"
+ },
+ "Dark": {
+ "alias": "zinc/50"
+ }
+ }
+ },
+ "card": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "white"
+ },
+ "Dark": {
+ "alias": "zinc/950"
+ }
+ }
+ },
+ "card-foreground": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/950"
+ },
+ "Dark": {
+ "alias": "zinc/50"
+ }
+ }
+ },
+ "popover": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "white"
+ },
+ "Dark": {
+ "alias": "zinc/950"
+ }
+ }
+ },
+ "popover-foreground": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/950"
+ },
+ "Dark": {
+ "alias": "zinc/50"
+ }
+ }
+ },
+ "primary": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/900"
+ },
+ "Dark": {
+ "alias": "zinc/50"
+ }
+ }
+ },
+ "primary-foreground": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/50"
+ },
+ "Dark": {
+ "alias": "zinc/900"
+ }
+ }
+ },
+ "secondary": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/100"
+ },
+ "Dark": {
+ "alias": "zinc/800"
+ }
+ }
+ },
+ "secondary-foreground": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/900"
+ },
+ "Dark": {
+ "alias": "zinc/50"
+ }
+ }
+ },
+ "muted": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/100"
+ },
+ "Dark": {
+ "alias": "zinc/800"
+ }
+ }
+ },
+ "muted-foreground": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/500"
+ },
+ "Dark": {
+ "alias": "zinc/400"
+ }
+ }
+ },
+ "accent": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/100"
+ },
+ "Dark": {
+ "alias": "zinc/800"
+ }
+ }
+ },
+ "accent-foreground": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/900"
+ },
+ "Dark": {
+ "alias": "zinc/50"
+ }
+ }
+ },
+ "destructive": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "red/500"
+ },
+ "Dark": {
+ "alias": "red/900"
+ }
+ }
+ },
+ "destructive-foreground": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/50"
+ },
+ "Dark": {
+ "alias": "zinc/50"
+ }
+ }
+ },
+ "border": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/200"
+ },
+ "Dark": {
+ "alias": "zinc/800"
+ }
+ }
+ },
+ "input": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/200"
+ },
+ "Dark": {
+ "alias": "zinc/800"
+ }
+ }
+ },
+ "ring": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/950"
+ },
+ "Dark": {
+ "alias": "zinc/300"
+ }
+ }
+ },
+ "chart-1": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "orange/500"
+ },
+ "Dark": {
+ "alias": "blue/500"
+ }
+ }
+ },
+ "chart-2": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "teal/500"
+ },
+ "Dark": {
+ "alias": "emerald/500"
+ }
+ }
+ },
+ "chart-3": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "blue/500"
+ },
+ "Dark": {
+ "alias": "amber/500"
+ }
+ }
+ },
+ "chart-4": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "amber/500"
+ },
+ "Dark": {
+ "alias": "rose/500"
+ }
+ }
+ },
+ "chart-5": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "rose/500"
+ },
+ "Dark": {
+ "alias": "violet/500"
+ }
+ }
+ },
+ "sidebar-background": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/50"
+ },
+ "Dark": {
+ "alias": "zinc/950"
+ }
+ }
+ },
+ "sidebar-foreground": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/900"
+ },
+ "Dark": {
+ "alias": "zinc/50"
+ }
+ }
+ },
+ "sidebar-primary": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/900"
+ },
+ "Dark": {
+ "alias": "zinc/50"
+ }
+ }
+ },
+ "sidebar-primary-foreground": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/50"
+ },
+ "Dark": {
+ "alias": "zinc/900"
+ }
+ }
+ },
+ "sidebar-accent": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/100"
+ },
+ "Dark": {
+ "alias": "zinc/800"
+ }
+ }
+ },
+ "sidebar-accent-foreground": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/900"
+ },
+ "Dark": {
+ "alias": "zinc/50"
+ }
+ }
+ },
+ "sidebar-border": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/200"
+ },
+ "Dark": {
+ "alias": "zinc/800"
+ }
+ }
+ },
+ "sidebar-ring": {
+ "type": "COLOR",
+ "values": {
+ "Light": {
+ "alias": "zinc/950"
+ },
+ "Dark": {
+ "alias": "zinc/300"
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
diff --git a/button-tokens.css b/button-tokens.css
new file mode 100644
index 00000000..a5430be8
--- /dev/null
+++ b/button-tokens.css
@@ -0,0 +1,278 @@
+:root {
+ --slate-50: #f8fafc;
+ --slate-100: #f1f5f9;
+ --slate-200: #e2e8f0;
+ --slate-300: #cbd5e1;
+ --slate-400: #94a3b8;
+ --slate-500: #64748b;
+ --slate-600: #475569;
+ --slate-700: #334155;
+ --slate-800: #1e293b;
+ --slate-900: #0f172a;
+ --slate-950: #020617;
+ --gray-50: #f9fafb;
+ --gray-100: #f3f4f6;
+ --gray-200: #e5e7eb;
+ --gray-300: #d1d5db;
+ --gray-400: #9ca3af;
+ --gray-500: #6b7280;
+ --gray-600: #4b5563;
+ --gray-700: #374151;
+ --gray-800: #1f2937;
+ --gray-900: #111827;
+ --gray-950: #030712;
+ --zinc-50: #fafafa;
+ --zinc-100: #f4f4f5;
+ --zinc-200: #e4e4e7;
+ --zinc-300: #d4d4d8;
+ --zinc-400: #a1a1aa;
+ --zinc-500: #71717a;
+ --zinc-600: #52525b;
+ --zinc-700: #3f3f46;
+ --zinc-800: #27272a;
+ --zinc-900: #18181b;
+ --zinc-950: #09090b;
+ --neutral-50: #fafafa;
+ --neutral-100: #f5f5f5;
+ --neutral-200: #e5e5e5;
+ --neutral-300: #d4d4d4;
+ --neutral-400: #a3a3a3;
+ --neutral-500: #737373;
+ --neutral-600: #525252;
+ --neutral-700: #404040;
+ --neutral-800: #262626;
+ --neutral-900: #171717;
+ --neutral-950: #0a0a0a;
+ --stone-50: #fafaf9;
+ --stone-100: #f5f5f4;
+ --stone-200: #e7e5e4;
+ --stone-300: #d6d3d1;
+ --stone-400: #a8a29e;
+ --stone-500: #78716c;
+ --stone-600: #57534e;
+ --stone-700: #44403c;
+ --stone-800: #292524;
+ --stone-900: #1c1917;
+ --stone-950: #0c0a09;
+ --red-50: #fef2f2;
+ --red-100: #fee2e2;
+ --red-200: #fecaca;
+ --red-300: #fca5a5;
+ --red-400: #f87171;
+ --red-500: #ef4444;
+ --red-600: #dc2626;
+ --red-700: #b91c1c;
+ --red-800: #991b1b;
+ --red-900: #7f1d1d;
+ --red-950: #450a0a;
+ --orange-50: #fff7ed;
+ --orange-100: #ffedd5;
+ --orange-200: #fed7aa;
+ --orange-300: #fdba74;
+ --orange-400: #fb923c;
+ --orange-500: #f97316;
+ --orange-600: #ea580c;
+ --orange-700: #c2410c;
+ --orange-800: #9a3412;
+ --orange-900: #7c2d12;
+ --orange-950: #431407;
+ --amber-50: #fffbeb;
+ --amber-100: #fef3c7;
+ --amber-200: #fde68a;
+ --amber-300: #fcd34d;
+ --amber-400: #fbbf24;
+ --amber-500: #f59e0b;
+ --amber-600: #d97706;
+ --amber-700: #b45309;
+ --amber-800: #92400e;
+ --amber-900: #78350f;
+ --amber-950: #451a03;
+ --yellow-50: #fefce8;
+ --yellow-100: #fef9c3;
+ --yellow-200: #fef08a;
+ --yellow-300: #fde047;
+ --yellow-400: #facc15;
+ --yellow-500: #eab308;
+ --yellow-600: #ca8a04;
+ --yellow-700: #a16207;
+ --yellow-800: #854d0e;
+ --yellow-900: #713f12;
+ --yellow-950: #422006;
+ --lime-50: #f7fee7;
+ --lime-100: #ecfccb;
+ --lime-200: #d9f99d;
+ --lime-300: #bef264;
+ --lime-400: #a3e635;
+ --lime-500: #84cc16;
+ --lime-600: #65a30d;
+ --lime-700: #4d7c0f;
+ --lime-800: #3f6212;
+ --lime-900: #365314;
+ --lime-950: #1a2e05;
+ --green-50: #f0fdf4;
+ --green-100: #dcfce7;
+ --green-200: #bbf7d0;
+ --green-300: #86efac;
+ --green-400: #4ade80;
+ --green-500: #22c55e;
+ --green-600: #16a34a;
+ --green-700: #15803d;
+ --green-800: #166534;
+ --green-900: #14532d;
+ --green-950: #052e16;
+ --emerald-50: #ecfdf5;
+ --emerald-100: #d1fae5;
+ --emerald-200: #a7f3d0;
+ --emerald-300: #6ee7b7;
+ --emerald-400: #34d399;
+ --emerald-500: #10b981;
+ --emerald-600: #059669;
+ --emerald-700: #047857;
+ --emerald-800: #065f46;
+ --emerald-900: #064e3b;
+ --emerald-950: #022c22;
+ --teal-50: #f0fdfa;
+ --teal-100: #ccfbf1;
+ --teal-200: #99f6e4;
+ --teal-300: #5eead4;
+ --teal-400: #2dd4bf;
+ --teal-500: #14b8a6;
+ --teal-600: #0d9488;
+ --teal-700: #0f766e;
+ --teal-800: #115e59;
+ --teal-900: #134e4a;
+ --teal-950: #042f2e;
+ --cyan-50: #ecfeff;
+ --cyan-100: #cffafe;
+ --cyan-200: #a5f3fc;
+ --cyan-300: #67e8f9;
+ --cyan-400: #22d3ee;
+ --cyan-500: #06b6d4;
+ --cyan-600: #0891b2;
+ --cyan-700: #0e7490;
+ --cyan-800: #155e75;
+ --cyan-900: #164e63;
+ --cyan-950: #083344;
+ --sky-50: #f0f9ff;
+ --sky-100: #e0f2fe;
+ --sky-200: #bae6fd;
+ --sky-300: #7dd3fc;
+ --sky-400: #38bdf8;
+ --sky-500: #0ea5e9;
+ --sky-600: #0284c7;
+ --sky-700: #0369a1;
+ --sky-800: #075985;
+ --sky-900: #0c4a6e;
+ --sky-950: #082f49;
+ --blue-50: #eff6ff;
+ --blue-100: #dbeafe;
+ --blue-200: #bfdbfe;
+ --blue-300: #93c5fd;
+ --blue-400: #60a5fa;
+ --blue-500: #3b82f6;
+ --blue-600: #2563eb;
+ --blue-700: #1d4ed8;
+ --blue-800: #1e40af;
+ --blue-900: #1e3a8a;
+ --blue-950: #172554;
+ --indigo-50: #eef2ff;
+ --indigo-100: #e0e7ff;
+ --indigo-200: #c7d2fe;
+ --indigo-300: #a5b4fc;
+ --indigo-400: #818cf8;
+ --indigo-500: #6366f1;
+ --indigo-600: #4f46e5;
+ --indigo-700: #4338ca;
+ --indigo-800: #3730a3;
+ --indigo-900: #312e81;
+ --indigo-950: #1e1b4b;
+ --violet-50: #f5f3ff;
+ --violet-100: #ede9fe;
+ --violet-200: #ddd6fe;
+ --violet-300: #c4b5fd;
+ --violet-400: #a78bfa;
+ --violet-500: #8b5cf6;
+ --violet-600: #7c3aed;
+ --violet-700: #6d28d9;
+ --violet-800: #5b21b6;
+ --violet-900: #4c1d95;
+ --violet-950: #2e1065;
+ --purple-50: #faf5ff;
+ --purple-100: #f3e8ff;
+ --purple-200: #e9d5ff;
+ --purple-300: #d8b4fe;
+ --purple-400: #c084fc;
+ --purple-500: #a855f7;
+ --purple-600: #9333ea;
+ --purple-700: #7e22ce;
+ --purple-800: #6b21a8;
+ --purple-900: #581c87;
+ --purple-950: #3b0764;
+ --fuchsia-50: #fdf4ff;
+ --fuchsia-100: #fae8ff;
+ --fuchsia-200: #f5d0fe;
+ --fuchsia-300: #f0abfc;
+ --fuchsia-400: #e879f9;
+ --fuchsia-500: #d946ef;
+ --fuchsia-600: #c026d3;
+ --fuchsia-700: #a21caf;
+ --fuchsia-800: #86198f;
+ --fuchsia-900: #701a75;
+ --fuchsia-950: #4a044e;
+ --pink-50: #fdf2f8;
+ --pink-100: #fce7f3;
+ --pink-200: #fbcfe8;
+ --pink-300: #f9a8d4;
+ --pink-400: #f472b6;
+ --pink-500: #ec4899;
+ --pink-600: #db2777;
+ --pink-700: #be185d;
+ --pink-800: #9d174d;
+ --pink-900: #831843;
+ --pink-950: #500724;
+ --rose-50: #fff1f2;
+ --rose-100: #ffe4e6;
+ --rose-200: #fecdd3;
+ --rose-300: #fda4af;
+ --rose-400: #fb7185;
+ --rose-500: #f43f5e;
+ --rose-600: #e11d48;
+ --rose-700: #be123c;
+ --rose-800: #9f1239;
+ --rose-900: #881337;
+ --rose-950: #4c0519;
+ --white: #ffffff;
+ --black: #000000;
+ --background: #NaNNaNNaN;
+ --foreground: #NaNNaNNaN;
+ --card: #NaNNaNNaN;
+ --card-foreground: #NaNNaNNaN;
+ --popover: #NaNNaNNaN;
+ --popover-foreground: #NaNNaNNaN;
+ --primary: #NaNNaNNaN;
+ --primary-foreground: #NaNNaNNaN;
+ --secondary: #NaNNaNNaN;
+ --secondary-foreground: #NaNNaNNaN;
+ --muted: #NaNNaNNaN;
+ --muted-foreground: #NaNNaNNaN;
+ --accent: #NaNNaNNaN;
+ --accent-foreground: #NaNNaNNaN;
+ --destructive: #NaNNaNNaN;
+ --destructive-foreground: #NaNNaNNaN;
+ --border: #NaNNaNNaN;
+ --input: #NaNNaNNaN;
+ --ring: #NaNNaNNaN;
+ --chart-1: #NaNNaNNaN;
+ --chart-2: #NaNNaNNaN;
+ --chart-3: #NaNNaNNaN;
+ --chart-4: #NaNNaNNaN;
+ --chart-5: #NaNNaNNaN;
+ --sidebar-background: #NaNNaNNaN;
+ --sidebar-foreground: #NaNNaNNaN;
+ --sidebar-primary: #NaNNaNNaN;
+ --sidebar-primary-foreground: #NaNNaNNaN;
+ --sidebar-accent: #NaNNaNNaN;
+ --sidebar-accent-foreground: #NaNNaNNaN;
+ --sidebar-border: #NaNNaNNaN;
+ --sidebar-ring: #NaNNaNNaN;
+}
diff --git a/button-tokens.json b/button-tokens.json
new file mode 100644
index 00000000..cbe174af
--- /dev/null
+++ b/button-tokens.json
@@ -0,0 +1,1150 @@
+{
+ "slate": {
+ "50": {
+ "$type": "color",
+ "$value": "#f8fafc"
+ },
+ "100": {
+ "$type": "color",
+ "$value": "#f1f5f9"
+ },
+ "200": {
+ "$type": "color",
+ "$value": "#e2e8f0"
+ },
+ "300": {
+ "$type": "color",
+ "$value": "#cbd5e1"
+ },
+ "400": {
+ "$type": "color",
+ "$value": "#94a3b8"
+ },
+ "500": {
+ "$type": "color",
+ "$value": "#64748b"
+ },
+ "600": {
+ "$type": "color",
+ "$value": "#475569"
+ },
+ "700": {
+ "$type": "color",
+ "$value": "#334155"
+ },
+ "800": {
+ "$type": "color",
+ "$value": "#1e293b"
+ },
+ "900": {
+ "$type": "color",
+ "$value": "#0f172a"
+ },
+ "950": {
+ "$type": "color",
+ "$value": "#020617"
+ }
+ },
+ "gray": {
+ "50": {
+ "$type": "color",
+ "$value": "#f9fafb"
+ },
+ "100": {
+ "$type": "color",
+ "$value": "#f3f4f6"
+ },
+ "200": {
+ "$type": "color",
+ "$value": "#e5e7eb"
+ },
+ "300": {
+ "$type": "color",
+ "$value": "#d1d5db"
+ },
+ "400": {
+ "$type": "color",
+ "$value": "#9ca3af"
+ },
+ "500": {
+ "$type": "color",
+ "$value": "#6b7280"
+ },
+ "600": {
+ "$type": "color",
+ "$value": "#4b5563"
+ },
+ "700": {
+ "$type": "color",
+ "$value": "#374151"
+ },
+ "800": {
+ "$type": "color",
+ "$value": "#1f2937"
+ },
+ "900": {
+ "$type": "color",
+ "$value": "#111827"
+ },
+ "950": {
+ "$type": "color",
+ "$value": "#030712"
+ }
+ },
+ "zinc": {
+ "50": {
+ "$type": "color",
+ "$value": "#fafafa"
+ },
+ "100": {
+ "$type": "color",
+ "$value": "#f4f4f5"
+ },
+ "200": {
+ "$type": "color",
+ "$value": "#e4e4e7"
+ },
+ "300": {
+ "$type": "color",
+ "$value": "#d4d4d8"
+ },
+ "400": {
+ "$type": "color",
+ "$value": "#a1a1aa"
+ },
+ "500": {
+ "$type": "color",
+ "$value": "#71717a"
+ },
+ "600": {
+ "$type": "color",
+ "$value": "#52525b"
+ },
+ "700": {
+ "$type": "color",
+ "$value": "#3f3f46"
+ },
+ "800": {
+ "$type": "color",
+ "$value": "#27272a"
+ },
+ "900": {
+ "$type": "color",
+ "$value": "#18181b"
+ },
+ "950": {
+ "$type": "color",
+ "$value": "#09090b"
+ }
+ },
+ "neutral": {
+ "50": {
+ "$type": "color",
+ "$value": "#fafafa"
+ },
+ "100": {
+ "$type": "color",
+ "$value": "#f5f5f5"
+ },
+ "200": {
+ "$type": "color",
+ "$value": "#e5e5e5"
+ },
+ "300": {
+ "$type": "color",
+ "$value": "#d4d4d4"
+ },
+ "400": {
+ "$type": "color",
+ "$value": "#a3a3a3"
+ },
+ "500": {
+ "$type": "color",
+ "$value": "#737373"
+ },
+ "600": {
+ "$type": "color",
+ "$value": "#525252"
+ },
+ "700": {
+ "$type": "color",
+ "$value": "#404040"
+ },
+ "800": {
+ "$type": "color",
+ "$value": "#262626"
+ },
+ "900": {
+ "$type": "color",
+ "$value": "#171717"
+ },
+ "950": {
+ "$type": "color",
+ "$value": "#0a0a0a"
+ }
+ },
+ "stone": {
+ "50": {
+ "$type": "color",
+ "$value": "#fafaf9"
+ },
+ "100": {
+ "$type": "color",
+ "$value": "#f5f5f4"
+ },
+ "200": {
+ "$type": "color",
+ "$value": "#e7e5e4"
+ },
+ "300": {
+ "$type": "color",
+ "$value": "#d6d3d1"
+ },
+ "400": {
+ "$type": "color",
+ "$value": "#a8a29e"
+ },
+ "500": {
+ "$type": "color",
+ "$value": "#78716c"
+ },
+ "600": {
+ "$type": "color",
+ "$value": "#57534e"
+ },
+ "700": {
+ "$type": "color",
+ "$value": "#44403c"
+ },
+ "800": {
+ "$type": "color",
+ "$value": "#292524"
+ },
+ "900": {
+ "$type": "color",
+ "$value": "#1c1917"
+ },
+ "950": {
+ "$type": "color",
+ "$value": "#0c0a09"
+ }
+ },
+ "red": {
+ "50": {
+ "$type": "color",
+ "$value": "#fef2f2"
+ },
+ "100": {
+ "$type": "color",
+ "$value": "#fee2e2"
+ },
+ "200": {
+ "$type": "color",
+ "$value": "#fecaca"
+ },
+ "300": {
+ "$type": "color",
+ "$value": "#fca5a5"
+ },
+ "400": {
+ "$type": "color",
+ "$value": "#f87171"
+ },
+ "500": {
+ "$type": "color",
+ "$value": "#ef4444"
+ },
+ "600": {
+ "$type": "color",
+ "$value": "#dc2626"
+ },
+ "700": {
+ "$type": "color",
+ "$value": "#b91c1c"
+ },
+ "800": {
+ "$type": "color",
+ "$value": "#991b1b"
+ },
+ "900": {
+ "$type": "color",
+ "$value": "#7f1d1d"
+ },
+ "950": {
+ "$type": "color",
+ "$value": "#450a0a"
+ }
+ },
+ "orange": {
+ "50": {
+ "$type": "color",
+ "$value": "#fff7ed"
+ },
+ "100": {
+ "$type": "color",
+ "$value": "#ffedd5"
+ },
+ "200": {
+ "$type": "color",
+ "$value": "#fed7aa"
+ },
+ "300": {
+ "$type": "color",
+ "$value": "#fdba74"
+ },
+ "400": {
+ "$type": "color",
+ "$value": "#fb923c"
+ },
+ "500": {
+ "$type": "color",
+ "$value": "#f97316"
+ },
+ "600": {
+ "$type": "color",
+ "$value": "#ea580c"
+ },
+ "700": {
+ "$type": "color",
+ "$value": "#c2410c"
+ },
+ "800": {
+ "$type": "color",
+ "$value": "#9a3412"
+ },
+ "900": {
+ "$type": "color",
+ "$value": "#7c2d12"
+ },
+ "950": {
+ "$type": "color",
+ "$value": "#431407"
+ }
+ },
+ "amber": {
+ "50": {
+ "$type": "color",
+ "$value": "#fffbeb"
+ },
+ "100": {
+ "$type": "color",
+ "$value": "#fef3c7"
+ },
+ "200": {
+ "$type": "color",
+ "$value": "#fde68a"
+ },
+ "300": {
+ "$type": "color",
+ "$value": "#fcd34d"
+ },
+ "400": {
+ "$type": "color",
+ "$value": "#fbbf24"
+ },
+ "500": {
+ "$type": "color",
+ "$value": "#f59e0b"
+ },
+ "600": {
+ "$type": "color",
+ "$value": "#d97706"
+ },
+ "700": {
+ "$type": "color",
+ "$value": "#b45309"
+ },
+ "800": {
+ "$type": "color",
+ "$value": "#92400e"
+ },
+ "900": {
+ "$type": "color",
+ "$value": "#78350f"
+ },
+ "950": {
+ "$type": "color",
+ "$value": "#451a03"
+ }
+ },
+ "yellow": {
+ "50": {
+ "$type": "color",
+ "$value": "#fefce8"
+ },
+ "100": {
+ "$type": "color",
+ "$value": "#fef9c3"
+ },
+ "200": {
+ "$type": "color",
+ "$value": "#fef08a"
+ },
+ "300": {
+ "$type": "color",
+ "$value": "#fde047"
+ },
+ "400": {
+ "$type": "color",
+ "$value": "#facc15"
+ },
+ "500": {
+ "$type": "color",
+ "$value": "#eab308"
+ },
+ "600": {
+ "$type": "color",
+ "$value": "#ca8a04"
+ },
+ "700": {
+ "$type": "color",
+ "$value": "#a16207"
+ },
+ "800": {
+ "$type": "color",
+ "$value": "#854d0e"
+ },
+ "900": {
+ "$type": "color",
+ "$value": "#713f12"
+ },
+ "950": {
+ "$type": "color",
+ "$value": "#422006"
+ }
+ },
+ "lime": {
+ "50": {
+ "$type": "color",
+ "$value": "#f7fee7"
+ },
+ "100": {
+ "$type": "color",
+ "$value": "#ecfccb"
+ },
+ "200": {
+ "$type": "color",
+ "$value": "#d9f99d"
+ },
+ "300": {
+ "$type": "color",
+ "$value": "#bef264"
+ },
+ "400": {
+ "$type": "color",
+ "$value": "#a3e635"
+ },
+ "500": {
+ "$type": "color",
+ "$value": "#84cc16"
+ },
+ "600": {
+ "$type": "color",
+ "$value": "#65a30d"
+ },
+ "700": {
+ "$type": "color",
+ "$value": "#4d7c0f"
+ },
+ "800": {
+ "$type": "color",
+ "$value": "#3f6212"
+ },
+ "900": {
+ "$type": "color",
+ "$value": "#365314"
+ },
+ "950": {
+ "$type": "color",
+ "$value": "#1a2e05"
+ }
+ },
+ "green": {
+ "50": {
+ "$type": "color",
+ "$value": "#f0fdf4"
+ },
+ "100": {
+ "$type": "color",
+ "$value": "#dcfce7"
+ },
+ "200": {
+ "$type": "color",
+ "$value": "#bbf7d0"
+ },
+ "300": {
+ "$type": "color",
+ "$value": "#86efac"
+ },
+ "400": {
+ "$type": "color",
+ "$value": "#4ade80"
+ },
+ "500": {
+ "$type": "color",
+ "$value": "#22c55e"
+ },
+ "600": {
+ "$type": "color",
+ "$value": "#16a34a"
+ },
+ "700": {
+ "$type": "color",
+ "$value": "#15803d"
+ },
+ "800": {
+ "$type": "color",
+ "$value": "#166534"
+ },
+ "900": {
+ "$type": "color",
+ "$value": "#14532d"
+ },
+ "950": {
+ "$type": "color",
+ "$value": "#052e16"
+ }
+ },
+ "emerald": {
+ "50": {
+ "$type": "color",
+ "$value": "#ecfdf5"
+ },
+ "100": {
+ "$type": "color",
+ "$value": "#d1fae5"
+ },
+ "200": {
+ "$type": "color",
+ "$value": "#a7f3d0"
+ },
+ "300": {
+ "$type": "color",
+ "$value": "#6ee7b7"
+ },
+ "400": {
+ "$type": "color",
+ "$value": "#34d399"
+ },
+ "500": {
+ "$type": "color",
+ "$value": "#10b981"
+ },
+ "600": {
+ "$type": "color",
+ "$value": "#059669"
+ },
+ "700": {
+ "$type": "color",
+ "$value": "#047857"
+ },
+ "800": {
+ "$type": "color",
+ "$value": "#065f46"
+ },
+ "900": {
+ "$type": "color",
+ "$value": "#064e3b"
+ },
+ "950": {
+ "$type": "color",
+ "$value": "#022c22"
+ }
+ },
+ "teal": {
+ "50": {
+ "$type": "color",
+ "$value": "#f0fdfa"
+ },
+ "100": {
+ "$type": "color",
+ "$value": "#ccfbf1"
+ },
+ "200": {
+ "$type": "color",
+ "$value": "#99f6e4"
+ },
+ "300": {
+ "$type": "color",
+ "$value": "#5eead4"
+ },
+ "400": {
+ "$type": "color",
+ "$value": "#2dd4bf"
+ },
+ "500": {
+ "$type": "color",
+ "$value": "#14b8a6"
+ },
+ "600": {
+ "$type": "color",
+ "$value": "#0d9488"
+ },
+ "700": {
+ "$type": "color",
+ "$value": "#0f766e"
+ },
+ "800": {
+ "$type": "color",
+ "$value": "#115e59"
+ },
+ "900": {
+ "$type": "color",
+ "$value": "#134e4a"
+ },
+ "950": {
+ "$type": "color",
+ "$value": "#042f2e"
+ }
+ },
+ "cyan": {
+ "50": {
+ "$type": "color",
+ "$value": "#ecfeff"
+ },
+ "100": {
+ "$type": "color",
+ "$value": "#cffafe"
+ },
+ "200": {
+ "$type": "color",
+ "$value": "#a5f3fc"
+ },
+ "300": {
+ "$type": "color",
+ "$value": "#67e8f9"
+ },
+ "400": {
+ "$type": "color",
+ "$value": "#22d3ee"
+ },
+ "500": {
+ "$type": "color",
+ "$value": "#06b6d4"
+ },
+ "600": {
+ "$type": "color",
+ "$value": "#0891b2"
+ },
+ "700": {
+ "$type": "color",
+ "$value": "#0e7490"
+ },
+ "800": {
+ "$type": "color",
+ "$value": "#155e75"
+ },
+ "900": {
+ "$type": "color",
+ "$value": "#164e63"
+ },
+ "950": {
+ "$type": "color",
+ "$value": "#083344"
+ }
+ },
+ "sky": {
+ "50": {
+ "$type": "color",
+ "$value": "#f0f9ff"
+ },
+ "100": {
+ "$type": "color",
+ "$value": "#e0f2fe"
+ },
+ "200": {
+ "$type": "color",
+ "$value": "#bae6fd"
+ },
+ "300": {
+ "$type": "color",
+ "$value": "#7dd3fc"
+ },
+ "400": {
+ "$type": "color",
+ "$value": "#38bdf8"
+ },
+ "500": {
+ "$type": "color",
+ "$value": "#0ea5e9"
+ },
+ "600": {
+ "$type": "color",
+ "$value": "#0284c7"
+ },
+ "700": {
+ "$type": "color",
+ "$value": "#0369a1"
+ },
+ "800": {
+ "$type": "color",
+ "$value": "#075985"
+ },
+ "900": {
+ "$type": "color",
+ "$value": "#0c4a6e"
+ },
+ "950": {
+ "$type": "color",
+ "$value": "#082f49"
+ }
+ },
+ "blue": {
+ "50": {
+ "$type": "color",
+ "$value": "#eff6ff"
+ },
+ "100": {
+ "$type": "color",
+ "$value": "#dbeafe"
+ },
+ "200": {
+ "$type": "color",
+ "$value": "#bfdbfe"
+ },
+ "300": {
+ "$type": "color",
+ "$value": "#93c5fd"
+ },
+ "400": {
+ "$type": "color",
+ "$value": "#60a5fa"
+ },
+ "500": {
+ "$type": "color",
+ "$value": "#3b82f6"
+ },
+ "600": {
+ "$type": "color",
+ "$value": "#2563eb"
+ },
+ "700": {
+ "$type": "color",
+ "$value": "#1d4ed8"
+ },
+ "800": {
+ "$type": "color",
+ "$value": "#1e40af"
+ },
+ "900": {
+ "$type": "color",
+ "$value": "#1e3a8a"
+ },
+ "950": {
+ "$type": "color",
+ "$value": "#172554"
+ }
+ },
+ "indigo": {
+ "50": {
+ "$type": "color",
+ "$value": "#eef2ff"
+ },
+ "100": {
+ "$type": "color",
+ "$value": "#e0e7ff"
+ },
+ "200": {
+ "$type": "color",
+ "$value": "#c7d2fe"
+ },
+ "300": {
+ "$type": "color",
+ "$value": "#a5b4fc"
+ },
+ "400": {
+ "$type": "color",
+ "$value": "#818cf8"
+ },
+ "500": {
+ "$type": "color",
+ "$value": "#6366f1"
+ },
+ "600": {
+ "$type": "color",
+ "$value": "#4f46e5"
+ },
+ "700": {
+ "$type": "color",
+ "$value": "#4338ca"
+ },
+ "800": {
+ "$type": "color",
+ "$value": "#3730a3"
+ },
+ "900": {
+ "$type": "color",
+ "$value": "#312e81"
+ },
+ "950": {
+ "$type": "color",
+ "$value": "#1e1b4b"
+ }
+ },
+ "violet": {
+ "50": {
+ "$type": "color",
+ "$value": "#f5f3ff"
+ },
+ "100": {
+ "$type": "color",
+ "$value": "#ede9fe"
+ },
+ "200": {
+ "$type": "color",
+ "$value": "#ddd6fe"
+ },
+ "300": {
+ "$type": "color",
+ "$value": "#c4b5fd"
+ },
+ "400": {
+ "$type": "color",
+ "$value": "#a78bfa"
+ },
+ "500": {
+ "$type": "color",
+ "$value": "#8b5cf6"
+ },
+ "600": {
+ "$type": "color",
+ "$value": "#7c3aed"
+ },
+ "700": {
+ "$type": "color",
+ "$value": "#6d28d9"
+ },
+ "800": {
+ "$type": "color",
+ "$value": "#5b21b6"
+ },
+ "900": {
+ "$type": "color",
+ "$value": "#4c1d95"
+ },
+ "950": {
+ "$type": "color",
+ "$value": "#2e1065"
+ }
+ },
+ "purple": {
+ "50": {
+ "$type": "color",
+ "$value": "#faf5ff"
+ },
+ "100": {
+ "$type": "color",
+ "$value": "#f3e8ff"
+ },
+ "200": {
+ "$type": "color",
+ "$value": "#e9d5ff"
+ },
+ "300": {
+ "$type": "color",
+ "$value": "#d8b4fe"
+ },
+ "400": {
+ "$type": "color",
+ "$value": "#c084fc"
+ },
+ "500": {
+ "$type": "color",
+ "$value": "#a855f7"
+ },
+ "600": {
+ "$type": "color",
+ "$value": "#9333ea"
+ },
+ "700": {
+ "$type": "color",
+ "$value": "#7e22ce"
+ },
+ "800": {
+ "$type": "color",
+ "$value": "#6b21a8"
+ },
+ "900": {
+ "$type": "color",
+ "$value": "#581c87"
+ },
+ "950": {
+ "$type": "color",
+ "$value": "#3b0764"
+ }
+ },
+ "fuchsia": {
+ "50": {
+ "$type": "color",
+ "$value": "#fdf4ff"
+ },
+ "100": {
+ "$type": "color",
+ "$value": "#fae8ff"
+ },
+ "200": {
+ "$type": "color",
+ "$value": "#f5d0fe"
+ },
+ "300": {
+ "$type": "color",
+ "$value": "#f0abfc"
+ },
+ "400": {
+ "$type": "color",
+ "$value": "#e879f9"
+ },
+ "500": {
+ "$type": "color",
+ "$value": "#d946ef"
+ },
+ "600": {
+ "$type": "color",
+ "$value": "#c026d3"
+ },
+ "700": {
+ "$type": "color",
+ "$value": "#a21caf"
+ },
+ "800": {
+ "$type": "color",
+ "$value": "#86198f"
+ },
+ "900": {
+ "$type": "color",
+ "$value": "#701a75"
+ },
+ "950": {
+ "$type": "color",
+ "$value": "#4a044e"
+ }
+ },
+ "pink": {
+ "50": {
+ "$type": "color",
+ "$value": "#fdf2f8"
+ },
+ "100": {
+ "$type": "color",
+ "$value": "#fce7f3"
+ },
+ "200": {
+ "$type": "color",
+ "$value": "#fbcfe8"
+ },
+ "300": {
+ "$type": "color",
+ "$value": "#f9a8d4"
+ },
+ "400": {
+ "$type": "color",
+ "$value": "#f472b6"
+ },
+ "500": {
+ "$type": "color",
+ "$value": "#ec4899"
+ },
+ "600": {
+ "$type": "color",
+ "$value": "#db2777"
+ },
+ "700": {
+ "$type": "color",
+ "$value": "#be185d"
+ },
+ "800": {
+ "$type": "color",
+ "$value": "#9d174d"
+ },
+ "900": {
+ "$type": "color",
+ "$value": "#831843"
+ },
+ "950": {
+ "$type": "color",
+ "$value": "#500724"
+ }
+ },
+ "rose": {
+ "50": {
+ "$type": "color",
+ "$value": "#fff1f2"
+ },
+ "100": {
+ "$type": "color",
+ "$value": "#ffe4e6"
+ },
+ "200": {
+ "$type": "color",
+ "$value": "#fecdd3"
+ },
+ "300": {
+ "$type": "color",
+ "$value": "#fda4af"
+ },
+ "400": {
+ "$type": "color",
+ "$value": "#fb7185"
+ },
+ "500": {
+ "$type": "color",
+ "$value": "#f43f5e"
+ },
+ "600": {
+ "$type": "color",
+ "$value": "#e11d48"
+ },
+ "700": {
+ "$type": "color",
+ "$value": "#be123c"
+ },
+ "800": {
+ "$type": "color",
+ "$value": "#9f1239"
+ },
+ "900": {
+ "$type": "color",
+ "$value": "#881337"
+ },
+ "950": {
+ "$type": "color",
+ "$value": "#4c0519"
+ }
+ },
+ "white": {
+ "$type": "color",
+ "$value": "#ffffff"
+ },
+ "black": {
+ "$type": "color",
+ "$value": "#000000"
+ },
+ "background": {
+ "$type": "color",
+ "$value": "{white}"
+ },
+ "foreground": {
+ "$type": "color",
+ "$value": "{zinc.950}"
+ },
+ "card": {
+ "$type": "color",
+ "$value": "{white}"
+ },
+ "card-foreground": {
+ "$type": "color",
+ "$value": "{zinc.950}"
+ },
+ "popover": {
+ "$type": "color",
+ "$value": "{white}"
+ },
+ "popover-foreground": {
+ "$type": "color",
+ "$value": "{zinc.950}"
+ },
+ "primary": {
+ "$type": "color",
+ "$value": "{zinc.900}"
+ },
+ "primary-foreground": {
+ "$type": "color",
+ "$value": "{zinc.50}"
+ },
+ "secondary": {
+ "$type": "color",
+ "$value": "{zinc.100}"
+ },
+ "secondary-foreground": {
+ "$type": "color",
+ "$value": "{zinc.900}"
+ },
+ "muted": {
+ "$type": "color",
+ "$value": "{zinc.100}"
+ },
+ "muted-foreground": {
+ "$type": "color",
+ "$value": "{zinc.500}"
+ },
+ "accent": {
+ "$type": "color",
+ "$value": "{zinc.100}"
+ },
+ "accent-foreground": {
+ "$type": "color",
+ "$value": "{zinc.900}"
+ },
+ "destructive": {
+ "$type": "color",
+ "$value": "{red.500}"
+ },
+ "destructive-foreground": {
+ "$type": "color",
+ "$value": "{zinc.50}"
+ },
+ "border": {
+ "$type": "color",
+ "$value": "{zinc.200}"
+ },
+ "input": {
+ "$type": "color",
+ "$value": "{zinc.200}"
+ },
+ "ring": {
+ "$type": "color",
+ "$value": "{zinc.950}"
+ },
+ "chart-1": {
+ "$type": "color",
+ "$value": "{orange.500}"
+ },
+ "chart-2": {
+ "$type": "color",
+ "$value": "{teal.500}"
+ },
+ "chart-3": {
+ "$type": "color",
+ "$value": "{blue.500}"
+ },
+ "chart-4": {
+ "$type": "color",
+ "$value": "{amber.500}"
+ },
+ "chart-5": {
+ "$type": "color",
+ "$value": "{rose.500}"
+ },
+ "sidebar-background": {
+ "$type": "color",
+ "$value": "{zinc.50}"
+ },
+ "sidebar-foreground": {
+ "$type": "color",
+ "$value": "{zinc.900}"
+ },
+ "sidebar-primary": {
+ "$type": "color",
+ "$value": "{zinc.900}"
+ },
+ "sidebar-primary-foreground": {
+ "$type": "color",
+ "$value": "{zinc.50}"
+ },
+ "sidebar-accent": {
+ "$type": "color",
+ "$value": "{zinc.100}"
+ },
+ "sidebar-accent-foreground": {
+ "$type": "color",
+ "$value": "{zinc.900}"
+ },
+ "sidebar-border": {
+ "$type": "color",
+ "$value": "{zinc.200}"
+ },
+ "sidebar-ring": {
+ "$type": "color",
+ "$value": "{zinc.950}"
+ }
+}
diff --git a/package-lock.json b/package-lock.json
index 6a19409f..ed3c583a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,6 +9,7 @@
"version": "2.1.0",
"license": "MIT",
"dependencies": {
+ "@modelcontextprotocol/sdk": "^1.29.0",
"chalk": "^5.3.0",
"commander": "^12.0.0",
"figma-use": "^0.13.3",
@@ -452,6 +453,18 @@
"node": ">=18"
}
},
+ "node_modules/@hono/node-server": {
+ "version": "1.19.14",
+ "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz",
+ "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.14.1"
+ },
+ "peerDependencies": {
+ "hono": "^4"
+ }
+ },
"node_modules/@img/sharp-darwin-arm64": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz",
@@ -813,6 +826,59 @@
"url": "https://opencollective.com/libvips"
}
},
+ "node_modules/@modelcontextprotocol/sdk": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz",
+ "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@hono/node-server": "^1.19.9",
+ "ajv": "^8.17.1",
+ "ajv-formats": "^3.0.1",
+ "content-type": "^1.0.5",
+ "cors": "^2.8.5",
+ "cross-spawn": "^7.0.5",
+ "eventsource": "^3.0.2",
+ "eventsource-parser": "^3.0.0",
+ "express": "^5.2.1",
+ "express-rate-limit": "^8.2.1",
+ "hono": "^4.11.4",
+ "jose": "^6.1.3",
+ "json-schema-typed": "^8.0.2",
+ "pkce-challenge": "^5.0.0",
+ "raw-body": "^3.0.0",
+ "zod": "^3.25 || ^4.0",
+ "zod-to-json-schema": "^3.25.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@cfworker/json-schema": "^4.1.1",
+ "zod": "^3.25 || ^4.0"
+ },
+ "peerDependenciesMeta": {
+ "@cfworker/json-schema": {
+ "optional": true
+ },
+ "zod": {
+ "optional": false
+ }
+ }
+ },
+ "node_modules/accepts": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "^3.0.0",
+ "negotiator": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/agentfmt": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/agentfmt/-/agentfmt-0.1.3.tgz",
@@ -822,6 +888,39 @@
"picocolors": "^1.1.1"
}
},
+ "node_modules/ajv": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz",
+ "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz",
+ "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
"node_modules/ansi-regex": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
@@ -834,6 +933,81 @@
"url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
+ "node_modules/body-parser": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz",
+ "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "^3.1.2",
+ "content-type": "^2.0.0",
+ "debug": "^4.4.3",
+ "http-errors": "^2.0.1",
+ "iconv-lite": "^0.7.2",
+ "on-finished": "^2.4.1",
+ "qs": "^6.15.2",
+ "raw-body": "^3.0.2",
+ "type-is": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/body-parser/node_modules/content-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz",
+ "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/chalk": {
"version": "5.6.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
@@ -941,6 +1115,77 @@
"node": "^14.18.0 || >=16.10.0"
}
},
+ "node_modules/content-disposition": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz",
+ "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.6.0"
+ }
+ },
+ "node_modules/cors": {
+ "version": "2.8.6",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz",
+ "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==",
+ "license": "MIT",
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/d3-hierarchy": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
@@ -950,6 +1195,32 @@
"node": ">=12"
}
},
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/detect-libc": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
@@ -968,12 +1239,71 @@
"node": ">=0.3.1"
}
},
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "license": "MIT"
+ },
"node_modules/emoji-regex": {
"version": "10.6.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
"integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
"license": "MIT"
},
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
+ "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/esbuild": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
@@ -1015,6 +1345,125 @@
"@esbuild/win32-x64": "0.25.12"
}
},
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "license": "MIT"
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/eventsource": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz",
+ "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==",
+ "license": "MIT",
+ "dependencies": {
+ "eventsource-parser": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/eventsource-parser": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz",
+ "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/express": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
+ "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "^2.0.0",
+ "body-parser": "^2.2.1",
+ "content-disposition": "^1.0.0",
+ "content-type": "^1.0.5",
+ "cookie": "^0.7.1",
+ "cookie-signature": "^1.2.1",
+ "debug": "^4.4.0",
+ "depd": "^2.0.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "finalhandler": "^2.1.0",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.0",
+ "merge-descriptors": "^2.0.0",
+ "mime-types": "^3.0.0",
+ "on-finished": "^2.4.1",
+ "once": "^1.4.0",
+ "parseurl": "^1.3.3",
+ "proxy-addr": "^2.0.7",
+ "qs": "^6.14.0",
+ "range-parser": "^1.2.1",
+ "router": "^2.2.0",
+ "send": "^1.1.0",
+ "serve-static": "^2.2.0",
+ "statuses": "^2.0.1",
+ "type-is": "^2.0.1",
+ "vary": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/express-rate-limit": {
+ "version": "8.5.2",
+ "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz",
+ "integrity": "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==",
+ "license": "MIT",
+ "dependencies": {
+ "ip-address": "^10.2.0"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/express-rate-limit"
+ },
+ "peerDependencies": {
+ "express": ">= 4.11"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "license": "MIT"
+ },
+ "node_modules/fast-uri": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.3.tgz",
+ "integrity": "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
"node_modules/figma-use": {
"version": "0.13.3",
"resolved": "https://registry.npmjs.org/figma-use/-/figma-use-0.13.3.tgz",
@@ -1039,6 +1488,27 @@
"figma-use": "bin/figma-use.js"
}
},
+ "node_modules/finalhandler": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz",
+ "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "on-finished": "^2.4.1",
+ "parseurl": "^1.3.3",
+ "statuses": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
"node_modules/fontoxpath": {
"version": "3.34.0",
"resolved": "https://registry.npmjs.org/fontoxpath/-/fontoxpath-3.34.0.tgz",
@@ -1049,6 +1519,33 @@
"xspattern": "^3.1.0"
}
},
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/get-east-asian-width": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz",
@@ -1061,42 +1558,217 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-arrayish": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz",
- "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==",
- "license": "MIT"
- },
- "node_modules/is-interactive": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz",
- "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==",
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
"engines": {
- "node": ">=12"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-unicode-supported": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz",
- "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==",
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"license": "MIT",
"engines": {
- "node": ">=18"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jpeg-js": {
- "version": "0.4.4",
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
+ "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hono": {
+ "version": "4.12.28",
+ "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.28.tgz",
+ "integrity": "sha512-YwUvVpSF7m1yOblFPrU3Hbo8XhPheBoiyfGuII6z19LnOr6JpDnyyp7LFNrfV56wS8tpvtBFGRISHN02pDdLOA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.9.0"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~2.0.0",
+ "inherits": "~2.0.4",
+ "setprototypeof": "~1.2.0",
+ "statuses": "~2.0.2",
+ "toidentifier": "~1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz",
+ "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/ip-address": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz",
+ "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz",
+ "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==",
+ "license": "MIT"
+ },
+ "node_modules/is-interactive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz",
+ "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-promise": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
+ "license": "MIT"
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz",
+ "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
+ },
+ "node_modules/jose": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz",
+ "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/panva"
+ }
+ },
+ "node_modules/jpeg-js": {
+ "version": "0.4.4",
"resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz",
"integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==",
"license": "BSD-3-Clause"
},
+ "node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "license": "MIT"
+ },
+ "node_modules/json-schema-typed": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz",
+ "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==",
+ "license": "BSD-2-Clause"
+ },
"node_modules/log-symbols": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz",
@@ -1125,6 +1797,61 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
"node_modules/mimic-function": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
@@ -1137,6 +1864,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
"node_modules/nanoid": {
"version": "3.3.12",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz",
@@ -1155,6 +1888,57 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
+ "node_modules/negotiator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
"node_modules/onetime": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
@@ -1193,12 +1977,49 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-to-regexp": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz",
+ "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"license": "ISC"
},
+ "node_modules/pkce-challenge": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz",
+ "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
"node_modules/pngjs": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz",
@@ -1236,12 +2057,78 @@
"node": "^10 || ^12 || >=14"
}
},
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "license": "MIT",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
"node_modules/prsc": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/prsc/-/prsc-4.0.0.tgz",
"integrity": "sha512-OmXQ2v76RlXNx/gqv7+oB6jyKnudJ/rsMfAIVexhbDFxXAJPoWKMxJkZU2ohlu4miCiSQCG+horf2DV4/kNc1Q==",
"license": "MIT"
},
+ "node_modules/qs": {
+ "version": "6.15.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz",
+ "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "es-define-property": "^1.0.1",
+ "side-channel": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz",
+ "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz",
+ "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "~3.1.2",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.7.0",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/restore-cursor": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
@@ -1258,6 +2145,28 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/router": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.0",
+ "depd": "^2.0.0",
+ "is-promise": "^4.0.0",
+ "parseurl": "^1.3.3",
+ "path-to-regexp": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
"node_modules/semver": {
"version": "7.8.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz",
@@ -1270,6 +2179,57 @@
"node": ">=10"
}
},
+ "node_modules/send": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz",
+ "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.3",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.1",
+ "mime-types": "^3.0.2",
+ "ms": "^2.1.3",
+ "on-finished": "^2.4.1",
+ "range-parser": "^1.2.1",
+ "statuses": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz",
+ "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==",
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "parseurl": "^1.3.3",
+ "send": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "license": "ISC"
+ },
"node_modules/sharp": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz",
@@ -1309,6 +2269,99 @@
"@img/sharp-win32-x64": "0.33.5"
}
},
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz",
+ "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4",
+ "side-channel-list": "^1.0.1",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
+ "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/signal-exit": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
@@ -1339,6 +2392,15 @@
"node": ">=0.10.0"
}
},
+ "node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/stdin-discarder": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz",
@@ -1398,6 +2460,15 @@
"url": "https://github.com/fontello/svg2ttf?sponsor=1"
}
},
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
@@ -1405,6 +2476,37 @@
"license": "0BSD",
"optional": true
},
+ "node_modules/type-is": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz",
+ "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==",
+ "license": "MIT",
+ "dependencies": {
+ "content-type": "^2.0.0",
+ "media-typer": "^1.1.0",
+ "mime-types": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/type-is/node_modules/content-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz",
+ "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
"node_modules/typescript": {
"version": "5.9.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
@@ -1418,6 +2520,24 @@
"node": ">=14.17"
}
},
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/whaticon": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/whaticon/-/whaticon-0.1.2.tgz",
@@ -1438,12 +2558,33 @@
"integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==",
"license": "MIT"
},
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/whynot": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/whynot/-/whynot-5.0.0.tgz",
"integrity": "sha512-cGGfDPYYqoHoMWqXVc3G+N74u1FhFhrBa+pOO906b9ktRc/JFUdwroTkfPqjKzyoCLVcKr6yy6bYIcWT7jTg2A==",
"license": "MIT"
},
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "license": "ISC"
+ },
"node_modules/ws": {
"version": "8.19.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz",
@@ -1497,6 +2638,15 @@
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}
+ },
+ "node_modules/zod-to-json-schema": {
+ "version": "3.25.2",
+ "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz",
+ "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==",
+ "license": "ISC",
+ "peerDependencies": {
+ "zod": "^3.25.28 || ^4"
+ }
}
}
}
diff --git a/package.json b/package.json
index 767c341a..1b4b69c2 100644
--- a/package.json
+++ b/package.json
@@ -35,6 +35,7 @@
"node": ">=18"
},
"dependencies": {
+ "@modelcontextprotocol/sdk": "^1.29.0",
"chalk": "^5.3.0",
"commander": "^12.0.0",
"figma-use": "^0.13.3",
diff --git a/src/commands/render.js b/src/commands/render.js
index d4083d46..0935d6b2 100644
--- a/src/commands/render.js
+++ b/src/commands/render.js
@@ -411,14 +411,27 @@ program
// Extract props that figma-use doesn't handle correctly
const postProcessFixes = extractPostProcessFixes(jsx);
- // Check if we're in Safe Mode (plugin only, no CDP)
+ // Decide whether to render via the daemon or the external figma-use binary.
+ // Use the daemon when:
+ // - Safe Mode (plugin only, no CDP), OR
+ // - figma-use isn't installed (e.g. NixOS browser Yolo — CDP works via
+ // the daemon, but there's no figma-use binary to shell out to).
+ // The daemon's render works in both plugin and CDP modes, so this only
+ // ever adds a working path — Desktop Yolo with figma-use installed is
+ // unchanged.
let useDaemonRender = false;
try {
const healthToken = getDaemonToken();
const healthHeader = healthToken ? ` -H "X-Daemon-Token: ${healthToken}"` : '';
const healthRes = execSync(`curl -s${healthHeader} http://127.0.0.1:${DAEMON_PORT}/health`, { encoding: 'utf8', timeout: 2000 });
const health = JSON.parse(healthRes);
- useDaemonRender = health.plugin && !health.cdp; // Safe Mode
+ const safeMode = health.plugin && !health.cdp;
+ let figmaUseAvailable = false;
+ try {
+ execSync('command -v figma-use', { stdio: 'ignore' });
+ figmaUseAvailable = true;
+ } catch {}
+ useDaemonRender = (health.plugin || health.cdp) && (safeMode || !figmaUseAvailable);
} catch {}
let result;
diff --git a/src/commands/setup.js b/src/commands/setup.js
index 0d2168ad..2ee712c3 100644
--- a/src/commands/setup.js
+++ b/src/commands/setup.js
@@ -4,6 +4,15 @@ import ora from 'ora';
import { execSync } from 'child_process';
import { existsSync, readFileSync, writeFileSync } from 'fs';
import { tmpdir } from 'os';
+
+function isNixOS() {
+ try {
+ const release = readFileSync('/etc/os-release', 'utf8');
+ return /^ID=nixos$/m.test(release) || /^ID_LIKE=.*nixos/m.test(release);
+ } catch {
+ return false;
+ }
+}
import { join, basename } from 'path';
import { FigmaClient } from '../figma-client.js';
import * as apiDocs from '../api-docs.js';
@@ -22,7 +31,10 @@ import {
saveConfig,
startDaemon,
startFigma,
- stopDaemon
+ stopDaemon,
+ detectBrowser,
+ isCdpBrowserRunning,
+ startFigmaBrowser
} from '../lib/cli-core.js';
program
@@ -514,8 +526,9 @@ program
program
.command('connect')
- .description('Connect to Figma Desktop')
+ .description('Connect to Figma Desktop or browser')
.option('--safe', 'Use Safe Mode (plugin-based, no patching required)')
+ .option('--browser', 'Yolo/CDP against Figma in a Chromium browser — no plugin, no Desktop (auto on NixOS)')
.action(async (options) => {
// Fun welcome message
console.log(chalk.hex('#FF6B35')('\n ✨ Hey designer! ') + chalk.white("Don't be afraid of the terminal!"));
@@ -523,6 +536,98 @@ program
const config = loadConfig();
+ // Auto-detect NixOS — Figma Desktop is not available, use browser (CDP) mode
+ if (!options.safe && !options.browser && isNixOS()) {
+ console.log(chalk.hex('#4ECDC4')(' 🐧 NixOS detected ') + chalk.gray('— Figma Desktop is not available, using browser mode\n'));
+ options.browser = true;
+ }
+
+ // Browser Mode: Yolo/CDP against Figma running in a Chromium browser.
+ // No plugin, no Desktop patch — launch the browser with remote debugging
+ // and drive it over the exact same CDP path Desktop Yolo uses.
+ if (options.browser) {
+ console.log(chalk.hex('#FF6B35')(' 🌐 Browser Mode ') + chalk.gray('(Yolo/CDP — no plugin, no Desktop)\n'));
+
+ const browser = detectBrowser();
+ if (!browser) {
+ console.log(chalk.red(' ✗ No Chromium-based browser found.'));
+ console.log(chalk.gray(' Install one of: Chrome, Chromium, Brave, Edge, Vivaldi'));
+ console.log(chalk.gray(' (Firefox is not supported — it does not speak the Chrome DevTools Protocol.)'));
+ console.log(chalk.gray(' Or set FIGMA_CLI_BROWSER=, or use Safe Mode: ') + chalk.cyan('figma-cli connect --safe\n'));
+ return;
+ }
+
+ // Launch the browser with remote debugging unless one is already up.
+ const launchSpinner = ora('Checking for a debug-enabled browser...').start();
+ const alreadyUp = await isCdpBrowserRunning();
+ if (alreadyUp) {
+ launchSpinner.succeed('Debug-enabled browser already running');
+ } else {
+ launchSpinner.text = `Launching ${browser} with remote debugging...`;
+ startFigmaBrowser();
+ // Wait for the CDP endpoint to come alive
+ let up = false;
+ for (let i = 0; i < 20; i++) {
+ await new Promise(r => setTimeout(r, 500));
+ if (await isCdpBrowserRunning()) { up = true; break; }
+ }
+ if (up) launchSpinner.succeed(`Launched ${browser} with remote debugging`);
+ else {
+ launchSpinner.fail('Browser did not expose the debug port');
+ console.log(chalk.gray('\n Start it manually:'));
+ console.log(chalk.cyan(` ${browser} --remote-debugging-port=9222 --user-data-dir=~/.figma-ds-cli/browser-profile https://figma.com\n`));
+ return;
+ }
+ }
+
+ // Start the daemon in CDP mode (same engine as Desktop Yolo)
+ stopDaemon();
+ const daemonSpinner = ora('Starting speed daemon (CDP mode)...').start();
+ try {
+ startDaemon(true, 'cdp');
+ await new Promise(r => setTimeout(r, 1200));
+ if (isDaemonRunning()) daemonSpinner.succeed('Daemon running (Browser Yolo)');
+ else { daemonSpinner.fail('Daemon failed to start'); return; }
+ } catch (e) {
+ daemonSpinner.fail('Daemon failed: ' + e.message);
+ return;
+ }
+
+ // Instructions + wait for a Figma design file + live figma context
+ console.log(chalk.hex('#FF6B35')('\n ┌─────────────────────────────────────────────────────┐'));
+ console.log(chalk.hex('#FF6B35')(' │') + chalk.white.bold(' Log in and open a file ') + chalk.hex('#FF6B35')('│'));
+ console.log(chalk.hex('#FF6B35')(' └─────────────────────────────────────────────────────┘\n'));
+ console.log(chalk.cyan(' 1. ') + chalk.white('In the browser window that opened, ') + chalk.yellow('log into Figma') + chalk.gray(' (first time only)'));
+ console.log(chalk.cyan(' 2. ') + chalk.white('Open any ') + chalk.yellow('design file') + chalk.white(' (a ') + chalk.gray('figma.com/design/…') + chalk.white(' tab)\n'));
+
+ const connectSpinner = ora('Waiting for a Figma design file...').start();
+ let connected = false;
+ const MAX_WAIT_S = 120;
+ for (let i = 0; i < MAX_WAIT_S; i++) {
+ await new Promise(r => setTimeout(r, 1000));
+ try {
+ if (await FigmaClient.isConnected()) {
+ connectSpinner.succeed('Connected to Figma in the browser!');
+ console.log(chalk.green('\n ✓ Ready! Browser Yolo active — no plugin, no Desktop.\n'));
+ console.log(chalk.gray(' Tip: your login is saved in ~/.figma-ds-cli/browser-profile, so next time'));
+ console.log(chalk.gray(' just run ') + chalk.cyan('figma-cli connect') + chalk.gray(' and open your file.\n'));
+ connected = true;
+ break;
+ }
+ } catch {}
+ if (i === Math.floor(MAX_WAIT_S / 2)) {
+ connectSpinner.text = `Waiting for a Figma design file (${MAX_WAIT_S - i}s left)…`;
+ }
+ }
+
+ if (!connected) {
+ connectSpinner.warn('No design file detected yet — daemon is still listening.');
+ console.log(chalk.gray('\n Open a design file in the browser whenever you\'re ready —'));
+ console.log(chalk.gray(' the next CLI command will connect automatically.\n'));
+ }
+ return;
+ }
+
// Safe Mode: Plugin-based connection (no patching, no CDP)
if (options.safe) {
console.log(chalk.hex('#4ECDC4')(' 🔒 Safe Mode ') + chalk.gray('(plugin-based, no patching required)\n'));
diff --git a/src/daemon.js b/src/daemon.js
index 8e3bd7fe..a4cd3854 100644
--- a/src/daemon.js
+++ b/src/daemon.js
@@ -518,6 +518,12 @@ const httpServer = createServer(handleRequest);
// WebSocket server for plugin connections
const wss = new WebSocketServer({ server: httpServer, path: '/plugin' });
+// Private Network Access header — required for Chrome 130+ when the plugin
+// runs inside browser Figma (origin: https://www.figma.com → localhost).
+wss.on('headers', (headers) => {
+ headers.push('Access-Control-Allow-Private-Network: true');
+});
+
wss.on('connection', (ws) => {
console.log('[daemon] Plugin connected (Safe Mode)');
pluginWs = ws;
diff --git a/src/lib/cli-core.js b/src/lib/cli-core.js
index 2a332403..cae6603b 100644
--- a/src/lib/cli-core.js
+++ b/src/lib/cli-core.js
@@ -497,6 +497,59 @@ function killFigma() {
killFigmaApp();
}
+// ── Browser (CDP) mode — for platforms without Figma Desktop (e.g. NixOS) ──
+// Instead of patching the Desktop app, drive Figma running in a Chromium-based
+// browser launched with --remote-debugging-port. Same CDP protocol, so the
+// existing FigmaClient / daemon work unchanged.
+
+// Persistent profile so the Figma login survives across launches.
+const BROWSER_PROFILE_DIR = join(homedir(), '.figma-ds-cli', 'browser-profile');
+
+const BROWSER_CANDIDATES = [
+ 'google-chrome-stable', 'google-chrome', 'chromium', 'chromium-browser',
+ 'brave', 'brave-browser', 'microsoft-edge', 'vivaldi'
+];
+
+// Find a Chromium-based browser binary on PATH (CDP requires Chromium, not Firefox).
+function detectBrowser() {
+ if (process.env.FIGMA_CLI_BROWSER) return process.env.FIGMA_CLI_BROWSER;
+ for (const bin of BROWSER_CANDIDATES) {
+ try {
+ const p = execSync(`command -v ${bin}`, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
+ if (p) return bin;
+ } catch {}
+ }
+ return null;
+}
+
+// Is a debug-enabled browser already listening on the CDP port?
+async function isCdpBrowserRunning() {
+ try {
+ const port = getCdpPort();
+ const res = await fetch(`http://127.0.0.1:${port}/json/version`, { signal: AbortSignal.timeout(1500) });
+ return res.ok;
+ } catch {
+ return false;
+ }
+}
+
+// Launch the browser with remote debugging enabled + a persistent profile,
+// opening figma.com. Returns the browser binary used, or null if none found.
+function startFigmaBrowser(url = 'https://www.figma.com') {
+ const browser = detectBrowser();
+ if (!browser) return null;
+ const port = getCdpPort();
+ const child = spawn(browser, [
+ `--remote-debugging-port=${port}`,
+ `--user-data-dir=${BROWSER_PROFILE_DIR}`,
+ '--no-first-run',
+ '--no-default-browser-check',
+ url
+ ], { detached: true, stdio: 'ignore' });
+ child.unref();
+ return browser;
+}
+
function getManualStartCommand() {
// Use centralized command from figma-patch.js
return getFigmaCommand(getCdpPort());
@@ -937,7 +990,10 @@ export {
checkConnection,
checkConnectionSync,
daemonExec,
+ detectBrowser,
detectWrapperSplit,
+ isCdpBrowserRunning,
+ startFigmaBrowser,
fastEval,
fastRender,
figmaEval,
diff --git a/src/mcp-server.js b/src/mcp-server.js
new file mode 100644
index 00000000..136b3fc1
--- /dev/null
+++ b/src/mcp-server.js
@@ -0,0 +1,343 @@
+#!/usr/bin/env node
+/**
+ * figma-cli MCP server — exposes figma-cli commands as MCP tools so Claude
+ * can drive Figma from any project without a shell.
+ *
+ * Add to ~/.claude/settings.json mcpServers:
+ * "figma-cli": { "command": "node", "args": ["/home/alauxui/figma-cli-nixos/src/mcp-server.js"] }
+ */
+import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
+import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
+import { execFile } from 'node:child_process';
+import { promisify } from 'node:util';
+import { z } from 'zod';
+import { fileURLToPath } from 'node:url';
+import { dirname, join } from 'node:path';
+
+const execFileAsync = promisify(execFile);
+const __dir = dirname(fileURLToPath(import.meta.url));
+const CLI = join(__dir, 'index.js');
+const NODE = process.execPath;
+
+async function run(args, opts = {}) {
+ try {
+ const { stdout, stderr } = await execFileAsync(NODE, [CLI, ...args], {
+ timeout: opts.timeout ?? 30_000,
+ env: { ...process.env },
+ });
+ return (stdout + (stderr ? `\nSTDERR: ${stderr}` : '')).trim();
+ } catch (err) {
+ return `ERROR: ${err.message}\n${err.stderr ?? ''}`.trim();
+ }
+}
+
+const server = new McpServer({
+ name: 'figma-cli',
+ version: '2.1.0',
+});
+
+// ── render ──────────────────────────────────────────────────────────────────
+server.tool(
+ 'figma_render',
+ 'Render a JSX frame on the Figma canvas. Use this to create any visual element.',
+ {
+ jsx: z.string().describe('JSX string, e.g. "Hello"'),
+ name: z.string().optional().describe('Node name override'),
+ verify: z.boolean().optional().describe('Screenshot after creation'),
+ collection: z.string().optional().describe('Variable collection name to resolve var: tokens against'),
+ },
+ async ({ jsx, name, verify, collection }) => {
+ const args = ['render', jsx];
+ if (name) args.push('--name', name);
+ if (verify) args.push('--verify');
+ if (collection) args.push('--collection', collection);
+ return { content: [{ type: 'text', text: await run(args) }] };
+ }
+);
+
+// ── render-batch ─────────────────────────────────────────────────────────────
+server.tool(
+ 'figma_render_batch',
+ 'Render multiple independent JSX frames side-by-side. Pass an array of JSX strings.',
+ {
+ items: z.array(z.string()).describe('Array of JSX strings, one per frame'),
+ direction: z.enum(['row', 'col']).optional().describe('Layout direction (default: row)'),
+ gap: z.number().optional().describe('Gap between frames in px'),
+ collection: z.string().optional().describe('Variable collection to resolve var: tokens'),
+ },
+ async ({ items, direction, gap, collection }) => {
+ const args = ['render-batch', JSON.stringify(items)];
+ if (direction) args.push('--direction', direction);
+ if (gap != null) args.push('--gap', String(gap));
+ if (collection) args.push('--collection', collection);
+ return { content: [{ type: 'text', text: await run(args, { timeout: 60_000 }) }] };
+ }
+);
+
+// ── verify ────────────────────────────────────────────────────────────────────
+server.tool(
+ 'figma_verify',
+ 'Screenshot a node for visual validation. Returns saved PNG path + dimensions.',
+ {
+ nodeId: z.string().optional().describe('Node ID to screenshot (omit = current selection)'),
+ measure: z.boolean().optional().describe('Include real w/h measure tree'),
+ },
+ async ({ nodeId, measure }) => {
+ const args = ['verify', ...(nodeId ? [nodeId] : [])];
+ if (measure) args.push('--measure');
+ return { content: [{ type: 'text', text: await run(args) }] };
+ }
+);
+
+// ── var list ──────────────────────────────────────────────────────────────────
+server.tool(
+ 'figma_var_list',
+ 'List all Figma variables/tokens in the current file.',
+ {
+ collection: z.string().optional().describe('Filter by collection name'),
+ },
+ async ({ collection }) => {
+ const args = ['var', 'list', ...(collection ? [collection] : [])];
+ return { content: [{ type: 'text', text: await run(args) }] };
+ }
+);
+
+// ── tokens preset ─────────────────────────────────────────────────────────────
+server.tool(
+ 'figma_tokens_preset',
+ 'Load a design token preset into Figma variables.',
+ {
+ preset: z.enum(['shadcn', 'tailwind', 'ds']).describe('Preset to load'),
+ },
+ async ({ preset }) => {
+ return { content: [{ type: 'text', text: await run(['tokens', 'preset', preset], { timeout: 60_000 }) }] };
+ }
+);
+
+// ── canvas info ───────────────────────────────────────────────────────────────
+server.tool(
+ 'figma_canvas_info',
+ 'Show what is currently on the Figma canvas.',
+ {},
+ async () => {
+ return { content: [{ type: 'text', text: await run(['canvas', 'info']) }] };
+ }
+);
+
+// ── find ──────────────────────────────────────────────────────────────────────
+server.tool(
+ 'figma_find',
+ 'Find nodes by name on the canvas.',
+ {
+ query: z.string().describe('Node name (or partial) to search for'),
+ },
+ async ({ query }) => {
+ return { content: [{ type: 'text', text: await run(['find', query]) }] };
+ }
+);
+
+// ── node to-component ────────────────────────────────────────────────────────
+server.tool(
+ 'figma_to_component',
+ 'Convert a frame/node to a Figma component.',
+ {
+ nodeId: z.string().describe('Node ID to convert'),
+ },
+ async ({ nodeId }) => {
+ return { content: [{ type: 'text', text: await run(['node', 'to-component', nodeId]) }] };
+ }
+);
+
+// ── instantiate ───────────────────────────────────────────────────────────────
+server.tool(
+ 'figma_instantiate',
+ 'Drop an instance of an existing component by name (reuse before rebuild).',
+ {
+ name: z.string().describe('Component name to instantiate'),
+ },
+ async ({ name }) => {
+ return { content: [{ type: 'text', text: await run(['instantiate', name]) }] };
+ }
+);
+
+// ── spec ──────────────────────────────────────────────────────────────────────
+server.tool(
+ 'figma_spec',
+ 'Show the spec (variant axes, values, sample size) for a component from DESIGN.md.',
+ {
+ name: z.string().describe('Component name'),
+ check: z.string().optional().describe('Node ID to enforce spec against (exits non-zero on mismatch)'),
+ },
+ async ({ name, check }) => {
+ const args = ['spec', name, ...(check ? ['--check', check] : [])];
+ return { content: [{ type: 'text', text: await run(args) }] };
+ }
+);
+
+// ── extract ───────────────────────────────────────────────────────────────────
+server.tool(
+ 'figma_extract',
+ 'Export the open Figma file as a DESIGN.md markdown document.',
+ {
+ output: z.string().optional().describe('Output file path (default: DESIGN.md)'),
+ pages: z.string().optional().describe('Comma-separated page names to include'),
+ sections: z.string().optional().describe('Only export specific sections, e.g. "tokens"'),
+ selection: z.boolean().optional().describe('Only extract selected nodes'),
+ },
+ async ({ output, pages, sections, selection }) => {
+ const args = ['extract', ...(output ? [output] : [])];
+ if (pages) args.push('--pages', pages);
+ if (sections) args.push('--sections', sections);
+ if (selection) args.push('--selection');
+ return { content: [{ type: 'text', text: await run(args, { timeout: 120_000 }) }] };
+ }
+);
+
+// ── import ────────────────────────────────────────────────────────────────────
+server.tool(
+ 'figma_import',
+ 'Import design tokens from a file (tailwind.config.js, globals.css, tokens.json, DESIGN.md) or Storybook URL into Figma.',
+ {
+ source: z.string().describe('File path or URL to import from'),
+ collection: z.string().optional().describe('Variable collection name'),
+ type: z.string().optional().describe('Override detection: tailwind | css | tokens | storybook | designmd'),
+ },
+ async ({ source, collection, type }) => {
+ const args = ['import', source];
+ if (collection) args.push('--collection', collection);
+ if (type) args.push('--type', type);
+ return { content: [{ type: 'text', text: await run(args, { timeout: 60_000 }) }] };
+ }
+);
+
+// ── export ────────────────────────────────────────────────────────────────────
+server.tool(
+ 'figma_export',
+ 'Export design tokens or assets from Figma (formats: png, svg, dtcg, css, tailwind).',
+ {
+ format: z.string().describe('Export format: png | svg | dtcg | css | tailwind'),
+ output: z.string().optional().describe('Output file path'),
+ },
+ async ({ format, output }) => {
+ const args = ['export', format, ...(output ? [output] : [])];
+ return { content: [{ type: 'text', text: await run(args, { timeout: 30_000 }) }] };
+ }
+);
+
+// ── blocks ────────────────────────────────────────────────────────────────────
+server.tool(
+ 'figma_blocks',
+ 'Create or list pre-built UI layout blocks (dashboards, etc.).',
+ {
+ action: z.enum(['list', 'create']).describe('"list" to see available blocks, "create" to add one'),
+ block: z.string().optional().describe('Block name to create, e.g. "dashboard-01"'),
+ },
+ async ({ action, block }) => {
+ const args = ['blocks', action, ...(block ? [block] : [])];
+ return { content: [{ type: 'text', text: await run(args, { timeout: 60_000 }) }] };
+ }
+);
+
+// ── shadcn add ────────────────────────────────────────────────────────────────
+server.tool(
+ 'figma_shadcn_add',
+ 'Add shadcn UI components to the Figma canvas.',
+ {
+ component: z.string().describe('Component name: button | card | badge | input | etc.'),
+ count: z.number().optional().describe('Number of distinct variants to create'),
+ },
+ async ({ component, count }) => {
+ const args = ['shadcn', 'add', component];
+ if (count != null) args.push('--count', String(count));
+ return { content: [{ type: 'text', text: await run(args, { timeout: 60_000 }) }] };
+ }
+);
+
+// ── a11y ──────────────────────────────────────────────────────────────────────
+server.tool(
+ 'figma_a11y',
+ 'Run accessibility checks on the Figma canvas.',
+ {
+ check: z.enum(['contrast', 'vision', 'touch', 'text', 'audit']).describe('Check type'),
+ },
+ async ({ check }) => {
+ return { content: [{ type: 'text', text: await run(['a11y', check]) }] };
+ }
+);
+
+// ── undo ──────────────────────────────────────────────────────────────────────
+server.tool(
+ 'figma_undo',
+ 'Undo the last Figma operation.',
+ {},
+ async () => {
+ return { content: [{ type: 'text', text: await run(['undo']) }] };
+ }
+);
+
+// ── gradient ─────────────────────────────────────────────────────────────────
+server.tool(
+ 'figma_gradient',
+ 'Create or extract mesh/aurora gradient backgrounds.',
+ {
+ colors: z.string().describe('Comma-separated hex colors, e.g. "#a855f7,#3b82f6,#06b6d4"'),
+ size: z.string().optional().describe('Canvas size, e.g. "1920x1080"'),
+ applyTo: z.string().optional().describe('Node ID to apply gradient to'),
+ mode: z.string().optional().describe('Gradient mode: mesh | aurora'),
+ style: z.string().optional().describe('Composition style: auto | scatter | diagonal | etc.'),
+ grain: z.boolean().optional().describe('Add film grain noise'),
+ },
+ async ({ colors, size, applyTo, mode, style, grain }) => {
+ const args = ['gradient', 'mesh', colors];
+ if (size) args.push('--size', size);
+ if (applyTo) args.push('--apply-to', applyTo);
+ if (mode) args.push('--mode', mode);
+ if (style) args.push('--style', style);
+ if (grain) args.push('--grain');
+ return { content: [{ type: 'text', text: await run(args, { timeout: 60_000 }) }] };
+ }
+);
+
+// ── variants from ─────────────────────────────────────────────────────────────
+server.tool(
+ 'figma_variants_from',
+ 'Combine existing frames or components into a Figma Component Set (variant set).',
+ {
+ nodeIds: z.string().describe('Comma-separated node IDs to combine'),
+ property: z.string().describe('Variant property name, e.g. "Size"'),
+ values: z.string().describe('Comma-separated values matching node order, e.g. "Small,Medium,Large"'),
+ name: z.string().describe('Component Set name'),
+ },
+ async ({ nodeIds, property, values, name }) => {
+ const args = ['variants', 'from', nodeIds, '--property', property, '--values', values, '--name', name];
+ return { content: [{ type: 'text', text: await run(args, { timeout: 30_000 }) }] };
+ }
+);
+
+// ── daemon ────────────────────────────────────────────────────────────────────
+server.tool(
+ 'figma_daemon',
+ 'Check or restart the figma-cli daemon.',
+ {
+ action: z.enum(['status', 'restart']).describe('"status" or "restart"'),
+ },
+ async ({ action }) => {
+ return { content: [{ type: 'text', text: await run(['daemon', action]) }] };
+ }
+);
+
+// ── connect ───────────────────────────────────────────────────────────────────
+server.tool(
+ 'figma_connect',
+ 'Connect to Figma (Yolo mode patches Figma once for full access; safe mode uses the plugin).',
+ {
+ safe: z.boolean().optional().describe('Use safe/plugin mode instead of Yolo'),
+ },
+ async ({ safe }) => {
+ const args = ['connect', ...(safe ? ['--safe'] : [])];
+ return { content: [{ type: 'text', text: await run(args, { timeout: 60_000 }) }] };
+ }
+);
+
+const transport = new StdioServerTransport();
+await server.connect(transport);