bmad-studio 0.2.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +163 -17
  2. package/package.json +12 -3
  3. package/packages/client/dist/assets/index-81ZKe-R8.css +1 -0
  4. package/packages/client/dist/assets/index-DyjtzhqN.js +641 -0
  5. package/packages/client/dist/index.html +2 -2
  6. package/packages/server/dist/app.d.ts +2 -1
  7. package/packages/server/dist/app.d.ts.map +1 -1
  8. package/packages/server/dist/app.js +68 -3
  9. package/packages/server/dist/app.js.map +1 -1
  10. package/packages/server/dist/core/file-store.d.ts +8 -1
  11. package/packages/server/dist/core/file-store.d.ts.map +1 -1
  12. package/packages/server/dist/core/file-store.js +26 -3
  13. package/packages/server/dist/core/file-store.js.map +1 -1
  14. package/packages/server/dist/core/ide-skill-generator.d.ts +58 -0
  15. package/packages/server/dist/core/ide-skill-generator.d.ts.map +1 -0
  16. package/packages/server/dist/core/ide-skill-generator.js +270 -0
  17. package/packages/server/dist/core/ide-skill-generator.js.map +1 -0
  18. package/packages/server/dist/core/ide-skill-generator.test.d.ts +2 -0
  19. package/packages/server/dist/core/ide-skill-generator.test.d.ts.map +1 -0
  20. package/packages/server/dist/core/ide-skill-generator.test.js +257 -0
  21. package/packages/server/dist/core/ide-skill-generator.test.js.map +1 -0
  22. package/packages/server/dist/core/module-installer.d.ts +165 -0
  23. package/packages/server/dist/core/module-installer.d.ts.map +1 -0
  24. package/packages/server/dist/core/module-installer.js +445 -0
  25. package/packages/server/dist/core/module-installer.js.map +1 -0
  26. package/packages/server/dist/core/module-installer.test.d.ts +2 -0
  27. package/packages/server/dist/core/module-installer.test.d.ts.map +1 -0
  28. package/packages/server/dist/core/module-installer.test.js +509 -0
  29. package/packages/server/dist/core/module-installer.test.js.map +1 -0
  30. package/packages/server/dist/core/module-registry.d.ts +5 -0
  31. package/packages/server/dist/core/module-registry.d.ts.map +1 -0
  32. package/packages/server/dist/core/module-registry.js +109 -0
  33. package/packages/server/dist/core/module-registry.js.map +1 -0
  34. package/packages/server/dist/core/module-registry.test.d.ts +2 -0
  35. package/packages/server/dist/core/module-registry.test.d.ts.map +1 -0
  36. package/packages/server/dist/core/module-registry.test.js +280 -0
  37. package/packages/server/dist/core/module-registry.test.js.map +1 -0
  38. package/packages/server/dist/core/write-service.d.ts +20 -0
  39. package/packages/server/dist/core/write-service.d.ts.map +1 -1
  40. package/packages/server/dist/core/write-service.js +113 -1
  41. package/packages/server/dist/core/write-service.js.map +1 -1
  42. package/packages/server/dist/core/write-service.test.js +93 -6
  43. package/packages/server/dist/core/write-service.test.js.map +1 -1
  44. package/packages/server/dist/index.js +85 -1
  45. package/packages/server/dist/index.js.map +1 -1
  46. package/packages/server/dist/parsers/module-yaml-parser.d.ts +16 -0
  47. package/packages/server/dist/parsers/module-yaml-parser.d.ts.map +1 -0
  48. package/packages/server/dist/parsers/module-yaml-parser.js +62 -0
  49. package/packages/server/dist/parsers/module-yaml-parser.js.map +1 -0
  50. package/packages/server/dist/parsers/module-yaml-parser.test.d.ts +2 -0
  51. package/packages/server/dist/parsers/module-yaml-parser.test.d.ts.map +1 -0
  52. package/packages/server/dist/parsers/module-yaml-parser.test.js +156 -0
  53. package/packages/server/dist/parsers/module-yaml-parser.test.js.map +1 -0
  54. package/packages/server/dist/parsers/skill-parser.d.ts.map +1 -1
  55. package/packages/server/dist/parsers/skill-parser.js +41 -4
  56. package/packages/server/dist/parsers/skill-parser.js.map +1 -1
  57. package/packages/server/dist/parsers/skill-parser.test.js +4 -3
  58. package/packages/server/dist/parsers/skill-parser.test.js.map +1 -1
  59. package/packages/server/dist/plugins/agents-plugin.d.ts.map +1 -1
  60. package/packages/server/dist/plugins/agents-plugin.js +60 -1
  61. package/packages/server/dist/plugins/agents-plugin.js.map +1 -1
  62. package/packages/server/dist/plugins/commands-plugin.d.ts.map +1 -1
  63. package/packages/server/dist/plugins/commands-plugin.js +37 -10
  64. package/packages/server/dist/plugins/commands-plugin.js.map +1 -1
  65. package/packages/server/dist/plugins/datasources-plugin.d.ts.map +1 -1
  66. package/packages/server/dist/plugins/datasources-plugin.js +101 -0
  67. package/packages/server/dist/plugins/datasources-plugin.js.map +1 -1
  68. package/packages/server/dist/plugins/modules-plugin.d.ts.map +1 -1
  69. package/packages/server/dist/plugins/modules-plugin.js +905 -100
  70. package/packages/server/dist/plugins/modules-plugin.js.map +1 -1
  71. package/packages/server/dist/plugins/modules-plugin.test.js +1894 -3
  72. package/packages/server/dist/plugins/modules-plugin.test.js.map +1 -1
  73. package/packages/server/dist/plugins/outputs-plugin.d.ts.map +1 -1
  74. package/packages/server/dist/plugins/outputs-plugin.js +111 -0
  75. package/packages/server/dist/plugins/outputs-plugin.js.map +1 -1
  76. package/packages/server/dist/plugins/overview-plugin.d.ts.map +1 -1
  77. package/packages/server/dist/plugins/overview-plugin.js +35 -2
  78. package/packages/server/dist/plugins/overview-plugin.js.map +1 -1
  79. package/packages/server/dist/plugins/search-plugin.d.ts.map +1 -1
  80. package/packages/server/dist/plugins/search-plugin.js +19 -2
  81. package/packages/server/dist/plugins/search-plugin.js.map +1 -1
  82. package/packages/server/dist/plugins/settings-plugin.d.ts.map +1 -1
  83. package/packages/server/dist/plugins/settings-plugin.js +38 -1
  84. package/packages/server/dist/plugins/settings-plugin.js.map +1 -1
  85. package/packages/server/dist/plugins/settings-plugin.test.js +72 -0
  86. package/packages/server/dist/plugins/settings-plugin.test.js.map +1 -1
  87. package/packages/server/dist/plugins/teams-plugin.d.ts.map +1 -1
  88. package/packages/server/dist/plugins/teams-plugin.js +6 -6
  89. package/packages/server/dist/plugins/teams-plugin.js.map +1 -1
  90. package/packages/server/dist/plugins/teams-plugin.test.js +43 -0
  91. package/packages/server/dist/plugins/teams-plugin.test.js.map +1 -1
  92. package/packages/server/dist/plugins/workflows-plugin.d.ts.map +1 -1
  93. package/packages/server/dist/plugins/workflows-plugin.js +14 -6
  94. package/packages/server/dist/plugins/workflows-plugin.js.map +1 -1
  95. package/packages/shared/src/config.ts +26 -0
  96. package/packages/shared/src/events.ts +7 -0
  97. package/packages/shared/src/index.ts +13 -0
  98. package/packages/shared/src/modules.ts +42 -0
  99. package/packages/shared/src/registry.ts +26 -0
  100. package/packages/shared/src/types.test.ts +37 -1
  101. package/packages/shared/src/workflows.ts +27 -0
  102. package/packages/client/dist/assets/index-5nXyrx_3.css +0 -1
  103. package/packages/client/dist/assets/index-DxN3uabX.js +0 -521
package/README.md CHANGED
@@ -4,16 +4,80 @@ Browser-based admin interface for the [BMAD](https://github.com/bmadcode/BMAD-ME
4
4
 
5
5
  BMAD Studio is the **configuration and visibility layer** for BMAD projects. It reads and writes BMAD's existing markdown and YAML files directly — no database, no hidden state. The IDE remains the execution environment; Studio helps you understand and manage the setup.
6
6
 
7
+ ## Screenshots
8
+
9
+ ### Overview Dashboard
10
+
11
+ The overview page surfaces everything at a glance — agents, teams, installed workflows, the BMAD process timeline, your toolkit, skills, and data sources.
12
+
13
+ ![Overview Dashboard](e2e/visual-regression.spec.ts-snapshots/overview-chromium-darwin.png)
14
+
15
+ ### Agents
16
+
17
+ Browse all agents across installed modules. Each card shows the agent's icon, title, module source, and skill count.
18
+
19
+ ![Agents](e2e/visual-regression.spec.ts-snapshots/agents-chromium-darwin.png)
20
+
21
+ ### Modules
22
+
23
+ Install, manage, and export modules. Browse a shared registry or install from npm, GitHub, local path, or ZIP.
24
+
25
+ ![Modules](e2e/visual-regression.spec.ts-snapshots/modules-chromium-darwin.png)
26
+
27
+ ### Module Registry
28
+
29
+ Connect to a GitHub-based module registry to browse and install shared modules across your team.
30
+
31
+ ![Module Registry](e2e/visual-regression.spec.ts-snapshots/packages-registry-list-chromium-darwin.png)
32
+
33
+ ### Teams
34
+
35
+ Create and manage agent teams for collaborative workflows and Party Mode.
36
+
37
+ ![Teams](e2e/visual-regression.spec.ts-snapshots/teams-chromium-darwin.png)
38
+
39
+ ### Outputs
40
+
41
+ Browse all project deliverables grouped by BMAD phase — brainstorming, implementation artifacts, and planning artifacts.
42
+
43
+ ![Outputs](e2e/visual-regression.spec.ts-snapshots/outputs-chromium-darwin.png)
44
+
45
+ ### Settings
46
+
47
+ Configure theme, port, module registry, and project settings.
48
+
49
+ ![Settings](e2e/visual-regression.spec.ts-snapshots/settings-with-registry-chromium-darwin.png)
50
+
51
+ ### Files
52
+
53
+ Browse and navigate the raw BMAD file tree with folder hierarchy.
54
+
55
+ ![Files](e2e/visual-regression.spec.ts-snapshots/files-chromium-darwin.png)
56
+
57
+ ### Data Sources
58
+
59
+ View and manage IDE connections and external data sources.
60
+
61
+ ![Data Sources](e2e/visual-regression.spec.ts-snapshots/connections-chromium-darwin.png)
62
+
7
63
  ## Features
8
64
 
9
- - **Overview Dashboard** — See your entire BMAD project at a glance: agents, teams, workflows, skills, data sources
10
- - **Agent Management** — Browse agents, view their skills and workflow roles, edit overrides
11
- - **Workflow Visualization** — Step-by-step workflow detail with variant tabs, nested step hierarchy, and supporting file previews
12
- - **Skill Library** — Browse, create, and assign skills to agents
65
+ - **Overview Dashboard** — Agents, teams, workflows, process timeline, toolkit stats, skills, and data sources at a glance
66
+ - **Agent Management** — Browse agents across modules, view skills and workflow roles, create overrides
13
67
  - **Team Management** — Create and manage agent teams for collaborative workflows and Party Mode
14
- - **Module Management** — Install, configure, and export BMAD modules
68
+ - **Skill Library** — Browse, filter, search, create, and assign skills to agents
69
+ - **Workflow Visualization** — Step-by-step detail with variant tabs and module filtering
70
+ - **Output Hub** — Browse all deliverables grouped by BMAD phase
71
+ - **Module Management** — Install, remove, export, and create modules from npm, GitHub, local, or ZIP sources
72
+ - **Module Registry** — Connect to a shared GitHub-based registry to browse and install team modules
73
+ - **Data Sources** — View and manage IDE connections and external integrations
74
+ - **Workspace Editor** — Structured editor for project-context.md with per-section editing and rules management
75
+ - **Commands** — Browse all BMAD process triggers organized by phase, including Quick Flow and anytime commands
76
+ - **File Browser** — Navigate the raw `_bmad/` file tree with size indicators
77
+ - **Project Switching** — Switch between registered BMAD projects without restarting
15
78
  - **Live Reload** — File system changes appear instantly via WebSocket
16
- - **Dark/Light Theme** — Automatic theme detection with manual toggle
79
+ - **Dark/Light Theme** — Toggle between themes from Settings or the sidebar
80
+ - **Custom App Title** — Rebrand the header (e.g. "DEPT Agent Studio") via Settings
17
81
 
18
82
  ## Quick Start
19
83
 
@@ -27,14 +91,19 @@ npx bmad-studio
27
91
 
28
92
  Then open [http://localhost:4040](http://localhost:4040) in your browser.
29
93
 
30
- ### Options
94
+ Studio auto-detects your BMAD project by walking up the directory tree looking for a `_bmad/` directory with a valid module configuration.
95
+
96
+ ### CLI Options
31
97
 
32
98
  ```bash
33
- npx bmad-studio --port 8080 # Custom port
99
+ npx bmad-studio # Start on default port 4040
100
+ npx bmad-studio --port 8080 # Custom port
34
101
  npx bmad-studio --dir /path/to/project # Specify project directory
35
- npx bmad-studio --verbose # Debug logging
102
+ npx bmad-studio --verbose # Enable debug logging to stdout
36
103
  ```
37
104
 
105
+ If the default port is in use, Studio will automatically try the next available port.
106
+
38
107
  ### From Source
39
108
 
40
109
  ```bash
@@ -51,15 +120,76 @@ For development with hot reload:
51
120
  npm run dev
52
121
  ```
53
122
 
54
- This starts the Vite dev server on [http://localhost:5173](http://localhost:5173) and the API server on port 4040.
123
+ This starts the Vite dev server on [http://localhost:5173](http://localhost:5173) and the API server on port 4040 concurrently.
55
124
 
56
125
  ## Prerequisites
57
126
 
58
127
  - **Node.js** >= 20.0.0
59
- - A **BMAD project** with a `_bmad/` directory at the project root (BMAD v6+)
128
+ - A **BMAD project** with a `_bmad/` directory at the project root ([BMAD v6+](https://github.com/bmadcode/BMAD-METHOD))
60
129
 
61
130
  If no BMAD project is detected, Studio starts in setup mode with guidance on getting started.
62
131
 
132
+ ## Configuration
133
+
134
+ ### Studio Settings
135
+
136
+ Studio stores its settings in `.bmad-studio/settings.json` inside your project root. You can edit these through the Settings page in the UI or directly in the file:
137
+
138
+ ```json
139
+ {
140
+ "port": 4040,
141
+ "theme": "light",
142
+ "appTitle": "My Agent Studio",
143
+ "registry": {
144
+ "repo": "owner/repo",
145
+ "branch": "main"
146
+ },
147
+ "logging": {
148
+ "enabled": true,
149
+ "level": "info"
150
+ }
151
+ }
152
+ ```
153
+
154
+ | Setting | Type | Default | Description |
155
+ |---------|------|---------|-------------|
156
+ | `port` | number | `4040` | Server port (requires restart) |
157
+ | `theme` | `"dark"` \| `"light"` | `"light"` | UI color theme |
158
+ | `appTitle` | string | `"BMAD Studio"` | Custom header title for branding |
159
+ | `registry.repo` | string | — | GitHub repo in `owner/repo` format for module registry |
160
+ | `registry.branch` | string | `"main"` | Branch to read registry from |
161
+ | `logging.enabled` | boolean | `false` | Enable file-based logging |
162
+ | `logging.level` | string | `"info"` | Log level: `trace`, `debug`, `info`, `warn`, `error` |
163
+
164
+ ### BMAD Project Configuration
165
+
166
+ BMAD project settings live in `_bmad/core/config.yaml` and are managed by the BMAD installer:
167
+
168
+ ```yaml
169
+ user_name: Jonathan
170
+ communication_language: English
171
+ document_output_language: English
172
+ output_folder: "{project-root}/_bmad-output"
173
+ ```
174
+
175
+ ### Runtime Files
176
+
177
+ Studio creates a `.bmad-studio/` directory in your project root for runtime state:
178
+
179
+ ```
180
+ .bmad-studio/
181
+ settings.json # Studio configuration (see above)
182
+ cache/ # Parsed entity cache for faster startup
183
+ logs/ # Server logs (when logging is enabled)
184
+ history/ # Change history
185
+ ```
186
+
187
+ This directory is gitignored by default. Delete it to fully reset Studio — zero-footprint removal.
188
+
189
+ ### Global State
190
+
191
+ Studio maintains a global registry of recent projects at `~/.bmad-studio/projects.json` (up to 10 entries). This enables the project switcher in Settings.
192
+
63
193
  ## Architecture
64
194
 
65
195
  BMAD Studio is a monorepo with three packages:
@@ -67,7 +197,7 @@ BMAD Studio is a monorepo with three packages:
67
197
  ```
68
198
  packages/
69
199
  shared/ # TypeScript types shared between client and server
70
- server/ # Fastify API — parses BMAD files, serves data, handles writes
200
+ server/ # Fastify 5 API — parses BMAD files, serves data, handles writes
71
201
  client/ # React SPA — Vite + Tailwind CSS + React Router
72
202
  ```
73
203
 
@@ -84,10 +214,10 @@ packages/
84
214
 
85
215
  | Layer | Technology |
86
216
  |-------|-----------|
87
- | Client | React 19, React Router 7, Tailwind CSS 4, TanStack Query, CodeMirror 6, React Flow |
88
- | Server | Fastify 5, Chokidar (file watching), gray-matter (frontmatter parsing) |
89
- | Shared | TypeScript 5.8 |
90
- | Build | Vite 6, tsx (dev), Vitest (testing) |
217
+ | Client | React 19, React Router 7, Tailwind CSS 4, shadcn/ui, CodeMirror 6 |
218
+ | Server | Fastify 5, Chokidar (file watching), WebSocket (live updates) |
219
+ | Shared | TypeScript |
220
+ | Build | Vite, tsx (dev), Vitest + Playwright (testing) |
91
221
 
92
222
  ## BMAD Concepts
93
223
 
@@ -97,7 +227,23 @@ packages/
97
227
  | **Skill** | Markdown file defining a capability assignable to agents |
98
228
  | **Workflow** | Structured markdown defining a sequence of steps with agents, inputs, and deliverables |
99
229
  | **Team** | Named grouping of agents for collaborative workflows and Party Mode |
100
- | **Module** | Versioned collection of BMAD entities from an external repository |
230
+ | **Module** | Versioned collection of agents, skills, workflows, and configuration for a specific domain |
231
+ | **Output** | Generated deliverable from a BMAD workflow (PRDs, architecture docs, stories, etc.) |
232
+ | **Command** | A BMAD process trigger organized by phase (Analysis, Planning, Solutioning, Implementation) |
233
+
234
+ ### Modules
235
+
236
+ Modules are how BMAD extends its capabilities for specific domains. They can be installed from multiple sources:
237
+
238
+ | Source | Example |
239
+ |--------|---------|
240
+ | **npm** | `npx bmad-studio` installs from the npm registry |
241
+ | **GitHub** | Install from any GitHub repository |
242
+ | **Local** | Point to a directory on disk (useful during development) |
243
+ | **ZIP** | Upload a ZIP archive |
244
+ | **Built-in** | Core modules bundled with BMAD |
245
+
246
+ Each module can contain agents, skills, workflows, teams, and configuration. Studio's Modules page lets you browse installed modules, explore a shared registry, install new modules, and export existing ones.
101
247
 
102
248
  For more on the BMAD method, see the [BMAD-METHOD repository](https://github.com/bmadcode/BMAD-METHOD).
103
249
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bmad-studio",
3
- "version": "0.2.0",
3
+ "version": "1.1.0",
4
4
  "description": "Browser-based admin interface for BMAD agentic engineering framework — visualize, configure, and manage your BMAD project",
5
5
  "type": "module",
6
6
  "workspaces": [
@@ -9,22 +9,27 @@
9
9
  "packages/client"
10
10
  ],
11
11
  "bin": {
12
- "bmad-studio": "./bin/bmad-studio.mjs"
12
+ "bmad-studio": "bin/bmad-studio.mjs"
13
13
  },
14
14
  "scripts": {
15
15
  "dev": "concurrently -n server,client -c blue,green \"npm run dev -w @bmad-studio/server\" \"npm run dev -w @bmad-studio/client\"",
16
16
  "build": "npm run build -w @bmad-studio/shared && npm run build -w @bmad-studio/client && npm run build -w @bmad-studio/server",
17
17
  "start": "node packages/server/dist/index.js",
18
18
  "test": "vitest run",
19
+ "test:visual": "npx playwright test",
20
+ "test:visual:update": "npx playwright test --update-snapshots",
19
21
  "lint": "eslint packages/*/src/",
20
22
  "format": "prettier --write \"packages/*/src/**/*.{ts,tsx}\""
21
23
  },
22
24
  "devDependencies": {
23
25
  "@eslint/js": "^9.25.0",
26
+ "@playwright/test": "^1.58.2",
27
+ "@types/adm-zip": "^0.5.7",
24
28
  "concurrently": "^9.1.2",
25
29
  "eslint": "^9.25.0",
26
30
  "eslint-plugin-react-hooks": "^7.0.1",
27
31
  "eslint-plugin-react-refresh": "^0.5.2",
32
+ "form-data": "^4.0.1",
28
33
  "prettier": "^3.5.3",
29
34
  "typescript": "~5.8.3",
30
35
  "typescript-eslint": "^8.31.0",
@@ -57,12 +62,16 @@
57
62
  "README.md"
58
63
  ],
59
64
  "dependencies": {
65
+ "@fastify/multipart": "^9.0.1",
60
66
  "@fastify/static": "^8.1.0",
61
67
  "@fastify/websocket": "^11.2.0",
68
+ "@types/semver": "^7.7.1",
69
+ "adm-zip": "^0.5.16",
62
70
  "chokidar": "^5.0.0",
63
71
  "fastify": "^5.3.3",
64
72
  "gray-matter": "^4.0.3",
65
- "js-yaml": "^4.1.1"
73
+ "js-yaml": "^4.1.1",
74
+ "semver": "^7.7.4"
66
75
  },
67
76
  "author": "Jonathan Whiteside",
68
77
  "engines": {
@@ -0,0 +1 @@
1
+ .markdown-preview{color:var(--color-text);font-size:.875rem;line-height:1.7;max-width:none}.markdown-preview h1{font-size:1.75rem;font-weight:800;margin-top:2rem;margin-bottom:1rem;padding-bottom:.5rem;border-bottom:1px solid var(--color-border-subtle);color:var(--color-text)}.markdown-preview h2{font-size:1.35rem;font-weight:700;margin-top:1.75rem;margin-bottom:.75rem;color:var(--color-text)}.markdown-preview h3{font-size:1.1rem;font-weight:700;margin-top:1.5rem;margin-bottom:.5rem;color:var(--color-text)}.markdown-preview h4,.markdown-preview h5,.markdown-preview h6{font-size:1rem;font-weight:600;margin-top:1.25rem;margin-bottom:.5rem;color:var(--color-text)}.markdown-preview h1:first-child{margin-top:0}.markdown-preview p{margin-bottom:.75rem}.markdown-preview a{color:var(--color-accent);text-decoration:none}.markdown-preview a:hover{text-decoration:underline}.markdown-preview strong{font-weight:700;color:var(--color-text)}.markdown-preview ul,.markdown-preview ol{margin-bottom:.75rem;padding-left:1.5rem}.markdown-preview ul{list-style-type:disc}.markdown-preview ol{list-style-type:decimal}.markdown-preview li{margin-bottom:.25rem}.markdown-preview li::marker{color:var(--color-muted)}.markdown-preview li>ul,.markdown-preview li>ol{margin-top:.25rem;margin-bottom:0}.markdown-preview blockquote{border-left:3px solid var(--color-accent);padding-left:1rem;margin:1rem 0;color:var(--color-muted);font-style:italic}.markdown-preview hr{border:none;border-top:1px solid var(--color-border-subtle);margin:1.5rem 0}.markdown-preview code{font-family:var(--font-mono);font-size:.8em;background:var(--color-surface-raised);padding:.15em .4em;border-radius:.25rem}.markdown-preview pre{background:var(--color-surface-raised);font-family:var(--font-mono);font-size:.8rem;padding:1rem;border-radius:.5rem;overflow-x:auto;margin:1rem 0;border:1px solid var(--color-border-subtle)}.markdown-preview pre code{background:none;padding:0;font-size:inherit}.markdown-preview table{width:100%;border-collapse:collapse;margin:1rem 0;font-size:.8rem}.markdown-preview th{text-align:left;font-weight:700;padding:.5rem .75rem;border:1px solid var(--color-border-subtle);background:var(--color-surface-raised)}.markdown-preview td{padding:.5rem .75rem;border:1px solid var(--color-border-subtle)}.markdown-preview img{max-width:100%;height:auto;border-radius:.5rem;margin:1rem 0}.markdown-preview input[type=checkbox]{margin-right:.5rem}/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-divide-x-reverse:0}}}@layer theme{:root,:host{--font-sans:var(--font-sans);--font-mono:var(--font-mono);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-950:oklch(25.8% .092 26.042);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-950:oklch(26.6% .065 152.934);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-normal:400;--font-weight-medium:500;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-wide:.025em;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-accent:var(--color-accent);--color-accent-hover:var(--color-accent-hover);--color-bg:var(--color-bg);--color-text:var(--color-text);--color-muted:var(--color-muted);--color-success:var(--color-success);--color-warning:var(--color-warning);--color-error:var(--color-error)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.top-0\.5{top:calc(var(--spacing) * .5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-6{top:calc(var(--spacing) * 6)}.top-full{top:100%}.right-2{right:calc(var(--spacing) * 2)}.right-4{right:calc(var(--spacing) * 4)}.bottom-4{bottom:calc(var(--spacing) * 4)}.left-0{left:calc(var(--spacing) * 0)}.left-2{left:calc(var(--spacing) * 2)}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-3{left:calc(var(--spacing) * 3)}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.z-\[60\]{z-index:60}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing) * 2)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-3{margin-right:calc(var(--spacing) * 3)}.mr-4{margin-right:calc(var(--spacing) * 4)}.-mb-px{margin-bottom:-1px}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.-ml-\[2px\]{margin-left:-2px}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-6{margin-left:calc(var(--spacing) * 6)}.ml-7{margin-left:calc(var(--spacing) * 7)}.ml-\[calc\(12px\+0\.625rem\+1\.25rem\)\]{margin-left:calc(12px + 1.875rem)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-16{height:calc(var(--spacing) * 16)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-40{height:calc(var(--spacing) * 40)}.h-48{height:calc(var(--spacing) * 48)}.h-64{height:calc(var(--spacing) * 64)}.h-96{height:calc(var(--spacing) * 96)}.h-\[500px\]{height:500px}.h-\[calc\(100vh-8rem\)\]{height:calc(100vh - 8rem)}.h-\[calc\(100vh-12rem\)\]{height:calc(100vh - 12rem)}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-36{max-height:calc(var(--spacing) * 36)}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-\[80vh\]{max-height:80vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[90vh\]{max-height:90vh}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\[32px\]{min-height:32px}.min-h-\[36px\]{min-height:36px}.min-h-\[44px\]{min-height:44px}.min-h-\[80px\]{min-height:80px}.min-h-\[120px\]{min-height:120px}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-1\/2{width:50%}.w-2{width:calc(var(--spacing) * 2)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-32{width:calc(var(--spacing) * 32)}.w-36{width:calc(var(--spacing) * 36)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-60{width:calc(var(--spacing) * 60)}.w-64{width:calc(var(--spacing) * 64)}.w-\[700px\]{width:700px}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-\[60\%\]{max-width:60%}.max-w-\[80px\]{max-width:80px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[200px\]{min-width:200px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.translate-x-0\.5{--tw-translate-x:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-1{--tw-translate-x:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-5{--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-6{--tw-translate-x:calc(var(--spacing) * 6);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-rotate-90{rotate:-90deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-grab{cursor:grab}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.resize-y{resize:vertical}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 0) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-\[var\(--color-border-subtle\)\]>:not(:last-child)){border-color:var(--color-border-subtle)}:where(.divide-\[var\(--color-warning\)\]\/10>:not(:last-child)){border-color:var(--color-warning)}@supports (color:color-mix(in lab,red,red)){:where(.divide-\[var\(--color-warning\)\]\/10>:not(:last-child)){border-color:color-mix(in oklab,var(--color-warning) 10%,transparent)}}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\[var\(--color-accent\)\],.border-\[var\(--color-accent\)\]\/20{border-color:var(--color-accent)}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-accent\)\]\/20{border-color:color-mix(in oklab,var(--color-accent) 20%,transparent)}}.border-\[var\(--color-accent\)\]\/30{border-color:var(--color-accent)}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-accent\)\]\/30{border-color:color-mix(in oklab,var(--color-accent) 30%,transparent)}}.border-\[var\(--color-accent\)\]\/40{border-color:var(--color-accent)}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-accent\)\]\/40{border-color:color-mix(in oklab,var(--color-accent) 40%,transparent)}}.border-\[var\(--color-border-subtle\)\],.border-\[var\(--color-border-subtle\)\]\/50{border-color:var(--color-border-subtle)}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-border-subtle\)\]\/50{border-color:color-mix(in oklab,var(--color-border-subtle) 50%,transparent)}}.border-\[var\(--color-error\)\]{border-color:var(--color-error)}.border-\[var\(--color-success\)\],.border-\[var\(--color-success\)\]\/20{border-color:var(--color-success)}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-success\)\]\/20{border-color:color-mix(in oklab,var(--color-success) 20%,transparent)}}.border-\[var\(--color-warning\)\],.border-\[var\(--color-warning\)\]\/20{border-color:var(--color-warning)}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-warning\)\]\/20{border-color:color-mix(in oklab,var(--color-warning) 20%,transparent)}}.border-\[var\(--color-warning\)\]\/30{border-color:var(--color-warning)}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-warning\)\]\/30{border-color:color-mix(in oklab,var(--color-warning) 30%,transparent)}}.border-\[var\(--color-warning\)\]\/40{border-color:var(--color-warning)}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-warning\)\]\/40{border-color:color-mix(in oklab,var(--color-warning) 40%,transparent)}}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/30{border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.border-blue-400\/50{border-color:#54a2ff80}@supports (color:color-mix(in lab,red,red)){.border-blue-400\/50{border-color:color-mix(in oklab,var(--color-blue-400) 50%,transparent)}}.border-blue-500\/30{border-color:#3080ff4d}@supports (color:color-mix(in lab,red,red)){.border-blue-500\/30{border-color:color-mix(in oklab,var(--color-blue-500) 30%,transparent)}}.border-current{border-color:currentColor}.border-green-500\/30{border-color:#00c7584d}@supports (color:color-mix(in lab,red,red)){.border-green-500\/30{border-color:color-mix(in oklab,var(--color-green-500) 30%,transparent)}}.border-purple-400\/50{border-color:#c07eff80}@supports (color:color-mix(in lab,red,red)){.border-purple-400\/50{border-color:color-mix(in oklab,var(--color-purple-400) 50%,transparent)}}.border-purple-500\/30{border-color:#ac4bff4d}@supports (color:color-mix(in lab,red,red)){.border-purple-500\/30{border-color:color-mix(in oklab,var(--color-purple-500) 30%,transparent)}}.border-transparent{border-color:#0000}.border-yellow-500\/30{border-color:#edb2004d}@supports (color:color-mix(in lab,red,red)){.border-yellow-500\/30{border-color:color-mix(in oklab,var(--color-yellow-500) 30%,transparent)}}.border-l-\[var\(--color-accent\)\]{border-left-color:var(--color-accent)}.bg-\[var\(--color-accent\)\],.bg-\[var\(--color-accent\)\]\/3{background-color:var(--color-accent)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-accent\)\]\/3{background-color:color-mix(in oklab,var(--color-accent) 3%,transparent)}}.bg-\[var\(--color-accent\)\]\/5{background-color:var(--color-accent)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-accent\)\]\/5{background-color:color-mix(in oklab,var(--color-accent) 5%,transparent)}}.bg-\[var\(--color-accent\)\]\/10{background-color:var(--color-accent)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-accent\)\]\/10{background-color:color-mix(in oklab,var(--color-accent) 10%,transparent)}}.bg-\[var\(--color-accent\)\]\/\[0\.03\]{background-color:var(--color-accent)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-accent\)\]\/\[0\.03\]{background-color:color-mix(in oklab,var(--color-accent) 3%,transparent)}}.bg-\[var\(--color-bg\)\]{background-color:var(--color-bg)}.bg-\[var\(--color-border-subtle\)\]{background-color:var(--color-border-subtle)}.bg-\[var\(--color-error\)\]{background-color:var(--color-error)}.bg-\[var\(--color-success\)\]{background-color:var(--color-success)}.bg-\[var\(--color-surface-raised\)\],.bg-\[var\(--color-surface-raised\)\]\/50{background-color:var(--color-surface-raised)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-surface-raised\)\]\/50{background-color:color-mix(in oklab,var(--color-surface-raised) 50%,transparent)}}.bg-\[var\(--color-warning\)\],.bg-\[var\(--color-warning\)\]\/5{background-color:var(--color-warning)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-warning\)\]\/5{background-color:color-mix(in oklab,var(--color-warning) 5%,transparent)}}.bg-\[var\(--color-warning\)\]\/10{background-color:var(--color-warning)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-warning\)\]\/10{background-color:color-mix(in oklab,var(--color-warning) 10%,transparent)}}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black) 40%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black) 60%,transparent)}}.bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/10{background-color:color-mix(in oklab,var(--color-blue-500) 10%,transparent)}}.bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/10{background-color:color-mix(in oklab,var(--color-green-500) 10%,transparent)}}.bg-green-500\/20{background-color:#00c75833}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/20{background-color:color-mix(in oklab,var(--color-green-500) 20%,transparent)}}.bg-green-950\/30{background-color:#032e154d}@supports (color:color-mix(in lab,red,red)){.bg-green-950\/30{background-color:color-mix(in oklab,var(--color-green-950) 30%,transparent)}}.bg-orange-500\/10{background-color:#fe6e001a}@supports (color:color-mix(in lab,red,red)){.bg-orange-500\/10{background-color:color-mix(in oklab,var(--color-orange-500) 10%,transparent)}}.bg-purple-500\/10{background-color:#ac4bff1a}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/10{background-color:color-mix(in oklab,var(--color-purple-500) 10%,transparent)}}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/10{background-color:color-mix(in oklab,var(--color-red-500) 10%,transparent)}}.bg-red-950\/30{background-color:#4608094d}@supports (color:color-mix(in lab,red,red)){.bg-red-950\/30{background-color:color-mix(in oklab,var(--color-red-950) 30%,transparent)}}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-yellow-500\/10{background-color:#edb2001a}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/10{background-color:color-mix(in oklab,var(--color-yellow-500) 10%,transparent)}}.bg-yellow-500\/20{background-color:#edb20033}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/20{background-color:color-mix(in oklab,var(--color-yellow-500) 20%,transparent)}}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-\[var\(--color-accent\)\]\/20{--tw-gradient-from:var(--color-accent)}@supports (color:color-mix(in lab,red,red)){.from-\[var\(--color-accent\)\]\/20{--tw-gradient-from:color-mix(in oklab, var(--color-accent) 20%, transparent)}}.from-\[var\(--color-accent\)\]\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-\[var\(--color-accent\)\]\/5{--tw-gradient-to:var(--color-accent)}@supports (color:color-mix(in lab,red,red)){.to-\[var\(--color-accent\)\]\/5{--tw-gradient-to:color-mix(in oklab, var(--color-accent) 5%, transparent)}}.to-\[var\(--color-accent\)\]\/5{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-16{padding-block:calc(var(--spacing) * 16)}.pt-0{padding-top:calc(var(--spacing) * 0)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-\[18vh\]{padding-top:18vh}.pr-1{padding-right:calc(var(--spacing) * 1)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-10{padding-bottom:calc(var(--spacing) * 10)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-7{padding-left:calc(var(--spacing) * 7)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-\[var\(--font-mono\)\]{--tw-font-weight:var(--font-mono);font-weight:var(--font-mono)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[var\(--color-accent\)\],.text-\[var\(--color-accent\)\]\/50{color:var(--color-accent)}@supports (color:color-mix(in lab,red,red)){.text-\[var\(--color-accent\)\]\/50{color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.text-\[var\(--color-border-subtle\)\]{color:var(--color-border-subtle)}.text-\[var\(--color-error\)\]{color:var(--color-error)}.text-\[var\(--color-muted\)\],.text-\[var\(--color-muted\)\]\/60{color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.text-\[var\(--color-muted\)\]\/60{color:color-mix(in oklab,var(--color-muted) 60%,transparent)}}.text-\[var\(--color-success\)\]{color:var(--color-success)}.text-\[var\(--color-text\)\]{color:var(--color-text)}.text-\[var\(--color-warning\)\],.text-\[var\(--color-warning\)\]\/70{color:var(--color-warning)}@supports (color:color-mix(in lab,red,red)){.text-\[var\(--color-warning\)\]\/70{color:color-mix(in oklab,var(--color-warning) 70%,transparent)}}.text-amber-400{color:var(--color-amber-400)}.text-blue-400{color:var(--color-blue-400)}.text-green-400{color:var(--color-green-400)}.text-orange-400{color:var(--color-orange-400)}.text-purple-400{color:var(--color-purple-400)}.text-red-400{color:var(--color-red-400)}.text-white{color:var(--color-white)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-500{color:var(--color-yellow-500)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.underline{text-decoration-line:underline}.accent-\[var\(--color-accent\)\]{accent-color:var(--color-accent)}.opacity-0{opacity:0}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.shadow-\[var\(--color-accent\)\]\/10{--tw-shadow-alpha:10%;--tw-shadow:var(--color-accent);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-\[var\(--color-accent\)\]\/30{--tw-ring-color:var(--color-accent)}@supports (color:color-mix(in lab,red,red)){.ring-\[var\(--color-accent\)\]\/30{--tw-ring-color:color-mix(in oklab, var(--color-accent) 30%, transparent)}}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.ring-inset{--tw-ring-inset:inset}@media(hover:hover){.group-hover\:text-\[var\(--color-accent\)\]:is(:where(.group):hover *){color:var(--color-accent)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.file\:mr-3::file-selector-button{margin-right:calc(var(--spacing) * 3)}.file\:rounded-md::file-selector-button{border-radius:var(--radius-md)}.file\:border::file-selector-button{border-style:var(--tw-border-style);border-width:1px}.file\:border-\[var\(--color-border-subtle\)\]::file-selector-button{border-color:var(--color-border-subtle)}.file\:bg-\[var\(--color-surface-raised\)\]::file-selector-button{background-color:var(--color-surface-raised)}.file\:px-3::file-selector-button{padding-inline:calc(var(--spacing) * 3)}.file\:py-1\.5::file-selector-button{padding-block:calc(var(--spacing) * 1.5)}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:text-\[var\(--color-text\)\]::file-selector-button{color:var(--color-text)}.placeholder\:text-\[var\(--color-muted\)\]::placeholder{color:var(--color-muted)}@media(hover:hover){.hover\:-translate-y-0\.5:hover{--tw-translate-y:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:scale-110:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:border-\[var\(--color-accent\)\]:hover,.hover\:border-\[var\(--color-accent\)\]\/50:hover{border-color:var(--color-accent)}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[var\(--color-accent\)\]\/50:hover{border-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.hover\:border-\[var\(--color-accent\)\]\/60:hover{border-color:var(--color-accent)}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[var\(--color-accent\)\]\/60:hover{border-color:color-mix(in oklab,var(--color-accent) 60%,transparent)}}.hover\:bg-\[var\(--color-accent\)\]:hover{background-color:var(--color-accent)}.hover\:bg-\[var\(--color-accent-hover\)\]:hover{background-color:var(--color-accent-hover)}.hover\:bg-\[var\(--color-bg\)\]:hover{background-color:var(--color-bg)}.hover\:bg-\[var\(--color-error\)\]:hover{background-color:var(--color-error)}.hover\:bg-\[var\(--color-surface-raised\)\]:hover,.hover\:bg-\[var\(--color-surface-raised\)\]\/60:hover{background-color:var(--color-surface-raised)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[var\(--color-surface-raised\)\]\/60:hover{background-color:color-mix(in oklab,var(--color-surface-raised) 60%,transparent)}}.hover\:bg-yellow-600:hover{background-color:var(--color-yellow-600)}.hover\:text-\[var\(--color-accent\)\]:hover{color:var(--color-accent)}.hover\:text-\[var\(--color-accent-hover\)\]:hover{color:var(--color-accent-hover)}.hover\:text-\[var\(--color-error\)\]:hover{color:var(--color-error)}.hover\:text-\[var\(--color-text\)\]:hover{color:var(--color-text)}.hover\:text-white:hover{color:var(--color-white)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:file\:bg-\[var\(--color-bg\)\]:hover::file-selector-button{background-color:var(--color-bg)}}.focus\:border-\[var\(--color-accent\)\]:focus{border-color:var(--color-accent)}.focus\:border-\[var\(--color-error\)\]:focus{border-color:var(--color-error)}.focus\:ring-\[var\(--color-accent\)\]:focus{--tw-ring-color:var(--color-accent)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:40rem){.sm\:inline{display:inline}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}:where(.md\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.md\:divide-y-0>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px * var(--tw-divide-y-reverse));border-bottom-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)))}}@media(min-width:64rem){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}}@font-face{font-family:Inter Tight;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-tight-cyrillic-ext-400-normal-CKO3cWyd.woff2)format("woff2"),url(/assets/inter-tight-cyrillic-ext-400-normal-DiHHcP5k.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Tight;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-tight-cyrillic-400-normal-G7BuwYWK.woff2)format("woff2"),url(/assets/inter-tight-cyrillic-400-normal-DPRou3KO.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Inter Tight;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-tight-greek-ext-400-normal-C3GMUg_S.woff2)format("woff2"),url(/assets/inter-tight-greek-ext-400-normal-DMqR5RoS.woff)format("woff");unicode-range:U+1F??}@font-face{font-family:Inter Tight;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-tight-greek-400-normal-Br_GQm5W.woff2)format("woff2"),url(/assets/inter-tight-greek-400-normal-BLLSFQTx.woff)format("woff");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Inter Tight;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-tight-vietnamese-400-normal-CqzIqjuX.woff2)format("woff2"),url(/assets/inter-tight-vietnamese-400-normal-kSDs3Vd1.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Tight;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-tight-latin-ext-400-normal-DN7wyBvd.woff2)format("woff2"),url(/assets/inter-tight-latin-ext-400-normal-BQQeeQrv.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Tight;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-tight-latin-400-normal-iW8qmuJY.woff2)format("woff2"),url(/assets/inter-tight-latin-400-normal-BLrFJfvD.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter Tight;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-tight-cyrillic-ext-700-normal-D_7NT8eF.woff2)format("woff2"),url(/assets/inter-tight-cyrillic-ext-700-normal-BFcoPt71.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Tight;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-tight-cyrillic-700-normal-DtWWjp29.woff2)format("woff2"),url(/assets/inter-tight-cyrillic-700-normal-DDZiLR3d.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Inter Tight;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-tight-greek-ext-700-normal-D0RkHJEE.woff2)format("woff2"),url(/assets/inter-tight-greek-ext-700-normal-mW3dmpoD.woff)format("woff");unicode-range:U+1F??}@font-face{font-family:Inter Tight;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-tight-greek-700-normal-RgALSHS4.woff2)format("woff2"),url(/assets/inter-tight-greek-700-normal-DU8XoIeX.woff)format("woff");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Inter Tight;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-tight-vietnamese-700-normal-Cn_DV52A.woff2)format("woff2"),url(/assets/inter-tight-vietnamese-700-normal-DwHBAXeT.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Tight;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-tight-latin-ext-700-normal-BpKPOkj3.woff2)format("woff2"),url(/assets/inter-tight-latin-ext-700-normal-CrlzIQ10.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Tight;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-tight-latin-700-normal-BZKd_v_8.woff2)format("woff2"),url(/assets/inter-tight-latin-700-normal-DvYAVZQd.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter Tight;font-style:normal;font-display:swap;font-weight:800;src:url(/assets/inter-tight-cyrillic-ext-800-normal-CzCOBUhR.woff2)format("woff2"),url(/assets/inter-tight-cyrillic-ext-800-normal-WowoGRZX.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Tight;font-style:normal;font-display:swap;font-weight:800;src:url(/assets/inter-tight-cyrillic-800-normal-CC_RRmyd.woff2)format("woff2"),url(/assets/inter-tight-cyrillic-800-normal-ChWbk4mt.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Inter Tight;font-style:normal;font-display:swap;font-weight:800;src:url(/assets/inter-tight-greek-ext-800-normal-DNWjXg9N.woff2)format("woff2"),url(/assets/inter-tight-greek-ext-800-normal-DfP-QoiQ.woff)format("woff");unicode-range:U+1F??}@font-face{font-family:Inter Tight;font-style:normal;font-display:swap;font-weight:800;src:url(/assets/inter-tight-greek-800-normal-X9eW6L67.woff2)format("woff2"),url(/assets/inter-tight-greek-800-normal-CxHmUlv4.woff)format("woff");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Inter Tight;font-style:normal;font-display:swap;font-weight:800;src:url(/assets/inter-tight-vietnamese-800-normal-OJoDhpMd.woff2)format("woff2"),url(/assets/inter-tight-vietnamese-800-normal-CbYrLkxo.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Tight;font-style:normal;font-display:swap;font-weight:800;src:url(/assets/inter-tight-latin-ext-800-normal-DfKN99cy.woff2)format("woff2"),url(/assets/inter-tight-latin-ext-800-normal-A39zhqaD.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Tight;font-style:normal;font-display:swap;font-weight:800;src:url(/assets/inter-tight-latin-800-normal-CRGCHRPv.woff2)format("woff2"),url(/assets/inter-tight-latin-800-normal-D2te1T7i.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--color-accent:#ff4a00;--color-accent-hover:#e04300;--color-yellow:#cf0;--color-bg:#fff;--color-surface-raised:#f5f5f5;--color-text:#000;--color-muted:#71717a;--color-border-subtle:#e4e4e7;--color-success:#22c55e;--color-warning:#f59e0b;--color-error:#ef4444;--color-neutral:#a1a1aa;--font-sans:"Inter Tight", system-ui, sans-serif;--font-mono:ui-monospace, "SFMono-Regular", "SF Mono", Menlo, Consolas, monospace}.dark{--color-bg:#000;--color-surface-raised:#1a1a1a;--color-text:#fff;--color-muted:#a1a1aa;--color-border-subtle:#27272a;--color-accent-hover:#ff6a33}:root{--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:20px;--space-6:24px;--space-7:28px;--space-8:32px;--space-9:36px;--space-10:40px;--space-11:44px;--space-12:48px}body{font-family:var(--font-sans);background-color:var(--color-bg);color:var(--color-text);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.btn-primary{background-color:var(--color-accent);color:#fff;cursor:pointer;border-radius:6px;justify-content:center;align-items:center;min-height:36px;padding:8px 16px;font-size:14px;font-weight:700;transition:background-color .15s;display:inline-flex}.btn-primary:hover{background-color:var(--color-accent-hover)}.btn-primary:disabled{opacity:.4;cursor:not-allowed}.btn-secondary{border:1px solid var(--color-border-subtle);color:var(--color-text);cursor:pointer;border-radius:6px;justify-content:center;align-items:center;min-height:36px;padding:8px 16px;font-size:14px;transition:background-color .15s;display:inline-flex}.btn-secondary:hover{background-color:var(--color-surface-raised)}.btn-ghost{color:var(--color-muted);cursor:pointer;border-radius:6px;justify-content:center;align-items:center;min-height:36px;padding:8px 12px;font-size:14px;transition:color .15s,background-color .15s;display:inline-flex}.btn-ghost:hover{color:var(--color-text);background-color:var(--color-surface-raised)}.dark .prose{--tw-prose-body:var(--color-text);--tw-prose-headings:var(--color-text);--tw-prose-links:var(--color-accent);--tw-prose-bold:var(--color-text);--tw-prose-counters:var(--color-muted);--tw-prose-bullets:var(--color-muted);--tw-prose-hr:var(--color-border-subtle);--tw-prose-quotes:var(--color-muted);--tw-prose-quote-borders:var(--color-accent);--tw-prose-code:var(--color-text);--tw-prose-pre-code:var(--color-text);--tw-prose-pre-bg:var(--color-surface-raised);--tw-prose-th-borders:var(--color-border-subtle);--tw-prose-td-borders:var(--color-border-subtle)}.slide-over-backdrop{z-index:40;justify-content:flex-end;display:flex;position:fixed;top:0;right:0;bottom:0;left:0}.slide-over-backdrop .slide-over-bg{background:#0006;position:absolute;top:0;right:0;bottom:0;left:0}.slide-over-backdrop .slide-over-panel{z-index:1;background:var(--color-bg);border-left:1px solid var(--color-border-subtle);max-height:100vh;position:relative;overflow-y:auto;box-shadow:-4px 0 24px #00000026}@media(prefers-reduced-motion:reduce){*,:before,:after{transition-duration:0s!important;animation-duration:0s!important}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}