algocoach 0.1.4 β†’ 0.1.7

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.
package/README.md CHANGED
@@ -1,101 +1,208 @@
1
- # AlgoCoach
1
+ # AlgoCoach 🎯
2
2
 
3
- AI-powered LeetCode study planner that creates personalized roadmaps, daily problem sets, and tracks your progress.
3
+ <p align="center">
4
+ <img src="https://img.shields.io/npm/v/algocoach" alt="npm version">
5
+ <img src="https://img.shields.io/badge/license-AGPLv3-blue" alt="license">
6
+ <img src="https://img.shields.io/badge/runtime-Bun-%23f9f9f9" alt="bun">
7
+ <img src="https://img.shields.io/badge/AI-Google%20|%20Groq%20|%20NVIDIA-orange" alt="AI providers">
8
+ </p>
4
9
 
5
- ## Prerequisites
10
+ <p align="center">
11
+ <b>AI-powered LeetCode study planner</b><br>
12
+ Personalized roadmaps, daily problem sets, progress tracking β€” all local, all private.
13
+ </p>
6
14
 
7
- - [Bun](https://bun.sh) >= 1.3
8
- - An AI provider API key (Google Gemini, Groq, or NVIDIA NIM)
15
+ <br>
9
16
 
10
- ## Quick Start
17
+ <p align="center">
18
+ <kbd>
19
+ <img src="screenshots/dashboard.png" alt="AlgoCoach Dashboard" width="700">
20
+ </kbd>
21
+ </p>
22
+
23
+ <p align="center">
24
+ <em>Dashboard showing today's plan, roadmap progress, and LeetCode stats</em>
25
+ </p>
26
+
27
+ ---
28
+
29
+ ## ✨ Features
30
+
31
+ | | Feature | Description |
32
+ |---|---|---|
33
+ | πŸ—ΊοΈ | **AI Roadmap** | Personalized multi-week study plan based on your skill level and goals |
34
+ | πŸ“… | **Daily Plans** | 3 curated problems (Easy + Medium + Hard) every day β€” never wonder what to solve |
35
+ | πŸ”„ | **Auto-refresh** | Stuck on a problem? Replace it with an easier one or regenerate the whole set |
36
+ | πŸ“Š | **Progress Tracking** | Solved/tried/skipped counts, streaks, and topic-level progress |
37
+ | πŸ”— | **LeetCode Sync** | Link your LeetCode account to auto-fetch your stats |
38
+ | πŸ”’ | **100% Local** | Database stored at `~/.algocoach/data.db`. No cloud, no signup, no data leaks |
39
+ | πŸš€ | **AI Anywhere** | Works with Google Gemini, Groq, or NVIDIA NIM |
40
+
41
+ ---
42
+
43
+ ## πŸš€ Quick Start
11
44
 
12
45
  ```bash
13
- # Install globally
46
+ # Install (requires Bun)
14
47
  npm install -g algocoach
15
48
 
16
- # Start (creates .env if missing)
49
+ # Start β€” creates config, opens browser
17
50
  algocoach start
18
-
19
- # Open http://localhost:3000
20
51
  ```
21
52
 
22
- ## Setup
53
+ <p align="center">
54
+ <img src="screenshots/cli-demo.gif" alt="CLI Demo" width="600">
55
+ </p>
56
+
57
+ ---
58
+
59
+ ## πŸ–₯️ Screenshots
60
+
61
+ <p align="center">
62
+ <table>
63
+ <tr>
64
+ <td align="center">
65
+ <img src="screenshots/onboard.png" alt="Onboarding" width="350"><br>
66
+ <em>Skill survey</em>
67
+ </td>
68
+ <td align="center">
69
+ <img src="screenshots/roadmap.png" alt="Roadmap" width="350"><br>
70
+ <em>AI-generated roadmap</em>
71
+ </td>
72
+ </tr>
73
+ <tr>
74
+ <td align="center">
75
+ <img src="screenshots/daily-plan.png" alt="Daily Plan" width="350"><br>
76
+ <em>Today's problems</em>
77
+ </td>
78
+ <td align="center">
79
+ <img src="screenshots/stats.png" alt="Stats" width="350"><br>
80
+ <em>Progress & streaks</em>
81
+ </td>
82
+ </tr>
83
+ </table>
84
+ </p>
85
+
86
+ ---
87
+
88
+ ## πŸ“– Usage
89
+
90
+ ### First Time
91
+
92
+ ```bash
93
+ algocoach start
94
+ ```
23
95
 
24
- 1. Run `algocoach start` β€” creates `~/.algocoach/.env`
25
- 2. Edit `~/.algocoach/.env` β€” uncomment and set at least one API key:
96
+ This creates `~/.algocoach/.env`. Edit it to set your AI provider API key:
26
97
 
27
98
  ```env
28
99
  AI_PROVIDER=google
29
- GEMINI_API_KEY=your-key-here
100
+ GEMINI_API_KEY=AIza...
30
101
  ```
31
102
 
32
- 3. Run `algocoach start` again β€” starts the server
103
+ Then run `algocoach start` again.
33
104
 
34
- ### Get an API Key
105
+ ### Commands
35
106
 
36
- | Provider | Get Key |
37
- |----------|---------|
38
- | Google Gemini | https://aistudio.google.com |
39
- | Groq | https://console.groq.com |
40
- | NVIDIA NIM | https://build.nvidia.com |
107
+ ```bash
108
+ algocoach start # Create config if needed + start server + open browser
109
+ algocoach init # Only create config file
110
+ ```
41
111
 
42
- ## Usage
112
+ ### Daily Workflow
43
113
 
44
- 1. **Onboard** β€” Tell AlgoCoach your skill level, goals, and weak topics
45
- 2. **Link LeetCode** β€” Enter your LeetCode username to auto-sync stats
46
- 3. **Generate Roadmap** β€” AI creates a personalized multi-week study plan
47
- 4. **Daily Plan** β€” Get 3 curated problems (Easy + Medium + Hard) each day
48
- 5. **Track Progress** β€” Mark problems solved/tried/skipped, view streaks
114
+ ```
115
+ 1. Open http://localhost:3000
116
+ 2. Complete the onboarding survey
117
+ 3. Link your LeetCode username
118
+ 4. Generate a roadmap (AI creates a study plan)
119
+ 5. Open "Today's Plan" β†’ solve 3 curated problems
120
+ 6. Track progress daily
121
+ ```
49
122
 
50
- ### Commands
123
+ ### Regenerating Problems
51
124
 
52
- | Command | Description |
53
- |---------|-------------|
54
- | `algocoach start` | Create .env if missing and start server (default) |
55
- | `algocoach init` | Create .env only |
56
- | `algocoach serve` | Start server (alias for `start`) |
125
+ - **Per problem**: Click the ↻ icon next to any problem to replace it
126
+ - **All problems**: Click "Regenerate" to get 3 entirely new problems
127
+ - **Stuck?**: Click "I'm stuck" on a tried problem to get an easier one
57
128
 
58
- ## Development
129
+ ---
59
130
 
60
- ```bash
61
- git clone https://github.com/yourusername/algocoach
62
- cd algocoach
63
- bun install
64
- bun run build # Build frontend
65
- bun run dev # Dev mode with hot reload (Vite :5173 + server :3000)
66
- bun test # Run tests
67
- ```
131
+ ## βš™οΈ Configuration
132
+
133
+ | Variable | Default | Description |
134
+ |---|---|---|
135
+ | `AI_PROVIDER` | `google` | `google`, `groq`, or `nvidia` |
136
+ | `GEMINI_API_KEY` | β€” | Google Gemini API key |
137
+ | `GROQ_API_KEY` | β€” | Groq API key |
138
+ | `NVIDIA_API_KEY` | β€” | NVIDIA NIM API key |
139
+ | `AI_MODEL` | (provider default) | Override the AI model |
140
+ | `PORT` | `3000` | Server port (auto-fallsback if busy) |
141
+
142
+ Config file: `~/.algocoach/.env`
143
+
144
+ ### Get an API Key
145
+
146
+ | Provider | Get Key | Free Tier |
147
+ |---|---|---|
148
+ | **Google Gemini** | [aistudio.google.com](https://aistudio.google.com) | βœ… Yes |
149
+ | **Groq** | [console.groq.com](https://console.groq.com) | βœ… Yes (fast!) |
150
+ | **NVIDIA NIM** | [build.nvidia.com](https://build.nvidia.com) | βœ… Yes |
151
+
152
+ ---
68
153
 
69
- ## Architecture
154
+ ## πŸ—οΈ Architecture
70
155
 
71
156
  ```
72
- cli/index.ts β€” CLI entry point (algocoach start/serve/init)
73
- server/
74
- index.ts β€” Hono HTTP server, static file serving
75
- db/
76
- schema.ts β€” Drizzle SQLite schema (11 tables)
77
- setup.ts β€” CREATE TABLE SQL
78
- index.ts β€” bun:sqlite connection at ~/.algocoach/data.db
79
- auth/index.ts β€” Better Auth with local-dev bypass
80
- routes/ β€” API route handlers (plan, leetcode, onboard, survey)
81
- services/
82
- ai.ts β€” AI provider wrapper + roadmap/daily-plan generation
83
- ai-provider.ts β€” Google, Groq, NVIDIA provider implementations
84
- leetcode-search.ts β€” LeetCode GraphQL search
85
- src/ β€” React frontend (Vite + Tailwind)
157
+ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
158
+ β”‚ algocoach CLI β”‚
159
+ β”‚ start / init / serve β”‚
160
+ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
161
+ β”‚
162
+ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
163
+ β”‚ Hono HTTP Server β”‚
164
+ β”‚ API routes + Static frontend (dist/) β”‚
165
+ β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
166
+ β”‚ β”‚
167
+ β”Œβ”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”
168
+ β”‚ SQLite DB β”‚ β”‚ AI Providers β”‚
169
+ β”‚ ~/.algocoach/ β”‚ β”‚ Google / Groq β”‚
170
+ β”‚ data.db β”‚ β”‚ / NVIDIA β”‚
171
+ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
172
+ ```
173
+
174
+ **Stack**: Bun + Hono + React + Tailwind + Drizzle ORM + SQLite + Better Auth
175
+
176
+ ### Data
177
+
178
+ - **Database**: `~/.algocoach/data.db` β€” persists across restarts, never sent anywhere
179
+ - **Config**: `~/.algocoach/.env` β€” API keys stay on your machine
180
+ - **No telemetry, no cloud, no signup**
181
+
182
+ ---
183
+
184
+ ## πŸ§ͺ Development
185
+
186
+ ```bash
187
+ git clone https://github.com/NitheshChakaravarthySeelan/algo-coach
188
+ cd algo-coach
189
+ bun install
190
+ bun run dev # Dev mode (hot reload)
191
+ bun run build # Production build
192
+ bun test # Run tests
86
193
  ```
87
194
 
88
- ## Data
195
+ ---
89
196
 
90
- - **Database**: `~/.algocoach/data.db` β€” SQLite, created on first use
91
- - **Config**: `~/.algocoach/.env` β€” API keys and settings
197
+ ## πŸ“„ License
92
198
 
93
- ## AI Providers
199
+ GNU Affero General Public License v3 (AGPL-3.0)
94
200
 
95
- AlgoCoach supports three AI backends for roadmap generation and daily plan selection:
201
+ You're free to fork, modify, and use it personally. If you distribute or run a modified version as a service, you **must** release your source code as well. This prevents anyone from making a proprietary closed-source version of AlgoCoach.
96
202
 
97
- - **Google Gemini** (default) β€” uses `@google/genai` SDK
98
- - **Groq** β€” uses `groq-sdk` for fast inference
99
- - **NVIDIA NIM** β€” uses `openai` SDK with NVIDIA's OpenAI-compatible API
203
+ ---
100
204
 
101
- Set `AI_PROVIDER=groq` or `AI_PROVIDER=nvidia` in `.env` to switch.
205
+ <p align="center">
206
+ Made by <a href="https://github.com/NitheshChakaravarthySeelan">NitheshChakaravarthySeelan</a><br>
207
+ <sub>Built with Bun, React, and a lot of AI tokens</sub>
208
+ </p>
@@ -0,0 +1 @@
1
+ *,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border:0 solid #e5e7eb}:before,:after{--tw-content:""}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:Inter,system-ui,-apple-system,sans-serif;line-height:1.5}body{line-height:inherit;margin:0}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-feature-settings:normal;font-variation-settings:normal;font-family:JetBrains Mono,Fira Code,monospace;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}button,input,optgroup,select,textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:#0000;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{margin:0;padding:0;list-style:none}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder{opacity:1;color:#9ca3af}textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--surface-950:255 255 255;--surface-900:250 250 250;--surface-800:243 244 246;--surface-700:229 231 235;--surface-600:209 213 219;--surface-500:156 163 175;--surface-400:107 114 128;--surface-300:75 85 99;--surface-200:31 41 55;--surface-100:17 24 39;--surface-50:3 7 12;--accent-50:239 246 255;--accent-100:219 234 254;--accent-200:191 219 254;--accent-300:147 197 253;--accent-400:96 165 250;--accent-500:59 130 246;--accent-600:37 99 235;--accent-700:29 78 216;--accent-800:30 64 175;--accent-900:30 58 138;--accent-950:23 37 84}.dark{--surface-50:212 212 212;--surface-100:200 200 200;--surface-200:180 180 180;--surface-300:156 156 156;--surface-400:120 120 120;--surface-500:100 100 100;--surface-600:80 80 80;--surface-700:60 60 60;--surface-800:45 45 45;--surface-900:30 30 30;--surface-950:20 20 20;--accent-50:240 240 240;--accent-100:224 224 224;--accent-200:200 200 200;--accent-300:176 176 176;--accent-400:150 150 150;--accent-500:120 120 120;--accent-600:100 100 100;--accent-700:80 80 80;--accent-800:60 60 60;--accent-900:45 45 45;--accent-950:35 35 35}html{scroll-behavior:smooth}body{--tw-bg-opacity:1;background-color:rgb(var(--surface-950) / var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(var(--surface-200) / var(--tw-text-opacity,1));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Inter,system-ui,-apple-system,sans-serif}::selection{background-color:rgb(var(--accent-500) / .3);--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}::-webkit-scrollbar{width:.5rem}::-webkit-scrollbar-track{--tw-bg-opacity:1;background-color:rgb(var(--surface-800) / var(--tw-bg-opacity,1))}::-webkit-scrollbar-thumb{--tw-bg-opacity:1;background-color:rgb(var(--surface-600) / var(--tw-bg-opacity,1));border-radius:9999px}::-webkit-scrollbar-thumb:hover{--tw-bg-opacity:1;background-color:rgb(var(--surface-500) / var(--tw-bg-opacity,1))}.glass-card{border-width:1px;border-color:rgb(var(--surface-600) / .5);background-color:rgb(var(--surface-800) / .6);--tw-backdrop-blur:blur(24px);-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);border-radius:1rem}.glass-card-hover{border-width:1px;border-color:rgb(var(--surface-600) / .5);background-color:rgb(var(--surface-800) / .6);--tw-backdrop-blur:blur(24px);-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);border-radius:1rem;transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.glass-card-hover:hover{border-color:rgb(var(--accent-500) / .3);--tw-shadow:var(--tw-shadow-colored);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow);--tw-shadow-color:rgb(var(--accent-500) / .05)}.gradient-text{background-image:linear-gradient(to right, var(--tw-gradient-stops));--tw-gradient-from:#fff var(--tw-gradient-from-position);--tw-gradient-to:rgb(var(--accent-400) / 1) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), rgb(var(--accent-200) / 1) var(--tw-gradient-via-position), var(--tw-gradient-to);color:#0000;-webkit-background-clip:text;background-clip:text}.pointer-events-none{pointer-events:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-4{inset:1rem}.-left-32{left:-8rem}.-right-32{right:-8rem}.bottom-1\/4{bottom:25%}.left-0{left:0}.left-3{left:.75rem}.right-0{right:0}.top-0{top:0}.top-1\/2{top:50%}.top-1\/4{top:25%}.z-40{z-index:40}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-12{margin-bottom:3rem}.mb-16{margin-bottom:4rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-4{margin-left:1rem}.mr-1\.5{margin-right:.375rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-12{margin-top:3rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-0\.5{height:.125rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-96{height:24rem}.h-full{height:100%}.max-h-32{max-height:8rem}.max-h-60{max-height:15rem}.max-h-80{max-height:20rem}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-20{width:5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-96{width:24rem}.w-full{width:100%}.min-w-0{min-width:0}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-7xl{max-width:80rem}.max-w-md{max-width:28rem}.max-w-xl{max-width:36rem}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y:-50%;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-90{--tw-rotate:-90deg;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:2s cubic-bezier(.4,0,.6,1) infinite pulse}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:1s linear infinite spin}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.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-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-16{gap:4rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.5rem * var(--tw-space-x-reverse));margin-left:calc(-.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.whitespace-pre-wrap{white-space:pre-wrap}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-accent-500{--tw-border-opacity:1;border-color:rgb(var(--accent-500) / var(--tw-border-opacity,1))}.border-accent-500\/20{border-color:rgb(var(--accent-500) / .2)}.border-accent-500\/40{border-color:rgb(var(--accent-500) / .4)}.border-accent-500\/50{border-color:rgb(var(--accent-500) / .5)}.border-amber-500\/20{border-color:#f59e0b33}.border-emerald-500\/20{border-color:#10b98133}.border-red-500\/20{border-color:#ef444433}.border-surface-500\/30{border-color:rgb(var(--surface-500) / .3)}.border-surface-600{--tw-border-opacity:1;border-color:rgb(var(--surface-600) / var(--tw-border-opacity,1))}.border-surface-600\/30{border-color:rgb(var(--surface-600) / .3)}.border-surface-700{--tw-border-opacity:1;border-color:rgb(var(--surface-700) / var(--tw-border-opacity,1))}.border-surface-700\/30{border-color:rgb(var(--surface-700) / .3)}.border-surface-700\/50{border-color:rgb(var(--surface-700) / .5)}.border-surface-800{--tw-border-opacity:1;border-color:rgb(var(--surface-800) / var(--tw-border-opacity,1))}.border-surface-800\/50{border-color:rgb(var(--surface-800) / .5)}.border-surface-950{--tw-border-opacity:1;border-color:rgb(var(--surface-950) / var(--tw-border-opacity,1))}.border-transparent{border-color:#0000}.bg-accent-400{--tw-bg-opacity:1;background-color:rgb(var(--accent-400) / var(--tw-bg-opacity,1))}.bg-accent-500{--tw-bg-opacity:1;background-color:rgb(var(--accent-500) / var(--tw-bg-opacity,1))}.bg-accent-500\/10{background-color:rgb(var(--accent-500) / .1)}.bg-accent-500\/20{background-color:rgb(var(--accent-500) / .2)}.bg-accent-500\/30{background-color:rgb(var(--accent-500) / .3)}.bg-accent-500\/5{background-color:rgb(var(--accent-500) / .05)}.bg-accent-600{--tw-bg-opacity:1;background-color:rgb(var(--accent-600) / var(--tw-bg-opacity,1))}.bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-black\/60{background-color:#0009}.bg-emerald-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity,1))}.bg-emerald-500\/10{background-color:#10b9811a}.bg-emerald-500\/5{background-color:#10b9810d}.bg-emerald-600{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity,1))}.bg-green-500\/80{background-color:#22c55ecc}.bg-indigo-500\/10{background-color:#6366f11a}.bg-purple-500\/20{background-color:#a855f733}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.bg-red-500\/10{background-color:#ef44441a}.bg-red-500\/80{background-color:#ef4444cc}.bg-surface-500\/30{background-color:rgb(var(--surface-500) / .3)}.bg-surface-600\/30{background-color:rgb(var(--surface-600) / .3)}.bg-surface-700{--tw-bg-opacity:1;background-color:rgb(var(--surface-700) / var(--tw-bg-opacity,1))}.bg-surface-700\/30{background-color:rgb(var(--surface-700) / .3)}.bg-surface-700\/50{background-color:rgb(var(--surface-700) / .5)}.bg-surface-800{--tw-bg-opacity:1;background-color:rgb(var(--surface-800) / var(--tw-bg-opacity,1))}.bg-surface-800\/10{background-color:rgb(var(--surface-800) / .1)}.bg-surface-800\/20{background-color:rgb(var(--surface-800) / .2)}.bg-surface-800\/30{background-color:rgb(var(--surface-800) / .3)}.bg-surface-800\/50{background-color:rgb(var(--surface-800) / .5)}.bg-surface-900{--tw-bg-opacity:1;background-color:rgb(var(--surface-900) / var(--tw-bg-opacity,1))}.bg-surface-900\/30{background-color:rgb(var(--surface-900) / .3)}.bg-surface-900\/50{background-color:rgb(var(--surface-900) / .5)}.bg-surface-900\/80{background-color:rgb(var(--surface-900) / .8)}.bg-surface-950{--tw-bg-opacity:1;background-color:rgb(var(--surface-950) / var(--tw-bg-opacity,1))}.bg-surface-950\/80{background-color:rgb(var(--surface-950) / .8)}.bg-yellow-500\/80{background-color:#eab308cc}.bg-gradient-to-b{background-image:linear-gradient(to bottom, var(--tw-gradient-stops))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right, var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right, var(--tw-gradient-stops))}.from-accent-400{--tw-gradient-from:rgb(var(--accent-400) / 1) var(--tw-gradient-from-position);--tw-gradient-to:rgb(var(--accent-400) / 0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), var(--tw-gradient-to)}.from-accent-500{--tw-gradient-from:rgb(var(--accent-500) / 1) var(--tw-gradient-from-position);--tw-gradient-to:rgb(var(--accent-500) / 0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), var(--tw-gradient-to)}.from-accent-500\/10{--tw-gradient-from:rgb(var(--accent-500) / .1) var(--tw-gradient-from-position);--tw-gradient-to:rgb(var(--accent-500) / 0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), var(--tw-gradient-to)}.from-accent-500\/20{--tw-gradient-from:rgb(var(--accent-500) / .2) var(--tw-gradient-from-position);--tw-gradient-to:rgb(var(--accent-500) / 0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), var(--tw-gradient-to)}.from-accent-500\/5{--tw-gradient-from:rgb(var(--accent-500) / .05) var(--tw-gradient-from-position);--tw-gradient-to:rgb(var(--accent-500) / 0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), var(--tw-gradient-to)}.from-surface-300{--tw-gradient-from:rgb(var(--surface-300) / 1) var(--tw-gradient-from-position);--tw-gradient-to:rgb(var(--surface-300) / 0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), var(--tw-gradient-to)}.from-surface-400{--tw-gradient-from:rgb(var(--surface-400) / 1) var(--tw-gradient-from-position);--tw-gradient-to:rgb(var(--surface-400) / 0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), var(--tw-gradient-to)}.from-surface-500{--tw-gradient-from:rgb(var(--surface-500) / 1) var(--tw-gradient-from-position);--tw-gradient-to:rgb(var(--surface-500) / 0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), var(--tw-gradient-to)}.from-surface-900\/30{--tw-gradient-from:rgb(var(--surface-900) / .3) var(--tw-gradient-from-position);--tw-gradient-to:rgb(var(--surface-900) / 0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), var(--tw-gradient-to)}.from-surface-900\/50{--tw-gradient-from:rgb(var(--surface-900) / .5) var(--tw-gradient-from-position);--tw-gradient-to:rgb(var(--surface-900) / 0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), var(--tw-gradient-to)}.from-transparent{--tw-gradient-from:transparent var(--tw-gradient-from-position);--tw-gradient-to:#0000 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), var(--tw-gradient-to)}.via-accent-500\/5{--tw-gradient-to:rgb(var(--accent-500) / 0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), rgb(var(--accent-500) / .05) var(--tw-gradient-via-position), var(--tw-gradient-to)}.via-transparent{--tw-gradient-to:#0000 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), transparent var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-accent-600{--tw-gradient-to:rgb(var(--accent-600) / 1) var(--tw-gradient-to-position)}.to-accent-600\/10{--tw-gradient-to:rgb(var(--accent-600) / .1) var(--tw-gradient-to-position)}.to-accent-600\/20{--tw-gradient-to:rgb(var(--accent-600) / .2) var(--tw-gradient-to-position)}.to-accent-700{--tw-gradient-to:rgb(var(--accent-700) / 1) var(--tw-gradient-to-position)}.to-surface-100{--tw-gradient-to:rgb(var(--surface-100) / 1) var(--tw-gradient-to-position)}.to-surface-200{--tw-gradient-to:rgb(var(--surface-200) / 1) var(--tw-gradient-to-position)}.to-surface-300{--tw-gradient-to:rgb(var(--surface-300) / 1) var(--tw-gradient-to-position)}.to-surface-600{--tw-gradient-to:rgb(var(--surface-600) / 1) var(--tw-gradient-to-position)}.to-surface-700{--tw-gradient-to:rgb(var(--surface-700) / 1) var(--tw-gradient-to-position)}.to-surface-900\/30{--tw-gradient-to:rgb(var(--surface-900) / .3) var(--tw-gradient-to-position)}.to-surface-900\/50{--tw-gradient-to:rgb(var(--surface-900) / .5) var(--tw-gradient-to-position)}.to-transparent{--tw-gradient-to:transparent var(--tw-gradient-to-position)}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.stroke-surface-100{stroke:rgb(var(--surface-100) / 1)}.stroke-surface-200{stroke:rgb(var(--surface-200) / 1)}.stroke-surface-300{stroke:rgb(var(--surface-300) / 1)}.p-1{padding:.25rem}.p-12{padding:3rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-3\.5{padding:.875rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-24{padding-top:6rem;padding-bottom:6rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-16{padding-bottom:4rem}.pl-10{padding-left:2.5rem}.pl-9{padding-left:2.25rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-24{padding-top:6rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-8{padding-top:2rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:JetBrains Mono,Fira Code,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-6xl{font-size:3.75rem;line-height:1}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.capitalize{text-transform:capitalize}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.text-accent-300{--tw-text-opacity:1;color:rgb(var(--accent-300) / var(--tw-text-opacity,1))}.text-accent-400{--tw-text-opacity:1;color:rgb(var(--accent-400) / var(--tw-text-opacity,1))}.text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.text-emerald-400{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity,1))}.text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity,1))}.text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.text-surface-100{--tw-text-opacity:1;color:rgb(var(--surface-100) / var(--tw-text-opacity,1))}.text-surface-200{--tw-text-opacity:1;color:rgb(var(--surface-200) / var(--tw-text-opacity,1))}.text-surface-300{--tw-text-opacity:1;color:rgb(var(--surface-300) / var(--tw-text-opacity,1))}.text-surface-400{--tw-text-opacity:1;color:rgb(var(--surface-400) / var(--tw-text-opacity,1))}.text-surface-50{--tw-text-opacity:1;color:rgb(var(--surface-50) / var(--tw-text-opacity,1))}.text-surface-500{--tw-text-opacity:1;color:rgb(var(--surface-500) / var(--tw-text-opacity,1))}.text-surface-600{--tw-text-opacity:1;color:rgb(var(--surface-600) / var(--tw-text-opacity,1))}.text-transparent{color:#0000}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.placeholder-surface-500::placeholder{--tw-placeholder-opacity:1;color:rgb(var(--surface-500) / var(--tw-placeholder-opacity,1))}.accent-accent-500{accent-color:rgb(var(--accent-500) / 1)}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-accent-500\/20{--tw-shadow-color:rgb(var(--accent-500) / .2);--tw-shadow:var(--tw-shadow-colored)}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.blur-2xl{--tw-blur:blur(40px);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)}.blur-3xl{--tw-blur:blur(64px);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)}.blur-xl{--tw-blur:blur(24px);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)}.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(4px);-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)}.backdrop-blur-xl{--tw-backdrop-blur:blur(24px);-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{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-property:opacity;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-property:transform;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-200{transition-duration:.2s}.duration-500{transition-duration:.5s}.text-balance{text-wrap:balance}.hover\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-accent-400:hover{--tw-border-opacity:1;border-color:rgb(var(--accent-400) / var(--tw-border-opacity,1))}.hover\:border-emerald-500:hover{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity,1))}.hover\:border-surface-600:hover{--tw-border-opacity:1;border-color:rgb(var(--surface-600) / var(--tw-border-opacity,1))}.hover\:border-surface-600\/50:hover{border-color:rgb(var(--surface-600) / .5)}.hover\:border-surface-700\/60:hover{border-color:rgb(var(--surface-700) / .6)}.hover\:bg-accent-500:hover{--tw-bg-opacity:1;background-color:rgb(var(--accent-500) / var(--tw-bg-opacity,1))}.hover\:bg-accent-500\/10:hover{background-color:rgb(var(--accent-500) / .1)}.hover\:bg-amber-500\/20:hover{background-color:#f59e0b33}.hover\:bg-emerald-500\/20:hover{background-color:#10b98133}.hover\:bg-indigo-500\/20:hover{background-color:#6366f133}.hover\:bg-red-500\/20:hover{background-color:#ef444433}.hover\:bg-surface-700:hover{--tw-bg-opacity:1;background-color:rgb(var(--surface-700) / var(--tw-bg-opacity,1))}.hover\:bg-surface-800:hover{--tw-bg-opacity:1;background-color:rgb(var(--surface-800) / var(--tw-bg-opacity,1))}.hover\:bg-surface-800\/20:hover{background-color:rgb(var(--surface-800) / .2)}.hover\:bg-surface-800\/50:hover{background-color:rgb(var(--surface-800) / .5)}.hover\:text-accent-400:hover{--tw-text-opacity:1;color:rgb(var(--accent-400) / var(--tw-text-opacity,1))}.hover\:text-surface-200:hover{--tw-text-opacity:1;color:rgb(var(--surface-200) / var(--tw-text-opacity,1))}.hover\:text-surface-300:hover{--tw-text-opacity:1;color:rgb(var(--surface-300) / var(--tw-text-opacity,1))}.hover\:text-surface-50:hover{--tw-text-opacity:1;color:rgb(var(--surface-50) / var(--tw-text-opacity,1))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.hover\:shadow-accent-500\/30:hover{--tw-shadow-color:rgb(var(--accent-500) / .3);--tw-shadow:var(--tw-shadow-colored)}.focus\:border-accent-500\/50:focus{border-color:rgb(var(--accent-500) / .5)}.focus\:outline-none:focus{outline-offset:2px;outline:2px solid #0000}.focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.focus\:ring-accent-500\/20:focus{--tw-ring-color:rgb(var(--accent-500) / .2)}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:opacity-100{opacity:1}@media (width>=640px){.sm\:inset-auto{inset:auto}.sm\:left-1\/2{left:50%}.sm\:top-1\/2{top:50%}.sm\:block{display:block}.sm\:inline{display:inline}.sm\:w-48{width:12rem}.sm\:w-auto{width:auto}.sm\:w-full{width:100%}.sm\:max-w-lg{max-width:32rem}.sm\:flex-initial{flex:0 auto}.sm\:-translate-x-1\/2{--tw-translate-x:-50%;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:-translate-y-1\/2{--tw-translate-y:-50%;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:text-3xl{font-size:1.875rem;line-height:2.25rem}.sm\:text-5xl{font-size:3rem;line-height:1}.sm\:text-6xl{font-size:3.75rem;line-height:1}.sm\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (width>=768px){.md\:col-span-4{grid-column:span 4/span 4}.md\:flex{display:flex}.md\:hidden{display:none}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:flex-row{flex-direction:row}}@media (width>=1024px){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:p-8{padding:2rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:text-7xl{font-size:4.5rem;line-height:1}}