@useorgx/openclaw-plugin 0.4.6 → 0.4.9
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 +310 -24
- package/dashboard/dist/assets/B5NEElEI.css +1 -0
- package/dashboard/dist/assets/BhapSNAs.js +215 -0
- package/dashboard/dist/assets/iFdvE7lx.js +1 -0
- package/dashboard/dist/assets/jRJsmpYM.js +1 -0
- package/dashboard/dist/index.html +2 -2
- package/dist/activity-actor-fields.d.ts +3 -0
- package/dist/activity-actor-fields.js +128 -0
- package/dist/activity-store.js +12 -19
- package/dist/agent-context-store.js +5 -25
- package/dist/agent-run-store.js +5 -25
- package/dist/agent-suite.js +1 -8
- package/dist/artifacts/register-artifact.d.ts +47 -0
- package/dist/artifacts/register-artifact.js +271 -0
- package/dist/auth/flows.d.ts +47 -0
- package/dist/auth/flows.js +169 -0
- package/dist/auth-store.js +14 -39
- package/dist/byok-store.js +5 -19
- package/dist/cli/orgx.d.ts +66 -0
- package/dist/cli/orgx.js +91 -0
- package/dist/config/refresh.d.ts +32 -0
- package/dist/config/refresh.js +55 -0
- package/dist/config/resolution.d.ts +37 -0
- package/dist/config/resolution.js +178 -0
- package/dist/contracts/client.d.ts +1 -0
- package/dist/contracts/client.js +7 -5
- package/dist/contracts/shared-types.d.ts +147 -0
- package/dist/contracts/shared-types.js +3 -0
- package/dist/contracts/types.d.ts +1 -130
- package/dist/contracts/types.js +5 -0
- package/dist/entities/auto-assignment.d.ts +36 -0
- package/dist/entities/auto-assignment.js +115 -0
- package/dist/entity-comment-store.js +5 -25
- package/dist/hash-utils.d.ts +2 -0
- package/dist/hash-utils.js +12 -0
- package/dist/http/helpers/activity-headline.d.ts +10 -0
- package/dist/http/helpers/activity-headline.js +192 -0
- package/dist/http/helpers/artifact-fallback.d.ts +13 -0
- package/dist/http/helpers/artifact-fallback.js +148 -0
- package/dist/http/helpers/auto-continue-engine.d.ts +298 -0
- package/dist/http/helpers/auto-continue-engine.js +1218 -0
- package/dist/http/helpers/autopilot-operations.d.ts +157 -0
- package/dist/http/helpers/autopilot-operations.js +403 -0
- package/dist/http/helpers/autopilot-runtime.d.ts +42 -0
- package/dist/http/helpers/autopilot-runtime.js +319 -0
- package/dist/http/helpers/autopilot-slice-utils.d.ts +38 -0
- package/dist/http/helpers/autopilot-slice-utils.js +476 -0
- package/dist/http/helpers/decision-mapper.d.ts +12 -0
- package/dist/http/helpers/decision-mapper.js +44 -0
- package/dist/http/helpers/dispatch-lifecycle.d.ts +102 -0
- package/dist/http/helpers/dispatch-lifecycle.js +604 -0
- package/dist/http/helpers/hash-utils.d.ts +1 -0
- package/dist/http/helpers/hash-utils.js +1 -0
- package/dist/http/helpers/kickoff-context.d.ts +12 -0
- package/dist/http/helpers/kickoff-context.js +154 -0
- package/dist/http/helpers/mission-control.d.ts +94 -0
- package/dist/http/helpers/mission-control.js +894 -0
- package/dist/http/helpers/openclaw-cli.d.ts +37 -0
- package/dist/http/helpers/openclaw-cli.js +283 -0
- package/dist/http/helpers/runtime-sse.d.ts +20 -0
- package/dist/http/helpers/runtime-sse.js +110 -0
- package/dist/http/helpers/value-utils.d.ts +6 -0
- package/dist/http/helpers/value-utils.js +67 -0
- package/dist/http/index.d.ts +88 -0
- package/dist/http/index.js +2353 -0
- package/dist/http/router.d.ts +23 -0
- package/dist/http/router.js +23 -0
- package/dist/http/routes/agent-control.d.ts +79 -0
- package/dist/http/routes/agent-control.js +684 -0
- package/dist/http/routes/agent-suite.d.ts +29 -0
- package/dist/http/routes/agent-suite.js +198 -0
- package/dist/http/routes/agents-catalog.d.ts +40 -0
- package/dist/http/routes/agents-catalog.js +83 -0
- package/dist/http/routes/billing.d.ts +23 -0
- package/dist/http/routes/billing.js +55 -0
- package/dist/http/routes/debug.d.ts +14 -0
- package/dist/http/routes/debug.js +21 -0
- package/dist/http/routes/decision-actions.d.ts +13 -0
- package/dist/http/routes/decision-actions.js +66 -0
- package/dist/http/routes/delegation.d.ts +19 -0
- package/dist/http/routes/delegation.js +32 -0
- package/dist/http/routes/entities.d.ts +47 -0
- package/dist/http/routes/entities.js +152 -0
- package/dist/http/routes/entity-dynamic.d.ts +25 -0
- package/dist/http/routes/entity-dynamic.js +191 -0
- package/dist/http/routes/health.d.ts +22 -0
- package/dist/http/routes/health.js +49 -0
- package/dist/http/routes/live-legacy.d.ts +110 -0
- package/dist/http/routes/live-legacy.js +598 -0
- package/dist/http/routes/live-misc.d.ts +69 -0
- package/dist/http/routes/live-misc.js +206 -0
- package/dist/http/routes/live-snapshot.d.ts +90 -0
- package/dist/http/routes/live-snapshot.js +297 -0
- package/dist/http/routes/mission-control-actions.d.ts +83 -0
- package/dist/http/routes/mission-control-actions.js +541 -0
- package/dist/http/routes/mission-control-read.d.ts +28 -0
- package/dist/http/routes/mission-control-read.js +67 -0
- package/dist/http/routes/onboarding.d.ts +34 -0
- package/dist/http/routes/onboarding.js +101 -0
- package/dist/http/routes/run-control.d.ts +24 -0
- package/dist/http/routes/run-control.js +86 -0
- package/dist/http/routes/runtime-hooks.d.ts +69 -0
- package/dist/http/routes/runtime-hooks.js +437 -0
- package/dist/http/routes/settings-byok.d.ts +23 -0
- package/dist/http/routes/settings-byok.js +163 -0
- package/dist/http/routes/summary.d.ts +18 -0
- package/dist/http/routes/summary.js +42 -0
- package/dist/http/routes/work-artifacts.d.ts +9 -0
- package/dist/http/routes/work-artifacts.js +36 -0
- package/dist/http/shared-state.d.ts +16 -0
- package/dist/http/shared-state.js +1 -0
- package/dist/http-handler.d.ts +1 -88
- package/dist/http-handler.js +1 -9664
- package/dist/index.js +122 -2121
- package/dist/json-utils.d.ts +1 -0
- package/dist/json-utils.js +8 -0
- package/dist/local-openclaw.js +8 -0
- package/dist/mcp-client-setup.js +75 -90
- package/dist/next-up-queue-store.js +4 -18
- package/dist/runtime-instance-store.js +8 -34
- package/dist/services/background.d.ts +23 -0
- package/dist/services/background.js +23 -0
- package/dist/services/instrumentation.d.ts +29 -0
- package/dist/services/instrumentation.js +136 -0
- package/dist/snapshot-store.js +5 -25
- package/dist/stores/json-store.d.ts +11 -0
- package/dist/stores/json-store.js +42 -0
- package/dist/sync/outbox-replay.d.ts +55 -0
- package/dist/sync/outbox-replay.js +514 -0
- package/dist/tools/core-tools.d.ts +76 -0
- package/dist/tools/core-tools.js +1005 -0
- package/dist/worker-supervisor.js +15 -0
- package/package.json +6 -1
- package/dashboard/dist/assets/0tOC3wSN.js +0 -214
- package/dashboard/dist/assets/Bm8QnMJ_.js +0 -1
- package/dashboard/dist/assets/CyxZio4Y.js +0 -1
- package/dashboard/dist/assets/DaAIOik3.css +0 -1
package/README.md
CHANGED
|
@@ -14,6 +14,93 @@ If Claude/Cursor/Codex MCP configs are detected on this machine, the pairing flo
|
|
|
14
14
|
|
|
15
15
|
Manual API key entry is still available as a permanent fallback from the onboarding panel.
|
|
16
16
|
|
|
17
|
+
## Architecture Overview
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
┌──────────────────────────────┐
|
|
21
|
+
│ OrgX Cloud API │
|
|
22
|
+
│ (useorgx.com) │
|
|
23
|
+
│ │
|
|
24
|
+
│ Snapshots, Decisions, │
|
|
25
|
+
│ Activity, Entity CRUD, │
|
|
26
|
+
│ Quality Gates, Model Routing │
|
|
27
|
+
└──────────────┬───────────────┘
|
|
28
|
+
│
|
|
29
|
+
Bearer token (oxk_...)
|
|
30
|
+
│
|
|
31
|
+
┌───────────────────────────────────────┼───────────────────────────────────────┐
|
|
32
|
+
│ OpenClaw Gateway (localhost:18789) │ │
|
|
33
|
+
│ ┌────────────────────────────────────┴──────────────────────────────────┐ │
|
|
34
|
+
│ │ OrgX Plugin (this repo) │ │
|
|
35
|
+
│ │ │ │
|
|
36
|
+
│ │ ┌──────────────┐ ┌──────────────┐ ┌─────────────────────────┐ │ │
|
|
37
|
+
│ │ │ OrgXClient │ │ Outbox │ │ State Stores │ │ │
|
|
38
|
+
│ │ │ │ │ │ │ │ │ │
|
|
39
|
+
│ │ │ API calls │ │ Offline │ │ auth-store (creds) │ │ │
|
|
40
|
+
│ │ │ to cloud │◄──│ event queue │ │ snapshot-store (cache) │ │ │
|
|
41
|
+
│ │ │ │ │ + replay │ │ activity-store (feed) │ │ │
|
|
42
|
+
│ │ └──────┬───────┘ └──────────────┘ │ agent-run-store │ │ │
|
|
43
|
+
│ │ │ │ next-up-queue-store │ │ │
|
|
44
|
+
│ │ │ └─────────────────────────┘ │ │
|
|
45
|
+
│ │ │ │ │
|
|
46
|
+
│ │ ┌──────┴──────────────────────────────────────────────────────────┐ │ │
|
|
47
|
+
│ │ │ HTTP Handler │ │ │
|
|
48
|
+
│ │ │ │ │ │
|
|
49
|
+
│ │ │ /orgx/live → Dashboard SPA (Vite-built React app) │ │ │
|
|
50
|
+
│ │ │ /orgx/api/* → 33+ REST endpoints │ │ │
|
|
51
|
+
│ │ │ /orgx/mcp → MCP bridge (tools/list, tools/call) │ │ │
|
|
52
|
+
│ │ │ /orgx/api/live/* → Polling + SSE for real-time data │ │ │
|
|
53
|
+
│ │ └────────────────────────────────┬────────────────────────────────┘ │ │
|
|
54
|
+
│ │ │ │ │
|
|
55
|
+
│ │ ┌────────────────────────────────┼─────────────────────────────┐ │ │
|
|
56
|
+
│ │ │ Background Services │ │ │ │
|
|
57
|
+
│ │ │ │ │ │ │
|
|
58
|
+
│ │ │ Sync service (every 5min) │ Gateway watchdog │ │ │
|
|
59
|
+
│ │ │ Agent suite provisioning │ MCP client auto-config │ │ │
|
|
60
|
+
│ │ │ Auto-continue pipeline │ Worker supervisor │ │ │
|
|
61
|
+
│ │ └────────────────────────────────┘─────────────────────────────┘ │ │
|
|
62
|
+
│ └──────────────────────────────────────────────────────────────────────┘ │
|
|
63
|
+
│ │ │
|
|
64
|
+
│ ┌───────────────────────────────────┴──────────────────────────────────┐ │
|
|
65
|
+
│ │ MCP Tools (exposed to agents) │ │
|
|
66
|
+
│ │ │ │
|
|
67
|
+
│ │ orgx_status orgx_spawn_check orgx_create_entity │ │
|
|
68
|
+
│ │ orgx_sync orgx_quality_score orgx_update_entity │ │
|
|
69
|
+
│ │ orgx_emit_activity orgx_request_decision orgx_list_entities │ │
|
|
70
|
+
│ └──────────────────────────────────────────────────────────────────────┘ │
|
|
71
|
+
└──────────────────────────────────────────────────────────────────────────────┘
|
|
72
|
+
│
|
|
73
|
+
Polling (every 8s)
|
|
74
|
+
│
|
|
75
|
+
┌──────────────┴───────────────┐
|
|
76
|
+
│ React Dashboard │
|
|
77
|
+
│ /orgx/live │
|
|
78
|
+
│ │
|
|
79
|
+
│ Mission Control (hierarchy) │
|
|
80
|
+
│ Activity Timeline │
|
|
81
|
+
│ Decision Queue (approve/ │
|
|
82
|
+
│ reject with notes) │
|
|
83
|
+
│ Session Inspector │
|
|
84
|
+
│ Agent Provisioning │
|
|
85
|
+
└──────────────────────────────┘
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Data Flow
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
Agent calls MCP tool (e.g. orgx_emit_activity)
|
|
92
|
+
→ Plugin validates + forwards to OrgX Cloud
|
|
93
|
+
→ Cloud persists, returns updated state
|
|
94
|
+
→ Plugin caches snapshot locally
|
|
95
|
+
→ Dashboard polls /orgx/api/live/sessions every 8s
|
|
96
|
+
→ useLiveData hook merges + renders
|
|
97
|
+
|
|
98
|
+
If cloud is unreachable:
|
|
99
|
+
→ Plugin queues event in Outbox (~/.orgx/plugin/outbox/)
|
|
100
|
+
→ Dashboard reads from cached snapshot + outbox replay
|
|
101
|
+
→ On reconnect, outbox auto-replays with backoff
|
|
102
|
+
```
|
|
103
|
+
|
|
17
104
|
## Installation
|
|
18
105
|
|
|
19
106
|
```bash
|
|
@@ -74,7 +161,7 @@ Environment overrides:
|
|
|
74
161
|
|
|
75
162
|
## Features
|
|
76
163
|
|
|
77
|
-
###
|
|
164
|
+
### MCP Tools
|
|
78
165
|
|
|
79
166
|
The plugin registers these tools for your agents:
|
|
80
167
|
|
|
@@ -88,7 +175,7 @@ The plugin registers these tools for your agents:
|
|
|
88
175
|
- **`orgx_update_entity`** — Update entity status and fields
|
|
89
176
|
- **`orgx_list_entities`** — Query entities by type and status
|
|
90
177
|
|
|
91
|
-
###
|
|
178
|
+
### Live Dashboard
|
|
92
179
|
|
|
93
180
|
Access the OrgX command center at `http://127.0.0.1:18789/orgx/live` (or your gateway URL).
|
|
94
181
|
The Vite dev server (`http://localhost:5173`) is only for local preview; the installed plugin runs on the OpenClaw port (18789).
|
|
@@ -100,7 +187,7 @@ Shows:
|
|
|
100
187
|
- Activity stream
|
|
101
188
|
- Outbox replay visibility for buffered offline events
|
|
102
189
|
|
|
103
|
-
###
|
|
190
|
+
### Auto-Continue (Scaffold to Agent Execution)
|
|
104
191
|
|
|
105
192
|
If you scaffold an initiative from chat (for example, "plan X" and then create/scaffold), OrgX can automatically start executing the first workstream via the stream auto-continue pipeline.
|
|
106
193
|
|
|
@@ -108,7 +195,7 @@ Troubleshooting:
|
|
|
108
195
|
- If agents do not start automatically, say: `start agents` to re-trigger dispatch.
|
|
109
196
|
- Open the live link (Mission Control) to see stream status (`ready`, `active`, `blocked`) and any upgrade/approval decisions.
|
|
110
197
|
|
|
111
|
-
###
|
|
198
|
+
### Model Routing
|
|
112
199
|
|
|
113
200
|
OrgX automatically routes tasks to the appropriate model tier:
|
|
114
201
|
|
|
@@ -118,30 +205,27 @@ OrgX automatically routes tasks to the appropriate model tier:
|
|
|
118
205
|
| Implementation, code, docs | **sonnet** | claude-sonnet-4 |
|
|
119
206
|
| Status checks, formatting | **local** | qwen2.5-coder |
|
|
120
207
|
|
|
121
|
-
###
|
|
208
|
+
### Quality Gates
|
|
122
209
|
|
|
123
210
|
Before spawning sub-agents, check the quality gate:
|
|
124
211
|
|
|
125
212
|
```
|
|
126
213
|
Agent calls orgx_spawn_check(domain: "engineering", taskId: "...")
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
Returns: { allowed: true, modelTier: "sonnet" }
|
|
131
|
-
↓
|
|
132
|
-
Agent spawns with recommended model
|
|
214
|
+
-> OrgX checks: rate limit, quality score threshold, task assignment
|
|
215
|
+
-> Returns: { allowed: true, modelTier: "sonnet" }
|
|
216
|
+
-> Agent spawns with recommended model
|
|
133
217
|
```
|
|
134
218
|
|
|
135
|
-
###
|
|
219
|
+
### BYOK (Bring Your Own Keys)
|
|
136
220
|
|
|
137
221
|
If you use BYOK models (OpenAI, Anthropic, OpenRouter), store your provider keys in OpenClaw. The OrgX plugin reads OpenClaw settings and injects keys when it invokes OpenClaw CLI commands, so you do not need to put provider keys in the OrgX plugin config.
|
|
138
222
|
|
|
139
|
-
###
|
|
223
|
+
### Diagnostics
|
|
140
224
|
|
|
141
225
|
- `openclaw orgx doctor` runs local checks and can optionally probe the OrgX API.
|
|
142
226
|
- `openclaw gateway status --json` shows the OpenClaw gateway port and runtime state.
|
|
143
227
|
|
|
144
|
-
###
|
|
228
|
+
### Gateway Watchdog
|
|
145
229
|
|
|
146
230
|
The plugin starts a lightweight watchdog daemon that periodically probes the local OpenClaw gateway and restarts it if needed.
|
|
147
231
|
|
|
@@ -152,15 +236,15 @@ The plugin starts a lightweight watchdog daemon that periodically probes the loc
|
|
|
152
236
|
|
|
153
237
|
| Capability | Status | Notes |
|
|
154
238
|
|-----------|--------|-------|
|
|
155
|
-
| Browser pairing onboarding |
|
|
156
|
-
| Manual API key fallback |
|
|
157
|
-
| Live sessions + activity + handoffs |
|
|
158
|
-
| Mission Control hierarchy view |
|
|
159
|
-
| Run control shortcuts |
|
|
160
|
-
| Outbox buffering + replay |
|
|
161
|
-
| Outbox observability in dashboard |
|
|
162
|
-
| Plugin diagnostics (`doctor`) |
|
|
163
|
-
| Full-auto codex dispatch |
|
|
239
|
+
| Browser pairing onboarding | Done | `POST /orgx/api/onboarding/start` + polling flow |
|
|
240
|
+
| Manual API key fallback | Done | In onboarding gate and `manual-key` endpoint |
|
|
241
|
+
| Live sessions + activity + handoffs | Done | SSE with local fallback paths |
|
|
242
|
+
| Mission Control hierarchy view | Done | Initiative -> workstream -> milestone -> task |
|
|
243
|
+
| Run control shortcuts | Done | Pause/resume/cancel/checkpoint/rollback in Session Detail |
|
|
244
|
+
| Outbox buffering + replay | Done | Local queue + auto replay on sync |
|
|
245
|
+
| Outbox observability in dashboard | Done | Pending/replay indicators in header/notifications |
|
|
246
|
+
| Plugin diagnostics (`doctor`) | Done | CLI + `GET /orgx/api/health` |
|
|
247
|
+
| Full-auto codex dispatch | Done | `npm run job:dispatch` with retries + rollups |
|
|
164
248
|
|
|
165
249
|
## CLI Commands
|
|
166
250
|
|
|
@@ -187,7 +271,7 @@ export ORGX_API_KEY=oxk_...
|
|
|
187
271
|
|
|
188
272
|
npm run job:dispatch -- \
|
|
189
273
|
--initiative_id=aa6d16dc-d450-417f-8a17-fd89bd597195 \
|
|
190
|
-
--plan_file
|
|
274
|
+
--plan_file=docs/orgx-openclaw-launch-workstreams-plan-2026-02-14.md \
|
|
191
275
|
--codex_args="--full-auto" \
|
|
192
276
|
--concurrency=6
|
|
193
277
|
```
|
|
@@ -249,6 +333,208 @@ When the plugin is loaded, these HTTP endpoints are available:
|
|
|
249
333
|
| `GET /orgx/api/handoffs` | Handoff summaries |
|
|
250
334
|
| `POST /orgx/mcp` | Local MCP bridge (tools/list, tools/call) |
|
|
251
335
|
|
|
336
|
+
## Contributing
|
|
337
|
+
|
|
338
|
+
### Prerequisites
|
|
339
|
+
|
|
340
|
+
- Node.js 18+
|
|
341
|
+
- npm 9+
|
|
342
|
+
- An OrgX account (free tier works for development)
|
|
343
|
+
|
|
344
|
+
### Dev Setup
|
|
345
|
+
|
|
346
|
+
```bash
|
|
347
|
+
git clone https://github.com/useorgx/openclaw-plugin.git
|
|
348
|
+
cd openclaw-plugin
|
|
349
|
+
|
|
350
|
+
# Install root dependencies (plugin core)
|
|
351
|
+
npm install
|
|
352
|
+
|
|
353
|
+
# Install dashboard dependencies
|
|
354
|
+
cd dashboard && npm install && cd ..
|
|
355
|
+
|
|
356
|
+
# Build everything
|
|
357
|
+
npm run build
|
|
358
|
+
|
|
359
|
+
# Run tests
|
|
360
|
+
npm run test:hooks
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
### Development Workflow
|
|
364
|
+
|
|
365
|
+
```bash
|
|
366
|
+
# Type-check (must pass before any commit)
|
|
367
|
+
npm run typecheck
|
|
368
|
+
|
|
369
|
+
# Run tests (must pass before any commit)
|
|
370
|
+
npm run test:hooks
|
|
371
|
+
|
|
372
|
+
# Build core only (TypeScript -> dist/)
|
|
373
|
+
npm run build:core
|
|
374
|
+
|
|
375
|
+
# Build dashboard only (Vite)
|
|
376
|
+
npm run build:dashboard
|
|
377
|
+
|
|
378
|
+
# Dashboard dev server (hot reload at localhost:5173)
|
|
379
|
+
cd dashboard && npm run dev
|
|
380
|
+
|
|
381
|
+
# Full build (core + dashboard)
|
|
382
|
+
npm run build
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
### Repository Structure
|
|
386
|
+
|
|
387
|
+
```
|
|
388
|
+
src/ # Plugin core (TypeScript, ES modules)
|
|
389
|
+
index.ts # Entry point: config resolution, tool registration,
|
|
390
|
+
# background sync, CLI commands (4.4k lines)
|
|
391
|
+
http-handler.ts # HTTP API: 33+ routes, dashboard serving,
|
|
392
|
+
# MCP bridge, SSE streaming (12.3k lines)
|
|
393
|
+
contracts/
|
|
394
|
+
client.ts # OrgXClient — all cloud API calls
|
|
395
|
+
types.ts # Shared type contracts
|
|
396
|
+
auth-store.ts # Credential persistence (~/.orgx/plugin/auth.json)
|
|
397
|
+
snapshot-store.ts # Cached org snapshot for offline fallback
|
|
398
|
+
outbox.ts # Offline event queue + auto-replay
|
|
399
|
+
activity-store.ts # Paginated activity timeline persistence
|
|
400
|
+
agent-suite.ts # Agent provisioning (profiles, skills, managed files)
|
|
401
|
+
agent-run-store.ts # Spawned agent run records
|
|
402
|
+
agent-context-store.ts # Launch context for agent runs
|
|
403
|
+
mcp-http-handler.ts # Local MCP bridge at /orgx/mcp
|
|
404
|
+
mcp-client-setup.ts # Auto-config for Claude/Codex/Cursor
|
|
405
|
+
gateway-watchdog.ts # Local gateway health monitor
|
|
406
|
+
local-openclaw.ts # Fallback: read OpenClaw local state when cloud down
|
|
407
|
+
byok-store.ts # Provider key management (OpenAI, Anthropic, etc.)
|
|
408
|
+
runtime-instance-store.ts # Runtime process tracking
|
|
409
|
+
next-up-queue-store.ts # Task ordering for auto-dispatch
|
|
410
|
+
worker-supervisor.ts # Detect failed agent handshakes
|
|
411
|
+
skill-pack-state.ts # Skill pack download/install tracking
|
|
412
|
+
fs-utils.ts # Atomic file writes, corruption recovery
|
|
413
|
+
paths.ts # Config directory paths (~/.orgx/plugin/)
|
|
414
|
+
|
|
415
|
+
dashboard/ # React SPA (served at /orgx/live)
|
|
416
|
+
src/
|
|
417
|
+
App.tsx # Root component, view routing (2.3k lines)
|
|
418
|
+
components/
|
|
419
|
+
activity/ # ActivityTimeline (live feed, 4.3k lines)
|
|
420
|
+
mission-control/ # Hierarchy view: initiative -> workstream -> task
|
|
421
|
+
sessions/ # Session inspector, agent chats
|
|
422
|
+
decisions/ # Decision queue (approve/reject with notes)
|
|
423
|
+
initiatives/ # Initiative detail + list
|
|
424
|
+
artifacts/ # Artifact viewer modal
|
|
425
|
+
agents/ # Agent panel, status indicators
|
|
426
|
+
handoffs/ # Handoff list
|
|
427
|
+
onboarding/ # Browser pairing gate
|
|
428
|
+
settings/ # Connection, BYOK, agent suite panels
|
|
429
|
+
shared/ # Modal, Badge, EntityIcon, MarkdownText
|
|
430
|
+
hooks/ # 17 custom hooks
|
|
431
|
+
useLiveData.ts # Core data hook (polling, state merge)
|
|
432
|
+
useConnection.ts # Connection status
|
|
433
|
+
useOnboarding.ts # Pairing flow
|
|
434
|
+
useMissionControlGraph.ts # Hierarchy visualization
|
|
435
|
+
useEntityMutations.ts # Entity CRUD operations
|
|
436
|
+
lib/
|
|
437
|
+
tokens.ts # Design tokens (lime, teal, background, etc.)
|
|
438
|
+
|
|
439
|
+
scripts/ # Orchestration and QA (not shipped in package)
|
|
440
|
+
run-codex-dispatch-job.mjs # Full-auto agent dispatch
|
|
441
|
+
capture-qa-evidence.mjs # Playwright QA screenshots
|
|
442
|
+
ship.mjs # Commit, PR, auto-merge
|
|
443
|
+
|
|
444
|
+
skills/ # Agent skill packs (9 domains)
|
|
445
|
+
tests/ # 26 test suites (Node test runner)
|
|
446
|
+
docs/ # ADRs, ops guides, launch plans
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
### Known Architecture Debt
|
|
450
|
+
|
|
451
|
+
This is an honest accounting of where the codebase is messy. If you're looking for high-impact contributions, these are the places that need the most love.
|
|
452
|
+
|
|
453
|
+
**1. God files**
|
|
454
|
+
|
|
455
|
+
Three files account for most of the complexity:
|
|
456
|
+
|
|
457
|
+
| File | Lines | Problem |
|
|
458
|
+
|------|------:|---------|
|
|
459
|
+
| `src/http-handler.ts` | 12,253 | 33 routes in one `if/else` chain inside a single 8,700-line closure. No router, no middleware, no controller separation. Business logic (auto-continue orchestration, LLM headline summarization, spawn guard enforcement) lives inline with route dispatch. |
|
|
460
|
+
| `src/index.ts` | 4,355 | Plugin bootstrap, tool registration, config resolution, sync logic, and CLI commands all in one file. |
|
|
461
|
+
| `dashboard/src/components/activity/ActivityTimeline.tsx` | 4,326 | Rendering, data transformation, outcome classification, and interaction logic in one component. |
|
|
462
|
+
|
|
463
|
+
The HTTP handler is the worst offender. Every new endpoint means modifying a 12k-line file. A 25-line negated boolean guard (listing every known route) must be manually updated each time a route is added.
|
|
464
|
+
|
|
465
|
+
**Ideal decomposition for `http-handler.ts`:**
|
|
466
|
+
- `routes/onboarding.ts` — pairing, manual key, disconnect
|
|
467
|
+
- `routes/live.ts` — sessions, activity, SSE streaming
|
|
468
|
+
- `routes/entities.ts` — CRUD, comments, artifacts
|
|
469
|
+
- `routes/mission-control.ts` — graph, next-up, auto-continue
|
|
470
|
+
- `routes/decisions.ts` — approval queue, mutations
|
|
471
|
+
- `routes/agents.ts` — launch, stop, suite provisioning
|
|
472
|
+
- `routes/dashboard.ts` — SPA serving, asset caching
|
|
473
|
+
- A thin router with route registration instead of the `if/else` cascade.
|
|
474
|
+
|
|
475
|
+
**2. State store sprawl**
|
|
476
|
+
|
|
477
|
+
Eight separate file-based stores under `~/.orgx/plugin/`:
|
|
478
|
+
|
|
479
|
+
```
|
|
480
|
+
auth-store.ts → auth.json
|
|
481
|
+
snapshot-store.ts → snapshot.json
|
|
482
|
+
activity-store.ts → activity pages
|
|
483
|
+
outbox.ts → outbox/<session>.json
|
|
484
|
+
agent-run-store.ts → agent run records
|
|
485
|
+
agent-context-store.ts → launch context
|
|
486
|
+
next-up-queue-store.ts → task ordering
|
|
487
|
+
skill-pack-state.ts → skill checksums
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
Each has its own read/write/corruption-recovery logic. Some overlap (outbox events become activity items; agent-run and agent-context track the same runs from different angles). A unified local store with a single persistence layer would reduce duplication.
|
|
491
|
+
|
|
492
|
+
**3. Type duplication**
|
|
493
|
+
|
|
494
|
+
Two separate `types.ts` files that can desync:
|
|
495
|
+
- `src/contracts/types.ts` — cloud API contract types
|
|
496
|
+
- `dashboard/src/types.ts` — dashboard-specific types
|
|
497
|
+
|
|
498
|
+
The `LiveDecision` interface exists in the dashboard types but has no shared definition with the server. The HTTP handler manually shapes responses to match what the dashboard expects, with no compile-time guarantee they agree.
|
|
499
|
+
|
|
500
|
+
**4. No routing abstraction**
|
|
501
|
+
|
|
502
|
+
The HTTP handler uses raw `if (method === "POST" && route === "...")` checks. Adding a new route requires:
|
|
503
|
+
1. Adding a boolean variable to the route-matching block
|
|
504
|
+
2. Adding it to the 25-line negated guard for unknown routes
|
|
505
|
+
3. Adding the handler body somewhere in the 8,700-line function
|
|
506
|
+
4. Hoping you don't accidentally shadow another route
|
|
507
|
+
|
|
508
|
+
**5. Dashboard polls by default**
|
|
509
|
+
|
|
510
|
+
SSE streaming exists (`/orgx/api/live/stream`) but the dashboard defaults to polling every 8 seconds. This works but means decisions and activity can feel delayed. The SSE path exists but isn't the primary code path.
|
|
511
|
+
|
|
512
|
+
### Design Decisions (Why Things Are This Way)
|
|
513
|
+
|
|
514
|
+
Not all of the above is accidental. Some context for why the architecture looks the way it does:
|
|
515
|
+
|
|
516
|
+
- **Zero production dependencies**: The plugin ships with no npm runtime deps. This means no Express, no Fastify, no routing library. The HTTP handler is hand-rolled because adding a router would be the first external dependency. The tradeoff is clear: easy distribution vs. maintainability.
|
|
517
|
+
|
|
518
|
+
- **File-based state over SQLite**: The plugin runs inside OpenClaw's process. Using SQLite would add a native dependency (build complexity, platform issues). JSON files are portable and inspectable with `cat`. The tradeoff: no queries, no transactions, more code for corruption recovery.
|
|
519
|
+
|
|
520
|
+
- **Monolithic bootstrap**: `index.ts` does everything at startup because OpenClaw plugins have a single entry point. There's no lifecycle hook for "register tools in phase 1, start services in phase 2." Everything happens in `register()`.
|
|
521
|
+
|
|
522
|
+
### What Makes a Good Contribution
|
|
523
|
+
|
|
524
|
+
- **Splitting `http-handler.ts`** into route modules would be the single highest-impact refactor. Even extracting one domain (e.g., onboarding routes) into its own file would be a great start.
|
|
525
|
+
- **Dashboard component extraction** — breaking `ActivityTimeline.tsx` into smaller components (OutcomeCard, ActivityItem, FilterBar) would make it approachable.
|
|
526
|
+
- **Shared types** — creating a shared `types/` directory that both `src/` and `dashboard/src/` import from would catch desync bugs at compile time.
|
|
527
|
+
- **Bug fixes and UX improvements** to the dashboard are always welcome. The design language is in `dashboard/src/lib/tokens.ts`.
|
|
528
|
+
|
|
529
|
+
### Code Conventions
|
|
530
|
+
|
|
531
|
+
- **TypeScript strict mode** — no `any`, no implicit returns, no unused variables
|
|
532
|
+
- **ES modules only** — all imports use `import`, no `require()`
|
|
533
|
+
- **Zero production dependencies** — if you need a library, implement the subset you need
|
|
534
|
+
- **Node test runner** — tests use `node --test`, not Jest. Test files end in `.test.mjs`
|
|
535
|
+
- **Dashboard design tokens** — use values from `dashboard/src/lib/tokens.ts`, not raw hex colors
|
|
536
|
+
- **Read AGENTS.md** — it has guardrails for AI agents working on this repo, but the conventions apply to humans too
|
|
537
|
+
|
|
252
538
|
## Requirements
|
|
253
539
|
|
|
254
540
|
- OpenClaw 2026.1.0 or later
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import"https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap";*,: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:var(--orgx-border)}: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:Geist,system-ui,-apple-system,sans-serif;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:JetBrains Mono,ui-monospace,SFMono-Regular,monospace;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}body{font-family:Geist,system-ui,-apple-system,sans-serif;background:radial-gradient(1200px 700px at 12% -20%,rgba(191,255,0,.09),transparent 58%),radial-gradient(1000px 700px at 90% -20%,rgba(20,184,166,.09),transparent 64%),var(--orgx-bg);color:var(--orgx-text);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-tap-highlight-color:transparent}h1,h2,h3,h4,.font-display{font-family:Geist,system-ui,-apple-system,sans-serif;letter-spacing:-.015em}code,.font-mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,monospace}button:focus-visible,a:focus-visible,input:focus-visible{outline:none;box-shadow:0 0 0 2px #bfff0073}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.glass-panel{-webkit-backdrop-filter:blur(14px) saturate(140%);backdrop-filter:blur(14px) saturate(140%);background:linear-gradient(145deg,#ffffff08,#ffffff04),var(--orgx-surface);border:1px solid var(--orgx-border)}.soft-shadow{box-shadow:0 16px 48px #00000073,0 2px 8px #0003,inset 0 1px #ffffff0a}.hover-lift{transition:transform .22s var(--orgx-ease-standard),box-shadow .22s ease,border-color .22s ease}.hover-lift:hover{transform:translateY(-2px);box-shadow:0 18px 42px #0006}.fade-in-up{animation:fadeInUp .36s var(--orgx-ease-entrance) both}.pulse-soft{animation:pulseSoft 3.6s ease-in-out infinite}.chip{border:1px solid var(--orgx-border);background:#ffffff0a;color:#f2f7ffcc;border-radius:999px;padding:3px 10px;font-size:11px;line-height:1;font-weight:500}.surface-tier-1{border:1px solid var(--orgx-border-subtle);background:linear-gradient(160deg,#ffffff08,#ffffff03),var(--orgx-surface);box-shadow:inset 0 1px #ffffff09,0 14px 34px #0000005c}.surface-tier-2{border:1px solid var(--orgx-border);background:linear-gradient(150deg,#ffffff0a,#ffffff04),var(--orgx-surface-elevated);box-shadow:inset 0 1px #ffffff0b,0 16px 36px #00000061}.surface-hero{border:1px solid rgba(191,255,0,.16);background:linear-gradient(140deg,#bfff000f,#0ad4c40d 46%,#ffffff05),var(--orgx-surface-hero);box-shadow:inset 0 1px #ffffff0d,0 18px 40px #0006,0 0 0 1px #bfff0014}.control-pill{height:34px;display:inline-flex;align-items:center;justify-content:center;gap:6px;flex:0 0 auto;min-inline-size:-moz-max-content;min-inline-size:max-content;border-radius:10px;border:1px solid rgba(255,255,255,.11);background:#ffffff09;color:#f2f7ffa8;white-space:nowrap;text-wrap:nowrap;overflow-wrap:normal;line-height:1;transition:background-color .16s var(--orgx-ease-standard),border-color .16s var(--orgx-ease-standard),color .16s var(--orgx-ease-standard),transform .22s var(--orgx-ease-standard),box-shadow .2s var(--orgx-ease-standard)}.control-pill:hover{border-color:#fff3;background:#ffffff12;color:#f2f7ffe0;box-shadow:0 8px 18px #00000038}.control-pill:active{transform:translateY(.5px)}.control-pill[data-state=active]{border-color:#bfff003d;background:#bfff0017;color:#d8ffa1}.control-pill[data-tone=teal][data-state=active]{border-color:#0ad4c452;background:#0ad4c41a;color:#8ff7ec}.control-pill[data-tone=amber]{border-color:#fbbf244d;background:#fbbf241f;color:#fff6d6eb}.control-pill[data-tone=amber]:hover{border-color:#fbbf246b;background:#fbbf2429;color:#fffae6fa}.status-pill{display:inline-flex;align-items:center;gap:6px;white-space:nowrap;border-radius:999px;border:1px solid rgba(255,255,255,.12);background:#ffffff0a;padding:2px 9px;font-size:10px;line-height:1;letter-spacing:.05em;color:#f2f7ffb8}.status-pill:before{content:"";width:6px;height:6px;border-radius:999px;background:#ffffff73}.status-pill[data-tone=done]{border-color:#14b8a642;background:#14b8a61c;color:#87ffe9e6}.status-pill[data-tone=done]:before{background:#14b8a6f2}.status-pill[data-tone=active]{border-color:#bfff0047;background:#bfff001c;color:#dfff9ce6}.status-pill[data-tone=active]:before{background:#bfff00f2}.status-pill[data-tone=blocked]{border-color:#ff6b8847;background:#ff6b881f;color:#ffc3d0e6}.status-pill[data-tone=blocked]:before{background:#ff6b88fa}.status-pill[data-tone=planned]{border-color:#ffffff29;background:#ffffff0f;color:#ecf1ffbd}.status-pill[data-tone=planned]:before{background:#ffffff85}.toolbar-shell{border-radius:14px;border:1px solid rgba(255,255,255,.075);background:linear-gradient(180deg,#ffffff08,#ffffff04),#ffffff04;padding:8px;box-shadow:inset 0 1px #ffffff08}.section-kicker{font-size:10px;text-transform:uppercase;letter-spacing:.09em;color:#ffffff61}.subsection-shell{border:1px solid var(--orgx-border-hairline);border-radius:12px;background:linear-gradient(180deg,#ffffff05,#ffffff02);box-shadow:inset 0 1px #ffffff06}.shimmer-skeleton{background:linear-gradient(90deg,#ffffff0a 25%,#ffffff14,#ffffff0a 75%);background-size:200% 100%;animation:shimmer 1.8s ease-in-out infinite;border-radius:12px}.nextup-skeleton-card{position:relative;overflow:hidden}.nextup-skeleton-card:after{content:"";position:absolute;top:-1px;right:-1px;bottom:-1px;left:-1px;background:linear-gradient(90deg,#bfff0000,#bfff000f 45%,#bfff001a 52%,#bfff000f 58%,#bfff0000);transform:translate(-35%);animation:nextUpSweep 2.8s ease-in-out infinite;pointer-events:none;mix-blend-mode:screen}.card-enter{animation:cardEnter .35s var(--orgx-ease-entrance) both}.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!important}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.inset-x-2\.5{left:.625rem;right:.625rem}.inset-x-3{left:.75rem;right:.75rem}.inset-y-0{top:0;bottom:0}.-bottom-0\.5{bottom:-.125rem}.-left-0\.5{left:-.125rem}.-right-0\.5{right:-.125rem}.-right-1{right:-.25rem}.-right-1\.5{right:-.375rem}.-top-1{top:-.25rem}.bottom-0{bottom:0}.bottom-3{bottom:.75rem}.left-0{left:0}.left-0\.5{left:.125rem}.left-1\/2{left:50%}.left-2\.5{left:.625rem}.left-3{left:.75rem}.left-\[20px\]{left:20px}.left-\[7px\]{left:7px}.right-0{right:0}.right-2{right:.5rem}.right-2\.5{right:.625rem}.right-3{right:.75rem}.right-4{right:1rem}.top-0{top:0}.top-0\.5{top:.125rem}.top-1{top:.25rem}.top-1\/2{top:50%}.top-10{top:2.5rem}.top-12{top:3rem}.top-16{top:4rem}.top-2\.5{top:.625rem}.top-3{top:.75rem}.top-4{top:1rem}.top-\[64px\]{top:64px}.top-\[calc\(100\%\+8px\)\]{top:calc(100% + 8px)}.top-full{top:100%}.isolate{isolation:isolate}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[120\]{z-index:120}.z-\[180\]{z-index:180}.z-\[1\]{z-index:1}.z-\[200\]{z-index:200}.z-\[210\]{z-index:210}.z-\[220\]{z-index:220}.z-\[230\]{z-index:230}.z-\[320\]{z-index:320}.col-span-2{grid-column:span 2 / span 2}.col-span-full{grid-column:1 / -1}.-mx-4{margin-left:-1rem;margin-right:-1rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-2\.5{margin-bottom:.625rem}.mb-3{margin-bottom:.75rem}.mb-3\.5{margin-bottom:.875rem}.mb-4{margin-bottom:1rem}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-8{margin-left:2rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-7{margin-top:1.75rem}.mt-\[3px\]{margin-top:3px}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.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\.5{height:.125rem}.h-1{height:.25rem}.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-20{height:5rem}.h-24{height:6rem}.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-8{height:2rem}.h-9{height:2.25rem}.h-\[100dvh\]{height:100dvh}.h-\[15px\]{height:15px}.h-\[18px\]{height:18px}.h-\[2px\]{height:2px}.h-\[48px\]{height:48px}.h-\[calc\(100vh-var\(--mc-toolbar-offset\)-24px\)\]{height:calc(100vh - var(--mc-toolbar-offset) - 24px)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.max-h-0{max-height:0px}.max-h-40{max-height:10rem}.max-h-\[100dvh\]{max-height:100dvh}.max-h-\[110px\]{max-height:110px}.max-h-\[150px\]{max-height:150px}.max-h-\[38vh\]{max-height:38vh}.max-h-\[500px\]{max-height:500px}.max-h-\[52vh\]{max-height:52vh}.max-h-\[58vh\]{max-height:58vh}.max-h-\[65vh\]{max-height:65vh}.max-h-\[84px\]{max-height:84px}.min-h-0{min-height:0px}.min-h-7{min-height:1.75rem}.min-h-\[16px\]{min-height:16px}.min-h-\[214px\]{min-height:214px}.min-h-\[220px\]{min-height:220px}.min-h-\[240px\]{min-height:240px}.min-h-\[40px\]{min-height:40px}.min-h-\[62px\]{min-height:62px}.min-h-\[66px\]{min-height:66px}.min-h-\[96px\]{min-height:96px}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-1\/3{width:33.333333%}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-2\/3{width:66.666667%}.w-2\/5{width:40%}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-3\/5{width:60%}.w-36{width:9rem}.w-4{width:1rem}.w-40{width:10rem}.w-44{width:11rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[104px\]{width:104px}.w-\[148px\]{width:148px}.w-\[15px\]{width:15px}.w-\[160px\]{width:160px}.w-\[176px\]{width:176px}.w-\[180px\]{width:180px}.w-\[188px\]{width:188px}.w-\[18px\]{width:18px}.w-\[190px\]{width:190px}.w-\[260px\]{width:260px}.w-\[290px\]{width:290px}.w-\[2px\]{width:2px}.w-\[320px\]{width:320px}.w-\[360px\]{width:360px}.w-\[42px\]{width:42px}.w-\[46px\]{width:46px}.w-\[480px\]{width:480px}.w-\[72px\]{width:72px}.w-\[82px\]{width:82px}.w-\[90px\]{width:90px}.w-\[92px\]{width:92px}.w-\[min\(92vw\,380px\)\]{width:min(92vw,380px)}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-\[104px\]{min-width:104px}.min-w-\[1180px\]{min-width:1180px}.min-w-\[148px\]{min-width:148px}.min-w-\[14px\]{min-width:14px}.min-w-\[160px\]{min-width:160px}.min-w-\[16px\]{min-width:16px}.min-w-\[200px\]{min-width:200px}.min-w-\[220px\]{min-width:220px}.min-w-\[240px\]{min-width:240px}.min-w-\[76px\]{min-width:76px}.min-w-\[88px\]{min-width:88px}.min-w-\[90px\]{min-width:90px}.min-w-full{min-width:100%}.min-w-max{min-width:-moz-max-content;min-width:max-content}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-\[110px\]{max-width:110px}.max-w-\[1120px\]{max-width:1120px}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[250px\]{max-width:250px}.max-w-\[280px\]{max-width:280px}.max-w-\[320px\]{max-width:320px}.max-w-\[340px\]{max-width:340px}.max-w-\[44\%\]{max-width:44%}.max-w-\[520px\]{max-width:520px}.max-w-\[540px\]{max-width:540px}.max-w-\[86vw\]{max-width:86vw}.max-w-\[94vw\]{max-width:94vw}.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}.flex-1{flex:1 1 0%}.flex-\[1_1_auto\]{flex:1 1 auto}.flex-shrink{flex-shrink:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.border-separate{border-collapse:separate}.border-spacing-y-1\.5{--tw-border-spacing-y: .375rem;border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y)}.origin-top-right{transform-origin:top right}.-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-1{--tw-translate-x: .25rem;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))}.rotate-0{--tw-rotate: 0deg;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))}.transform-gpu{transform:translate3d(var(--tw-translate-x),var(--tw-translate-y),0) 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 ping{75%,to{transform:scale(2);opacity:0}}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}@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-grabbing{cursor:grabbing}.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}.resize{resize:both}.list-decimal{list-style-type:decimal}.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-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.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-3\.5{gap:.875rem}.gap-4{gap:1rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-1{row-gap:.25rem}.gap-y-1\.5{row-gap:.375rem}.-space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(-.375rem * var(--tw-space-x-reverse));margin-left:calc(-.375rem * calc(1 - var(--tw-space-x-reverse)))}.-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-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-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.625rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem * 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-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.875rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem * 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))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overscroll-contain{overscroll-behavior:contain}.overscroll-y-contain{overscroll-behavior-y:contain}.scroll-smooth{scroll-behavior:smooth}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-\[18px\]{border-radius:18px}.rounded-\[24px\]{border-radius:24px}.rounded-\[4px\]{border-radius:4px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-xl{border-radius:.75rem}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.\!border-transparent{border-color:transparent!important}.border-\[\#08090D\]{--tw-border-opacity: 1;border-color:rgb(8 9 13 / var(--tw-border-opacity, 1))}.border-\[\#0AD4C4\]\/30{border-color:#0ad4c44d}.border-\[\#14B8A6\]\/20{border-color:#14b8a633}.border-\[\#14B8A6\]\/35{border-color:#14b8a659}.border-\[\#14B8A6\]\/\[0\.2\]{border-color:#14b8a633}.border-\[\#7C7CFF\]\/25{border-color:#7c7cff40}.border-\[\#7C7CFF\]\/30{border-color:#7c7cff4d}.border-\[\#BFFF00\]\/15{border-color:#bfff0026}.border-\[\#BFFF00\]\/20{border-color:#bfff0033}.border-\[\#BFFF00\]\/25{border-color:#bfff0040}.border-\[\#BFFF00\]\/30{border-color:#bfff004d}.border-\[\#BFFF00\]\/35{border-color:#bfff0059}.border-\[\#BFFF00\]\/\[0\.22\]{border-color:#bfff0038}.border-\[\#F5B700\]\/20{border-color:#f5b70033}.border-\[\#FF6B88\]\/20{border-color:#ff6b8833}.border-\[--orgx-border\]{border-color:var(--orgx-border)}.border-amber-200\/20{border-color:#fde68a33}.border-amber-200\/25{border-color:#fde68a40}.border-amber-300\/15{border-color:#fcd34d26}.border-amber-300\/20{border-color:#fcd34d33}.border-amber-300\/25{border-color:#fcd34d40}.border-amber-300\/30{border-color:#fcd34d4d}.border-amber-300\/45{border-color:#fcd34d73}.border-amber-300\/70{border-color:#fcd34db3}.border-amber-400\/30{border-color:#fbbf244d}.border-black\/35{border-color:#00000059}.border-black\/40{border-color:#0006}.border-current{border-color:currentColor}.border-emerald-300\/25{border-color:#6ee7b740}.border-fuchsia-400\/30{border-color:#e879f94d}.border-hairline{border-color:var(--orgx-border-hairline)}.border-lime\/20{border-color:#bfff0033}.border-lime\/25{border-color:#bfff0040}.border-lime\/30{border-color:#bfff004d}.border-lime\/35{border-color:#bfff0059}.border-lime\/45{border-color:#bfff0073}.border-lime\/60{border-color:#bfff0099}.border-lime\/80{border-color:#bfff00cc}.border-red-300\/25{border-color:#fca5a540}.border-red-400\/20{border-color:#f8717133}.border-red-400\/25{border-color:#f8717140}.border-red-400\/30{border-color:#f871714d}.border-red-400\/35{border-color:#f8717159}.border-red-500\/15{border-color:#ef444426}.border-red-500\/20{border-color:#ef444433}.border-red-500\/30{border-color:#ef44444d}.border-rose-300\/20{border-color:#fda4af33}.border-rose-300\/25{border-color:#fda4af40}.border-rose-400\/20{border-color:#fb718533}.border-sky-400\/30{border-color:#38bdf84d}.border-strong{border-color:var(--orgx-border-strong)}.border-subtle{border-color:var(--orgx-border-subtle)}.border-teal\/45{border-color:#14b8a673}.border-transparent{border-color:transparent}.border-white\/10{border-color:#ffffff1a}.border-white\/15{border-color:#ffffff26}.border-white\/20{border-color:#fff3}.border-white\/\[0\.06\]{border-color:#ffffff0f}.border-white\/\[0\.075\]{border-color:#ffffff13}.border-white\/\[0\.07\]{border-color:#ffffff12}.border-white\/\[0\.08\]{border-color:#ffffff14}.border-white\/\[0\.10\]{border-color:#ffffff1a}.border-white\/\[0\.12\]{border-color:#ffffff1f}.border-white\/\[0\.14\]{border-color:#ffffff24}.border-white\/\[0\.1\]{border-color:#ffffff1a}.border-t-black{--tw-border-opacity: 1;border-top-color:rgb(0 0 0 / var(--tw-border-opacity, 1))}.border-t-transparent{border-top-color:transparent}.\!bg-transparent{background-color:transparent!important}.bg-\[\#070a11\]\/95{background-color:#070a11f2}.bg-\[\#070b12\]\/85{background-color:#070b12d9}.bg-\[\#080808\]{--tw-bg-opacity: 1;background-color:rgb(8 8 8 / var(--tw-bg-opacity, 1))}.bg-\[\#08090D\]{--tw-bg-opacity: 1;background-color:rgb(8 9 13 / var(--tw-bg-opacity, 1))}.bg-\[\#080d14\]\/85{background-color:#080d14d9}.bg-\[\#090d16\]\/90{background-color:#090d16e6}.bg-\[\#0A0D14\]\/95{background-color:#0a0d14f2}.bg-\[\#0AD4C4\]{--tw-bg-opacity: 1;background-color:rgb(10 212 196 / var(--tw-bg-opacity, 1))}.bg-\[\#0AD4C4\]\/10{background-color:#0ad4c41a}.bg-\[\#0AD4C4\]\/\[0\.08\]{background-color:#0ad4c414}.bg-\[\#0C0E14\]\/95{background-color:#0c0e14f2}.bg-\[\#0d0f16\]{--tw-bg-opacity: 1;background-color:rgb(13 15 22 / var(--tw-bg-opacity, 1))}.bg-\[\#14B8A6\]\/10{background-color:#14b8a61a}.bg-\[\#14B8A6\]\/\[0\.06\]{background-color:#14b8a60f}.bg-\[\#14B8A6\]\/\[0\.08\]{background-color:#14b8a614}.bg-\[\#7C7CFF\]\/10{background-color:#7c7cff1a}.bg-\[\#7dd3c0\]\/70{background-color:#7dd3c0b3}.bg-\[\#BFFF00\]{--tw-bg-opacity: 1;background-color:rgb(191 255 0 / var(--tw-bg-opacity, 1))}.bg-\[\#BFFF00\]\/10{background-color:#bfff001a}.bg-\[\#BFFF00\]\/15{background-color:#bfff0026}.bg-\[\#BFFF00\]\/70{background-color:#bfff00b3}.bg-\[\#BFFF00\]\/80{background-color:#bfff00cc}.bg-\[\#BFFF00\]\/\[0\.05\]{background-color:#bfff000d}.bg-\[\#BFFF00\]\/\[0\.06\]{background-color:#bfff000f}.bg-\[\#BFFF00\]\/\[0\.08\]{background-color:#bfff0014}.bg-\[\#BFFF00\]\/\[0\.12\]{background-color:#bfff001f}.bg-\[\#BFFF00\]\/\[0\.1\]{background-color:#bfff001a}.bg-\[\#F5B700\]\/10{background-color:#f5b7001a}.bg-\[\#FF6B88\]\/10{background-color:#ff6b881a}.bg-\[--orgx-surface-elevated\]{background-color:var(--orgx-surface-elevated)}.bg-\[--orgx-surface\]{background-color:var(--orgx-surface)}.bg-amber-200\/10{background-color:#fde68a1a}.bg-amber-200\/15{background-color:#fde68a26}.bg-amber-200\/80{background-color:#fde68acc}.bg-amber-300{--tw-bg-opacity: 1;background-color:rgb(252 211 77 / var(--tw-bg-opacity, 1))}.bg-amber-300\/10{background-color:#fcd34d1a}.bg-amber-300\/90{background-color:#fcd34de6}.bg-amber-400\/10{background-color:#fbbf241a}.bg-amber-400\/\[0\.08\]{background-color:#fbbf2414}.bg-amber-500\/\[0\.06\]{background-color:#f59e0b0f}.bg-amber-500\/\[0\.09\]{background-color:#f59e0b17}.bg-amber-500\/\[0\.1\]{background-color:#f59e0b1a}.bg-black\/15{background-color:#00000026}.bg-black\/20{background-color:#0003}.bg-black\/25{background-color:#00000040}.bg-black\/30{background-color:#0000004d}.bg-black\/35{background-color:#00000059}.bg-black\/40{background-color:#0006}.bg-black\/45{background-color:#00000073}.bg-black\/60{background-color:#0009}.bg-black\/80{background-color:#000c}.bg-black\/\[0\.14\]{background-color:#00000024}.bg-black\/\[0\.18\]{background-color:#0000002e}.bg-emerald-300\/90{background-color:#6ee7b7e6}.bg-emerald-400{--tw-bg-opacity: 1;background-color:rgb(52 211 153 / var(--tw-bg-opacity, 1))}.bg-emerald-400\/10{background-color:#34d3991a}.bg-emerald-500\/\[0\.1\]{background-color:#10b9811a}.bg-fuchsia-400\/10{background-color:#e879f91a}.bg-lime{--tw-bg-opacity: 1;background-color:rgb(191 255 0 / var(--tw-bg-opacity, 1))}.bg-lime\/10{background-color:#bfff001a}.bg-lime\/15{background-color:#bfff0026}.bg-lime\/30{background-color:#bfff004d}.bg-lime\/\[0\.06\]{background-color:#bfff000f}.bg-lime\/\[0\.08\]{background-color:#bfff0014}.bg-lime\/\[0\.10\]{background-color:#bfff001a}.bg-lime\/\[0\.12\]{background-color:#bfff001f}.bg-lime\/\[0\.14\]{background-color:#bfff0024}.bg-lime\/\[0\.16\]{background-color:#bfff0029}.bg-lime\/\[0\.20\]{background-color:#bfff0033}.bg-red-300{--tw-bg-opacity: 1;background-color:rgb(252 165 165 / var(--tw-bg-opacity, 1))}.bg-red-400{--tw-bg-opacity: 1;background-color:rgb(248 113 113 / var(--tw-bg-opacity, 1))}.bg-red-400\/10{background-color:#f871711a}.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\/15{background-color:#ef444426}.bg-red-500\/\[0\.04\]{background-color:#ef44440a}.bg-red-500\/\[0\.06\]{background-color:#ef44440f}.bg-red-500\/\[0\.08\]{background-color:#ef444414}.bg-red-500\/\[0\.09\]{background-color:#ef444417}.bg-red-500\/\[0\.12\]{background-color:#ef44441f}.bg-rose-400\/10{background-color:#fb71851a}.bg-sky-400\/10{background-color:#38bdf81a}.bg-teal\/10{background-color:#14b8a61a}.bg-transparent{background-color:transparent}.bg-white\/30{background-color:#ffffff4d}.bg-white\/35{background-color:#ffffff59}.bg-white\/40{background-color:#fff6}.bg-white\/5{background-color:#ffffff0d}.bg-white\/70{background-color:#ffffffb3}.bg-white\/\[0\.016\]{background-color:#ffffff04}.bg-white\/\[0\.025\]{background-color:#ffffff06}.bg-white\/\[0\.02\]{background-color:#ffffff05}.bg-white\/\[0\.03\]{background-color:#ffffff08}.bg-white\/\[0\.04\]{background-color:#ffffff0a}.bg-white\/\[0\.05\]{background-color:#ffffff0d}.bg-white\/\[0\.06\]{background-color:#ffffff0f}.bg-white\/\[0\.08\]{background-color:#ffffff14}.bg-white\/\[0\.09\]{background-color:#ffffff17}.bg-white\/\[0\.10\]{background-color:#ffffff1a}.bg-white\/\[0\.12\]{background-color:#ffffff1f}.bg-white\/\[0\.14\]{background-color:#ffffff24}.bg-white\/\[0\.1\]{background-color:#ffffff1a}.bg-\[linear-gradient\(150deg\,rgba\(20\,184\,166\,0\.15\)\,rgba\(2\,4\,10\,0\.7\)_42\%\,rgba\(2\,4\,10\,0\.95\)\)\]{background-image:linear-gradient(150deg,#14b8a626,#02040ab3 42%,#02040af2)}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.from-\[\#02040A\]{--tw-gradient-from: #02040A var(--tw-gradient-from-position);--tw-gradient-to: rgb(2 4 10 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-\[\#BFFF00\]\/0{--tw-gradient-from: rgb(191 255 0 / 0) var(--tw-gradient-from-position);--tw-gradient-to: rgb(191 255 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-\[\#BFFF00\]\/80{--tw-gradient-from: rgb(191 255 0 / .8) var(--tw-gradient-from-position);--tw-gradient-to: rgb(191 255 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-lime\/10{--tw-gradient-from: rgb(191 255 0 / .1) var(--tw-gradient-from-position);--tw-gradient-to: rgb(191 255 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-red-300\/0{--tw-gradient-from: rgb(252 165 165 / 0) var(--tw-gradient-from-position);--tw-gradient-to: rgb(252 165 165 / 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: rgb(0 0 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-white\/0{--tw-gradient-from: rgb(255 255 255 / 0) var(--tw-gradient-from-position);--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.via-\[\#BFFF00\]\/70{--tw-gradient-to: rgb(191 255 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), rgb(191 255 0 / .7) var(--tw-gradient-via-position), var(--tw-gradient-to)}.via-cyan\/5{--tw-gradient-to: rgb(10 212 196 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), rgb(10 212 196 / .05) var(--tw-gradient-via-position), var(--tw-gradient-to)}.via-red-300\/55{--tw-gradient-to: rgb(252 165 165 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), rgb(252 165 165 / .55) var(--tw-gradient-via-position), var(--tw-gradient-to)}.via-white\/35{--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), rgb(255 255 255 / .35) var(--tw-gradient-via-position), var(--tw-gradient-to)}.via-white\/50{--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), rgb(255 255 255 / .5) var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-\[\#7dd3c0\]{--tw-gradient-to: #7dd3c0 var(--tw-gradient-to-position)}.to-\[\#BFFF00\]\/0{--tw-gradient-to: rgb(191 255 0 / 0) var(--tw-gradient-to-position)}.to-red-300\/0{--tw-gradient-to: rgb(252 165 165 / 0) var(--tw-gradient-to-position)}.to-transparent{--tw-gradient-to: transparent var(--tw-gradient-to-position)}.to-white\/0{--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position)}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.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-3\.5{padding:.875rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-\[1px\]{padding:1px}.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}.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-10{padding-top:2.5rem;padding-bottom:2.5rem}.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-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-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}.py-\[1px\]{padding-top:1px;padding-bottom:1px}.pb-1{padding-bottom:.25rem}.pb-1\.5{padding-bottom:.375rem}.pb-2{padding-bottom:.5rem}.pb-2\.5{padding-bottom:.625rem}.pb-20{padding-bottom:5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pb-\[92px\]{padding-bottom:92px}.pl-0{padding-left:0}.pl-1{padding-left:.25rem}.pl-10{padding-left:2.5rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-9{padding-left:2.25rem}.pr-0\.5{padding-right:.125rem}.pr-1{padding-right:.25rem}.pr-2{padding-right:.5rem}.pr-8{padding-right:2rem}.pt-0{padding-top:0}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-2\.5{padding-top:.625rem}.pt-3{padding-top:.75rem}.pt-3\.5{padding-top:.875rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.font-mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,monospace}.font-sans{font-family:Geist,system-ui,-apple-system,sans-serif}.text-\[0\.93em\]{font-size:.93em}.text-\[22px\]{font-size:22px}.text-\[24px\]{font-size:24px}.text-\[8px\]{font-size:8px}.text-body{font-size:13px;line-height:20px}.text-caption{font-size:11px;line-height:16px}.text-heading{font-size:15px;line-height:22px}.text-micro{font-size:10px;line-height:14px}.text-sm{font-size:.875rem;line-height:1.25rem}.text-title{font-size:20px;line-height:28px}.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}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.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-\[1\.2\]{line-height:1.2}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[-0\.01em\]{letter-spacing:-.01em}.tracking-\[-0\.02em\]{letter-spacing:-.02em}.tracking-\[0\.01em\]{letter-spacing:.01em}.tracking-\[0\.02em\]{letter-spacing:.02em}.tracking-\[0\.06em\]{letter-spacing:.06em}.tracking-\[0\.07em\]{letter-spacing:.07em}.tracking-\[0\.08em\]{letter-spacing:.08em}.tracking-\[0\.09em\]{letter-spacing:.09em}.tracking-\[0\.12em\]{letter-spacing:.12em}.tracking-\[0\.14em\]{letter-spacing:.14em}.tracking-\[0\.1em\]{letter-spacing:.1em}.tracking-normal{letter-spacing:0em}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-\[\#0AD4C4\]{--tw-text-opacity: 1;color:rgb(10 212 196 / var(--tw-text-opacity, 1))}.text-\[\#14B8A6\]{--tw-text-opacity: 1;color:rgb(20 184 166 / var(--tw-text-opacity, 1))}.text-\[\#43E7D8\]{--tw-text-opacity: 1;color:rgb(67 231 216 / var(--tw-text-opacity, 1))}.text-\[\#7EEDE1\]{--tw-text-opacity: 1;color:rgb(126 237 225 / var(--tw-text-opacity, 1))}.text-\[\#8FF7EC\]{--tw-text-opacity: 1;color:rgb(143 247 236 / var(--tw-text-opacity, 1))}.text-\[\#98FFF5\]{--tw-text-opacity: 1;color:rgb(152 255 245 / var(--tw-text-opacity, 1))}.text-\[\#A8A0FF\]{--tw-text-opacity: 1;color:rgb(168 160 255 / var(--tw-text-opacity, 1))}.text-\[\#BFFF00\]{--tw-text-opacity: 1;color:rgb(191 255 0 / var(--tw-text-opacity, 1))}.text-\[\#CFCBFF\]{--tw-text-opacity: 1;color:rgb(207 203 255 / var(--tw-text-opacity, 1))}.text-\[\#CFF8F3\]{--tw-text-opacity: 1;color:rgb(207 248 243 / var(--tw-text-opacity, 1))}.text-\[\#D8FFA1\]{--tw-text-opacity: 1;color:rgb(216 255 161 / var(--tw-text-opacity, 1))}.text-\[\#E1FFB2\]{--tw-text-opacity: 1;color:rgb(225 255 178 / var(--tw-text-opacity, 1))}.text-\[\#E6E4FF\]{--tw-text-opacity: 1;color:rgb(230 228 255 / var(--tw-text-opacity, 1))}.text-\[\#E8FFD0\]\/95{color:#e8ffd0f2}.text-\[\#F5B700\]{--tw-text-opacity: 1;color:rgb(245 183 0 / var(--tw-text-opacity, 1))}.text-\[\#F5D37A\]{--tw-text-opacity: 1;color:rgb(245 211 122 / var(--tw-text-opacity, 1))}.text-\[\#FF6B88\]{--tw-text-opacity: 1;color:rgb(255 107 136 / var(--tw-text-opacity, 1))}.text-amber-100{--tw-text-opacity: 1;color:rgb(254 243 199 / var(--tw-text-opacity, 1))}.text-amber-100\/55{color:#fef3c78c}.text-amber-100\/70{color:#fef3c7b3}.text-amber-100\/85{color:#fef3c7d9}.text-amber-100\/90{color:#fef3c7e6}.text-amber-200{--tw-text-opacity: 1;color:rgb(253 230 138 / var(--tw-text-opacity, 1))}.text-amber-200\/70{color:#fde68ab3}.text-amber-200\/75{color:#fde68abf}.text-amber-200\/80{color:#fde68acc}.text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.text-amber-300\/70{color:#fcd34db3}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-amber-50{--tw-text-opacity: 1;color:rgb(255 251 235 / var(--tw-text-opacity, 1))}.text-amber-50\/90{color:#fffbebe6}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.text-bright{color:var(--orgx-text-bright)}.text-current{color:currentColor}.text-emerald-100{--tw-text-opacity: 1;color:rgb(209 250 229 / var(--tw-text-opacity, 1))}.text-faint{color:var(--orgx-text-faint)}.text-fuchsia-300{--tw-text-opacity: 1;color:rgb(240 171 252 / var(--tw-text-opacity, 1))}.text-lime{--tw-text-opacity: 1;color:rgb(191 255 0 / var(--tw-text-opacity, 1))}.text-lime\/70{color:#bfff00b3}.text-lime\/80{color:#bfff00cc}.text-lime\/85{color:#bfff00d9}.text-muted{color:var(--orgx-text-muted)}.text-primary{color:var(--orgx-text-primary)}.text-red-100{--tw-text-opacity: 1;color:rgb(254 226 226 / var(--tw-text-opacity, 1))}.text-red-100\/80{color:#fee2e2cc}.text-red-100\/85{color:#fee2e2d9}.text-red-100\/90{color:#fee2e2e6}.text-red-200{--tw-text-opacity: 1;color:rgb(254 202 202 / var(--tw-text-opacity, 1))}.text-red-200\/70{color:#fecacab3}.text-red-200\/75{color:#fecacabf}.text-red-200\/80{color:#fecacacc}.text-red-200\/85{color:#fecacad9}.text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.text-red-300\/70{color:#fca5a5b3}.text-red-300\/80{color:#fca5a5cc}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-400\/70{color:#f87171b3}.text-rose-100{--tw-text-opacity: 1;color:rgb(255 228 230 / var(--tw-text-opacity, 1))}.text-rose-100\/80{color:#ffe4e6cc}.text-rose-200{--tw-text-opacity: 1;color:rgb(254 205 211 / var(--tw-text-opacity, 1))}.text-rose-200\/70{color:#fecdd3b3}.text-rose-50\/85{color:#fff1f2d9}.text-secondary{color:var(--orgx-text-secondary)}.text-sky-300{--tw-text-opacity: 1;color:rgb(125 211 252 / var(--tw-text-opacity, 1))}.text-teal{--tw-text-opacity: 1;color:rgb(20 184 166 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-white\/60{color:#fff9}.underline{text-decoration-line:underline}.decoration-white\/20{text-decoration-color:#fff3}.decoration-white\/35{text-decoration-color:#ffffff59}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-white\/30::-moz-placeholder{color:#ffffff4d}.placeholder-white\/30::placeholder{color:#ffffff4d}.accent-\[\#BFFF00\]{accent-color:#BFFF00}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-55{opacity:.55}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-85{opacity:.85}.opacity-90{opacity:.9}.opacity-95{opacity:.95}.\!shadow-none{--tw-shadow: 0 0 #0000 !important;--tw-shadow-colored: 0 0 #0000 !important;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)!important}.shadow-\[0_0_0_1px_rgba\(191\,255\,0\,0\.12\)\]{--tw-shadow: 0 0 0 1px rgba(191,255,0,.12);--tw-shadow-colored: 0 0 0 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-\[0_0_16px_rgba\(191\,255\,0\,0\.08\)\]{--tw-shadow: 0 0 16px rgba(191,255,0,.08);--tw-shadow-colored: 0 0 16px 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_0_24px_rgba\(191\,255\,0\,0\.12\)\]{--tw-shadow: 0 0 24px rgba(191,255,0,.12);--tw-shadow-colored: 0 0 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-\[0_10px_24px_rgba\(0\,0\,0\,0\.22\)\]{--tw-shadow: 0 10px 24px rgba(0,0,0,.22);--tw-shadow-colored: 0 10px 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-\[0_10px_24px_rgba\(0\,0\,0\,0\.35\)\]{--tw-shadow: 0 10px 24px rgba(0,0,0,.35);--tw-shadow-colored: 0 10px 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-\[0_10px_30px_rgba\(0\,0\,0\,0\.35\)\]{--tw-shadow: 0 10px 30px rgba(0,0,0,.35);--tw-shadow-colored: 0 10px 30px 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_12px_40px_rgba\(0\,0\,0\,0\.45\)\]{--tw-shadow: 0 12px 40px rgba(0,0,0,.45);--tw-shadow-colored: 0 12px 40px 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_16px_40px_rgba\(0\,0\,0\,0\.45\)\]{--tw-shadow: 0 16px 40px rgba(0,0,0,.45);--tw-shadow-colored: 0 16px 40px 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_18px_40px_rgba\(0\,0\,0\,0\.42\)\]{--tw-shadow: 0 18px 40px rgba(0,0,0,.42);--tw-shadow-colored: 0 18px 40px 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_20px_40px_rgba\(0\,0\,0\,0\.45\)\]{--tw-shadow: 0 20px 40px rgba(0,0,0,.45);--tw-shadow-colored: 0 20px 40px 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_20px_50px_rgba\(0\,0\,0\,0\.45\)\]{--tw-shadow: 0 20px 50px rgba(0,0,0,.45);--tw-shadow-colored: 0 20px 50px 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_20px_50px_rgba\(0\,0\,0\,0\.52\)\]{--tw-shadow: 0 20px 50px rgba(0,0,0,.52);--tw-shadow-colored: 0 20px 50px 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_2px_8px_rgba\(0\,0\,0\,0\.35\)\]{--tw-shadow: 0 2px 8px rgba(0,0,0,.35);--tw-shadow-colored: 0 2px 8px 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_18px_rgba\(0\,0\,0\,0\.24\)\]{--tw-shadow: 0 8px 18px rgba(0,0,0,.24);--tw-shadow-colored: 0 8px 18px 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_20px_rgba\(0\,0\,0\,0\.3\)\]{--tw-shadow: 0 8px 20px rgba(0,0,0,.3);--tw-shadow-colored: 0 8px 20px 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)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring-1{--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)}.ring-\[\#02040A\]{--tw-ring-opacity: 1;--tw-ring-color: rgb(2 4 10 / var(--tw-ring-opacity, 1))}.ring-\[\#BFFF00\]\/30{--tw-ring-color: rgb(191 255 0 / .3)}.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);-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-\[10px\]{--tw-backdrop-blur: blur(10px);-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-\[12px\],.backdrop-blur-md{--tw-backdrop-blur: blur(12px);-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-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,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[background-color\,border-color\,box-shadow\]{transition-property:background-color,border-color,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[background-color\,border-radius\,box-shadow\]{transition-property:background-color,border-radius,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[border-color\,box-shadow\]{transition-property:border-color,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[padding\,min-height\]{transition-property:padding,min-height;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[transform\,background-color\,border-color\,color\]{transition-property:transform,background-color,border-color,color;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-all{transition-property:all;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-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-700{transition-duration:.7s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.cv-auto{content-visibility:auto;contain-intrinsic-size:120px 1px}.\[scrollbar-width\:none\]{scrollbar-width:none}:root{color-scheme:dark;--orgx-bg: #02040a;--orgx-surface: #08090d;--orgx-surface-elevated: #0c0e14;--orgx-surface-hero: #121824;--orgx-border: rgba(255, 255, 255, .08);--orgx-border-strong: rgba(255, 255, 255, .12);--orgx-border-subtle: rgba(255, 255, 255, .05);--orgx-border-hairline: rgba(255, 255, 255, .035);--orgx-text: #f2f7ff;--orgx-text-muted: #8f9ab7;--orgx-lime: #bfff00;--orgx-teal: #14b8a6;--orgx-cyan: #0ad4c4;--orgx-text-bright: rgba(242, 247, 255, .95);--orgx-text-primary: rgba(242, 247, 255, .78);--orgx-text-secondary: rgba(242, 247, 255, .55);--orgx-text-muted: rgba(242, 247, 255, .38);--orgx-text-faint: rgba(242, 247, 255, .22);--orgx-ease-standard: cubic-bezier(.22, 1, .36, 1);--orgx-ease-entrance: cubic-bezier(.16, 1, .3, 1)}*{scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.16) transparent}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#ffffff29;border-radius:999px}@keyframes fadeInUp{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes pulseSoft{0%,to{opacity:.5}50%{opacity:1}}@keyframes shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}@keyframes nextUpSweep{0%{transform:translate(-35%);opacity:0}12%{opacity:1}to{transform:translate(135%);opacity:0}}@keyframes drawIn{0%{stroke-dashoffset:1}to{stroke-dashoffset:0}}@keyframes stepEntrance{0%{opacity:0;transform:translateY(12px) scale(.97)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes cardEnter{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes breathe{0%,to{opacity:.85}50%{opacity:1}}.status-breathe{animation:breathe 6s ease-in-out infinite}.section-divider{height:1px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.075) 20%,rgba(255,255,255,.075) 80%,transparent)}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}.placeholder\:text-faint::-moz-placeholder{color:var(--orgx-text-faint)}.placeholder\:text-faint::placeholder{color:var(--orgx-text-faint)}.placeholder\:text-muted::-moz-placeholder{color:var(--orgx-text-muted)}.placeholder\:text-muted::placeholder{color:var(--orgx-text-muted)}.focus-within\:border-\[\#BFFF00\]\/40:focus-within{border-color:#bfff0066}.hover\:-translate-y-\[1px\]:hover{--tw-translate-y: -1px;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))}.hover\:border-red-400\/30:hover{border-color:#f871714d}.hover\:border-strong:hover{border-color:var(--orgx-border-strong)}.hover\:border-subtle:hover{border-color:var(--orgx-border-subtle)}.hover\:border-white\/30:hover{border-color:#ffffff4d}.hover\:border-white\/\[0\.15\]:hover{border-color:#ffffff26}.hover\:border-white\/\[0\.18\]:hover{border-color:#ffffff2e}.hover\:border-white\/\[0\.2\]:hover{border-color:#fff3}.hover\:bg-\[\#BFFF00\]\/20:hover{background-color:#bfff0033}.hover\:bg-\[\#BFFF00\]\/25:hover{background-color:#bfff0040}.hover\:bg-\[\#BFFF00\]\/\[0\.1\]:hover{background-color:#bfff001a}.hover\:bg-\[\#d3ff42\]:hover{--tw-bg-opacity: 1;background-color:rgb(211 255 66 / var(--tw-bg-opacity, 1))}.hover\:bg-amber-200\/15:hover{background-color:#fde68a26}.hover\:bg-amber-200\/20:hover{background-color:#fde68a33}.hover\:bg-amber-400\/20:hover{background-color:#fbbf2433}.hover\:bg-black\/35:hover{background-color:#00000059}.hover\:bg-fuchsia-400\/20:hover{background-color:#e879f933}.hover\:bg-lime\/20:hover{background-color:#bfff0033}.hover\:bg-lime\/\[0\.16\]:hover{background-color:#bfff0029}.hover\:bg-red-400\/20:hover{background-color:#f8717133}.hover\:bg-red-400\/\[0\.08\]:hover{background-color:#f8717114}.hover\:bg-red-500\/15:hover{background-color:#ef444426}.hover\:bg-red-500\/20:hover{background-color:#ef444433}.hover\:bg-red-500\/\[0\.09\]:hover{background-color:#ef444417}.hover\:bg-red-500\/\[0\.14\]:hover{background-color:#ef444424}.hover\:bg-rose-400\/10:hover{background-color:#fb71851a}.hover\:bg-rose-400\/20:hover{background-color:#fb718533}.hover\:bg-sky-400\/20:hover{background-color:#38bdf833}.hover\:bg-white\/\[0\.02\]:hover{background-color:#ffffff05}.hover\:bg-white\/\[0\.035\]:hover{background-color:#ffffff09}.hover\:bg-white\/\[0\.03\]:hover{background-color:#ffffff08}.hover\:bg-white\/\[0\.04\]:hover{background-color:#ffffff0a}.hover\:bg-white\/\[0\.05\]:hover{background-color:#ffffff0d}.hover\:bg-white\/\[0\.06\]:hover{background-color:#ffffff0f}.hover\:bg-white\/\[0\.07\]:hover{background-color:#ffffff12}.hover\:bg-white\/\[0\.08\]:hover{background-color:#ffffff14}.hover\:bg-white\/\[0\.09\]:hover{background-color:#ffffff17}.hover\:bg-white\/\[0\.15\]:hover{background-color:#ffffff26}.hover\:bg-white\/\[0\.1\]:hover{background-color:#ffffff1a}.hover\:bg-\[linear-gradient\(150deg\,rgba\(20\,184\,166\,0\.22\)\,rgba\(2\,4\,10\,0\.72\)_42\%\,rgba\(2\,4\,10\,0\.95\)\)\]:hover{background-image:linear-gradient(150deg,#14b8a638,#02040ab8 42%,#02040af2)}.hover\:text-\[\#BFFF00\]:hover{--tw-text-opacity: 1;color:rgb(191 255 0 / var(--tw-text-opacity, 1))}.hover\:text-\[\#ECFFC6\]:hover{--tw-text-opacity: 1;color:rgb(236 255 198 / var(--tw-text-opacity, 1))}.hover\:text-bright:hover{color:var(--orgx-text-bright)}.hover\:text-emerald-400:hover{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.hover\:text-primary:hover{color:var(--orgx-text-primary)}.hover\:text-red-100:hover{--tw-text-opacity: 1;color:rgb(254 226 226 / var(--tw-text-opacity, 1))}.hover\:text-red-300:hover{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.hover\:text-secondary:hover{color:var(--orgx-text-secondary)}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow-\[0_0_32px_rgba\(191\,255\,0\,0\.22\)\]:hover{--tw-shadow: 0 0 32px rgba(191,255,0,.22);--tw-shadow-colored: 0 0 32px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:border-\[\#BFFF00\]\/30:focus{border-color:#bfff004d}.focus\:border-\[\#BFFF00\]\/35:focus{border-color:#bfff0059}.focus\:border-\[\#BFFF00\]\/40:focus{border-color:#bfff0066}.focus\:border-white\/20:focus{border-color:#fff3}.focus\:border-white\/25:focus{border-color:#ffffff40}.focus\:border-white\/30:focus{border-color:#ffffff4d}.focus\:border-white\/\[0\.16\]:focus{border-color:#ffffff29}.focus\:bg-white\/\[0\.04\]:focus{background-color:#ffffff0a}.focus\:bg-white\/\[0\.05\]:focus{background-color:#ffffff0d}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.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-\[\#BFFF00\]\/30:focus{--tw-ring-color: rgb(191 255 0 / .3)}.focus\:ring-\[\#BFFF00\]\/35:focus{--tw-ring-color: rgb(191 255 0 / .35)}.focus\:ring-\[\#BFFF00\]\/40:focus{--tw-ring-color: rgb(191 255 0 / .4)}.focus\:ring-lime\/40:focus{--tw-ring-color: rgb(191 255 0 / .4)}.focus\:ring-red-300\/40:focus{--tw-ring-color: rgb(252 165 165 / .4)}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.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-\[\#BFFF00\]\/35:focus-visible{--tw-ring-color: rgb(191 255 0 / .35)}.focus-visible\:ring-\[\#BFFF00\]\/45:focus-visible{--tw-ring-color: rgb(191 255 0 / .45)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.focus-visible\:ring-offset-\[\#02040A\]:focus-visible{--tw-ring-offset-color: #02040A}.active\:scale-\[0\.995\]:active{--tw-scale-x: .995;--tw-scale-y: .995;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))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:border-white\/10:disabled{border-color:#ffffff1a}.disabled\:bg-white\/\[0\.08\]:disabled{background-color:#ffffff14}.disabled\:text-secondary:disabled{color:var(--orgx-text-secondary)}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-35:disabled{opacity:.35}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-45:disabled{opacity:.45}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:hover\:bg-white\/\[0\.05\]:hover:disabled{background-color:#ffffff0d}.group:focus-within .group-focus-within\: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))}.group:focus-within .group-focus-within\:opacity-100{opacity:1}.group:hover .group-hover\: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))}.group:hover .group-hover\:translate-x-0\.5{--tw-translate-x: .125rem;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))}.group:hover .group-hover\:rotate-45{--tw-rotate: 45deg;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))}.group:hover .group-hover\:scale-110{--tw-scale-x: 1.1;--tw-scale-y: 1.1;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))}.group:hover .group-hover\:bg-white\/\[0\.06\]{background-color:#ffffff0f}.group\/row:hover .group-hover\/row\:opacity-100,.group:hover .group-hover\:opacity-100{opacity:1}@media(min-width:640px){.sm\:right-6{right:1.5rem}.sm\:col-span-2{grid-column:span 2 / span 2}.sm\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.sm\:mx-8{margin-left:2rem;margin-right:2rem}.sm\:block{display:block}.sm\:inline{display:inline}.sm\:inline-flex{display:inline-flex}.sm\:hidden{display:none}.sm\:h-\[86vh\]{height:86vh}.sm\:h-\[88vh\]{height:88vh}.sm\:max-h-\[86vh\]{max-height:86vh}.sm\:max-h-\[88vh\]{max-height:88vh}.sm\:w-\[102px\]{width:102px}.sm\:w-\[116px\]{width:116px}.sm\:w-\[182px\]{width:182px}.sm\:w-\[48px\]{width:48px}.sm\:w-auto{width:auto}.sm\:min-w-\[102px\]{min-width:102px}.sm\:min-w-\[112px\]{min-width:112px}.sm\:min-w-\[116px\]{min-width:116px}.sm\:min-w-\[182px\]{min-width:182px}.sm\:max-w-\[360px\]{max-width:360px}.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-\[1fr_auto\]{grid-template-columns:1fr auto}.sm\:flex-row{flex-direction:row}.sm\:items-end{align-items:flex-end}.sm\:items-center{align-items:center}.sm\:justify-end{justify-content:flex-end}.sm\:justify-between{justify-content:space-between}.sm\:gap-1\.5{gap:.375rem}.sm\:gap-2{gap:.5rem}.sm\:gap-2\.5{gap:.625rem}.sm\:gap-3{gap:.75rem}.sm\:rounded-2xl{border-radius:1rem}.sm\:p-10{padding:2.5rem}.sm\:p-5{padding:1.25rem}.sm\:p-6{padding:1.5rem}.sm\:p-7{padding:1.75rem}.sm\:p-8{padding:2rem}.sm\:px-3{padding-left:.75rem;padding-right:.75rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:px-8{padding-left:2rem;padding-right:2rem}.sm\:pb-20{padding-bottom:5rem}.sm\:pl-2\.5{padding-left:.625rem}.sm\:pr-1{padding-right:.25rem}.sm\:pr-3{padding-right:.75rem}.sm\:pt-2{padding-top:.5rem}.sm\:pt-5{padding-top:1.25rem}.sm\:pt-8{padding-top:2rem}.sm\:text-\[17px\]{font-size:17px}.sm\:text-\[28px\]{font-size:28px}.sm\:text-caption{font-size:11px;line-height:16px}.sm\:text-heading{font-size:15px;line-height:22px}}@media(min-width:768px){.md\:ml-auto{margin-left:auto}.md\:w-\[132px\]{width:132px}.md\:w-\[206px\]{width:206px}.md\:min-w-\[132px\]{min-width:132px}.md\:min-w-\[140px\]{min-width:140px}.md\:min-w-\[206px\]{min-width:206px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:flex-nowrap{flex-wrap:nowrap}.md\:items-center{align-items:center}}@media(min-width:1024px){.lg\:col-span-3{grid-column:span 3 / span 3}.lg\:col-span-6{grid-column:span 6 / span 6}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:grid{display:grid}.lg\:hidden{display:none}.lg\:h-screen{height:100vh}.lg\:min-h-0{min-height:0px}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-\[1\.24fr_0\.86fr\]{grid-template-columns:1.24fr .86fr}.lg\:grid-cols-\[1fr_auto_1fr\]{grid-template-columns:1fr auto 1fr}.lg\:flex-col{flex-direction:column}.lg\:gap-3{gap:.75rem}.lg\:overflow-hidden{overflow:hidden}.lg\:pb-0{padding-bottom:0}.lg\:pb-5{padding-bottom:1.25rem}}@media(min-width:1280px){.xl\:block{display:block}.xl\:inline{display:inline}.xl\:flex{display:flex}.xl\:hidden{display:none}.xl\:h-full{height:100%}.xl\:min-h-\[70px\]{min-height:70px}.xl\:min-h-\[92px\]{min-height:92px}.xl\:max-w-\[380px\]{max-width:380px}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-\[minmax\(0\,1fr\)_320px\]{grid-template-columns:minmax(0,1fr) 320px}.xl\:grid-cols-\[minmax\(0\,1fr\)_560px\]{grid-template-columns:minmax(0,1fr) 560px}.xl\:flex-row{flex-direction:row}.xl\:items-start{align-items:flex-start}.xl\:items-center{align-items:center}.xl\:justify-between{justify-content:space-between}.xl\:gap-0{gap:0px}.xl\:self-end{align-self:flex-end}.xl\:rounded-none{border-radius:0}.xl\:rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.xl\:border-b-0{border-bottom-width:0px}.xl\:border-l{border-left-width:1px}.xl\:border-r-0{border-right-width:0px}.xl\:border-t-0{border-top-width:0px}.xl\:border-white\/\[0\.10\]{border-color:#ffffff1a}.xl\:bg-transparent{background-color:transparent}.xl\:px-3{padding-left:.75rem;padding-right:.75rem}.xl\:py-2{padding-top:.5rem;padding-bottom:.5rem}.xl\:pr-4{padding-right:1rem}.xl\:shadow-none{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.xl\:backdrop-blur-none{--tw-backdrop-blur: ;-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)}}@media(min-width:1536px){.\32xl\:flex{display:flex}}.\[\&\:\:-webkit-scrollbar\]\:hidden::-webkit-scrollbar{display:none}@media(min-width:1024px){.lg\:\[\&\>section\]\:h-full>section{height:100%}}
|