modular-studio 0.2.4 → 1.0.3
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 +41 -261
- package/dist/assets/{graphPopulator-C6jg83nL.js → graphPopulator-DH0qM1Fu.js} +1 -1
- package/dist/assets/index-B0RRTCSi.css +1 -0
- package/dist/assets/index-LWCi_4Hu.js +662 -0
- package/dist/assets/{jszip.min-BlpRodxc.js → jszip.min-DByyLalk.js} +1 -1
- package/dist/index.html +2 -2
- package/dist-server/bin/modular-studio.js +5 -0
- package/dist-server/bin/modular-studio.js.map +1 -1
- package/dist-server/server/config.js +1 -1
- package/dist-server/server/config.js.map +1 -1
- package/dist-server/server/data/mcp-tokens.json +9 -0
- package/dist-server/server/index.d.ts.map +1 -1
- package/dist-server/server/index.js +2 -0
- package/dist-server/server/index.js.map +1 -1
- package/dist-server/server/mcp/manager.js +1 -1
- package/dist-server/server/mcp/manager.js.map +1 -1
- package/dist-server/server/routes/connectors.d.ts.map +1 -1
- package/dist-server/server/routes/connectors.js +7 -4
- package/dist-server/server/routes/connectors.js.map +1 -1
- package/dist-server/server/routes/conversations.d.ts +6 -0
- package/dist-server/server/routes/conversations.d.ts.map +1 -0
- package/dist-server/server/routes/conversations.js +111 -0
- package/dist-server/server/routes/conversations.js.map +1 -0
- package/dist-server/server/routes/embeddings.d.ts.map +1 -1
- package/dist-server/server/routes/embeddings.js +18 -8
- package/dist-server/server/routes/embeddings.js.map +1 -1
- package/dist-server/server/routes/health.d.ts.map +1 -1
- package/dist-server/server/routes/health.js +1 -0
- package/dist-server/server/routes/health.js.map +1 -1
- package/dist-server/server/routes/repo-index.d.ts.map +1 -1
- package/dist-server/server/routes/repo-index.js +4 -3
- package/dist-server/server/routes/repo-index.js.map +1 -1
- package/dist-server/server/services/__tests__/embeddingService.test.js +13 -5
- package/dist-server/server/services/__tests__/embeddingService.test.js.map +1 -1
- package/dist-server/server/services/agentStore.js +1 -1
- package/dist-server/server/services/agentStore.js.map +1 -1
- package/dist-server/server/services/contentStore.js +1 -1
- package/dist-server/server/services/contentStore.js.map +1 -1
- package/dist-server/server/services/embeddingService.d.ts +3 -2
- package/dist-server/server/services/embeddingService.d.ts.map +1 -1
- package/dist-server/server/services/embeddingService.js +14 -1
- package/dist-server/server/services/embeddingService.js.map +1 -1
- package/dist-server/server/services/githubIndexer.d.ts.map +1 -1
- package/dist-server/server/services/githubIndexer.js +9 -3
- package/dist-server/server/services/githubIndexer.js.map +1 -1
- package/dist-server/server/services/sqliteStore.d.ts +22 -0
- package/dist-server/server/services/sqliteStore.d.ts.map +1 -0
- package/dist-server/server/services/sqliteStore.js +101 -0
- package/dist-server/server/services/sqliteStore.js.map +1 -0
- package/dist-server/server/services/worktreeManager.d.ts.map +1 -1
- package/dist-server/server/services/worktreeManager.js +15 -3
- package/dist-server/server/services/worktreeManager.js.map +1 -1
- package/dist-server/tsconfig.server.tsbuildinfo +1 -1
- package/package.json +3 -2
- package/dist/assets/index-CXhIX28x.js +0 -634
- package/dist/assets/index-CeNF0r-K.css +0 -1
package/README.md
CHANGED
|
@@ -1,261 +1,41 @@
|
|
|
1
|
-
# Modular Studio
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
│ │ Index Allocator Navigator │ │
|
|
43
|
-
│ │ (4 connectors) (epistemic (LLM-driven (semantic │ │
|
|
44
|
-
│ │ weights) branch sel.) dedup) │ │
|
|
45
|
-
│ │ │ │ │ │
|
|
46
|
-
│ │ ▼ ▼ │ │
|
|
47
|
-
│ │ Contradiction Corrective Re-Nav │ │
|
|
48
|
-
│ │ Detection + HyDE │ │
|
|
49
|
-
│ │ │ │ │ │
|
|
50
|
-
│ │ └──────┬───────┘ │ │
|
|
51
|
-
│ │ ▼ │ │
|
|
52
|
-
│ │ Attention-Ordered │ │
|
|
53
|
-
│ │ Context Assembly │ │
|
|
54
|
-
│ └───────────────────────────────────────────────────────────────────┘ │
|
|
55
|
-
│ │
|
|
56
|
-
│ ┌─────────────────── Memory System ─────────────────────────────────┐ │
|
|
57
|
-
│ │ Fact Extraction ──► Three-Factor Retrieval ──► Consolidation │ │
|
|
58
|
-
│ │ (pattern + LLM) (relevance + recency (prune, merge, │ │
|
|
59
|
-
│ │ + importance) promote) │ │
|
|
60
|
-
│ └───────────────────────────────────────────────────────────────────┘ │
|
|
61
|
-
│ │
|
|
62
|
-
│ ┌─────────────────── Team Runtime ──────────────────────────────────┐ │
|
|
63
|
-
│ │ POST /api/runtime/team ──► Parallel Agents ──► Shared Facts │ │
|
|
64
|
-
│ │ (SSE streaming) (Claude Agent SDK) (deduplicated) │ │
|
|
65
|
-
│ └───────────────────────────────────────────────────────────────────┘ │
|
|
66
|
-
│ │
|
|
67
|
-
│ Backend: Express 5 + TypeScript Frontend: React 19 + Zustand │
|
|
68
|
-
│ Port 4800 Port 5173 (dev) │
|
|
69
|
-
└─────────────────────────────────────────────────────────────────────────┘
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
## Features
|
|
73
|
-
|
|
74
|
-
### Pipeline
|
|
75
|
-
- **Epistemic Budget Allocator** — Token budgets by knowledge type (ground-truth 30%, evidence 20%, framework 15%, guideline 15%, signal 12%, hypothesis 8%)
|
|
76
|
-
- **4 Source Connectors** — Markdown, Structured, Chronological, Flat — normalize any source to a navigable tree
|
|
77
|
-
- **Agent Navigator** — LLM reads tree headlines and selects relevant branches per task
|
|
78
|
-
- **Attention-Aware Ordering** — Sources reordered to exploit LLM primacy/recency attention bias
|
|
79
|
-
- **Contradiction Detection** — Heuristic entity extraction + epistemic priority resolution, no LLM calls
|
|
80
|
-
- **Context Compression** — Semantic dedup, filler removal, code compression (inspired by [rtk-ai/rtk](https://github.com/rtk-ai/rtk))
|
|
81
|
-
- **Corrective Re-Navigation** — Critique pass identifies gaps, re-navigates with 20% budget cap
|
|
82
|
-
- **HyDE Navigation** — Hypothetical ideal answer improves heading matching for complex queries
|
|
83
|
-
|
|
84
|
-
### Memory
|
|
85
|
-
- **Fact Extraction** — Pattern-based + LLM-based fact extraction with epistemic typing
|
|
86
|
-
- **Three-Factor Retrieval** — `score = relevance + 0.5×recency + 0.5×importance`
|
|
87
|
-
- **Ebbinghaus Decay** — Strength = importance × e^(-days/halfLife), half-life extends with access frequency
|
|
88
|
-
- **Consolidation** — Prune weak facts, merge similar ones, promote validated hypotheses
|
|
89
|
-
|
|
90
|
-
### Runtime
|
|
91
|
-
- **Team Execution** — Multi-agent parallel runs with SSE streaming and per-agent system prompts
|
|
92
|
-
- **Cross-Agent Facts** — Extracted facts shared across team members, deduplicated by confidence
|
|
93
|
-
- **Claude Agent SDK** — Full integration with built-in tools (Read, Edit, Bash, Grep, Glob, WebSearch, WebFetch)
|
|
94
|
-
- **Maximizable Results** — Full-screen overlay for reading long agent outputs
|
|
95
|
-
- **Contrastive Retrieval** — For analytical queries, automatically pulls both supporting AND contradicting evidence
|
|
96
|
-
|
|
97
|
-
### IDE
|
|
98
|
-
- **Knowledge Type System** — 6 types with classification rules and visual color coding
|
|
99
|
-
- **MCP Server Registry** — 100+ pre-configured servers with live health probes
|
|
100
|
-
- **Skills Marketplace** — Searchable catalog with security badges (GEN, Socket, Snyk)
|
|
101
|
-
- **Agent Directory Format** — Primary export: ZIP with agent.yaml + SOUL.md + INSTRUCTIONS.md + TOOLS.md + KNOWLEDGE.md + MEMORY.md. Git-friendly, human-readable, portable.
|
|
102
|
-
- **Universal Export** — Claude Code, Amp, Codex, Vibe Kanban, OpenClaw, Generic JSON
|
|
103
|
-
- **Execution Traces** — Timeline of LLM calls, tool invocations, retrievals
|
|
104
|
-
- **Automatic Versioning** — Semantic diffs on every agent change
|
|
105
|
-
- **AI-Powered Generation** — Generate full agent configs from plain-language descriptions
|
|
106
|
-
|
|
107
|
-
## Quick Start
|
|
108
|
-
|
|
109
|
-
```bash
|
|
110
|
-
# Run directly
|
|
111
|
-
npx modular-studio
|
|
112
|
-
|
|
113
|
-
# Or install globally
|
|
114
|
-
npm install -g modular-studio
|
|
115
|
-
modular-studio
|
|
116
|
-
|
|
117
|
-
# Development
|
|
118
|
-
git clone https://github.com/VictorGjn/modular-patchbay.git
|
|
119
|
-
cd modular-patchbay
|
|
120
|
-
npm install --legacy-peer-deps
|
|
121
|
-
npm run dev # Frontend on :5173, backend on :4800
|
|
122
|
-
npm run build:all # Full production build
|
|
123
|
-
npm test # 646 tests
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
### First steps
|
|
127
|
-
|
|
128
|
-
1. Add an LLM provider (Anthropic, OpenAI, OpenRouter, or Google)
|
|
129
|
-
2. Create an agent — set identity, persona, objectives, constraints
|
|
130
|
-
3. Add knowledge sources — assign knowledge types (ground-truth, evidence, framework, etc.)
|
|
131
|
-
4. Test with the chat panel — the pipeline assembles context automatically
|
|
132
|
-
5. Export to your preferred format (Claude Code, Amp, Codex, etc.)
|
|
133
|
-
|
|
134
|
-
## Agent Definition Format
|
|
135
|
-
|
|
136
|
-
```yaml
|
|
137
|
-
version: '1.0'
|
|
138
|
-
kind: agent
|
|
139
|
-
|
|
140
|
-
identity:
|
|
141
|
-
name: fleet-monitor
|
|
142
|
-
display_name: Fleet Monitor
|
|
143
|
-
description: Real-time vessel performance monitoring agent
|
|
144
|
-
tags: ['maritime', 'fleet', 'monitoring']
|
|
145
|
-
|
|
146
|
-
instructions:
|
|
147
|
-
persona: |
|
|
148
|
-
You are a maritime fleet performance analyst.
|
|
149
|
-
Monitor vessel metrics and flag anomalies.
|
|
150
|
-
constraints:
|
|
151
|
-
- Never recommend speed changes without fuel impact analysis
|
|
152
|
-
- Always include CII rating context
|
|
153
|
-
objectives:
|
|
154
|
-
primary: Detect performance anomalies early
|
|
155
|
-
success_criteria:
|
|
156
|
-
- Flag fuel overconsumption within 4 hours
|
|
157
|
-
- Correlate weather impact on route efficiency
|
|
158
|
-
|
|
159
|
-
context:
|
|
160
|
-
knowledge:
|
|
161
|
-
- type: file
|
|
162
|
-
ref: fleet-specs.md
|
|
163
|
-
knowledge_type: ground-truth
|
|
164
|
-
depth: 0
|
|
165
|
-
- type: structured
|
|
166
|
-
ref: hubspot://deals
|
|
167
|
-
knowledge_type: signal
|
|
168
|
-
depth: 2
|
|
169
|
-
|
|
170
|
-
mcp_servers:
|
|
171
|
-
- name: github
|
|
172
|
-
transport: stdio
|
|
173
|
-
command: npx @modelcontextprotocol/server-github
|
|
174
|
-
|
|
175
|
-
workflow:
|
|
176
|
-
steps:
|
|
177
|
-
- id: ingest
|
|
178
|
-
action: Read latest vessel telemetry
|
|
179
|
-
condition: always
|
|
180
|
-
- id: analyze
|
|
181
|
-
action: Compare against baseline performance
|
|
182
|
-
- id: alert
|
|
183
|
-
action: Flag anomalies with severity and recommended actions
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
## Export Targets
|
|
187
|
-
|
|
188
|
-
| Target | Format | Use case |
|
|
189
|
-
|--------|--------|----------|
|
|
190
|
-
| Claude Code | `AGENTS.md` | Direct CLI integration |
|
|
191
|
-
| Amp | YAML | Sourcegraph agent definitions |
|
|
192
|
-
| Codex | JSON | OpenAI-compatible configs |
|
|
193
|
-
| Vibe Kanban | YAML | BloopAI task automation |
|
|
194
|
-
| OpenClaw | YAML | Open-source agent runtime |
|
|
195
|
-
| Generic | JSON | Custom integrations |
|
|
196
|
-
|
|
197
|
-
## Tech Stack
|
|
198
|
-
|
|
199
|
-
- **Frontend**: React 18 + TypeScript + Vite
|
|
200
|
-
- **Styling**: Tailwind CSS + custom design system
|
|
201
|
-
- **State**: Zustand (9 stores with persist middleware)
|
|
202
|
-
- **Backend**: Express + TypeScript (LLM proxy, MCP manager, team runner)
|
|
203
|
-
- **Agent SDK**: @anthropic-ai/claude-agent-sdk
|
|
204
|
-
- **Testing**: Vitest (unit) + Playwright (E2E) — 646 tests
|
|
205
|
-
- **Fonts**: Geist Sans (body) + Geist Mono (labels)
|
|
206
|
-
|
|
207
|
-
## Documentation
|
|
208
|
-
|
|
209
|
-
| Document | Description |
|
|
210
|
-
|---|---|
|
|
211
|
-
| [Release Notes v0.2.0](docs/RELEASE-v0.2.0.md) | What's new in v0.2.0 |
|
|
212
|
-
| [Usage Guide](docs/USAGE-GUIDE.md) | Comprehensive usage guide |
|
|
213
|
-
| [Hurricane Use Case](docs/USE-CASE-HURRICANE.md) | End-to-end maritime hurricane response validation |
|
|
214
|
-
| [Dogfood Review](docs/DOGFOOD-REVIEW.md) | Can Modular Studio improve itself? |
|
|
215
|
-
| [Agent Architecture](docs/AGENT-ARCHITECTURE.md) | Platform design and agent definition format |
|
|
216
|
-
| [Context Engineering Vision](docs/CONTEXT-ENGINEERING-VISION.md) | Product vision and value proposition |
|
|
217
|
-
| [Knowledge Pipeline v2](docs/KNOWLEDGE-PIPELINE-V2.md) | Pipeline architecture spec |
|
|
218
|
-
| [Memory System](docs/MEMORY-SYSTEM-ANALYSIS.md) | Memory management design |
|
|
219
|
-
|
|
220
|
-
## Contributing
|
|
221
|
-
|
|
222
|
-
We use conventional commits:
|
|
223
|
-
|
|
224
|
-
```
|
|
225
|
-
feat: add embedding-based navigation
|
|
226
|
-
fix: budget allocator overflow on empty sources
|
|
227
|
-
docs: add hurricane use case validation
|
|
228
|
-
refactor: simplify depth filter to budget multiplier
|
|
229
|
-
test: add contradiction detector edge cases
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
### Development workflow
|
|
233
|
-
|
|
234
|
-
1. Fork and clone the repository
|
|
235
|
-
2. `npm install --legacy-peer-deps`
|
|
236
|
-
3. `npm run dev` — starts frontend + backend
|
|
237
|
-
4. Make changes, write tests
|
|
238
|
-
5. `npm test` — ensure all tests pass
|
|
239
|
-
6. `npx tsc --noEmit` — verify TypeScript compiles
|
|
240
|
-
7. Submit a PR with conventional commit title
|
|
241
|
-
|
|
242
|
-
### Code quality
|
|
243
|
-
|
|
244
|
-
- No dead code — if it's not used, delete it
|
|
245
|
-
- DRY + KISS — prefer simplicity over abstraction
|
|
246
|
-
- Continuous refactoring — leave code better than you found it
|
|
247
|
-
- Squash-and-merge for PRs
|
|
248
|
-
|
|
249
|
-
## Acknowledgments
|
|
250
|
-
|
|
251
|
-
- [rtk-ai/rtk](https://github.com/rtk-ai/rtk) — Rust Token Killer. Our context compression module is inspired by RTK's approach to minimizing LLM token consumption.
|
|
252
|
-
- [ReactFlow](https://reactflow.dev) — Used for the visual canvas mode.
|
|
253
|
-
- [Anthropic](https://anthropic.com) — Claude Agent SDK for backend agent execution.
|
|
254
|
-
|
|
255
|
-
## License
|
|
256
|
-
|
|
257
|
-
Apache License 2.0 — see [LICENSE](LICENSE) for details.
|
|
258
|
-
|
|
259
|
-
---
|
|
260
|
-
|
|
261
|
-
*Context engineering is the layer every AI platform needs. Modular Studio is that layer.*
|
|
1
|
+
# Modular Studio
|
|
2
|
+
|
|
3
|
+
**The context engineering IDE for AI agents**
|
|
4
|
+
|
|
5
|
+
Build knowledge pipelines, not just prompts. Design AI systems that understand your codebase through tree-aware retrieval and deep contextual intelligence.
|
|
6
|
+
|
|
7
|
+
## Quick Start
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npx modular-studio
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Open [localhost:4800](http://localhost:4800) and start building.
|
|
14
|
+
|
|
15
|
+
## Key Features
|
|
16
|
+
|
|
17
|
+
- **🌳 Tree-Aware Retrieval** — Semantic search that understands code structure
|
|
18
|
+
- **🔌 150+ MCP Connectors** — Integrate with any system or service
|
|
19
|
+
- **⚡ Built-in Tools** — GitHub indexing, file management, embeddings out of the box
|
|
20
|
+
- **📊 Pipeline Visibility** — See exactly how context flows through your system
|
|
21
|
+
- **🤖 Multi-Agent** — Coordinate multiple AI agents with shared knowledge
|
|
22
|
+
- **📤 Export Anywhere** — Generate prompts for Claude, ChatGPT, or any LLM
|
|
23
|
+
|
|
24
|
+
## How It Compares
|
|
25
|
+
|
|
26
|
+
| | **Traditional RAG** | **Prompt Engineering** | **Modular Studio** |
|
|
27
|
+
|---|---|---|---|
|
|
28
|
+
| **Context Quality** | Document chunks | Manual examples | Tree-aware semantic |
|
|
29
|
+
| **Knowledge Integration** | Static embeddings | Copy-paste | Live repository sync |
|
|
30
|
+
| **Collaboration** | Team wikis | Shared prompts | Version-controlled pipelines |
|
|
31
|
+
| **Debugging** | Black box | Trial and error | Visual pipeline inspection |
|
|
32
|
+
| **Scalability** | Database scaling | Prompt size limits | Distributed knowledge graphs |
|
|
33
|
+
|
|
34
|
+
## Requirements
|
|
35
|
+
|
|
36
|
+
- **Node 18+**
|
|
37
|
+
- **API Key** (Anthropic, OpenAI, or compatible)
|
|
38
|
+
|
|
39
|
+
## License
|
|
40
|
+
|
|
41
|
+
Apache 2.0 — Free for commercial and open source use.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as l}from"./index-
|
|
1
|
+
import{u as l}from"./index-LWCi_4Hu.js";function c(o,n){const t=[],a=[];t.push({name:o,entityType:"repository",observations:[`Tech stack: ${n.stack.join(", ")}`,`Total files: ${n.totalFiles}`,`Total tokens: ${n.totalTokens}`,...(n.conventions??[]).map(e=>`Convention: ${e}`)]});for(const e of n.features){const s=`${o}/${e.name}`;t.push({name:s,entityType:"feature",observations:[`Key files: ${e.keyFiles.join(", ")}`,...(e.stores??[]).map(i=>`Store: ${i}`),...(e.routes??[]).map(i=>`Route: ${i}`),...e.componentCount?[`Components: ${e.componentCount}`]:[]]}),a.push({from:o,to:s,relationType:"has_feature"});for(const i of e.keyFiles.slice(0,5)){const r=`${o}:${i}`;t.push({name:r,entityType:"file",observations:[`Path: ${i}`,`Feature: ${e.name}`]}),a.push({from:s,to:r,relationType:"contains_file"})}}for(const e of n.modules??[]){const s=`${o}/module:${e.name}`;t.push({name:s,entityType:"module",observations:[`Files: ${e.files.length}`,`Key files: ${e.files.slice(0,5).join(", ")}`]}),a.push({from:o,to:s,relationType:"has_module"})}return{entities:t,relations:a}}async function f(o,n){const t=l.getState(),a=t.servers.find(i=>i.status==="connected"&&i.tools.some(r=>r.name==="create_entities"));if(!a)return;const{entities:e,relations:s}=c(o,n);try{e.length>0&&await t.callTool(a.id,"create_entities",{entities:e}),s.length>0&&await t.callTool(a.id,"create_relations",{relations:s})}catch{}}async function m(o){for(const{name:n,scan:t}of o)await f(n,t)}export{m as populateGraphFromMultiScan,f as populateGraphFromScan};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:"Geist Sans", sans-serif;--font-mono:"Geist Mono", monospace;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-md:28rem;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-bg:#111114;--color-accent:#fe5000;--color-text-primary:#f0f0f0}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{box-sizing:border-box;margin:0;padding:0}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.top-0\.5{top:calc(var(--spacing) * .5)}.top-1{top:calc(var(--spacing) * 1)}.top-1\/2{top:50%}.top-3{top:calc(var(--spacing) * 3)}.top-4{top:calc(var(--spacing) * 4)}.top-12{top:calc(var(--spacing) * 12)}.top-13{top:calc(var(--spacing) * 13)}.top-\[2px\]{top:2px}.top-\[3px\]{top:3px}.top-full{top:100%}.right-0{right:calc(var(--spacing) * 0)}.right-1\.5{right:calc(var(--spacing) * 1.5)}.right-2{right:calc(var(--spacing) * 2)}.right-6{right:calc(var(--spacing) * 6)}.bottom-4{bottom:calc(var(--spacing) * 4)}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.left-3{left:calc(var(--spacing) * 3)}.left-5{left:calc(var(--spacing) * 5)}.left-6{left:calc(var(--spacing) * 6)}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\[200\]{z-index:200}.z-\[250\]{z-index:250}.z-\[300\]{z-index:300}.z-\[9999\]{z-index:9999}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing) * 0)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing) * 2)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-auto{margin-top:auto}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-4{margin-right:calc(var(--spacing) * 4)}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-6{margin-left:calc(var(--spacing) * 6)}.ml-11{margin-left:calc(var(--spacing) * 11)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1{height:calc(var(--spacing) * 1)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-11{height:calc(var(--spacing) * 11)}.h-\[6px\]{height:6px}.h-\[8px\]{height:8px}.h-\[10px\]{height:10px}.h-\[14px\]{height:14px}.h-\[18px\]{height:18px}.h-\[44px\]{height:44px}.h-\[48px\]{height:48px}.h-full{height:100%}.h-px{height:1px}.max-h-\[60vh\]{max-height:60vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[300px\]{max-height:300px}.max-h-\[400px\]{max-height:400px}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\[28px\]{min-height:28px}.min-h-\[32px\]{min-height:32px}.min-h-\[36px\]{min-height:36px}.min-h-\[44px\]{min-height:44px}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-44{width:calc(var(--spacing) * 44)}.w-\[2px\]{width:2px}.w-\[3px\]{width:3px}.w-\[6px\]{width:6px}.w-\[8px\]{width:8px}.w-\[10px\]{width:10px}.w-\[14px\]{width:14px}.w-\[36px\]{width:36px}.w-\[44px\]{width:44px}.w-\[90vw\]{width:90vw}.w-\[560px\]{width:560px}.w-full{width:100%}.max-w-\[85\%\]{max-width:85%}.max-w-\[800px\]{max-width:800px}.max-w-md{max-width:var(--container-md)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[28px\]{min-width:28px}.min-w-\[32px\]{min-width:32px}.min-w-\[44px\]{min-width:44px}.min-w-\[260px\]{min-width:260px}.min-w-max{min-width:max-content}.flex-1{flex:1}.flex-shrink{flex-shrink:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-ns-resize{cursor:ns-resize}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.resize{resize:both}.resize-none{resize:none}.appearance-none{appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0{gap:calc(var(--spacing) * 0)}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-\[2px\]{gap:2px}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}.self-center{align-self:center}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l-0{border-left-style:var(--tw-border-style);border-left-width:0}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.bg-\[\#FE5000\]{background-color:#fe5000}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.object-cover{object-fit:cover}.p-0{padding:calc(var(--spacing) * 0)}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-8{padding:calc(var(--spacing) * 8)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-px{padding-block:1px}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pr-1{padding-right:calc(var(--spacing) * 1)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-7{padding-right:calc(var(--spacing) * 7)}.pr-9{padding-right:calc(var(--spacing) * 9)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pb-1\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-\[7px\]{font-size:7px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[16px\]{font-size:16px}.text-\[17px\]{font-size:17px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.1em\]{--tw-tracking:.1em;letter-spacing:.1em}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[1px\]{--tw-tracking:1px;letter-spacing:1px}.tracking-\[2px\]{--tw-tracking:2px;letter-spacing:2px}.tracking-\[3px\]{--tw-tracking:3px;letter-spacing:3px}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.opacity-30{opacity:.3}.opacity-60{opacity:.6}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.hover\:border-\[\#FE5000\]:hover{border-color:#fe5000}.hover\:bg-\[\#ff000010\]:hover{background-color:#ff000010}.hover\:opacity-70:hover{opacity:.7}}.focus-visible\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}@media(prefers-reduced-motion:reduce){.motion-reduce\:animate-none{animation:none}.motion-reduce\:transition-none{transition-property:none}}}:focus-visible{outline:2px solid var(--color-accent,#6366f1);outline-offset:2px}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}html,body,#root{background:var(--color-bg);width:100%;height:100%;font-family:var(--font-sans);color:var(--color-text-primary);overflow:hidden}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:#111114}::-webkit-scrollbar-thumb{background:#2a2a30;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#3a3a40}[data-theme=light] ::-webkit-scrollbar-track{background:#f0f1f3}[data-theme=light] ::-webkit-scrollbar-thumb{background:#ccccd4}[data-theme=light] ::-webkit-scrollbar-thumb:hover{background:#aaaab0}.react-flow__node{box-shadow:none!important;background:0 0!important;border:none!important;padding:0!important}.react-flow__controls{border-radius:8px!important;overflow:hidden!important;box-shadow:0 2px 8px #00000026!important}.react-flow__controls-button{color:#f0f0f0!important;fill:#f0f0f0!important;background:#1c1c20!important;border:none!important;border-bottom:1px solid #2a2a30!important;justify-content:center!important;align-items:center!important;width:32px!important;height:32px!important;display:flex!important}.react-flow__controls-button:hover{background:#25252a!important}.react-flow__controls-button:last-child{border-bottom:none!important}.react-flow__controls-button svg{fill:currentColor!important;max-width:14px!important;max-height:14px!important}.react-flow__minimap{background:#1c1c20!important;border:1px solid #2a2a30!important;border-radius:8px!important;box-shadow:0 2px 8px #0003!important}.react-flow__minimap-mask{fill:#111114d9!important}.react-flow__minimap-node{fill:#3a3a42!important;stroke:#555!important;stroke-width:1px!important}[data-theme=light] .react-flow__controls-button{color:#1a1a20!important;fill:#1a1a20!important;background:#fff!important;border-bottom-color:#dddde2!important}[data-theme=light] .react-flow__controls-button:hover{background:#f0f0f5!important}[data-theme=light] .react-flow__minimap{background:#fff!important;border-color:#ccccd4!important}[data-theme=light] .react-flow__minimap-mask{fill:#f0f1f3d9!important}[data-theme=light] .react-flow__minimap-node{fill:#ccccd4!important;stroke:#999!important}::placeholder{color:#666!important;opacity:1!important}[data-theme=light] ::placeholder{color:#888!important}.react-flow__edge-textwrapper .react-flow__edge-text{fill:#888!important}[data-theme=light] .react-flow__edge-textwrapper .react-flow__edge-text{fill:#555!important}@keyframes spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes pulse{50%{opacity:.5}}.glass-surface{background:#1c1c20cc;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(42,42,48,.6)}[data-theme=light] .glass-surface{background:#ffffffd9;border:1px solid rgba(200,200,210,.6)}@keyframes pulse-glow{0%,to{opacity:.6}50%{opacity:1}}@keyframes run-pulse-ring{0%{box-shadow:0 0 #fe500099,0 0 8px #fe50004d}50%{box-shadow:0 0 0 6px #fe500000,0 0 16px #fe500066}to{box-shadow:0 0 #fe500000,0 0 8px #fe50004d}}@keyframes cursor-blink{0%,to{opacity:1}50%{opacity:0}}@keyframes fade-in-up{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes modal-in{0%{opacity:0;transform:translateY(4px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.response-modal-overlay{animation:modal-in .2s ease-out}.tile{transition:transform .12s ease,border-color .15s ease,box-shadow .15s ease}.tile:hover{transform:translateY(-1px)}.tile:active{transform:translateY(0)}@keyframes jack-glow{0%,to{box-shadow:0 0 4px currentColor}50%{box-shadow:0 0 8px currentColor,0 0 12px currentColor}}@keyframes cable-sway{0%,to{filter:drop-shadow(0 0 2px currentColor)}50%{filter:drop-shadow(0 0 4px currentColor)}}@keyframes cable-dash{0%{stroke-dashoffset:20}to{stroke-dashoffset:0}}@keyframes ghost-pulse{0%,to{transform:scale(1);opacity:.6}50%{transform:scale(1.02);opacity:.75}}@keyframes skeleton-loading{0%{background-position:200% 0}to{background-position:-200% 0}}@keyframes status-pulse{0%,to{opacity:.6;transform:scale(1)}50%{opacity:1;transform:scale(1.1)}}.ghost-tile{border-style:dashed!important;opacity:.6;animation:ghost-pulse 2s ease-in-out infinite}.gradient-mesh-bg{position:relative}.gradient-mesh-bg:before{content:"";position:absolute;inset:0;pointer-events:none;background:radial-gradient(ellipse 600px 400px at 15% 50%,rgba(254,80,0,.012) 0%,transparent 70%),radial-gradient(ellipse 500px 500px at 85% 30%,rgba(52,152,219,.008) 0%,transparent 70%);z-index:0}.hover-accent-border{transition:border-color .15s ease,color .15s ease}.hover-accent-border:hover{border-color:#fe5000!important;color:#fe5000!important}.hover-accent-text{transition:color .15s ease}.hover-accent-text:hover{color:#fe5000!important}.hover-row{transition:background-color .15s ease}.hover-row:hover{background-color:#25252a80}[data-theme=light] .hover-row:hover{background-color:#0000000a}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}
|