squad-kit 0.7.2 → 0.9.0
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/CHANGELOG.md +42 -0
- package/dist/cli.js +2305 -1130
- package/dist/cli.js.map +1 -1
- package/dist/console-ui/assets/index-C5I4cnED.css +1 -0
- package/dist/console-ui/assets/index-Dnb4Fisq.js +416 -0
- package/dist/console-ui/index.html +2 -2
- package/package.json +8 -1
- package/templates/prompts/generate-plan.md +78 -50
- package/templates/prompts/scout.md +42 -0
- package/dist/console-ui/assets/index-BDlxrwaG.css +0 -1
- package/dist/console-ui/assets/index-gaFPpGMN.js +0 -416
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
<link rel="icon" href="/favicon.ico" sizes="any" />
|
|
8
8
|
<link rel="icon" href="/logo.svg" type="image/svg+xml" />
|
|
9
9
|
<title>squad console</title>
|
|
10
|
-
<script type="module" crossorigin src="/assets/index-
|
|
11
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
10
|
+
<script type="module" crossorigin src="/assets/index-Dnb4Fisq.js"></script>
|
|
11
|
+
<link rel="stylesheet" crossorigin href="/assets/index-C5I4cnED.css">
|
|
12
12
|
</head>
|
|
13
13
|
<body>
|
|
14
14
|
<div id="root"></div>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "squad-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"author": "Momen Yasser <momenysr@gmail.com>",
|
|
5
5
|
"description": "Plan once, execute cheap. A token-efficient, 3-step SDD workflow CLI (stories → plans → implementation).",
|
|
6
6
|
"keywords": [
|
|
@@ -38,12 +38,19 @@
|
|
|
38
38
|
"verify:console": "tsx scripts/verify-console-build.ts",
|
|
39
39
|
"verify:models": "tsx scripts/verify-models.ts",
|
|
40
40
|
"size:guard": "tsx scripts/size-guard.ts",
|
|
41
|
+
"eval": "SQUAD_INTEGRATION_TEST=1 tsx test/eval/run-eval.ts",
|
|
42
|
+
"eval:offline": "tsx test/eval/run-eval-offline.ts",
|
|
41
43
|
"prepublishOnly": "pnpm run verify:models && pnpm build && pnpm test && pnpm size:guard"
|
|
42
44
|
},
|
|
43
45
|
"dependencies": {
|
|
46
|
+
"@ai-sdk/provider": "1.1.3",
|
|
47
|
+
"@ai-sdk/anthropic": "^1.2.12",
|
|
48
|
+
"@ai-sdk/google": "^1.2.22",
|
|
49
|
+
"@ai-sdk/openai": "^1.3.24",
|
|
44
50
|
"@hono/node-server": "^1.13.0",
|
|
45
51
|
"@inquirer/prompts": "^7.2.0",
|
|
46
52
|
"boxen": "^8.0.1",
|
|
53
|
+
"ai": "^4.3.19",
|
|
47
54
|
"commander": "^12.1.0",
|
|
48
55
|
"diff": "^7.0.0",
|
|
49
56
|
"fs-extra": "^11.2.0",
|
|
@@ -1,93 +1,121 @@
|
|
|
1
1
|
# Meta-prompt: generate implementation-plan Markdown
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
You are a senior engineer maintaining **agent-executable implementation plans** for this project.
|
|
4
4
|
|
|
5
|
-
> **
|
|
5
|
+
> **Plan once, execute cheap.** Put enough concrete detail into the plan that a cheap executor model can act on it without re-exploring the codebase. Every claim — file path, line range, type signature, verification command — must be **verified against real code** before you write it.
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## Inputs
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
1. **Feature slug** — Target folder: `.squad/plans/<feature-slug>/`.
|
|
12
|
+
2. **Tracker work item id** (optional) — When the tracker type (`{{trackerType}}`) is not `none`, the id appears in the filename and tables.
|
|
13
|
+
3. **Intake story** — Provided in the user message; do not ask for it.
|
|
14
|
+
4. **Attachments** — Files under the intake folder's `attachments/`. Read every attachment the intake references.
|
|
12
15
|
|
|
13
|
-
|
|
14
|
-
2. **Tracker work item id** (optional) — If the project's tracker type (see `.squad/config.yaml`) is not `none`, the id must appear in the filename and tables. It should already be in the intake **metadata**.
|
|
15
|
-
3. **Intake story** — Read **`.squad/stories/<feature-slug>/<id>/intake.md`** (folder name is the tracker id, or a slug if no tracker).
|
|
16
|
-
4. **Attachments** — If the intake folder has **`attachments/`**, open the files the intake references.
|
|
17
|
-
|
|
18
|
-
## Project context (read as needed)
|
|
16
|
+
## Project context
|
|
19
17
|
|
|
20
18
|
- Project roots: `{{projectRoots}}`
|
|
21
19
|
- Primary language: `{{primaryLanguage}}`
|
|
22
20
|
- Tracker type: `{{trackerType}}`
|
|
23
|
-
- Existing plans in `.squad/plans/` — read one
|
|
21
|
+
- Existing plans in `.squad/plans/` — read at least one plan from a sibling feature to match tone and structure.
|
|
22
|
+
|
|
23
|
+
## Tools available
|
|
24
|
+
|
|
25
|
+
| Tool | When to use it |
|
|
26
|
+
|---|---|
|
|
27
|
+
| `list_dir` | Discover sibling files before reading them. Cheap. Use first when exploring a directory you have not seen. |
|
|
28
|
+
| `grep` | Locate a symbol, string, or call site without reading whole files. Cheap. Use **before** `read_file` when you know what you are looking for. |
|
|
29
|
+
| `read_file` (ranged: `offset` + `limit`) | Read a known region of a file (the function around line 142, the imports at the top, the test at the bottom). Preferred over whole-file reads. |
|
|
30
|
+
| `read_file` (whole) | Read a small file end-to-end (≤ 32 KB). Use only when the whole file is genuinely needed. |
|
|
31
|
+
|
|
32
|
+
**Cost discipline:** prefer `grep` → ranged `read_file` over whole `read_file`. The byte budget and the read-count budget are both bounded; whole-file reads burn both.
|
|
33
|
+
|
|
34
|
+
## Discovery discipline (mandatory before writing the body)
|
|
35
|
+
|
|
36
|
+
Before producing the plan body you must:
|
|
37
|
+
|
|
38
|
+
1. **Map the area** — `list_dir` the directory or directories the intake mentions (or that the repo tree suggests). Confirm the file names match expectations.
|
|
39
|
+
2. **Find the right files** — `grep` for the central symbols, function names, error messages, or strings cited in the intake. Verify they exist; capture which files they live in.
|
|
40
|
+
3. **Read the right regions** — for each file you intend to cite, do a ranged `read_file` over the section you will reference. Capture the **exact** line numbers you will quote in the plan.
|
|
41
|
+
4. **Find a similar precedent** — `grep` or browse `.squad/plans/` for at least one prior story that touched the same area. Reference it in `## Prerequisites` or in the body when the new work follows the same pattern.
|
|
42
|
+
|
|
43
|
+
A plan written without these four steps **will fail the post-write validation pass** and be returned to you for revision.
|
|
44
|
+
|
|
45
|
+
## Anti-hallucination rules
|
|
46
|
+
|
|
47
|
+
- **No invented paths.** Every file path you cite must come from a successful `list_dir` or `grep` or `read_file` result during this run.
|
|
48
|
+
- **No invented line numbers.** Every line range you cite must come from a `read_file` you actually ran (with `offset`/`limit` if applicable). When in doubt, re-read.
|
|
49
|
+
- **No invented symbols.** Every function name, type name, or constant you cite in the body must appear in the actual code you read. If you cannot confirm it exists, do not name it; describe it generically and let the executor find it.
|
|
50
|
+
- **No "consider", "might", "potentially".** A plan is a contract. If you are not sure, find out. If you cannot find out, mark the uncertainty in `## Edge Cases & Failure Modes` so the executor sees it explicitly.
|
|
24
51
|
|
|
25
52
|
## Story document pattern
|
|
26
53
|
|
|
27
|
-
Every
|
|
54
|
+
Every plan Markdown file follows this structure and tone.
|
|
28
55
|
|
|
29
|
-
### H1 title
|
|
56
|
+
### H1 title
|
|
30
57
|
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
- `NN` is the
|
|
58
|
+
- With tracker id: `# Story NN — <title> (Story: <tracker-id>)`
|
|
59
|
+
- Without: `# Story NN — <title>`
|
|
60
|
+
- `NN` is the global execution sequence (continue after the highest existing number across all features).
|
|
34
61
|
|
|
35
|
-
###
|
|
62
|
+
### Sections (in order; `---` between major sections)
|
|
36
63
|
|
|
37
|
-
1. **`## Prerequisites`** — Bullet list.
|
|
64
|
+
1. **`## Prerequisites`** — Bullet list. `None.` only when truly no dependencies. Otherwise reference prior stories (`Story NN completed: …`) or markdown links to sibling plan files. Mention coordination with owners of shared contracts.
|
|
38
65
|
|
|
39
|
-
2. **`## Story Goal`** — Outcome in clear prose. For business-heavy items a short numbered list of user-visible outcomes is
|
|
66
|
+
2. **`## Story Goal`** — Outcome in clear prose. For business-heavy items, a short numbered list of user-visible outcomes. State what is **not** in scope when ambiguity is likely.
|
|
40
67
|
|
|
41
|
-
3. **`## Context — Read These Files First`** (
|
|
42
|
-
-
|
|
43
|
-
-
|
|
44
|
-
-
|
|
45
|
-
- Include **grep / search** lines when helpful (`` Grep for `handleRequest` in … ``).
|
|
46
|
-
- Reference intake attachments with workspace-root paths when relevant.
|
|
68
|
+
3. **`## Context — Read These Files First`** (exact casing). Numbered list:
|
|
69
|
+
- Each entry: ``project-relative path in backticks`` (or markdown link to a sibling plan file), em dash, then a **specific** instruction citing line ranges (`~lines 513–662`) and symbol names in backticks. Mention what to look for, not just what to read.
|
|
70
|
+
- Include `grep` lines as separate bullets when helpful (`` Grep for `handleRequest` in `project/src/console/api/` ``).
|
|
71
|
+
- Reference intake attachments with workspace-root paths.
|
|
47
72
|
|
|
48
|
-
4. **Optional: `## Product rules (from story)`** —
|
|
73
|
+
4. **Optional: `## Product rules (from story)`** — Only when the intake distinguishes **current vs new behaviour**.
|
|
49
74
|
|
|
50
75
|
5. **Implementation body** — Pick the heading style that fits:
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
- Subsections:
|
|
54
|
-
- For each change,
|
|
55
|
-
- Include
|
|
56
|
-
- State
|
|
76
|
+
- `## Backend Tasks` / `## Frontend Tasks` (split by layer), **or**
|
|
77
|
+
- `## Implementation tasks` (single stream).
|
|
78
|
+
- Subsections: `### 1.` or `### 1 — Short title`. Nest `####` only when needed.
|
|
79
|
+
- For each change, lead with **`File: \`path\``** or **`Create file: \`path\``** so the executor knows exactly where to edit.
|
|
80
|
+
- Include language-tagged fenced code for DTOs, signatures, snippets that match repo style.
|
|
81
|
+
- State `No backend changes required.` (or frontend equivalent) explicitly when true.
|
|
82
|
+
|
|
83
|
+
6. **`## Edge Cases & Failure Modes`** (mandatory). Bullet list. For each: the trigger, the expected behaviour, and where in the code it is enforced (with file path / line range). Examples: empty input, unicode in identifiers, concurrent calls, network timeouts, malformed config, partial migration state. Do not skip this section even when "obvious" — make the executor see what to test.
|
|
84
|
+
|
|
85
|
+
7. **`## Test Plan`** (mandatory). Numbered list of tests to add, modify, or remove, with file paths and either test names or descriptions. Distinguish unit / integration / smoke. Reference existing test patterns by file path so the executor matches them.
|
|
86
|
+
|
|
87
|
+
8. **Optional: `## Migration / Rollback`** — For non-trivial changes (schema migrations, breaking config changes, removed APIs, file renames). Include rollback-on-failure steps and a brief "what could go wrong on a half-applied state."
|
|
57
88
|
|
|
58
|
-
|
|
89
|
+
9. **`## Verification Steps`** — Numbered list. Bold lead-ins: **`Frontend runs:`**, **`Backend builds:`**, **`Regression:`**. Concrete commands (`pnpm dev`, `dotnet build`, `cargo test`, `pytest`) with the exact directory to run them in.
|
|
59
90
|
|
|
60
|
-
|
|
91
|
+
10. **`## Done Criteria`** — `- [ ]` checklist aligned with the intake's acceptance criteria. Each item testable by a person reading the diff.
|
|
61
92
|
|
|
62
|
-
|
|
63
|
-
|
|
93
|
+
11. **Optional closing line** for sequential stories:
|
|
94
|
+
`**STOP HERE. Report to the user and wait for confirmation before proceeding to Story NN+1.**`
|
|
64
95
|
|
|
65
|
-
### Tone and formatting
|
|
96
|
+
### Tone and formatting
|
|
66
97
|
|
|
67
98
|
- **Direct and imperative** ("Add…", "Find…", "Read lines…"). Tie steps to **concrete paths** and **symbols**.
|
|
68
|
-
-
|
|
99
|
+
- **Bold** for file names, field names, stage keys, and critical constraints (**backward compatibility**, **nullable**, **do not** …).
|
|
69
100
|
- Prefer **minimal breaking changes**, **nullable** new fields, and **document** follow-ups in comments when out of scope.
|
|
70
101
|
- User-facing strings (including non-English text) in quotes where they appear in the app.
|
|
102
|
+
- One topic per section; do not let bug-fix-style commentary leak into a feature plan.
|
|
71
103
|
|
|
72
104
|
## Output rules
|
|
73
105
|
|
|
74
|
-
1. **Location:** Write new or updated files only under
|
|
75
|
-
2. **Filename:**
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
3. **Story file body:** Follow the **Story document pattern** above for every new plan file.
|
|
79
|
-
4. **Overview:** Update **`.squad/plans/<feature-slug>/00-overview.md`**:
|
|
80
|
-
- Columns include tracker id (if applicable), file name, title, depends on.
|
|
81
|
-
- Adjust dependency notes if dependencies changed.
|
|
106
|
+
1. **Location:** Write new or updated files only under `.squad/plans/<feature-slug>/`.
|
|
107
|
+
2. **Filename:** With tracker id: `NN-story-<slug>-<id>.md` or `NN-story-<id>.md` (project choice in `config.yaml.naming`). Without: `NN-story-<slug>.md`.
|
|
108
|
+
3. **Story file body:** Follow the Story document pattern above for every new plan file.
|
|
109
|
+
4. **Overview:** Update `.squad/plans/<feature-slug>/00-overview.md`. Columns include tracker id (if applicable), file name, title, depends on. Adjust dependency notes when dependencies change.
|
|
82
110
|
5. **Cross-feature links:** Use relative paths like `../other-feature/NN-story-….md`.
|
|
83
111
|
6. **Index:** If introducing a **new** feature slug, add a row to `.squad/plans/00-index.md`.
|
|
84
112
|
7. **Scope:** Produce planning Markdown only unless the user explicitly asks for code changes.
|
|
85
|
-
8. **First-line metadata (`<!-- squad-kit: … -->`):** If an existing `NN-story-*.md` already
|
|
86
|
-
9. **New plan files
|
|
87
|
-
10. **Executor sessions (later):** When
|
|
113
|
+
8. **First-line metadata (`<!-- squad-kit: … -->`):** If an existing `NN-story-*.md` already starts (after any leading blank lines) with a single-line HTML comment `<!-- squad-kit: … -->`, leave that first line unchanged unless the user explicitly asks to change plan metadata. Status notes belong in the body, not on that line.
|
|
114
|
+
9. **New plan files in the in-agent path:** Start the body with `# Story NN — …`. Do **not** invent the squad-kit metadata comment; only `squad new-plan --api` writes the exact API header format.
|
|
115
|
+
10. **Executor sessions (later):** When a plan is used for implementation (attach-only workflow), treat the plan file as **read-only** unless the user explicitly asks to revise it; implement in application sources and tests.
|
|
88
116
|
|
|
89
117
|
---
|
|
90
118
|
|
|
91
|
-
## Intake content
|
|
119
|
+
## Intake content
|
|
92
120
|
|
|
93
121
|
{{intakeContent}}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Scout: pre-rank files for planning
|
|
2
|
+
|
|
3
|
+
You help a later **draft** planner by selecting the most relevant repository files for an implementation plan.
|
|
4
|
+
|
|
5
|
+
## Context
|
|
6
|
+
|
|
7
|
+
- Project roots: `{{projectRoots}}`
|
|
8
|
+
- Primary language: `{{primaryLanguage}}`
|
|
9
|
+
- Tracker type: `{{trackerType}}`
|
|
10
|
+
|
|
11
|
+
## Repository tree (truncated)
|
|
12
|
+
|
|
13
|
+
The tree lists paths with approximate file sizes. Use it to reason about module layout and siblings — you do **not** have file-reading tools in this stage.
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
{{repoMap}}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Existing plans (style and dependency hints)
|
|
20
|
+
|
|
21
|
+
When the intake mentions an area, prefer files cited in similar prior plans. Bullet list:
|
|
22
|
+
|
|
23
|
+
{{plansIndex}}
|
|
24
|
+
|
|
25
|
+
## Your task
|
|
26
|
+
|
|
27
|
+
Read the intake (user message). From the tree, pick **5–25** repo-relative paths (Unix-style `/`) that the drafter should study first, ordered **most to least relevant**.
|
|
28
|
+
|
|
29
|
+
Prefer:
|
|
30
|
+
|
|
31
|
+
- Entry points, API routes, commands, and services tied to the intake.
|
|
32
|
+
- Existing tests and configs that will need updates.
|
|
33
|
+
- Related types, errors, or utilities named in the story.
|
|
34
|
+
|
|
35
|
+
Avoid:
|
|
36
|
+
|
|
37
|
+
- `node_modules`, build artifacts, and generated bundles (they are already excluded from the tree when possible).
|
|
38
|
+
- Huge files unless the intake clearly centers on them.
|
|
39
|
+
|
|
40
|
+
## Output
|
|
41
|
+
|
|
42
|
+
Respond **only** via structured output (JSON) matching the schema: `selectedFiles`, `reasoning`, `suggestedReadStrategy`, optional `readRanges` for important line-level follow-ups the drafter might use.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
/*! tailwindcss v4.2.4 | MIT License | https://tailwindcss.com */@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-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-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:"Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--spacing:.25rem;--breakpoint-2xl:96rem;--container-sm:24rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-snug:1.375;--leading-relaxed:1.625;--radius-xs:4px;--radius-sm:6px;--radius-md:8px;--radius-lg:10px;--radius-xl:14px;--blur-sm:8px;--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);--gray-1:#0a0a0a;--gray-2:#0f0f10;--gray-3:#161618;--gray-4:#1c1c1f;--gray-5:#232327;--gray-6:#2b2b30;--gray-7:#34343a;--gray-9:#6b6b73;--gray-10:#8e8e96;--gray-11:#c8c8cf;--gray-12:#f5f5f7;--color-bg:var(--gray-1);--color-bg-elevated:var(--gray-2);--color-surface:var(--gray-3);--color-border:var(--gray-6);--color-border-strong:var(--gray-7);--color-text:var(--gray-12);--color-text-muted:var(--gray-10);--color-text-dim:var(--gray-9);--color-accent:#4ade80;--color-accent-soft:#4ade801a;--color-accent-glow:#4ade802e;--color-ok:#22c55e;--color-ok-bg:#22c55e14;--color-ok-border:#22c55e4d;--color-warn:#f59e0b;--color-warn-bg:#f59e0b14;--color-warn-border:#f59e0b4d;--color-fail:#ef4444;--color-fail-bg:#ef444414;--color-fail-border:#ef44444d;--color-info:#3b82f6;--color-info-bg:#3b82f614;--color-info-border:#3b82f64d;--color-primary-fg:#0a0a0a;--color-primary-bg:#f5f5f7;--color-primary-bg-hover:#fff;--space-row-y:10px;--space-card:16px;--space-section:24px;--font-size-base:14px;--font-size-h1:22px;--line-height-tight:1.3;--line-height-base:1.55;--duration-fast:.12s;--duration-normal:.18s;--duration-slow:.24s;--easing-standard:cubic-bezier(.4, 0, .2, 1);--easing-entrance:cubic-bezier(.16, 1, .3, 1);--z-sticky:10;--z-overlay:50;--z-modal:60;--z-toast:70;--z-tooltip:80}}@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}:root{color-scheme:dark}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizelegibility;scroll-behavior:smooth;font-size:var(--font-size-base)}body{background:var(--color-bg);color:var(--color-text);font-family:var(--font-sans);font-feature-settings:"ss01","cv11","tnum" off;line-height:var(--line-height-base)}::selection{background:var(--color-accent-soft);color:var(--color-text)}code,pre,kbd,samp{font-family:var(--font-mono);font-variant-ligatures:none}h1,h2,h3,h4,h5,h6{letter-spacing:-.011em;color:var(--color-text);font-weight:600;line-height:var(--line-height-tight)}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--gray-6);border:2px solid var(--color-bg);border-radius:999px}::-webkit-scrollbar-thumb:hover{background:var(--gray-7)}:focus-visible{box-shadow:0 0 0 2px var(--color-bg),0 0 0 4px var(--color-accent-glow);border-radius:var(--radius-sm);transition:box-shadow var(--duration-fast) var(--easing-standard);outline:none}button:focus-visible,[role=button]:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,a:focus-visible{border-radius:inherit}.tabular{font-variant-numeric:tabular-nums}}@layer components{.container-page{width:100%;max-width:1280px;margin-inline:auto;padding-inline:24px}.btn-primary{justify-content:center;align-items:center;gap:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);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));background:var(--color-primary-bg);color:var(--color-primary-fg);border-radius:var(--radius-md);border:1px solid #0000;padding:8px 14px;line-height:1.2;display:inline-flex}.btn-primary:hover{background:var(--color-primary-bg-hover)}.btn-primary:active{background:var(--gray-11)}.btn-primary:disabled{opacity:.5;cursor:not-allowed}.btn-secondary{justify-content:center;align-items:center;gap:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);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));background:var(--gray-3);color:var(--color-text);border-radius:var(--radius-md);border:1px solid var(--color-border);padding:8px 14px;line-height:1.2;display:inline-flex}.btn-secondary:hover{background:var(--gray-4);border-color:var(--color-border-strong)}.btn-secondary:active{background:var(--gray-5)}.btn-secondary:disabled{opacity:.5;cursor:not-allowed}.btn-ghost{justify-content:center;align-items:center;gap:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);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));color:var(--color-text-muted);border-radius:var(--radius-md);background:0 0;padding:6px 10px;display:inline-flex}.btn-ghost:hover{color:var(--color-text);background:var(--gray-3)}.btn-ghost:active{background:var(--gray-4)}.btn-danger{justify-content:center;align-items:center;gap:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);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));color:var(--color-fail);border-radius:var(--radius-md);border:1px solid var(--color-fail-border);background:0 0;padding:8px 14px;display:inline-flex}.btn-danger:hover{background:var(--color-fail-bg)}.btn-danger:active{background:#ef44442e}.chip{align-items:center;gap:calc(var(--spacing) * 1.5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);border-radius:var(--radius-sm);border:1px solid var(--color-border);background:var(--gray-2);color:var(--color-text-muted);padding:2px 8px;line-height:1.4;display:inline-flex}.card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-card);transition:border-color var(--duration-fast) var(--easing-standard)}.card:hover{border-color:var(--color-border-strong)}.kbd{font-family:var(--font-mono);background:var(--gray-2);border:1px solid var(--color-border);color:var(--color-text-muted);border-radius:var(--radius-xs);box-shadow:0 1px 0 var(--gray-7);align-items:center;padding:1px 6px;font-size:11px;line-height:1.4;display:inline-flex}.gradient-text{color:var(--color-text);-webkit-text-fill-color:currentColor;background:0 0}.grid-bg{background-image:none;-webkit-mask-image:none;mask-image:none}.glow-orb{display:none!important}.gradient-border{position:relative}.gradient-border:before{content:none}.prose-docs{color:var(--color-text);line-height:1.6;font-size:var(--font-size-base)}.prose-docs h1{letter-spacing:-.015em;margin:0 0 16px;font-size:26px}.prose-docs h2{margin:28px 0 10px;font-size:18px}.prose-docs h3{margin:20px 0 8px;font-size:15px}.prose-docs p{color:var(--color-text-muted);margin:12px 0}.prose-docs strong{color:var(--color-text);font-weight:600}.prose-docs a{color:var(--color-text);text-decoration:underline;-webkit-text-decoration-color:var(--gray-7);text-decoration-color:var(--gray-7);text-underline-offset:3px;transition:text-decoration-color var(--duration-fast)}.prose-docs a:hover{-webkit-text-decoration-color:var(--color-accent);text-decoration-color:var(--color-accent)}.prose-docs ul,.prose-docs ol{color:var(--color-text-muted);margin:12px 0;padding-left:22px}.prose-docs ul{list-style:outside}.prose-docs ol{list-style:decimal}.prose-docs li{margin:4px 0}.prose-docs blockquote{border-left:2px solid var(--color-border-strong);color:var(--color-text-muted);margin:16px 0;padding-left:14px;font-style:normal}.prose-docs code:not(pre code){background:var(--gray-2);border:1px solid var(--color-border);color:var(--color-text);border-radius:var(--radius-xs);padding:1px 5px;font-size:.9em}.prose-docs pre{background:var(--gray-2);border:1px solid var(--color-border);border-radius:var(--radius-md);margin:16px 0;padding:12px 14px;font-size:13px;line-height:1.55;overflow-x:auto}.prose-docs hr{border:none;border-top:1px solid var(--color-border);margin:32px 0}.prose-docs table{border-collapse:collapse;width:100%;margin:18px 0;font-size:13px}.prose-docs th,.prose-docs td{border:1px solid var(--color-border);text-align:left;padding:8px 12px}.prose-docs th{background:var(--gray-2);color:var(--color-text);font-weight:600}.prose-docs td{color:var(--color-text-muted)}.animate-fade-up{animation:fade-up var(--duration-slow) var(--easing-entrance) both}.animate-fade-in{animation:fade-in var(--duration-normal) var(--easing-standard) both}.animate-blink{animation:1s steps(2,end) infinite blink}.cmdk-row{cursor:pointer;align-items:center;gap:calc(var(--spacing) * 2);border-radius:var(--radius-sm);padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-text);-webkit-user-select:none;user-select:none;display:flex}.cmdk-row[data-selected=true],.cmdk-row[aria-selected=true]{background:var(--gray-3)}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.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)}.top-0{top:calc(var(--spacing) * 0)}.top-1\/2{top:50%}.top-full{top:100%}.right-3{right:calc(var(--spacing) * 3)}.right-6{right:calc(var(--spacing) * 6)}.bottom-6{bottom:calc(var(--spacing) * 6)}.bottom-full{bottom:100%}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.z-\[var\(--z-modal\)\]{z-index:var(--z-modal)}.z-\[var\(--z-overlay\)\]{z-index:var(--z-overlay)}.z-\[var\(--z-sticky\)\]{z-index:var(--z-sticky)}.z-\[var\(--z-toast\)\]{z-index:var(--z-toast)}.z-\[var\(--z-tooltip\)\]{z-index:var(--z-tooltip)}.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}}.mx-auto{margin-inline:auto}.mt-0{margin-top:calc(var(--spacing) * 0)}.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-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.-mb-px{margin-bottom:-1px}.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-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-4{height:calc(var(--spacing) * 4)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-96{height:calc(var(--spacing) * 96)}.h-\[140px\]{height:140px}.h-fit{height:fit-content}.h-full{height:100%}.h-screen{height:100vh}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-\[60vh\]{max-height:60vh}.min-h-\[12rem\]{min-height:12rem}.min-h-\[320px\]{min-height:320px}.min-h-screen{min-height:100vh}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-1\/2{width:50%}.w-2{width:calc(var(--spacing) * 2)}.w-2\/3{width:66.6667%}.w-3\/4{width:75%}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-32{width:calc(var(--spacing) * 32)}.w-56{width:calc(var(--spacing) * 56)}.w-\[min\(calc\(100vw-3rem\)\,360px\)\]{width:min(100vw - 3rem,360px)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-\[200px\]{max-width:200px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-none{max-width:none}.max-w-screen-2xl{max-width:var(--breakpoint-2xl)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[140px\]{min-width:140px}.min-w-\[180px\]{min-width:180px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.basis-\[min\(100\%\,240px\)\]{flex-basis:min(100%,240px)}.-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)}.cursor-pointer{cursor:pointer}.resize-y{resize:vertical}.list-decimal{list-style-type:decimal}.appearance-none{appearance:none}.grid-cols-2{grid-template-columns:repeat(2,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\.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-6{gap:calc(var(--spacing) * 6)}.gap-\[var\(--space-section\)\]{gap:var(--space-section)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}: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-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * 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)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[var\(--radius-md\)\]{border-radius:var(--radius-md)}.rounded-\[var\(--radius-sm\)\]{border-radius:var(--radius-sm)}.rounded-\[var\(--radius-xl\)\]{border-radius:var(--radius-xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-\[var\(--color-border\)\]{border-color:var(--color-border)}.border-\[var\(--color-border\)\]\/50{border-color:#2b2b3080}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-border\)\]\/50{border-color:color-mix(in oklab,var(--color-border) 50%,transparent)}}.border-\[var\(--color-border-strong\)\]{border-color:var(--color-border-strong)}.border-\[var\(--color-text\)\]{border-color:var(--color-text)}.border-transparent{border-color:#0000}.bg-\[var\(--color-accent\)\]{background-color:var(--color-accent)}.bg-\[var\(--color-bg\)\]{background-color:var(--color-bg)}.bg-\[var\(--color-bg\)\]\/85{background-color:#0a0a0ad9}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-bg\)\]\/85{background-color:color-mix(in oklab,var(--color-bg) 85%,transparent)}}.bg-\[var\(--color-bg-elevated\)\]{background-color:var(--color-bg-elevated)}.bg-\[var\(--color-surface\)\]{background-color:var(--color-surface)}.bg-\[var\(--color-text\)\]{background-color:var(--color-text)}.bg-\[var\(--gray-2\)\]{background-color:var(--gray-2)}.bg-\[var\(--gray-3\)\]{background-color:var(--gray-3)}.bg-\[var\(--gray-4\)\]{background-color:var(--gray-4)}.bg-transparent{background-color:#0000}.p-0{padding:calc(var(--spacing) * 0)}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-\[var\(--space-card\)\]{padding:var(--space-card)}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.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-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-\[var\(--space-card\)\]{padding-inline:var(--space-card)}.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-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-\[var\(--space-row-y\)\]{padding-block:var(--space-row-y)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-\[12vh\]{padding-top:12vh}.pr-1{padding-right:calc(var(--spacing) * 1)}.pr-9{padding-right:calc(var(--spacing) * 9)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-1{padding-left:calc(var(--spacing) * 1)}.pl-4{padding-left:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[20px\]{font-size:20px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[var\(--color-accent\)\]{color:var(--color-accent)}.text-\[var\(--color-fail\)\]{color:var(--color-fail)}.text-\[var\(--color-info\)\]{color:var(--color-info)}.text-\[var\(--color-ok\)\]{color:var(--color-ok)}.text-\[var\(--color-text\)\]{color:var(--color-text)}.text-\[var\(--color-text-dim\)\]{color:var(--color-text-dim)}.text-\[var\(--color-text-muted\)\]{color:var(--color-text-muted)}.text-\[var\(--color-warn\)\]{color:var(--color-warn)}.text-\[var\(--font-size-h1\)\]{color:var(--font-size-h1)}.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,)}.underline{text-decoration-line:underline}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_10px_var\(--color-accent\)\]{--tw-shadow:0 0 10px var(--tw-shadow-color,var(--color-accent));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)}.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)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-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-\[width\]{transition-property:width;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))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.group-hover\:text-\[var\(--color-text\)\]:is(:where(.group):hover *){color:var(--color-text)}}.group-aria-\[current\=page\]\:text-\[var\(--color-text\)\]:is(:where(.group)[aria-current=page] *){color:var(--color-text)}.placeholder\:text-\[var\(--color-text-dim\)\]::placeholder{color:var(--color-text-dim)}.first\:border-t-0:first-child{border-top-style:var(--tw-border-style);border-top-width:0}.focus-within\:border-\[var\(--color-border-strong\)\]:focus-within{border-color:var(--color-border-strong)}@media (hover:hover){.hover\:border-\[var\(--color-border-strong\)\]:hover{border-color:var(--color-border-strong)}.hover\:bg-\[var\(--gray-3\)\]:hover{background-color:var(--gray-3)}.hover\:bg-\[var\(--gray-4\)\]:hover{background-color:var(--gray-4)}.hover\:text-\[var\(--color-text\)\]:hover{color:var(--color-text)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:border-\[var\(--color-border-strong\)\]:focus{border-color:var(--color-border-strong)}.data-\[interactive\]\:transition-colors[data-interactive]{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))}@media (hover:hover){.data-\[interactive\]\:hover\:border-\[var\(--color-border-strong\)\][data-interactive]:hover{border-color:var(--color-border-strong)}}.data-\[invalid\]\:border-\[var\(--color-fail\)\][data-invalid]{border-color:var(--color-fail)}@media (min-width:40rem){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:inline-flex{display:inline-flex}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-end{align-items:flex-end}}@media (min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:64rem){.lg\:col-span-3{grid-column:span 3/span 3}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-\[minmax\(0\,1fr\)_280px\]{grid-template-columns:minmax(0,1fr) 280px}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}}}html[data-density=compact]{--space-row-y:6px;--space-row-x:10px;--space-card:12px;--space-section:16px;--font-size-base:13px;--font-size-sm:12px;--font-size-xs:11px;font-size:var(--font-size-base)}@media (prefers-reduced-motion:reduce){:root{--duration-fast:0s;--duration-normal:0s;--duration-slow:0s}*,:before,:after{scroll-behavior:auto!important;transition-duration:.001ms!important;animation-duration:.001ms!important;animation-iteration-count:1!important}}@keyframes fade-up{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes blink{50%{opacity:0}}@keyframes pulse-glow{0%,to{opacity:.3}50%{opacity:.55}}@keyframes skeleton-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@keyframes spin{to{transform:rotate(360deg)}}@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-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-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}
|