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 | +|---|---|---| +| image | image | image | + +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);