@omnicross/ui 0.2.1 → 0.3.1

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,89 +1,89 @@
1
- # @omnicross/ui — Control Panel frontend
2
-
3
- The Omnicross Control Panel: a **Vite + React frontend** wired to the daemon's
4
- localhost admin HTTP API (`/admin/api/*`). The package publishes only its built
5
- `dist/` (static assets, zero runtime deps); the source lives right here. It has
6
- no hard runtime dependency on any shell — the same build runs
7
-
8
- 1. **served by the daemon** at `http://127.0.0.1:8766/ui` (same origin as the
9
- admin API — no CORS). This is what `omnicross ui` launches; `@omnicross/daemon`
10
- depends on this package and resolves its `dist/` at runtime.
11
- 2. **inside the Tauri desktop shell** (`../../apps/desktop`) — the only
12
- Tauri-aware code paths are three `isTauri()`-guarded seams (native fetch, the
13
- `daemon_status` command, tray/autostart settings); in a plain browser they
14
- fall back to platform `fetch` / a liveness probe / hidden rows.
15
- 3. **on the Vite dev server** (port 1430). The daemon deliberately sends no
16
- CORS headers, so the dev server **proxies `/admin/*` to it server-side** —
17
- the browser only ever talks same-origin, exactly like the production `/ui`
18
- serving. Works against a real daemon or the mock, no `.env` needed.
19
-
20
- ## Prerequisites
21
-
22
- - Node 18+ and npm. Nothing else for `npm run dev` at the repo root (it boots
23
- the daemon for you); frontend-only dev needs a daemon (or the mock) on
24
- `127.0.0.1:8766` for the proxy to forward to.
25
-
26
- ## Configure (optional)
27
-
28
- Zero config by default. `.env` (see `.env.example`) is only for unusual setups:
29
-
30
- - `VITE_DAEMON_ADMIN_TOKEN` — when the daemon sets `admin.token`, put the same
31
- value here so requests carry `Authorization: Bearer <token>`.
32
- - `VITE_DAEMON_PROXY_TARGET` — where the dev proxy forwards `/admin/*`
33
- (default `http://127.0.0.1:8766`).
34
- - `VITE_DAEMON_BASE_URL` — overrides the client's base URL entirely. Do NOT
35
- set it to an absolute URL for browser dev: that bypasses the proxy and
36
- cross-origin calls fail by design (the daemon sends no CORS headers).
37
-
38
- ## Run
39
-
40
- This is a workspace member — `npm install` at the repo root installs everything.
41
-
42
- ```bash
43
- # One command, both halves (recommended): daemon on 8766 + Vite on 1430
44
- npm run dev # at the REPO ROOT — seeds omnicross.dev.config.json on first run
45
-
46
- # Frontend only (you provide the daemon or the mock on 8766):
47
- npm run dev -w @omnicross/ui # http://localhost:1430 — /admin/* proxied to 127.0.0.1:8766
48
- node scripts/mock-daemon.mjs # or: a no-key mock admin API on 8766
49
- ```
50
-
51
- For the native desktop window, use the Tauri shell project instead:
52
- `cd apps/desktop && npm run dev`.
53
-
54
- ## Build / verify
55
-
56
- ```bash
57
- npm run typecheck -w @omnicross/ui # tsc --noEmit
58
- npm run build -w @omnicross/ui # vite build → dist/ (relative-asset base; servable at any mount path)
59
- ```
60
-
61
- `prepack` runs the build automatically, so `npm publish` always ships a fresh
62
- `dist/`. The daemon serves whatever `packages/ui/dist/` holds — rebuild after
63
- frontend changes (or point `OMNICROSS_UI_DIST` elsewhere).
64
-
65
- ## Architecture
66
-
67
- - `src/daemon/` — the typed admin HTTP client (`adminClient.ts`) + the provider
68
- DTO adapter (`llmConfigAdapter.ts`) that maps the daemon's thin provider DTO
69
- to the Provider page's rich `LLMProvider` shape. `httpFetch.ts` is the
70
- transport seam (Tauri plugin-http inside the shell, platform `fetch` otherwise);
71
- `adminClient.ts` picks the base URL by host context (loopback inside Tauri,
72
- same-origin everywhere else — the daemon-served `/ui` directly, the Vite dev
73
- server via its `/admin` proxy).
74
- - `src/shared/` — the local seam: `agent` (daemon-pointed, no `window.native`),
75
- a single-slice `settingsStore` (`useLlmProvidersData`), a `useTranslation`
76
- shim, and `cn`.
77
- - `src/shared-types/` — the hand-mirrored subset of the daemon/upstream
78
- `llm-config` types the page consumes.
79
- - `src/components/ui/` — shared UI primitives.
80
- - `src/features/` — the pages (provider settings, accounts, API service,
81
- Code CLI, settings).
82
- - The Tauri shell itself lives in `apps/desktop/src-tauri` (separate project).
83
-
84
- ### Disabled-when-unbacked controls
85
-
86
- The full Provider form is rendered for visual fidelity. Controls whose
87
- underlying field has no daemon backing render **disabled with a tooltip**
88
- ("Not yet supported by the daemon") — never hidden, never fake-success. The only
89
- hard exclusion is the Electron-only encrypted-credential migration pack.
1
+ # @omnicross/ui — Control Panel frontend
2
+
3
+ The Omnicross Control Panel: a **Vite + React frontend** wired to the daemon's
4
+ localhost admin HTTP API (`/admin/api/*`). The package publishes only its built
5
+ `dist/` (static assets, zero runtime deps); the source lives right here. It has
6
+ no hard runtime dependency on any shell — the same build runs
7
+
8
+ 1. **served by the daemon** at `http://127.0.0.1:8766/ui` (same origin as the
9
+ admin API — no CORS). This is what `omnicross ui` launches; `@omnicross/daemon`
10
+ depends on this package and resolves its `dist/` at runtime.
11
+ 2. **inside the Tauri desktop shell** (`../../apps/desktop`) — the only
12
+ Tauri-aware code paths are three `isTauri()`-guarded seams (native fetch, the
13
+ `daemon_status` command, tray/autostart settings); in a plain browser they
14
+ fall back to platform `fetch` / a liveness probe / hidden rows.
15
+ 3. **on the Vite dev server** (port 1430). The daemon deliberately sends no
16
+ CORS headers, so the dev server **proxies `/admin/*` to it server-side** —
17
+ the browser only ever talks same-origin, exactly like the production `/ui`
18
+ serving. Works against a real daemon or the mock, no `.env` needed.
19
+
20
+ ## Prerequisites
21
+
22
+ - Node 18+ and npm. Nothing else for `npm run dev` at the repo root (it boots
23
+ the daemon for you); frontend-only dev needs a daemon (or the mock) on
24
+ `127.0.0.1:8766` for the proxy to forward to.
25
+
26
+ ## Configure (optional)
27
+
28
+ Zero config by default. `.env` (see `.env.example`) is only for unusual setups:
29
+
30
+ - `VITE_DAEMON_ADMIN_TOKEN` — when the daemon sets `admin.token`, put the same
31
+ value here so requests carry `Authorization: Bearer <token>`.
32
+ - `VITE_DAEMON_PROXY_TARGET` — where the dev proxy forwards `/admin/*`
33
+ (default `http://127.0.0.1:8766`).
34
+ - `VITE_DAEMON_BASE_URL` — overrides the client's base URL entirely. Do NOT
35
+ set it to an absolute URL for browser dev: that bypasses the proxy and
36
+ cross-origin calls fail by design (the daemon sends no CORS headers).
37
+
38
+ ## Run
39
+
40
+ This is a workspace member — `npm install` at the repo root installs everything.
41
+
42
+ ```bash
43
+ # One command, both halves (recommended): daemon on 8766 + Vite on 1430
44
+ npm run dev # at the REPO ROOT — seeds omnicross.dev.config.json on first run
45
+
46
+ # Frontend only (you provide the daemon or the mock on 8766):
47
+ npm run dev -w @omnicross/ui # http://localhost:1430 — /admin/* proxied to 127.0.0.1:8766
48
+ node scripts/mock-daemon.mjs # or: a no-key mock admin API on 8766
49
+ ```
50
+
51
+ For the native desktop window, use the Tauri shell project instead:
52
+ `cd apps/desktop && npm run dev`.
53
+
54
+ ## Build / verify
55
+
56
+ ```bash
57
+ npm run typecheck -w @omnicross/ui # tsc --noEmit
58
+ npm run build -w @omnicross/ui # vite build → dist/ (relative-asset base; servable at any mount path)
59
+ ```
60
+
61
+ `prepack` runs the build automatically, so `npm publish` always ships a fresh
62
+ `dist/`. The daemon serves whatever `packages/ui/dist/` holds — rebuild after
63
+ frontend changes (or point `OMNICROSS_UI_DIST` elsewhere).
64
+
65
+ ## Architecture
66
+
67
+ - `src/daemon/` — the typed admin HTTP client (`adminClient.ts`) + the provider
68
+ DTO adapter (`llmConfigAdapter.ts`) that maps the daemon's thin provider DTO
69
+ to the Provider page's rich `LLMProvider` shape. `httpFetch.ts` is the
70
+ transport seam (Tauri plugin-http inside the shell, platform `fetch` otherwise);
71
+ `adminClient.ts` picks the base URL by host context (loopback inside Tauri,
72
+ same-origin everywhere else — the daemon-served `/ui` directly, the Vite dev
73
+ server via its `/admin` proxy).
74
+ - `src/shared/` — the local seam: `agent` (daemon-pointed, no `window.native`),
75
+ a single-slice `settingsStore` (`useLlmProvidersData`), a `useTranslation`
76
+ shim, and `cn`.
77
+ - `src/shared-types/` — the hand-mirrored subset of the daemon/upstream
78
+ `llm-config` types the page consumes.
79
+ - `src/components/ui/` — shared UI primitives.
80
+ - `src/features/` — the pages (provider settings, accounts, API service,
81
+ Code CLI, settings).
82
+ - The Tauri shell itself lives in `apps/desktop/src-tauri` (separate project).
83
+
84
+ ### Disabled-when-unbacked controls
85
+
86
+ The full Provider form is rendered for visual fidelity. Controls whose
87
+ underlying field has no daemon backing render **disabled with a tooltip**
88
+ ("Not yet supported by the daemon") — never hidden, never fake-success. The only
89
+ hard exclusion is the Electron-only encrypted-credential migration pack.
@@ -0,0 +1 @@
1
+ *,:before,:after{--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: rgb(59 130 246 / .5);--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: }::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: rgb(59 130 246 / .5);--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-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--font-sans);font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--font-mono);font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings: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:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-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{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,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{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--font-sans: "Inter", system-ui, "Segoe UI", Roboto, sans-serif;--font-mono: ui-monospace, SFMono-Regular, Consolas, Menlo, monospace;--font-display: Georgia, "Times New Roman", serif;--surface-0: 50 37% 97%;--surface-1: 48 31% 94%;--surface-2: 47 25% 89%;--surface-3: 46 22% 85%;--line: 44 19% 81%;--text-strong: 60 3% 8%;--text-muted: 48 3% 36%;--text-subtle: 53 3% 51%;--accent: 15 56% 52%;--accent-soft: 15 56% 87%;--success: 142 75% 36%;--warning: 45 93% 47%;--danger: 0 56% 45%;--background: var(--surface-0);--foreground: var(--text-strong);--card: var(--surface-1);--card-foreground: var(--text-strong);--popover: var(--surface-3);--popover-foreground: var(--text-strong);--primary: var(--accent);--primary-foreground: 210 40% 98%;--secondary: var(--surface-2);--secondary-foreground: var(--text-strong);--muted: var(--surface-2);--muted-foreground: var(--text-muted);--accent-foreground: 210 40% 98%;--destructive: var(--danger);--destructive-foreground: 210 40% 98%;--border: var(--line);--input: var(--line);--ring: var(--accent);--radius: .5rem}.dark{--surface-0: 60 3% 8%;--surface-1: 30 6% 12%;--surface-2: 36 6% 16%;--surface-3: 34 7% 21%;--line: 40 7% 24%;--text-strong: 47 31% 94%;--text-muted: 49 7% 67%;--text-subtle: 53 3% 51%;--accent: 15 56% 52%;--accent-soft: 15 56% 17%;--success: 141 61% 44%;--warning: 45 93% 47%;--danger: 3 58% 62%;--background: var(--surface-0);--foreground: var(--text-strong);--card: var(--surface-2);--card-foreground: var(--text-strong);--popover: var(--surface-3);--popover-foreground: var(--text-strong);--primary: var(--accent);--primary-foreground: 210 40% 98%;--secondary: var(--surface-2);--secondary-foreground: var(--text-strong);--muted: var(--surface-2);--muted-foreground: var(--text-muted);--accent-foreground: 210 40% 98%;--destructive: var(--danger);--destructive-foreground: 210 40% 98%;--border: var(--line);--input: 40 7% 24%;--ring: var(--accent)}*{border-color:hsl(var(--border))}html,body,#root{height:100%}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:var(--font-sans);-webkit-font-smoothing:antialiased;margin:0}:focus-visible{scroll-margin:.75rem}.container{width:100%;margin-right:auto;margin-left:auto;padding-right:2rem;padding-left:2rem}@media (min-width: 1400px){.container{max-width:1400px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.bottom-full{bottom:100%}.left-0{left:0}.left-1{left:.25rem}.left-1\/2{left:50%}.left-2\.5{left:.625rem}.left-3{left:.75rem}.left-\[12\.5\%\]{left:12.5%}.left-\[50\%\]{left:50%}.left-full{left:100%}.right-0{right:0}.right-2{right:.5rem}.right-4{right:1rem}.right-\[12\.5\%\]{right:12.5%}.right-full{right:100%}.top-0{top:0}.top-1\/2{top:50%}.top-2\.5{top:.625rem}.top-4{top:1rem}.top-\[2\.1rem\]{top:2.1rem}.top-\[50\%\]{top:50%}.top-full{top:100%}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.z-\[60\]{z-index:60}.z-\[70\]{z-index:70}.z-\[9999\]{z-index:9999}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mr-auto{margin-right:auto}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-auto{margin-top:auto}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-0{height:0px}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-40{height:10rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-72{height:18rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[38\%\]{height:38%}.h-\[42\%\]{height:42%}.h-\[88vh\]{height:88vh}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-32{max-height:8rem}.max-h-64{max-height:16rem}.max-h-80{max-height:20rem}.max-h-\[88vh\]{max-height:88vh}.max-h-\[90vh\]{max-height:90vh}.min-h-0{min-height:0px}.min-h-10{min-height:2.5rem}.min-h-14{min-height:3.5rem}.min-h-56{min-height:14rem}.min-h-64{min-height:16rem}.min-h-9{min-height:2.25rem}.min-h-\[64px\]{min-height:64px}.w-0{width:0px}.w-0\.5{width:.125rem}.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-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-40{width:10rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-60{width:15rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[105px\]{width:105px}.w-\[150px\]{width:150px}.w-\[185px\]{width:185px}.w-\[250px\]{width:250px}.w-\[90px\]{width:90px}.w-\[95px\]{width:95px}.w-auto{width:auto}.w-full{width:100%}.w-screen{width:100vw}.min-w-0{min-width:0px}.min-w-52{min-width:13rem}.min-w-\[1160px\]{min-width:1160px}.min-w-\[180px\]{min-width:180px}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-56{max-width:14rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-\[28rem\]{max-width:28rem}.max-w-\[60\%\]{max-width:60%}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-4{--tw-translate-x: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(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)) skew(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)) skew(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:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-grab{cursor:grab}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize-y{resize:vertical}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.grid-cols-\[minmax\(0\,1fr\)_20px_minmax\(0\,1fr\)_32px\]{grid-template-columns:minmax(0,1fr) 20px minmax(0,1fr) 32px}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-px{gap:1px}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-1{row-gap:.25rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-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-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * 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))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-border\/60>:not([hidden])~:not([hidden]){border-color:hsl(var(--border) / .6)}.divide-border\/70>:not([hidden])~:not([hidden]){border-color:hsl(var(--border) / .7)}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.scroll-smooth{scroll-behavior:smooth}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-\[3px\]{border-radius:3px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.25rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-4{border-width:4px}.border-y{border-top-width:1px;border-bottom-width:1px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-amber-500\/35{border-color:#f59e0b59}.border-amber-500\/40{border-color:#f59e0b66}.border-amber-500\/60{border-color:#f59e0b99}.border-border{border-color:hsl(var(--border))}.border-border\/30{border-color:hsl(var(--border) / .3)}.border-border\/40{border-color:hsl(var(--border) / .4)}.border-border\/50{border-color:hsl(var(--border) / .5)}.border-border\/60{border-color:hsl(var(--border) / .6)}.border-border\/70{border-color:hsl(var(--border) / .7)}.border-destructive\/30{border-color:hsl(var(--destructive) / .3)}.border-destructive\/35{border-color:hsl(var(--destructive) / .35)}.border-destructive\/40{border-color:hsl(var(--destructive) / .4)}.border-destructive\/60{border-color:hsl(var(--destructive) / .6)}.border-emerald-500\/30{border-color:#10b9814d}.border-emerald-500\/35{border-color:#10b98159}.border-input{border-color:hsl(var(--input))}.border-primary{border-color:hsl(var(--primary))}.border-primary\/20{border-color:hsl(var(--primary) / .2)}.border-primary\/30{border-color:hsl(var(--primary) / .3)}.border-primary\/35{border-color:hsl(var(--primary) / .35)}.border-primary\/40{border-color:hsl(var(--primary) / .4)}.border-primary\/50{border-color:hsl(var(--primary) / .5)}.border-primary\/60{border-color:hsl(var(--primary) / .6)}.border-red-500\/20{border-color:#ef444433}.border-rose-500\/30{border-color:#f43f5e4d}.border-rose-500\/40{border-color:#f43f5e66}.border-sky-500\/35{border-color:#0ea5e959}.border-success\/30{border-color:hsl(var(--success) / .3)}.border-success\/50{border-color:hsl(var(--success) / .5)}.border-success\/60{border-color:hsl(var(--success) / .6)}.border-transparent{border-color:transparent}.border-warning\/40{border-color:hsl(var(--warning) / .4)}.border-warning\/50{border-color:hsl(var(--warning) / .5)}.border-warning\/60{border-color:hsl(var(--warning) / .6)}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-500\/15{background-color:#f59e0b26}.bg-amber-500\/60{background-color:#f59e0b99}.bg-amber-500\/\[0\.03\]{background-color:#f59e0b08}.bg-amber-500\/\[0\.07\]{background-color:#f59e0b12}.bg-background{background-color:hsl(var(--background))}.bg-black\/50{background-color:#00000080}.bg-black\/80{background-color:#000c}.bg-border{background-color:hsl(var(--border))}.bg-border\/70{background-color:hsl(var(--border) / .7)}.bg-destructive{background-color:hsl(var(--destructive))}.bg-destructive\/10{background-color:hsl(var(--destructive) / .1)}.bg-destructive\/15{background-color:hsl(var(--destructive) / .15)}.bg-destructive\/5{background-color:hsl(var(--destructive) / .05)}.bg-emerald-500\/10{background-color:#10b9811a}.bg-emerald-500\/15{background-color:#10b98126}.bg-emerald-500\/5{background-color:#10b9810d}.bg-emerald-500\/\[0\.06\]{background-color:#10b9810f}.bg-input{background-color:hsl(var(--input))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted-foreground\/50{background-color:hsl(var(--muted-foreground) / .5)}.bg-muted\/30{background-color:hsl(var(--muted) / .3)}.bg-muted\/40{background-color:hsl(var(--muted) / .4)}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-primary-soft\/20{background-color:hsl(var(--accent-soft) / .2)}.bg-primary-soft\/30{background-color:hsl(var(--accent-soft) / .3)}.bg-primary-soft\/35{background-color:hsl(var(--accent-soft) / .35)}.bg-primary-soft\/40{background-color:hsl(var(--accent-soft) / .4)}.bg-primary\/10{background-color:hsl(var(--primary) / .1)}.bg-primary\/15{background-color:hsl(var(--primary) / .15)}.bg-primary\/35{background-color:hsl(var(--primary) / .35)}.bg-primary\/5{background-color:hsl(var(--primary) / .05)}.bg-red-500\/10{background-color:#ef44441a}.bg-rose-500\/10{background-color:#f43f5e1a}.bg-rose-500\/5{background-color:#f43f5e0d}.bg-sky-500\/\[0\.06\]{background-color:#0ea5e90f}.bg-success{background-color:hsl(var(--success))}.bg-success\/10{background-color:hsl(var(--success) / .1)}.bg-success\/15{background-color:hsl(var(--success) / .15)}.bg-surface-0{background-color:hsl(var(--surface-0))}.bg-surface-0\/30{background-color:hsl(var(--surface-0) / .3)}.bg-surface-0\/45{background-color:hsl(var(--surface-0) / .45)}.bg-surface-0\/50{background-color:hsl(var(--surface-0) / .5)}.bg-surface-0\/60{background-color:hsl(var(--surface-0) / .6)}.bg-surface-0\/70{background-color:hsl(var(--surface-0) / .7)}.bg-surface-0\/80{background-color:hsl(var(--surface-0) / .8)}.bg-surface-1{background-color:hsl(var(--surface-1))}.bg-surface-1\/30{background-color:hsl(var(--surface-1) / .3)}.bg-surface-1\/35{background-color:hsl(var(--surface-1) / .35)}.bg-surface-1\/40{background-color:hsl(var(--surface-1) / .4)}.bg-surface-1\/45{background-color:hsl(var(--surface-1) / .45)}.bg-surface-1\/50{background-color:hsl(var(--surface-1) / .5)}.bg-surface-1\/60{background-color:hsl(var(--surface-1) / .6)}.bg-surface-1\/70{background-color:hsl(var(--surface-1) / .7)}.bg-surface-1\/95{background-color:hsl(var(--surface-1) / .95)}.bg-surface-2{background-color:hsl(var(--surface-2))}.bg-surface-2\/30{background-color:hsl(var(--surface-2) / .3)}.bg-surface-2\/40{background-color:hsl(var(--surface-2) / .4)}.bg-surface-2\/45{background-color:hsl(var(--surface-2) / .45)}.bg-surface-2\/50{background-color:hsl(var(--surface-2) / .5)}.bg-surface-2\/60{background-color:hsl(var(--surface-2) / .6)}.bg-surface-2\/70{background-color:hsl(var(--surface-2) / .7)}.bg-surface-2\/80{background-color:hsl(var(--surface-2) / .8)}.bg-transparent{background-color:transparent}.bg-warning{background-color:hsl(var(--warning))}.bg-warning\/10{background-color:hsl(var(--warning) / .1)}.bg-warning\/15{background-color:hsl(var(--warning) / .15)}.bg-warning\/5{background-color:hsl(var(--warning) / .05)}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.from-surface-0{--tw-gradient-from: hsl(var(--surface-0)) var(--tw-gradient-from-position);--tw-gradient-to: hsl(var(--surface-0) / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.via-surface-0\/80{--tw-gradient-to: hsl(var(--surface-0) / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), hsl(var(--surface-0) / .8) var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-transparent{--tw-gradient-to: transparent var(--tw-gradient-to-position)}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-0{padding-left:0;padding-right:0}.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-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0{padding-top:0;padding-bottom:0}.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-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-1{padding-bottom:.25rem}.pb-\[calc\(4\.5rem\+env\(safe-area-inset-bottom\)\)\]{padding-bottom:calc(4.5rem + env(safe-area-inset-bottom))}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-7{padding-left:1.75rem}.pl-8{padding-left:2rem}.pl-9{padding-left:2.25rem}.pr-1{padding-right:.25rem}.pr-10{padding-right:2.5rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pr-8{padding-right:2rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.font-display{font-family:var(--font-display)}.font-mono{font-family:var(--font-mono)}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-base{font-size:.875rem;line-height:1.35rem}.text-lg{font-size:1rem;line-height:1.55rem}.text-sm{font-size:.8125rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1.125rem}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-none{line-height:1}.tracking-\[0\.01em\]{letter-spacing:.01em}.tracking-\[0\.06em\]{letter-spacing:.06em}.tracking-\[0\.08em\]{letter-spacing:.08em}.tracking-\[0\.12em\]{letter-spacing:.12em}.tracking-\[0\.14em\]{letter-spacing:.14em}.tracking-\[0\.16em\]{letter-spacing:.16em}.tracking-\[0\.3em\]{letter-spacing:.3em}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-amber-600\/70{color:#d97706b3}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-border{color:hsl(var(--border))}.text-cyan-500{--tw-text-opacity: 1;color:rgb(6 182 212 / var(--tw-text-opacity, 1))}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-emerald-500{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.text-emerald-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.text-foreground{color:hsl(var(--foreground))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-indigo-500{--tw-text-opacity: 1;color:rgb(99 102 241 / var(--tw-text-opacity, 1))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-muted-foreground\/40{color:hsl(var(--muted-foreground) / .4)}.text-muted-foreground\/50{color:hsl(var(--muted-foreground) / .5)}.text-muted-foreground\/60{color:hsl(var(--muted-foreground) / .6)}.text-muted-foreground\/70{color:hsl(var(--muted-foreground) / .7)}.text-muted-foreground\/80{color:hsl(var(--muted-foreground) / .8)}.text-orange-400{--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity, 1))}.text-orange-500{--tw-text-opacity: 1;color:rgb(249 115 22 / var(--tw-text-opacity, 1))}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-purple-500{--tw-text-opacity: 1;color:rgb(168 85 247 / var(--tw-text-opacity, 1))}.text-purple-600{--tw-text-opacity: 1;color:rgb(147 51 234 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-rose-500{--tw-text-opacity: 1;color:rgb(244 63 94 / var(--tw-text-opacity, 1))}.text-rose-600{--tw-text-opacity: 1;color:rgb(225 29 72 / var(--tw-text-opacity, 1))}.text-rose-700{--tw-text-opacity: 1;color:rgb(190 18 60 / var(--tw-text-opacity, 1))}.text-sky-700{--tw-text-opacity: 1;color:rgb(3 105 161 / var(--tw-text-opacity, 1))}.text-success{color:hsl(var(--success))}.text-teal-500{--tw-text-opacity: 1;color:rgb(20 184 166 / var(--tw-text-opacity, 1))}.text-text-muted{color:hsl(var(--text-muted))}.text-warning{color:hsl(var(--warning))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.accent-primary{accent-color:hsl(var(--primary))}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px 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-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px 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-\[0_-8px_24px_hsl\(var\(--text-strong\)\/0\.08\)\]{--tw-shadow: 0 -8px 24px hsl(var(--text-strong)/.08);--tw-shadow-colored: 0 -8px 24px 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-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--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-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px 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-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 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 rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--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-black\/\[0\.02\]{--tw-shadow-color: rgb(0 0 0 / .02);--tw-shadow: var(--tw-shadow-colored)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-0{--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(0px + 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)}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.blur{--tw-blur: blur(8px);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{--tw-backdrop-blur: blur(8px);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,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.request-path-live:after{content:"";position:absolute;top:-2px;left:0;width:5px;height:5px;border-radius:999px;background:hsl(var(--success));box-shadow:0 0 0 3px hsl(var(--surface-1));animation:request-path-travel 3.2s linear infinite}@keyframes request-path-travel{0%{left:0}to{left:calc(100% - 5px)}}@media (prefers-reduced-motion: reduce){*,*:before,*:after{scroll-behavior:auto!important;animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:inset-x-2:after{content:var(--tw-content);left:.5rem;right:.5rem}.after\:bottom-0:after{content:var(--tw-content);bottom:0}.after\:h-0\.5:after{content:var(--tw-content);height:.125rem}.after\:bg-primary:after{content:var(--tw-content);background-color:hsl(var(--primary))}.first\:mt-0:first-child{margin-top:0}.last\:border-b-0:last-child{border-bottom-width:0px}.hover\:border-border:hover{border-color:hsl(var(--border))}.hover\:border-destructive\/70:hover{border-color:hsl(var(--destructive) / .7)}.hover\:border-primary:hover{border-color:hsl(var(--primary))}.hover\:border-primary\/40:hover{border-color:hsl(var(--primary) / .4)}.hover\:border-primary\/50:hover{border-color:hsl(var(--primary) / .5)}.hover\:border-text-subtle\/40:hover{border-color:hsl(var(--text-subtle) / .4)}.hover\:border-warning\/70:hover{border-color:hsl(var(--warning) / .7)}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted) / .5)}.hover\:bg-muted\/60:hover{background-color:hsl(var(--muted) / .6)}.hover\:bg-primary-soft\/30:hover{background-color:hsl(var(--accent-soft) / .3)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:bg-surface-1:hover{background-color:hsl(var(--surface-1))}.hover\:bg-surface-2:hover{background-color:hsl(var(--surface-2))}.hover\:bg-surface-2\/40:hover{background-color:hsl(var(--surface-2) / .4)}.hover\:bg-surface-2\/60:hover{background-color:hsl(var(--surface-2) / .6)}.hover\:bg-surface-2\/70:hover{background-color:hsl(var(--surface-2) / .7)}.hover\:bg-surface-2\/80:hover{background-color:hsl(var(--surface-2) / .8)}.hover\:text-destructive:hover{color:hsl(var(--destructive))}.hover\:text-destructive\/80:hover{color:hsl(var(--destructive) / .8)}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.focus\:border-primary\/50:focus{border-color:hsl(var(--primary) / .5)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2: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(2px + 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-primary:focus{--tw-ring-color: hsl(var(--primary))}.focus\:ring-primary\/50:focus{--tw-ring-color: hsl(var(--primary) / .5)}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-1:focus-visible{--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-visible\:ring-2:focus-visible{--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(2px + 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-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-offset-0:focus-visible{--tw-ring-offset-width: 0px}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color: hsl(var(--background))}.active\:cursor-grabbing:active{cursor:grabbing}.active\:bg-primary\/80:active{background-color:hsl(var(--primary) / .8)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:text-muted-foreground{color:hsl(var(--muted-foreground))}.data-\[state\=open\]\:bg-surface-1[data-state=open]{background-color:hsl(var(--surface-1))}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}@media (prefers-reduced-motion: no-preference){@keyframes pulse{50%{opacity:.5}}.motion-safe\:animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}}.dark\:text-amber-300:is(.dark *){--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.dark\:text-amber-400:is(.dark *){--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.dark\:text-amber-500:is(.dark *){--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.dark\:text-emerald-300:is(.dark *){--tw-text-opacity: 1;color:rgb(110 231 183 / var(--tw-text-opacity, 1))}.dark\:text-emerald-400:is(.dark *){--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.dark\:text-emerald-500:is(.dark *){--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.dark\:text-rose-300:is(.dark *){--tw-text-opacity: 1;color:rgb(253 164 175 / var(--tw-text-opacity, 1))}.dark\:text-rose-400:is(.dark *){--tw-text-opacity: 1;color:rgb(251 113 133 / var(--tw-text-opacity, 1))}.dark\:text-sky-400:is(.dark *){--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}@media (min-width: 640px){.sm\:col-span-2{grid-column:span 2 / span 2}.sm\:flex{display:flex}.sm\:grid{display:grid}.sm\:w-48{width:12rem}.sm\:max-w-sm{max-width:24rem}.sm\:shrink-0{flex-shrink:0}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.sm\:grid-cols-\[1fr_auto_1fr\]{grid-template-columns:1fr auto 1fr}.sm\:grid-cols-\[minmax\(8rem\,0\.8fr\)_minmax\(0\,1\.2fr\)\]{grid-template-columns:minmax(8rem,.8fr) minmax(0,1.2fr)}.sm\:flex-row{flex-direction:row}.sm\:items-start{align-items:flex-start}.sm\:items-center{align-items:center}.sm\:justify-end{justify-content:flex-end}.sm\:gap-0{gap:0px}.sm\:gap-4{gap:1rem}.sm\: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)))}.sm\:rounded-lg{border-radius:.5rem}.sm\:text-left{text-align:left}}@media (min-width: 768px){.md\:mt-1{margin-top:.25rem}.md\:mt-5{margin-top:1.25rem}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-full{height:100%}.md\:w-72{width:18rem}.md\:w-80{width:20rem}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-\[150px_minmax\(0\,1fr\)\]{grid-template-columns:150px minmax(0,1fr)}.md\:grid-cols-\[7\.5rem_minmax\(10rem\,1fr\)_2\.5rem_minmax\(12rem\,1fr\)_7rem\]{grid-template-columns:7.5rem minmax(10rem,1fr) 2.5rem minmax(12rem,1fr) 7rem}.md\:grid-cols-\[minmax\(0\,1fr\)_28px_minmax\(0\,1fr\)_28px_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr) 28px minmax(0,1fr) 28px minmax(0,1fr)}.md\:grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.md\:grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:justify-end{justify-content:flex-end}.md\:justify-between{justify-content:space-between}.md\:border-b-0{border-bottom-width:0px}.md\:border-r{border-right-width:1px}.md\:p-5{padding:1.25rem}.md\:p-6{padding:1.5rem}.md\:px-4{padding-left:1rem;padding-right:1rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:px-7{padding-left:1.75rem;padding-right:1.75rem}.md\:py-4{padding-top:1rem;padding-bottom:1rem}.md\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.md\:pb-0{padding-bottom:0}.md\:text-right{text-align:right}.md\:normal-case{text-transform:none}.md\:tracking-normal{letter-spacing:0em}}@media (min-width: 1024px){.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\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-\[1\.05fr_0\.95fr\]{grid-template-columns:1.05fr .95fr}}@media (min-width: 1280px){.xl\:block{display:block}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:1rem;height:1rem}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}