@wingman-ai/gateway 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/README.md +8 -0
  2. package/dist/agent/config/agentConfig.cjs +12 -0
  3. package/dist/agent/config/agentConfig.d.ts +22 -0
  4. package/dist/agent/config/agentConfig.js +10 -1
  5. package/dist/agent/config/agentLoader.cjs +9 -0
  6. package/dist/agent/config/agentLoader.js +9 -0
  7. package/dist/agent/config/toolRegistry.cjs +17 -0
  8. package/dist/agent/config/toolRegistry.d.ts +15 -0
  9. package/dist/agent/config/toolRegistry.js +17 -0
  10. package/dist/agent/tests/agentConfig.test.cjs +6 -1
  11. package/dist/agent/tests/agentConfig.test.js +6 -1
  12. package/dist/agent/tests/browserControlHelpers.test.cjs +35 -0
  13. package/dist/agent/tests/browserControlHelpers.test.d.ts +1 -0
  14. package/dist/agent/tests/browserControlHelpers.test.js +29 -0
  15. package/dist/agent/tests/browserControlTool.test.cjs +2117 -0
  16. package/dist/agent/tests/browserControlTool.test.d.ts +1 -0
  17. package/dist/agent/tests/browserControlTool.test.js +2111 -0
  18. package/dist/agent/tests/internet_search.test.cjs +22 -28
  19. package/dist/agent/tests/internet_search.test.js +22 -28
  20. package/dist/agent/tests/toolRegistry.test.cjs +6 -0
  21. package/dist/agent/tests/toolRegistry.test.js +6 -0
  22. package/dist/agent/tools/browser_control.cjs +1282 -0
  23. package/dist/agent/tools/browser_control.d.ts +478 -0
  24. package/dist/agent/tools/browser_control.js +1242 -0
  25. package/dist/agent/tools/internet_search.cjs +9 -5
  26. package/dist/agent/tools/internet_search.js +9 -5
  27. package/dist/cli/commands/agent.cjs +16 -2
  28. package/dist/cli/commands/agent.js +16 -2
  29. package/dist/cli/commands/browser.cjs +603 -0
  30. package/dist/cli/commands/browser.d.ts +13 -0
  31. package/dist/cli/commands/browser.js +566 -0
  32. package/dist/cli/commands/gateway.cjs +18 -7
  33. package/dist/cli/commands/gateway.d.ts +5 -1
  34. package/dist/cli/commands/gateway.js +18 -7
  35. package/dist/cli/commands/init.cjs +134 -45
  36. package/dist/cli/commands/init.js +134 -45
  37. package/dist/cli/commands/skill.cjs +3 -2
  38. package/dist/cli/commands/skill.js +3 -2
  39. package/dist/cli/config/loader.cjs +15 -0
  40. package/dist/cli/config/loader.js +15 -0
  41. package/dist/cli/config/schema.cjs +51 -2
  42. package/dist/cli/config/schema.d.ts +49 -0
  43. package/dist/cli/config/schema.js +44 -1
  44. package/dist/cli/core/workspace.cjs +89 -0
  45. package/dist/cli/core/workspace.d.ts +1 -0
  46. package/dist/cli/core/workspace.js +55 -0
  47. package/dist/cli/index.cjs +53 -5
  48. package/dist/cli/index.js +53 -5
  49. package/dist/cli/types/browser.cjs +18 -0
  50. package/dist/cli/types/browser.d.ts +9 -0
  51. package/dist/cli/types/browser.js +0 -0
  52. package/dist/gateway/browserRelayServer.cjs +338 -0
  53. package/dist/gateway/browserRelayServer.d.ts +38 -0
  54. package/dist/gateway/browserRelayServer.js +301 -0
  55. package/dist/gateway/http/agents.cjs +22 -0
  56. package/dist/gateway/http/agents.js +22 -0
  57. package/dist/gateway/http/fs.cjs +57 -0
  58. package/dist/gateway/http/fs.js +58 -1
  59. package/dist/gateway/server.cjs +43 -6
  60. package/dist/gateway/server.d.ts +4 -1
  61. package/dist/gateway/server.js +36 -5
  62. package/dist/gateway/transport/websocket.cjs +45 -10
  63. package/dist/gateway/transport/websocket.d.ts +1 -0
  64. package/dist/gateway/transport/websocket.js +41 -9
  65. package/dist/gateway/types.d.ts +4 -0
  66. package/dist/tests/agents-api.test.cjs +52 -0
  67. package/dist/tests/agents-api.test.js +53 -1
  68. package/dist/tests/browser-command.test.cjs +264 -0
  69. package/dist/tests/browser-command.test.d.ts +1 -0
  70. package/dist/tests/browser-command.test.js +258 -0
  71. package/dist/tests/browser-relay-server.test.cjs +20 -0
  72. package/dist/tests/browser-relay-server.test.d.ts +1 -0
  73. package/dist/tests/browser-relay-server.test.js +14 -0
  74. package/dist/tests/cli-config-loader.test.cjs +43 -0
  75. package/dist/tests/cli-config-loader.test.js +43 -0
  76. package/dist/tests/cli-init.test.cjs +25 -2
  77. package/dist/tests/cli-init.test.js +25 -2
  78. package/dist/tests/cli-workspace-root.test.cjs +114 -0
  79. package/dist/tests/cli-workspace-root.test.d.ts +1 -0
  80. package/dist/tests/cli-workspace-root.test.js +108 -0
  81. package/dist/tests/fs-api.test.cjs +138 -0
  82. package/dist/tests/fs-api.test.d.ts +1 -0
  83. package/dist/tests/fs-api.test.js +132 -0
  84. package/dist/tests/gateway-command-workspace.test.cjs +150 -0
  85. package/dist/tests/gateway-command-workspace.test.d.ts +1 -0
  86. package/dist/tests/gateway-command-workspace.test.js +144 -0
  87. package/dist/tests/gateway-request-execution-overrides.test.cjs +42 -0
  88. package/dist/tests/gateway-request-execution-overrides.test.d.ts +1 -0
  89. package/dist/tests/gateway-request-execution-overrides.test.js +36 -0
  90. package/dist/tests/gateway.test.cjs +31 -0
  91. package/dist/tests/gateway.test.js +31 -0
  92. package/dist/tests/websocket-transport.test.cjs +31 -0
  93. package/dist/tests/websocket-transport.test.d.ts +1 -0
  94. package/dist/tests/websocket-transport.test.js +25 -0
  95. package/dist/webui/assets/index-Cwkg4DKj.css +11 -0
  96. package/dist/webui/assets/{index-0nUBsUUq.js → index-DHbfLOUR.js} +109 -107
  97. package/dist/webui/index.html +2 -2
  98. package/extensions/wingman-browser-extension/README.md +27 -0
  99. package/extensions/wingman-browser-extension/background.js +416 -0
  100. package/extensions/wingman-browser-extension/manifest.json +19 -0
  101. package/extensions/wingman-browser-extension/options.html +156 -0
  102. package/extensions/wingman-browser-extension/options.js +106 -0
  103. package/package.json +8 -8
  104. package/{.wingman → templates}/agents/README.md +2 -1
  105. package/{.wingman → templates}/agents/coding/agent.md +0 -1
  106. package/{.wingman → templates}/agents/coding-v2/agent.md +0 -1
  107. package/{.wingman → templates}/agents/game-dev/agent.md +8 -1
  108. package/{.wingman → templates}/agents/game-dev/art-generation.md +1 -0
  109. package/{.wingman → templates}/agents/main/agent.md +5 -0
  110. package/{.wingman → templates}/agents/researcher/agent.md +9 -0
  111. package/{.wingman → templates}/agents/stock-trader/agent.md +1 -0
  112. package/dist/webui/assets/index-kk7OrD-G.css +0 -11
  113. /package/{.wingman → templates}/agents/coding-v2/implementor.md +0 -0
  114. /package/{.wingman → templates}/agents/game-dev/asset-refinement.md +0 -0
  115. /package/{.wingman → templates}/agents/game-dev/planning-idea.md +0 -0
  116. /package/{.wingman → templates}/agents/game-dev/ui-specialist.md +0 -0
  117. /package/{.wingman → templates}/agents/stock-trader/chain-curator.md +0 -0
  118. /package/{.wingman → templates}/agents/stock-trader/goal-translator.md +0 -0
  119. /package/{.wingman → templates}/agents/stock-trader/guardrails-veto.md +0 -0
  120. /package/{.wingman → templates}/agents/stock-trader/path-planner.md +0 -0
  121. /package/{.wingman → templates}/agents/stock-trader/regime-analyst.md +0 -0
  122. /package/{.wingman → templates}/agents/stock-trader/risk.md +0 -0
  123. /package/{.wingman → templates}/agents/stock-trader/selection.md +0 -0
  124. /package/{.wingman → templates}/agents/stock-trader/strategy-composer.md +0 -0
@@ -0,0 +1,106 @@
1
+ const DEFAULT_RELAY_PORT = 18792;
2
+
3
+ function clampPort(rawValue) {
4
+ const parsed = Number.parseInt(String(rawValue || ""), 10);
5
+ if (!Number.isFinite(parsed) || parsed <= 0 || parsed > 65535) {
6
+ return DEFAULT_RELAY_PORT;
7
+ }
8
+ return parsed;
9
+ }
10
+
11
+ function getRelayUrl(port) {
12
+ return `http://127.0.0.1:${port}/`;
13
+ }
14
+
15
+ function setStatus(message, level = "info") {
16
+ const element = document.getElementById("status");
17
+ if (!element) return;
18
+ element.textContent = message;
19
+ element.dataset.level = level;
20
+ }
21
+
22
+ function updateRelayUrl(port) {
23
+ const element = document.getElementById("relay-url");
24
+ if (!element) return;
25
+ element.textContent = getRelayUrl(port);
26
+ }
27
+
28
+ async function testRelay(port) {
29
+ const controller = new AbortController();
30
+ const timeout = setTimeout(() => controller.abort(), 1000);
31
+ try {
32
+ const response = await fetch(getRelayUrl(port), {
33
+ method: "HEAD",
34
+ signal: controller.signal,
35
+ });
36
+ if (!response.ok) {
37
+ throw new Error(`HTTP ${response.status}`);
38
+ }
39
+ setStatus(`Relay is reachable at ${getRelayUrl(port)}`, "ok");
40
+ } catch {
41
+ setStatus(
42
+ `Relay is not reachable at ${getRelayUrl(port)}. Start Wingman gateway/browser relay and try again.`,
43
+ "error",
44
+ );
45
+ } finally {
46
+ clearTimeout(timeout);
47
+ }
48
+ }
49
+
50
+ async function loadSettings() {
51
+ const { relayPort, relayToken } = await chrome.storage.local.get([
52
+ "relayPort",
53
+ "relayToken",
54
+ ]);
55
+ const port = clampPort(relayPort);
56
+ const portInput = document.getElementById("relay-port");
57
+ if (portInput) {
58
+ portInput.value = String(port);
59
+ }
60
+ const tokenInput = document.getElementById("relay-token");
61
+ if (tokenInput) {
62
+ tokenInput.value = typeof relayToken === "string" ? relayToken : "";
63
+ }
64
+ updateRelayUrl(port);
65
+ if (!tokenInput?.value.trim()) {
66
+ setStatus(
67
+ "Relay token is empty. Run `wingman browser extension pair` and paste the token.",
68
+ "error",
69
+ );
70
+ return;
71
+ }
72
+ await testRelay(port);
73
+ }
74
+
75
+ async function saveSettings() {
76
+ const portInput = document.getElementById("relay-port");
77
+ const tokenInput = document.getElementById("relay-token");
78
+ const port = clampPort(portInput?.value);
79
+ const relayToken = String(tokenInput?.value || "").trim();
80
+ await chrome.storage.local.set({ relayPort: port, relayToken });
81
+ if (portInput) {
82
+ portInput.value = String(port);
83
+ }
84
+ if (tokenInput) {
85
+ tokenInput.value = relayToken;
86
+ }
87
+ updateRelayUrl(port);
88
+ if (!relayToken) {
89
+ setStatus("Saved, but relay token is empty.", "error");
90
+ return;
91
+ }
92
+ await testRelay(port);
93
+ }
94
+
95
+ document.getElementById("save")?.addEventListener("click", () => {
96
+ void saveSettings();
97
+ });
98
+
99
+ document.getElementById("test")?.addEventListener("click", () => {
100
+ const input = document.getElementById("relay-port");
101
+ const port = clampPort(input?.value);
102
+ updateRelayUrl(port);
103
+ void testRelay(port);
104
+ });
105
+
106
+ void loadSettings();
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@wingman-ai/gateway",
3
3
  "displayName": "Wingman Agent",
4
4
  "description": "Wingman-AI agentic coding assistant that works with Anthropic, OpenAI, Google, xAI and LMStudio.",
5
- "version": "0.3.0",
5
+ "version": "0.3.2",
6
6
  "main": "index.js",
7
7
  "bin": {
8
8
  "wingman": "./bin/wingman"
@@ -14,7 +14,8 @@
14
14
  "dist",
15
15
  "bin",
16
16
  "skills",
17
- ".wingman/agents"
17
+ "extensions",
18
+ "templates/agents"
18
19
  ],
19
20
  "publishConfig": {
20
21
  "access": "public"
@@ -22,12 +23,12 @@
22
23
  "packageManager": "bun@1.1.42",
23
24
  "scripts": {
24
25
  "test": "vitest",
25
- "test:unit": "vitest run --dir src/tests --exclude '**/*integration*'",
26
- "test:integration": "vitest run --dir src/tests/integration",
26
+ "test:unit": "vitest run src/tests --exclude '**/*integration*'",
27
+ "test:integration": "vitest run src/tests/integration",
27
28
  "test:coverage": "vitest run --coverage",
28
29
  "test:watch": "vitest watch",
29
- "test:watch:unit": "vitest watch --dir src/tests --exclude '**/*integration*'",
30
- "test:watch:integration": "vitest watch --dir src/tests/integration",
30
+ "test:watch:unit": "vitest watch src/tests --exclude '**/*integration*'",
31
+ "test:watch:integration": "vitest watch src/tests/integration",
31
32
  "build": "rslib build && bun run webui:build",
32
33
  "dev": "concurrently -n gateway,webui -c emerald,orange \"bun --watch ./src/cli/index.ts gateway run\" \"bun run webui:dev\"",
33
34
  "dev:gateway": "bun --watch ./src/cli/index.ts gateway run",
@@ -87,7 +88,6 @@
87
88
  "@clack/prompts": "^0.7.0",
88
89
  "@fal-ai/client": "^1.9.1",
89
90
  "@langchain/anthropic": "^1.3.17",
90
- "@langchain/community": "^1.1.14",
91
91
  "@langchain/core": "^1.1.24",
92
92
  "@langchain/google-genai": "^2.1.17",
93
93
  "@langchain/langgraph": "^1.1.4",
@@ -103,11 +103,11 @@
103
103
  "duck-duck-scrape": "^2.2.7",
104
104
  "highlight.js": "^11.11.1",
105
105
  "ink": "^5.2.1",
106
- "ink-box": "^2.0.0",
107
106
  "ink-spinner": "^5.0.0",
108
107
  "js-yaml": "^4.1.1",
109
108
  "langchain": "^1.2.23",
110
109
  "multicast-dns": "^7.2.5",
110
+ "playwright-core": "^1.58.2",
111
111
  "react": "^18.3.1",
112
112
  "react-dom": "^18.3.1",
113
113
  "react-icons": "^5.3.0",
@@ -50,7 +50,7 @@ Each agent configuration file follows this schema:
50
50
  ### Optional Fields
51
51
 
52
52
  - **tools**: Array of tool names the agent can use
53
- - Available tools: `internet_search`, `web_crawler`, `command_execute`, `think`, `code_search`, `git_status`
53
+ - Available tools: `internet_search`, `web_crawler`, `browser_control`, `command_execute`, `background_terminal`, `think`, `code_search`, `git_status`, `ui_registry_list`, `ui_registry_get`, `ui_present`
54
54
  - **model**: Override the default model (format: `provider:model-name`)
55
55
  - Anthropic: `anthropic:claude-opus-4-5`, `anthropic:claude-sonnet-4-5-20250929`
56
56
  - OpenAI: `openai:gpt-4o`, `openai:gpt-4-turbo`
@@ -58,6 +58,7 @@ Each agent configuration file follows this schema:
58
58
  - Allowed values: `minimal`, `low`, `medium`, `high`
59
59
  - If the selected model does not support effort controls, Wingman logs a warning and continues
60
60
  - `thinkingEffort` is accepted as a legacy alias
61
+ - **browserProfile**: Optional named persistent browser profile for `browser_control` (configured in `wingman.config.json` under `browser`; initialize with `wingman browser profile init <id>`)
61
62
  - **promptRefinement**: Allow the agent to maintain a durable prompt overlay under `/memories/`
62
63
  - `enabled`: Set true to allow updates from explicit user feedback
63
64
  - `instructionsPath`: Optional override for the overlay file location (virtual path)
@@ -11,7 +11,6 @@ tools:
11
11
  model: codex:gpt-5.3-codex
12
12
  reasoningEffort: "high"
13
13
  mcpUseGlobal: true
14
- promptRefinement: false
15
14
  ---
16
15
 
17
16
  You are a coding agent running in Wingman, a distributed agentic platform. Wingman is an open source project. You are expected to be precise, safe, and helpful.
@@ -14,7 +14,6 @@ tools:
14
14
  model: codex:gpt-5.3-codex
15
15
  reasoningEffort: "high"
16
16
  mcpUseGlobal: true
17
- promptRefinement: false
18
17
  subAgents:
19
18
  - name: coding-worker
20
19
  description: Generic coding subagent for isolated multi-step tasks.
@@ -11,13 +11,13 @@ tools:
11
11
  - background_terminal
12
12
  - internet_search
13
13
  - web_crawler
14
+ - browser_control
14
15
  - ui_registry_list
15
16
  - ui_registry_get
16
17
  - ui_present
17
18
  model: codex:gpt-5.3-codex
18
19
  reasoningEffort: "high"
19
20
  mcpUseGlobal: true
20
- promptRefinement: false
21
21
  subAgents:
22
22
  - name: art-generation
23
23
  description: Creates game-ready textures, images, video concepts, and audio concepts.
@@ -26,6 +26,7 @@ subAgents:
26
26
  - command_execute
27
27
  - internet_search
28
28
  - web_crawler
29
+ - browser_control
29
30
  promptFile: ./art-generation.md
30
31
  - name: asset-refinement
31
32
  description: Refines, converts, and batch-processes media assets with tools like ffmpeg.
@@ -49,6 +50,7 @@ subAgents:
49
50
  - think
50
51
  - code_search
51
52
  - command_execute
53
+ - browser_control
52
54
  - ui_registry_list
53
55
  - ui_registry_get
54
56
  - ui_present
@@ -79,6 +81,11 @@ Media generation policy:
79
81
  - Use modality-specific tools directly for one-off requests; delegate to `art-generation` when there are multiple assets, style consistency constraints, or exploratory prompt iterations.
80
82
  - Keep tool outputs actionable: include prompts used, selected variants, and concrete output paths.
81
83
 
84
+ Browser automation policy:
85
+ - Use built-in `browser_control` for interactive web validation tasks (for example game UI smoke checks, hosted build QA, screenshot capture from JS-rendered pages).
86
+ - `browser_control` is a first-class Wingman runtime surface powered by headless Chrome/Chromium via CDP.
87
+ - Do not model browser automation as an MCP dependency; reserve MCP for external services/data providers.
88
+
82
89
  Execution standards:
83
90
  - Prefer minimal, reviewable diffs that fit existing project structure.
84
91
  - Validate with the most relevant tests or build checks before claiming completion.
@@ -12,6 +12,7 @@ Working rules:
12
12
  - `generate_video_from_image`
13
13
  - `fal_generation_status`
14
14
  - When generation tooling is unavailable, provide high-quality prompts, reference constraints, and executable fallback commands.
15
+ - Use `browser_control` for browser-based visual QA or reference capture when the task depends on JS-rendered pages (for example hosted model demos, web galleries, or WebGL previews).
15
16
  - For texture work, gather or infer geometry context first: mesh/part name, material slot(s), UV set(s) or UDIM tiles, mirrored/overlapped islands, and whether the asset uses tiling, trim sheets, or unique unwraps.
16
17
  - For Three.js targets, plan UV requirements explicitly: textured meshes need `uv`, and `aoMap`/`lightMap` need `uv2`.
17
18
  - For textures, default to power-of-two dimensions and call out tiling/seamless requirements explicitly.
@@ -5,6 +5,7 @@ tools:
5
5
  - think
6
6
  - internet_search
7
7
  - web_crawler
8
+ - browser_control
8
9
  - command_execute
9
10
  model: openai:gpt-5-mini
10
11
  mcpUseGlobal: true
@@ -16,6 +17,10 @@ You are the primary Wingman agent. Handle a wide range of coding, research, and
16
17
  Follow these principles:
17
18
  - Be proactive about gathering context before making changes.
18
19
  - Use the available tools when they add confidence or speed.
20
+ - Use `browser_control` for interactive browser tasks (navigation, clicks, JS-rendered pages, screenshots); it is a native runtime capability using Chrome/Chromium runtime control (CDP with automatic persistent-context fallback), not an MCP server.
21
+ - When using `browser_control`, stick to supported action types (`navigate`, `click`, `type`, `press`, `wait`, `wait_for`, `extract_text`, `evaluate`, `screenshot`) or documented aliases (`goto`, `selector`, `getContent`, `querySelector`, `snapshot`, etc.).
22
+ - If this agent has `browserProfile` configured, prefer that persistent named profile for authenticated workflows.
23
+ - For authenticated profile reuse (for example Robinhood): bootstrap login headed first, then you may request `headless: true` for automation runs; navigate directly to target pages instead of forcing `/login` URLs.
19
24
  - For image/audio/video generation requests, prefer MCP FAL tools (for example `generate_image_or_texture`, `generate_image_edit`, `generate_audio_or_music`, `generate_video_from_image`) and use `fal_generation_status` for queue lifecycle actions.
20
25
  - Keep responses concise, factual, and focused on completing the task.
21
26
  - For repository-affecting requests, treat execution as required by default.
@@ -4,6 +4,7 @@ description: A general-purpose internet researcher for topics, documentation, an
4
4
  tools:
5
5
  - internet_search
6
6
  - web_crawler
7
+ - browser_control
7
8
  promptRefinement: true
8
9
  ---
9
10
 
@@ -27,6 +28,14 @@ Use this to crawl and extract detailed content from specific URLs.
27
28
  - Can crawl multiple pages following links (up to 10 pages)
28
29
  - Returns formatted content with titles, links, and metadata
29
30
 
31
+ ## `browser_control`
32
+
33
+ Use this when static crawling is insufficient and you need real browser behavior.
34
+
35
+ - Native Wingman capability backed by headless Chrome/Chromium over CDP
36
+ - Best for JS-rendered pages, interaction-required flows, and visual verification screenshots
37
+ - Not an MCP dependency; use MCP for external data/SaaS integrations
38
+
30
39
  ## Scope and guardrails
31
40
 
32
41
  - You are not a stock-trading specialist. If a request is primarily about trading workflows or portfolio decisions, suggest using the `stock-trader` agent.
@@ -4,6 +4,7 @@ description: "Options-enabled trading research agent that produces structured De
4
4
  tools:
5
5
  - think
6
6
  - web_crawler
7
+ - browser_control
7
8
  model: xai:grok-4-1-fast-reasoning
8
9
  mcpUseGlobal: true
9
10
  promptRefinement: true
@@ -1,11 +0,0 @@
1
- .react-flow{direction:ltr}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1;cursor:grab}.react-flow__pane.selection{cursor:pointer}.react-flow__pane.dragging{cursor:grabbing}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow .react-flow__edges{pointer-events:none;overflow:visible}.react-flow__edge-path,.react-flow__connection-path{stroke:#b1b1b7;stroke-width:1;fill:none}.react-flow__edge{pointer-events:visibleStroke;cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge:focus .react-flow__edge-path,.react-flow__edge:focus-visible .react-flow__edge-path{stroke:#555}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge-textbg{fill:#fff}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__connectionline{z-index:1001}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:grab}.react-flow__node.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background:#1a192b;border:1px solid white;border-radius:100%}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:-4px;transform:translate(-50%)}.react-flow__handle-top{left:50%;top:-4px;transform:translate(-50%)}.react-flow__handle-left{top:50%;left:-4px;transform:translateY(-50%)}.react-flow__handle-right{right:-4px;top:50%;transform:translateY(-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.center{left:50%;transform:translate(-50%)}.react-flow__attribution{font-size:10px;background:#ffffff80;padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-default,.react-flow__node-input,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:3px;width:150px;font-size:12px;color:#222;text-align:center;border-width:1px;border-style:solid;border-color:#1a192b;background-color:#fff}.react-flow__node-default.selectable:hover,.react-flow__node-input.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:0 1px 4px 1px #00000014}.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:0 0 0 .5px #1a192b}.react-flow__node-group{background-color:#f0f0f040}.react-flow__nodesselection-rect,.react-flow__selection{background:#0059dc14;border:1px dotted rgba(0,89,220,.8)}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls{box-shadow:0 0 2px 1px #00000014}.react-flow__controls-button{border:none;background:#fefefe;border-bottom:1px solid #eee;box-sizing:content-box;display:flex;justify-content:center;align-items:center;width:16px;height:16px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;padding:5px}.react-flow__controls-button:hover{background:#f4f4f4}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__minimap{background-color:#fff}.react-flow__minimap svg{display:block}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:4px;height:4px;border:1px solid #fff;border-radius:1px;background-color:#3367d9;transform:translate(-50%,-50%)}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:#3367d9;border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
2
- Theme: GitHub Dark
3
- Description: Dark theme as seen on github.com
4
- Author: github.com
5
- Maintainer: @Hirse
6
- Updated: 2021-05-15
7
-
8
- Outdated base version: https://github.com/primer/github-syntax-dark
9
- Current colors taken from GitHub's CSS
10
- */.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#79c0ff}.hljs-regexp,.hljs-string,.hljs-meta .hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-comment,.hljs-code,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}*,: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: }/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com
11
- */*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";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,Menlo,Consolas,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}:root{color-scheme:dark}body{margin:0;min-height:100vh;font-family:Sora,system-ui,-apple-system,sans-serif;color:#e2e8f0;background:radial-gradient(1200px 600px at 12% 12%,rgba(56,189,248,.14) 0%,transparent 60%),radial-gradient(900px 620px at 88% 8%,rgba(59,130,246,.2) 0%,transparent 55%),radial-gradient(1200px 900px at 42% 100%,rgba(15,23,42,.85) 0%,transparent 60%),linear-gradient(135deg,#0b0f14,#101826 55%,#0b1120)}.\!container{width:100%!important}.container{width:100%}@media (min-width: 640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width: 768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width: 1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width: 1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width: 1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.glass-edge{border-width:1px;border-color:#ffffff26;background-color:#0f172a99;--tw-shadow: 0 25px 80px rgba(10,25,60,.35);--tw-shadow-colored: 0 25px 80px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);--tw-backdrop-blur: blur(40px);-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)}.panel-card{border-radius:1rem;border-width:1px;border-color:#ffffff1a;background-color:#0f172a99;--tw-shadow: 0 12px 24px rgba(2,10,25,.45);--tw-shadow-colored: 0 12px 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);--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)}.stat-card{border-radius:1rem;border-width:1px;border-color:#ffffff1a;background-image:linear-gradient(to bottom right,var(--tw-gradient-stops));--tw-gradient-from: rgb(15 23 42 / .8) var(--tw-gradient-from-position);--tw-gradient-to: rgb(15 23 42 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);--tw-gradient-to: rgb(2 6 23 / .7) var(--tw-gradient-to-position);--tw-shadow: 0 12px 24px rgba(2,10,25,.45);--tw-shadow-colored: 0 12px 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)}.text-gradient{background-image:linear-gradient(to right,var(--tw-gradient-stops));--tw-gradient-from: #7dd3fc var(--tw-gradient-from-position);--tw-gradient-to: rgb(125 211 252 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);--tw-gradient-to: rgb(56 189 248 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #38bdf8 var(--tw-gradient-via-position), var(--tw-gradient-to);--tw-gradient-to: #3b82f6 var(--tw-gradient-to-position);-webkit-background-clip:text;background-clip:text;color:transparent}.pill{border-radius:9999px;border-width:1px;border-style:dashed;border-color:#fff3;background-color:#0f172a99;padding:.25rem .75rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1));font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.button-primary{border-radius:9999px;background-image:linear-gradient(to right,var(--tw-gradient-stops));--tw-gradient-from: #0ea5e9 var(--tw-gradient-from-position);--tw-gradient-to: rgb(14 165 233 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);--tw-gradient-to: #2563eb var(--tw-gradient-to-position);padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));--tw-shadow: 0 14px 30px rgba(37,99,235,.35);--tw-shadow-colored: 0 14px 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);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}.button-secondary{border-radius:9999px;border-width:1px;border-color:#ffffff1a;background-color:#0f172ab3;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity: 1;color:rgb(241 245 249 / var(--tw-text-opacity, 1));--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);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}.button-ghost{border-radius:9999px;border-width:1px;border-style:dashed;border-color:#fff3;background-color:transparent;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1));--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);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}.markdown-content h1,.markdown-content h2,.markdown-content h3,.markdown-content h4{margin-top:1rem;margin-bottom:.5rem;font-weight:600;--tw-text-opacity: 1;color:rgb(241 245 249 / var(--tw-text-opacity, 1))}.markdown-content p{margin-bottom:0}.markdown-content h1{font-size:1.125rem;line-height:1.75rem}.markdown-content h2{font-size:1rem;line-height:1.5rem}.markdown-content h3,.markdown-content h4{font-size:.875rem;line-height:1.25rem}.markdown-content hr{margin-top:1rem;margin-bottom:1rem;border-color:#ffffff1a}.markdown-content pre code.hljs{background-color:transparent;padding:0}.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}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.\!relative{position:relative!important}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.bottom-6{bottom:1.5rem}.left-0{left:0}.left-\[13px\]{left:13px}.left-\[9px\]{left:9px}.right-2{right:.5rem}.right-6{right:1.5rem}.top-0{top:0}.top-2{top:.5rem}.top-6{top:1.5rem}.z-0{z-index:0}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.z-\[120\]{z-index:120}.z-\[1\]{z-index:1}.z-\[60\]{z-index:60}.z-\[70\]{z-index:70}.order-last{order:9999}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-5{margin-left:1.25rem}.mt-0{margin-top:0}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-auto{margin-top:auto}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.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-3{height:.75rem}.h-3\.5{height:.875rem}.h-36{height:9rem}.h-4{height:1rem}.h-40{height:10rem}.h-5{height:1.25rem}.h-56{height:14rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[520px\]{height:520px}.h-\[calc\(100vh-120px\)\]{height:calc(100vh - 120px)}.h-full{height:100%}.max-h-40{max-height:10rem}.max-h-52{max-height:13rem}.max-h-56{max-height:14rem}.max-h-60{max-height:15rem}.max-h-\[45vh\]{max-height:45vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[90vh\]{max-height:90vh}.min-h-0{min-height:0px}.min-h-\[1200px\]{min-height:1200px}.min-h-\[44px\]{min-height:44px}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[200px\]{width:200px}.w-\[280px\]{width:280px}.w-auto{width:auto}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-\[180px\]{min-width:180px}.min-w-\[200px\]{min-width:200px}.min-w-\[220px\]{min-width:220px}.min-w-full{min-width:100%}.max-w-2xl{max-width:42rem}.max-w-\[160px\]{max-width:160px}.max-w-\[360px\]{max-width:360px}.max-w-\[420px\]{max-width:420px}.max-w-\[90\%\]{max-width:90%}.max-w-\[90vw\]{max-width:90vw}.max-w-full{max-width:100%}.max-w-screen-2xl{max-width:1536px}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}@keyframes drift{0%,to{transform:translateZ(0)}50%{transform:translate3d(40px,-30px,0)}}.animate-drift{animation:drift 14s ease-in-out infinite}@keyframes floatIn{0%{opacity:0;transform:translateY(18px)}to{opacity:1;transform:translateY(0)}}.animate-floatIn{animation:floatIn .7s cubic-bezier(.22,.61,.36,1)}@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 pulseSoft{0%{box-shadow:0 0 #38bdf880}70%{box-shadow:0 0 0 8px #38bdf800}to{box-shadow:0 0 #38bdf800}}.animate-pulseSoft{animation:pulseSoft 1.6s ease-in-out infinite}@keyframes rise{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.animate-rise{animation:rise .6s cubic-bezier(.22,.61,.36,1)}@keyframes slideInFromLeft{0%{transform:translate(-100%);opacity:0}to{transform:translate(0);opacity:1}}.animate-slideInFromLeft{animation:slideInFromLeft .3s cubic-bezier(.22,.61,.36,1)}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.cursor-zoom-in{cursor:zoom-in}.resize-none{resize:none}.resize{resize:both}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.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-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-1{row-gap:.25rem}.space-y-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-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-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.self-center{align-self:center}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-0{border-width:0px}.border-b{border-bottom-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-amber-300\/60{border-color:#fcd34d99}.border-amber-400\/35{border-color:#fbbf2459}.border-amber-400\/40{border-color:#fbbf2466}.border-amber-400\/45{border-color:#fbbf2473}.border-amber-400\/50{border-color:#fbbf2480}.border-emerald-400\/30{border-color:#34d3994d}.border-emerald-400\/35{border-color:#34d39959}.border-emerald-400\/40{border-color:#34d39966}.border-emerald-400\/45{border-color:#34d39973}.border-emerald-400\/60{border-color:#34d39999}.border-emerald-500\/30{border-color:#10b9814d}.border-red-500\/30{border-color:#ef44444d}.border-rose-400\/35{border-color:#fb718559}.border-rose-400\/40{border-color:#fb718566}.border-rose-400\/45{border-color:#fb718573}.border-rose-400\/50{border-color:#fb718580}.border-rose-400\/60{border-color:#fb718599}.border-rose-500\/40{border-color:#f43f5e66}.border-sky-400\/35{border-color:#38bdf859}.border-sky-400\/40{border-color:#38bdf866}.border-sky-400\/50{border-color:#38bdf880}.border-sky-400\/60{border-color:#38bdf899}.border-sky-500\/20{border-color:#0ea5e933}.border-sky-500\/50{border-color:#0ea5e980}.border-transparent{border-color:transparent}.border-violet-400\/35{border-color:#a78bfa59}.border-white\/10{border-color:#ffffff1a}.border-white\/15{border-color:#ffffff26}.border-white\/5{border-color:#ffffff0d}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-500\/15{background-color:#f59e0b26}.bg-black\/0{background-color:#0000}.bg-black\/30{background-color:#0000004d}.bg-black\/70{background-color:#000000b3}.bg-blue-400{--tw-bg-opacity: 1;background-color:rgb(96 165 250 / var(--tw-bg-opacity, 1))}.bg-emerald-400{--tw-bg-opacity: 1;background-color:rgb(52 211 153 / var(--tw-bg-opacity, 1))}.bg-emerald-500\/10{background-color:#10b9811a}.bg-emerald-500\/15{background-color:#10b98126}.bg-emerald-950\/30{background-color:#022c224d}.bg-red-500\/10{background-color:#ef44441a}.bg-rose-400{--tw-bg-opacity: 1;background-color:rgb(251 113 133 / var(--tw-bg-opacity, 1))}.bg-rose-500\/10{background-color:#f43f5e1a}.bg-rose-500\/15{background-color:#f43f5e26}.bg-rose-500\/20{background-color:#f43f5e33}.bg-sky-300{--tw-bg-opacity: 1;background-color:rgb(125 211 252 / var(--tw-bg-opacity, 1))}.bg-sky-400{--tw-bg-opacity: 1;background-color:rgb(56 189 248 / var(--tw-bg-opacity, 1))}.bg-sky-500{--tw-bg-opacity: 1;background-color:rgb(14 165 233 / var(--tw-bg-opacity, 1))}.bg-sky-500\/10{background-color:#0ea5e91a}.bg-sky-500\/100{background-color:#0ea5e9}.bg-sky-500\/15{background-color:#0ea5e926}.bg-sky-500\/20{background-color:#0ea5e933}.bg-sky-500\/5{background-color:#0ea5e90d}.bg-slate-400{--tw-bg-opacity: 1;background-color:rgb(148 163 184 / var(--tw-bg-opacity, 1))}.bg-slate-600{--tw-bg-opacity: 1;background-color:rgb(71 85 105 / var(--tw-bg-opacity, 1))}.bg-slate-800\/80{background-color:#1e293bcc}.bg-slate-900\/55{background-color:#0f172a8c}.bg-slate-900\/60{background-color:#0f172a99}.bg-slate-900\/65{background-color:#0f172aa6}.bg-slate-900\/70{background-color:#0f172ab3}.bg-slate-900\/95{background-color:#0f172af2}.bg-slate-950{--tw-bg-opacity: 1;background-color:rgb(2 6 23 / var(--tw-bg-opacity, 1))}.bg-slate-950\/40{background-color:#02061766}.bg-slate-950\/50{background-color:#02061780}.bg-slate-950\/60{background-color:#02061799}.bg-slate-950\/70{background-color:#020617b3}.bg-slate-950\/80{background-color:#020617cc}.bg-slate-950\/90{background-color:#020617e6}.bg-transparent{background-color:transparent}.bg-violet-500\/10{background-color:#8b5cf61a}.bg-white\/10{background-color:#ffffff1a}.bg-white\/5{background-color:#ffffff0d}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-cyan-400{--tw-gradient-from: #22d3ee var(--tw-gradient-from-position);--tw-gradient-to: rgb(34 211 238 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to) }.from-rose-500\/10{--tw-gradient-from: rgb(244 63 94 / .1) var(--tw-gradient-from-position);--tw-gradient-to: rgb(244 63 94 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to) }.from-sky-500{--tw-gradient-from: #0ea5e9 var(--tw-gradient-from-position);--tw-gradient-to: rgb(14 165 233 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to) }.from-slate-950\/80{--tw-gradient-from: rgb(2 6 23 / .8) var(--tw-gradient-from-position);--tw-gradient-to: rgb(2 6 23 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to) }.from-slate-950\/90{--tw-gradient-from: rgb(2 6 23 / .9) var(--tw-gradient-from-position);--tw-gradient-to: rgb(2 6 23 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to) }.via-slate-900\/70{--tw-gradient-to: rgb(15 23 42 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), rgb(15 23 42 / .7) var(--tw-gradient-via-position), var(--tw-gradient-to) }.via-slate-900\/80{--tw-gradient-to: rgb(15 23 42 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), rgb(15 23 42 / .8) var(--tw-gradient-via-position), var(--tw-gradient-to) }.to-blue-500{--tw-gradient-to: #3b82f6 var(--tw-gradient-to-position) }.to-blue-600{--tw-gradient-to: #2563eb var(--tw-gradient-to-position) }.to-slate-900\/70{--tw-gradient-to: rgb(15 23 42 / .7) var(--tw-gradient-to-position) }.to-slate-900\/80{--tw-gradient-to: rgb(15 23 42 / .8) var(--tw-gradient-to-position) }.to-slate-950\/70{--tw-gradient-to: rgb(2 6 23 / .7) 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-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-\[10px\]{padding-top:10px;padding-bottom:10px}.pb-1{padding-bottom:.25rem}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-7{padding-left:1.75rem}.pr-1{padding-right:.25rem}.pr-1\.5{padding-right:.375rem}.pr-2{padding-right:.5rem}.pr-4{padding-right:1rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-8{padding-top:2rem}.pt-9{padding-top:2.25rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[0\.85em\]{font-size:.85em}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.ordinal{--tw-ordinal: ordinal;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-6{line-height:1.5rem}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.tracking-\[0\.12em\]{letter-spacing:.12em}.tracking-\[0\.14em\]{letter-spacing:.14em}.tracking-\[0\.18em\]{letter-spacing:.18em}.tracking-\[0\.25em\]{letter-spacing:.25em}.tracking-\[0\.2em\]{letter-spacing:.2em}.tracking-\[0\.3em\]{letter-spacing:.3em}.tracking-tight{letter-spacing:-.025em}.text-amber-100{--tw-text-opacity: 1;color:rgb(254 243 199 / var(--tw-text-opacity, 1))}.text-amber-200{--tw-text-opacity: 1;color:rgb(253 230 138 / var(--tw-text-opacity, 1))}.text-amber-200\/80{color:#fde68acc}.text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.text-blue-300{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.text-emerald-100{--tw-text-opacity: 1;color:rgb(209 250 229 / var(--tw-text-opacity, 1))}.text-emerald-200{--tw-text-opacity: 1;color:rgb(167 243 208 / var(--tw-text-opacity, 1))}.text-emerald-300{--tw-text-opacity: 1;color:rgb(110 231 183 / var(--tw-text-opacity, 1))}.text-emerald-300\/60{color:#6ee7b799}.text-emerald-300\/80{color:#6ee7b7cc}.text-ink{--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1))}.text-red-200{--tw-text-opacity: 1;color:rgb(254 202 202 / var(--tw-text-opacity, 1))}.text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.text-rose-100{--tw-text-opacity: 1;color:rgb(255 228 230 / var(--tw-text-opacity, 1))}.text-rose-200{--tw-text-opacity: 1;color:rgb(254 205 211 / var(--tw-text-opacity, 1))}.text-rose-300{--tw-text-opacity: 1;color:rgb(253 164 175 / var(--tw-text-opacity, 1))}.text-rose-500{--tw-text-opacity: 1;color:rgb(244 63 94 / var(--tw-text-opacity, 1))}.text-sky-100{--tw-text-opacity: 1;color:rgb(224 242 254 / var(--tw-text-opacity, 1))}.text-sky-200{--tw-text-opacity: 1;color:rgb(186 230 253 / var(--tw-text-opacity, 1))}.text-sky-300{--tw-text-opacity: 1;color:rgb(125 211 252 / var(--tw-text-opacity, 1))}.text-slate-100{--tw-text-opacity: 1;color:rgb(241 245 249 / var(--tw-text-opacity, 1))}.text-slate-200{--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1))}.text-slate-300{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-violet-100{--tw-text-opacity: 1;color:rgb(237 233 254 / var(--tw-text-opacity, 1))}.text-violet-200{--tw-text-opacity: 1;color:rgb(221 214 254 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.decoration-sky-400\/40{text-decoration-color:#38bdf866}.decoration-slate-300{text-decoration-color:#cbd5e1}.underline-offset-4{text-underline-offset:4px}.opacity-95{opacity:.95}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_0_1px_rgba\(0\,0\,0\,0\.03\)\]{--tw-shadow: 0 0 0 1px rgba(0,0,0,.03);--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_18px_rgba\(56\,189\,248\,0\.2\)\]{--tw-shadow: 0 0 18px rgba(56,189,248,.2);--tw-shadow-colored: 0 0 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_10px_18px_rgba\(18\,14\,12\,0\.08\)\]{--tw-shadow: 0 10px 18px rgba(18,14,12,.08);--tw-shadow-colored: 0 10px 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_10px_24px_rgba\(18\,14\,12\,0\.12\)\]{--tw-shadow: 0 10px 24px rgba(18,14,12,.12);--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_12px_26px_rgba\(3\,9\,28\,0\.35\)\]{--tw-shadow: 0 12px 26px rgba(3,9,28,.35);--tw-shadow-colored: 0 12px 26px 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_14px_30px_rgba\(37\,99\,235\,0\.45\)\]{--tw-shadow: 0 14px 30px rgba(37,99,235,.45);--tw-shadow-colored: 0 14px 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_25px_80px_rgba\(10\,25\,60\,0\.5\)\]{--tw-shadow: 0 25px 80px rgba(10,25,60,.5);--tw-shadow-colored: 0 25px 80px 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\(2\,8\,20\,0\.35\)\]{--tw-shadow: 0 8px 20px rgba(2,8,20,.35);--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-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-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)}.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-2xl{--tw-backdrop-blur: blur(40px);-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-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}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.\[animation-delay\:150ms\]{animation-delay:.15s}.\[animation-delay\:160ms\]{animation-delay:.16s}.\[animation-delay\:300ms\]{animation-delay:.3s}.\[animation-delay\:320ms\]{animation-delay:.32s}.\[overflow-wrap\:anywhere\]{overflow-wrap:anywhere}.gridlines{position:absolute;top:0;right:0;bottom:0;left:0;background-image:linear-gradient(transparent 0%,#94a3b814),linear-gradient(to right,rgba(148,163,184,.12) 1px,transparent 1px),linear-gradient(to bottom,rgba(148,163,184,.12) 1px,transparent 1px);background-size:100% 100%,64px 64px,64px 64px;-webkit-mask-image:radial-gradient(circle at top left,rgba(2,6,23,.8),transparent 70%);mask-image:radial-gradient(circle at top left,rgba(2,6,23,.8),transparent 70%)}.noise{position:fixed;top:0;right:0;bottom:0;left:0;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='2'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)' opacity='0.18'/%3E%3C/svg%3E");mix-blend-mode:soft-light;opacity:.35;pointer-events:none}.aurora{position:absolute;top:-20%;right:-10%;bottom:-20%;left:-10%;background:conic-gradient(from 180deg,#38bdf838,#3b82f61f,#0ea5e933,#fff0);filter:blur(60px);opacity:.55;animation:auroraShift 18s ease-in-out infinite}.orb{position:absolute;border-radius:999px;filter:blur(32px);opacity:.65;mix-blend-mode:multiply}.orb-a{width:420px;height:420px;background:radial-gradient(circle,rgba(56,189,248,.5) 0%,transparent 70%);top:-120px;left:-80px}.orb-b{width:440px;height:440px;background:radial-gradient(circle,rgba(37,99,235,.4) 0%,transparent 70%);bottom:-180px;right:-120px;animation-delay:-3s}.orb-c{width:320px;height:320px;background:radial-gradient(circle,rgba(14,165,233,.4) 0%,transparent 70%);top:120px;right:10%;animation-delay:-6s}@media (prefers-reduced-motion: reduce){*{animation:none!important;transition:none!important}}@keyframes auroraShift{0%,to{transform:translateZ(0) rotate(0)}50%{transform:translate3d(40px,-30px,0) rotate(30deg)}}.placeholder\:text-slate-400::-moz-placeholder{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.placeholder\:text-slate-400::placeholder{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.last\:border-0:last-child{border-width:0px}.hover\:border-rose-300\/80:hover{border-color:#fda4afcc}.hover\:border-rose-400\/40:hover{border-color:#fb718566}.hover\:border-rose-400\/60:hover{border-color:#fb718599}.hover\:border-sky-400\/50:hover{border-color:#38bdf880}.hover\:border-sky-400\/60:hover{border-color:#38bdf899}.hover\:from-cyan-300:hover{--tw-gradient-from: #67e8f9 var(--tw-gradient-from-position);--tw-gradient-to: rgb(103 232 249 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to) }.hover\:to-blue-400:hover{--tw-gradient-to: #60a5fa var(--tw-gradient-to-position) }.hover\:text-red-200:hover{--tw-text-opacity: 1;color:rgb(254 202 202 / var(--tw-text-opacity, 1))}.hover\:text-rose-500:hover{--tw-text-opacity: 1;color:rgb(244 63 94 / var(--tw-text-opacity, 1))}.hover\:text-sky-100:hover{--tw-text-opacity: 1;color:rgb(224 242 254 / var(--tw-text-opacity, 1))}.hover\:text-sky-300:hover{--tw-text-opacity: 1;color:rgb(125 211 252 / var(--tw-text-opacity, 1))}.hover\:text-slate-100:hover{--tw-text-opacity: 1;color:rgb(241 245 249 / var(--tw-text-opacity, 1))}.hover\:text-slate-300:hover{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.hover\:shadow-\[0_18px_36px_rgba\(37\,99\,235\,0\.55\)\]:hover{--tw-shadow: 0 18px 36px rgba(37,99,235,.55);--tw-shadow-colored: 0 18px 36px 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\:shadow-glow:focus{--tw-shadow: 0 0 0 1px rgba(56, 189, 248, .15), 0 18px 42px rgba(59, 130, 246, .24);--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color), 0 18px 42px 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\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.active\:scale-95:active{--tw-scale-x: .95;--tw-scale-y: .95;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\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.group[open] .group-open\: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))}.group[open] .group-open\:text-slate-300{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:scale-\[1\.02\]{--tw-scale-x: 1.02;--tw-scale-y: 1.02;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\/5{background-color:#ffffff0d}@media (min-width: 640px){.sm\:inline{display:inline}.sm\:min-w-\[240px\]{min-width:240px}.sm\:max-w-\[78\%\]{max-width:78%}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:gap-4{gap:1rem}.sm\:p-4{padding:1rem}}@media (min-width: 768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:text-\[13px\]{font-size:13px}}@media (min-width: 1024px){.lg\:order-none{order:0}.lg\:block{display:block}.lg\:hidden{display:none}.lg\:max-h-\[420px\]{max-height:420px}.lg\:grid-cols-\[1\.2fr_0\.8fr\]{grid-template-columns:1.2fr .8fr}.lg\:grid-cols-\[1fr_280px\]{grid-template-columns:1fr 280px}.lg\:grid-cols-\[280px_1fr\]{grid-template-columns:280px 1fr}.lg\:grid-cols-\[360px_1fr\]{grid-template-columns:360px 1fr}.lg\:rounded-\[32px\]{border-radius:32px}.lg\:px-7{padding-left:1.75rem;padding-right:1.75rem}.lg\:py-7{padding-top:1.75rem;padding-bottom:1.75rem}}@media (min-width: 1280px){.xl\:grid-cols-\[minmax\(420px\,1\.4fr\)_minmax\(360px\,1fr\)\]{grid-template-columns:minmax(420px,1.4fr) minmax(360px,1fr)}.xl\:grid-cols-\[minmax\(420px\,1fr\)_minmax\(360px\,1fr\)\]{grid-template-columns:minmax(420px,1fr) minmax(360px,1fr)}}