viteboard 0.1.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/LICENSE +21 -0
- package/README.md +136 -0
- package/bin/viteboard.mjs +59 -0
- package/content/docs/assets/image-mqjpqlyw.png +0 -0
- package/content/docs/assets/image-mqjsmenr.png +0 -0
- package/content/docs/boards/product-roadmap.board.json +2130 -0
- package/content/docs/capabilities.md +89 -0
- package/content/docs/docs.md +84 -0
- package/content/docs/guide/boards-in-markdown.md +48 -0
- package/content/docs/guide/boards.md +92 -0
- package/content/docs/guide/getting-started.md +71 -0
- package/content/docs/guide/test.md +6 -0
- package/content/docs/index.md +47 -0
- package/content/docs/product-roadmap.board.json +2130 -0
- package/content/docs/test.md +219 -0
- package/content/docs/tetst-dir/test-board.board.json +15 -0
- package/content/docs/tetst-dir/test-test.md +1 -0
- package/content/docs/workspace.md +73 -0
- package/dist/assets/index-CEpxLM2o.css +1 -0
- package/dist/assets/index-D4xvJdEQ.js +60 -0
- package/dist/index.html +13 -0
- package/index.html +13 -0
- package/package.json +52 -0
- package/src/app/AppController.ts +955 -0
- package/src/app/BoardState.ts +130 -0
- package/src/app/ClipboardService.ts +159 -0
- package/src/app/CommandManager.ts +66 -0
- package/src/app/ElementActions.ts +152 -0
- package/src/app/EmbedRegionSelector.ts +103 -0
- package/src/app/ExportPng.ts +107 -0
- package/src/app/ImageInsertService.ts +141 -0
- package/src/app/KeyboardShortcuts.ts +124 -0
- package/src/app/main.ts +6 -0
- package/src/board/BoardPreview.ts +189 -0
- package/src/board/BoardService.ts +222 -0
- package/src/canvas/CanvasRenderer.ts +253 -0
- package/src/canvas/CanvasSurface.ts +70 -0
- package/src/canvas/HitTester.ts +110 -0
- package/src/canvas/ImageCache.ts +123 -0
- package/src/canvas/PerformanceMonitor.ts +31 -0
- package/src/canvas/RenderScheduler.ts +26 -0
- package/src/canvas/Viewport.ts +77 -0
- package/src/content/ContentApi.ts +258 -0
- package/src/content/Markdown.ts +431 -0
- package/src/content/MarkdownView.ts +70 -0
- package/src/editor/DocEditor.ts +799 -0
- package/src/editor/htmlToMarkdown.ts +333 -0
- package/src/elements/renderElement.ts +509 -0
- package/src/elements/types.ts +118 -0
- package/src/shell/Shell.ts +2950 -0
- package/src/shell/Sidebar.ts +1352 -0
- package/src/storage/AssetStore.ts +86 -0
- package/src/storage/BoardSerializer.ts +114 -0
- package/src/storage/ImportExportService.ts +153 -0
- package/src/storage/IndexedDbStore.ts +92 -0
- package/src/storage/LocalBoardStore.ts +104 -0
- package/src/styles.css +3257 -0
- package/src/templates/helpers.ts +124 -0
- package/src/templates/index.ts +65 -0
- package/src/templates/journeyMapTemplate.ts +52 -0
- package/src/templates/opportunityTreeTemplate.ts +45 -0
- package/src/templates/personaTemplate.ts +41 -0
- package/src/templates/prioritizationMatrixTemplate.ts +44 -0
- package/src/templates/requirementsFlowTemplate.ts +45 -0
- package/src/templates/screenshotReviewTemplate.ts +52 -0
- package/src/templates/systemDiagramTemplate.ts +41 -0
- package/src/testing/StressTestGenerator.ts +134 -0
- package/src/testing/StressTestPanel.ts +64 -0
- package/src/tools/ArrowTool.ts +87 -0
- package/src/tools/ImageTool.ts +39 -0
- package/src/tools/PanTool.ts +34 -0
- package/src/tools/SelectTool.ts +377 -0
- package/src/tools/ShapeTool.ts +106 -0
- package/src/tools/StickyTool.ts +69 -0
- package/src/tools/TaskTool.ts +52 -0
- package/src/tools/TextTool.ts +45 -0
- package/src/tools/ToolContext.ts +44 -0
- package/src/tools/ToolController.ts +178 -0
- package/src/ui/Modal.ts +58 -0
- package/src/ui/PerformanceOverlay.ts +75 -0
- package/src/ui/StorageManager.ts +94 -0
- package/src/ui/TemplatePicker.ts +67 -0
- package/src/ui/TextEditorOverlay.ts +137 -0
- package/src/ui/Toolbar.ts +151 -0
- package/src/ui/TopControls.ts +137 -0
- package/src/ui/icons.ts +50 -0
- package/tsconfig.json +19 -0
- package/vite.config.ts +694 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Markdown stress test
|
|
3
|
+
order: 99
|
|
4
|
+
summary: Exercises every feature of the Docs markdown renderer.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Markdown stress test
|
|
8
|
+
|
|
9
|
+
This document deliberately hits **every renderer code path** — headings, inline styles, lists, tables, code, blockquotes, board embeds, and a pile of nasty edge cases. If the renderer survives this page, it survives anything.
|
|
10
|
+
|
|
11
|
+
## 1. Headings
|
|
12
|
+
|
|
13
|
+
# H1 heading
|
|
14
|
+
|
|
15
|
+
## H2 heading
|
|
16
|
+
|
|
17
|
+
### H3 heading
|
|
18
|
+
|
|
19
|
+
#### H4 heading
|
|
20
|
+
|
|
21
|
+
##### H5 heading
|
|
22
|
+
|
|
23
|
+
###### H6 heading
|
|
24
|
+
|
|
25
|
+
####### Seven hashes is not a heading (renders as text)
|
|
26
|
+
|
|
27
|
+
## 2. Inline formatting
|
|
28
|
+
|
|
29
|
+
Normal text with **bold**, *italic with asterisks*, *italic with underscores*, **bold and *nested italic* together**, and `inline code`.
|
|
30
|
+
|
|
31
|
+
Inline code that contains markdown that must NOT be parsed: `**not bold** _not italic_ [not a link](nope) `.
|
|
32
|
+
|
|
33
|
+
Mixed: **bold `code` inside bold** and *italic `code` inside italic*.
|
|
34
|
+
|
|
35
|
+
Escaping check — these characters must render literally, not as HTML: `<script>alert("xss")</script>`, and outside code: a < b, c > d, x & y.
|
|
36
|
+
|
|
37
|
+
A standalone asterisk \* and underscore \_ in the middle should not start emphasis.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 3. Links and images
|
|
42
|
+
|
|
43
|
+
- Internal hash link: [Getting started](#/docs/guide/getting-started.md)
|
|
44
|
+
- Another internal link: [Boards](#/boards)
|
|
45
|
+
- External link (should open in new tab): [Supabase](https://supabase.com)
|
|
46
|
+
- A relative asset image (will show a broken/placeholder if missing): 
|
|
47
|
+
- An absolute URL image: 
|
|
48
|
+
|
|
49
|
+
## 4. Lists
|
|
50
|
+
|
|
51
|
+
### Unordered
|
|
52
|
+
|
|
53
|
+
- First item
|
|
54
|
+
- Second item with **bold**
|
|
55
|
+
- Third item with `code`
|
|
56
|
+
- Nested item A
|
|
57
|
+
- Nested item B
|
|
58
|
+
- Deeply nested item
|
|
59
|
+
- Back to top level
|
|
60
|
+
|
|
61
|
+
### Ordered
|
|
62
|
+
|
|
63
|
+
1. Step one
|
|
64
|
+
2. Step two
|
|
65
|
+
3. Step three
|
|
66
|
+
1. Sub-step 3a
|
|
67
|
+
2. Sub-step 3b
|
|
68
|
+
|
|
69
|
+
### Task list
|
|
70
|
+
|
|
71
|
+
- [x] Completed task
|
|
72
|
+
|
|
73
|
+
-
|
|
74
|
+
|
|
75
|
+
- [x] Another done one with a [link](#/docs/test.md)
|
|
76
|
+
- [ ] One with `inline code`
|
|
77
|
+
|
|
78
|
+
### Mixed / messy indentation
|
|
79
|
+
|
|
80
|
+
- Item with a continuation line that wraps onto the next line
|
|
81
|
+
- Item followed by nested ordered list
|
|
82
|
+
|
|
83
|
+
```board
|
|
84
|
+
src: product-roadmap
|
|
85
|
+
region: 378, -33, 620, 544
|
|
86
|
+
height: 360
|
|
87
|
+
title: Product Roadmap
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## 5. Tables
|
|
91
|
+
|
|
92
|
+
### Basic table
|
|
93
|
+
|
|
94
|
+
| Feature | Supported | Notes |
|
|
95
|
+
| --- | --- | --- |
|
|
96
|
+
| Headings | yes | H1–H6 |
|
|
97
|
+
| Tables | yes | with alignment |
|
|
98
|
+
| Board embeds | yes | the fun part |
|
|
99
|
+
|
|
100
|
+
### Aligned table
|
|
101
|
+
|
|
102
|
+
| Left | Center | Right |
|
|
103
|
+
| --- | --- | --- |
|
|
104
|
+
| a | b | c |
|
|
105
|
+
| longer cell | mid | 123 |
|
|
106
|
+
| `code` | **bold** | *em* |
|
|
107
|
+
|
|
108
|
+
## 6. Blockquotes
|
|
109
|
+
|
|
110
|
+
> A simple blockquote.
|
|
111
|
+
|
|
112
|
+
> A blockquote with **bold**, `code`, and a [link](#/).
|
|
113
|
+
>
|
|
114
|
+
> Second paragraph inside the same blockquote.
|
|
115
|
+
>
|
|
116
|
+
> > A nested blockquote inside the blockquote.
|
|
117
|
+
|
|
118
|
+
## 7. Code blocks
|
|
119
|
+
|
|
120
|
+
A plain (no language) fence:
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
plain text
|
|
124
|
+
preserves spacing
|
|
125
|
+
no *markdown* parsed here
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
A language fence:
|
|
129
|
+
|
|
130
|
+
```ts
|
|
131
|
+
function greet(name: string): string {
|
|
132
|
+
return `Hello, ${name}`; // <-- angle brackets & backticks
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
A bash fence:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
pnpm install && pnpm dev
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
A four-backtick fence that CONTAINS a triple-backtick block (must render literally, not execute the inner fence):
|
|
143
|
+
|
|
144
|
+
```md
|
|
145
|
+
```board
|
|
146
|
+
src: product-roadmap
|
|
147
|
+
region: 0, 0, 800, 600
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## 8. Board embeds (live)
|
|
153
|
+
|
|
154
|
+
Full board, fit to frame:
|
|
155
|
+
|
|
156
|
+
```board
|
|
157
|
+
src: product-roadmap
|
|
158
|
+
height: 280
|
|
159
|
+
title: Full roadmap (stress test)
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
A cropped region:
|
|
163
|
+
|
|
164
|
+
```board
|
|
165
|
+
src: product-roadmap
|
|
166
|
+
region: 20, 70, 420, 560
|
|
167
|
+
height: 280
|
|
168
|
+
title: Cropped to a region
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
A board that does NOT exist (should show a friendly error, not crash):
|
|
172
|
+
|
|
173
|
+
```board
|
|
174
|
+
src: this-board-does-not-exist
|
|
175
|
+
height: 160
|
|
176
|
+
title: Missing board
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
A board embed with a malformed region (should ignore region and fit whole board):
|
|
180
|
+
|
|
181
|
+
```board
|
|
182
|
+
src: product-roadmap
|
|
183
|
+
height: 200
|
|
184
|
+
title: Bad region falls back to full board
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## 9. Horizontal rules
|
|
188
|
+
|
|
189
|
+
Three dashes:
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
Three asterisks:
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
Three underscores:
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## 10. Edge cases
|
|
202
|
+
|
|
203
|
+
Empty fenced block:
|
|
204
|
+
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
A heading immediately followed by text with no blank line:
|
|
210
|
+
|
|
211
|
+
### Tight heading
|
|
212
|
+
|
|
213
|
+
This line comes right after the heading.
|
|
214
|
+
|
|
215
|
+
Lots of inline code in a row: `a` `b` `c` `d` `e`.
|
|
216
|
+
|
|
217
|
+
A line with only special characters: \*\*\* (handled as a rule above) and here: `***`.
|
|
218
|
+
|
|
219
|
+
Trailing text to confirm the parser reached the end of the document without hanging or throwing. If you can read this sentence, the stress test passed.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"id": "tetst-dir/test-board",
|
|
4
|
+
"title": "test-board",
|
|
5
|
+
"createdAt": 1784584724024,
|
|
6
|
+
"updatedAt": 1784592411574,
|
|
7
|
+
"viewport": {
|
|
8
|
+
"offsetX": -251.59375,
|
|
9
|
+
"offsetY": -11.28515625,
|
|
10
|
+
"scale": 1
|
|
11
|
+
},
|
|
12
|
+
"theme": "light",
|
|
13
|
+
"elements": [],
|
|
14
|
+
"assetIds": []
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Test test
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Workspace
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Workspace
|
|
6
|
+
|
|
7
|
+
The workspace is the set of projects registered with the tool. It's stored in `.workspace/workspace.json` relative to where you run `pnpm dev`.
|
|
8
|
+
|
|
9
|
+
## Adding a project
|
|
10
|
+
|
|
11
|
+
Click **+ Add Repo** on the home page or at the bottom of the sidebar. Choose a directory in the native folder picker.
|
|
12
|
+
|
|
13
|
+
The tool scans for `docs/` folders recursively and registers them as docs roots. The scan excludes `.git/`, `node_modules/`, `dist/`, and a few other common output directories.
|
|
14
|
+
|
|
15
|
+
One project can have many docs roots — for example, a large monorepo might have one per source area (`backend/api/docs`, `frontend/web-app/docs`, etc.).
|
|
16
|
+
|
|
17
|
+
## The sidebar structure
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
▸ my-project ← project header (click to expand)
|
|
21
|
+
▸ backend ← path segment (shared prefix, auto-grouped)
|
|
22
|
+
▸ api/docs ← individual docs root
|
|
23
|
+
Overview
|
|
24
|
+
...
|
|
25
|
+
All Boards ← one per project
|
|
26
|
+
All Capabilities ← one per project
|
|
27
|
+
▸ another-project
|
|
28
|
+
...
|
|
29
|
+
─────────────────
|
|
30
|
+
System
|
|
31
|
+
Tokens
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Everything starts collapsed. Click a project header to expand. Click any segment or docs root to expand further.
|
|
35
|
+
|
|
36
|
+
## Right-click actions
|
|
37
|
+
|
|
38
|
+
| Target | Actions available |
|
|
39
|
+
| --- | --- |
|
|
40
|
+
| Project header | Remove from workspace |
|
|
41
|
+
| Path segment (`frontend/src`) | New Doc · New Board · New Capability |
|
|
42
|
+
| Docs root label | New Doc · New Board · New Capability |
|
|
43
|
+
| Doc file | Open · Edit · Rename · Delete |
|
|
44
|
+
| Board file | Open · Rename · Delete |
|
|
45
|
+
|
|
46
|
+
## The project wiki
|
|
47
|
+
|
|
48
|
+
Each project has an auto-generated wiki page. Click the small page icon that appears when you hover over a project header, or click the project name in the home page workspace panel.
|
|
49
|
+
|
|
50
|
+
The wiki lists every docs root in the project with all its documents, boards, and capabilities as clickable links — useful for large projects with many roots.
|
|
51
|
+
|
|
52
|
+
## The home page
|
|
53
|
+
|
|
54
|
+
Navigate to `#/` (click the home button or navigate to root) to see:
|
|
55
|
+
|
|
56
|
+
- A feature guide explaining each part of the tool
|
|
57
|
+
- The workspace panel on the right showing all registered projects and their roots
|
|
58
|
+
- A quick-reference table of every keyboard shortcut and right-click action
|
|
59
|
+
|
|
60
|
+
## Keyboard shortcuts
|
|
61
|
+
|
|
62
|
+
| Shortcut | Action |
|
|
63
|
+
| --- | --- |
|
|
64
|
+
| **Cmd K** / **Ctrl K** | Open search |
|
|
65
|
+
| **Arrow Down / Up** | Move through search results |
|
|
66
|
+
| **Enter** | Open selected search result |
|
|
67
|
+
| **Escape** | Close search or close inline editor |
|
|
68
|
+
| **Cmd/Ctrl + scroll** | Zoom on board canvas |
|
|
69
|
+
| **Shift + scroll** | Pan horizontally on board canvas |
|
|
70
|
+
|
|
71
|
+
## The design token library
|
|
72
|
+
|
|
73
|
+
The **Tokens** link at the bottom of the sidebar opens a browser of the CSS design tokens built into the tool. Select any tokens and copy them as a `:root { }` block for use in another project.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--brand-100: #ffffff;--brand-200: #4dabf7;--brand-300: #0078d4;--brand-400: #495057;--brand-500: #0078d4;--brand-600: #005a9e;--neutral-100: #f3f2f1;--neutral-200: #eaeaea;--neutral-300: #d1d1d1;--neutral-400: #c8c8c8;--neutral-500: #6e6e6e;--neutral-600: #7a7a7a;--neutral-700: #495057;--neutral-800: #4a4a4a;--neutral-900: #0f0f0f;--neutral-000: #ffffff;--success-main: #28a745;--success-bg: #e6f4ea;--success-text: #1e7e34;--warning-main: #dc2626;--warning-bg: #fef2f2;--warning-text: #ffffff;--error-main: #cd0000;--error-bg: #ffe5e5;--error-text: #b91c1c;--info-main: #1080a6;--info-bg: #e0f7fa;--info-text: #0369a1;--bg-canvas: var(--neutral-100);--bg-toolbar: rgba(255, 255, 255, .92);--bg-panel: var(--brand-100);--bg-hover: rgba(0, 0, 0, .05);--bg-active: rgba(0, 120, 212, .12);--surface-raised: var(--brand-100);--accent: var(--neutral-500);--accent-quiet: rgba(110, 110, 110, .14);--accent-soft: rgba(110, 110, 110, .08);--accent-secondary: var(--brand-300);--accent-secondary-quiet: rgba(0, 120, 212, .13);--focus-glow: rgba(0, 120, 212, .26);--text-primary: var(--neutral-900);--text-secondary: #6e6e6e;--border-subtle: rgba(0, 0, 0, .08);--selection: var(--accent);--shadow-soft: 0 4px 24px rgba(0, 0, 0, .08), 0 1px 3px rgba(0, 0, 0, .06);--shadow-modal: 0 12px 48px rgba(0, 0, 0, .18);--grid-dot: rgba(110, 110, 110, .16);--danger: var(--error-main)}[data-theme=dark]{--bg-canvas: #0d0d0d;--bg-toolbar: rgba(20, 22, 23, .94);--bg-panel: #1a1a1a;--bg-hover: rgba(255, 255, 255, .055);--bg-active: rgba(97, 218, 251, .12);--surface-raised: #212121;--accent: #61dafb;--accent-quiet: rgba(97, 218, 251, .14);--accent-soft: rgba(97, 218, 251, .075);--accent-secondary: #73d0f4;--accent-secondary-quiet: rgba(97, 218, 251, .18);--focus-glow: rgba(97, 218, 251, .28);--text-primary: #f6f6f3;--text-secondary: #a7aaa8;--border-subtle: rgba(255, 255, 255, .09);--selection: var(--accent);--shadow-soft: 0 16px 46px rgba(0, 0, 0, .52), 0 1px 1px rgba(255, 255, 255, .03);--shadow-modal: 0 22px 70px rgba(0, 0, 0, .72);--grid-dot: rgba(97, 218, 251, .1)}*{margin:0;padding:0;box-sizing:border-box}html,body{width:100%;height:100%;overflow:hidden;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;background:var(--bg-canvas);color:var(--text-primary)}#app{position:fixed;top:0;right:0;bottom:0;left:0}.canvas-stack{position:absolute;top:0;right:0;bottom:0;left:0}.canvas-stack canvas{position:absolute;top:0;right:0;bottom:0;left:0;display:block}.bottom-tool-cluster{position:fixed;bottom:20px;left:50%;transform:translate(-50%);display:flex;align-items:center;justify-content:center;gap:10px;z-index:125}.toolbar{position:fixed;bottom:20px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:2px;padding:6px;background:var(--bg-toolbar);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border:1px solid var(--border-subtle);border-radius:14px;box-shadow:var(--shadow-soft);z-index:100}.bottom-tool-cluster .toolbar{position:relative;inset:auto;transform:none;z-index:1}.shape-tool-group{position:relative;display:flex}.shape-tool-popover{position:absolute;left:50%;bottom:calc(100% + 12px);transform:translate(-50%) translateY(8px) scale(.96);transform-origin:bottom center;display:grid;grid-template-columns:repeat(3,38px);gap:4px;padding:6px;background:var(--bg-toolbar);border:1px solid var(--border-subtle);border-radius:14px;box-shadow:var(--shadow-soft);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);opacity:0;pointer-events:none;transition:opacity .16s ease,transform .2s cubic-bezier(.2,.8,.2,1)}.shape-tool-group.open .shape-tool-popover{opacity:1;pointer-events:auto;transform:translate(-50%) translateY(0) scale(1)}.shape-option-btn{width:38px;height:38px}.shape-tool-popover:after{content:"";position:absolute;left:50%;bottom:-5px;width:10px;height:10px;transform:translate(-50%) rotate(45deg);background:var(--bg-toolbar);border-right:1px solid var(--border-subtle);border-bottom:1px solid var(--border-subtle)}.context-tool-popover{position:relative;width:0;height:52px;transform:translate(-14px) scale(.96);transform-origin:left center;display:flex;align-items:center;gap:8px;padding:6px 0;background:var(--bg-toolbar);border:1px solid transparent;border-radius:999px;box-shadow:var(--shadow-soft);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);opacity:0;overflow:hidden;pointer-events:none;z-index:0;transition:width .26s cubic-bezier(.2,.8,.2,1),padding .26s cubic-bezier(.2,.8,.2,1),opacity .18s ease,transform .24s cubic-bezier(.2,.8,.2,1),border-color .18s ease}.context-tool-popover.is-visible{padding:6px 10px;border-color:var(--border-subtle);opacity:1;pointer-events:auto;transform:translate(0) scale(1)}.sticky-color-popover.is-visible{width:286px}.text-size-popover.is-visible{width:300px}.shape-style-popover.is-visible{width:386px}.sticky-color-btn,.shape-fill-btn{width:24px;height:24px;border:1px solid rgba(0,0,0,.16);border-radius:999px;background:var(--swatch);box-shadow:inset 0 0 0 1px #ffffff6b;cursor:pointer;opacity:0;transform:translate(-6px) scale(.88);transition:opacity .16s ease,transform .2s cubic-bezier(.2,.8,.2,1),box-shadow .12s ease,border-color .12s ease}.shape-text-color-btn{flex:0 0 auto;width:32px;height:32px;border:1px solid var(--border-subtle);border-radius:999px;background:var(--surface-raised);color:var(--text-primary);font-size:12px;font-weight:800;cursor:pointer;opacity:0;transform:translate(-6px) scale(.88);transition:opacity .16s ease,transform .2s cubic-bezier(.2,.8,.2,1),box-shadow .12s ease,border-color .12s ease,background .12s ease}.shape-text-color-btn[aria-label="White text"]{background:#fff;color:#252829}.shape-text-color-btn[aria-label="Black text"]{background:#252829;color:#fff}.context-tool-divider{width:1px;height:28px;background:var(--border-subtle);opacity:0;transform:scaleY(.65);transition:opacity .16s ease,transform .2s cubic-bezier(.2,.8,.2,1)}.text-size-btn{flex:1 1 0;min-width:0;height:38px;padding:0 8px;border:1px solid transparent;border-radius:999px;background:transparent;color:var(--text-secondary);font-size:12px;font-weight:750;line-height:1;text-align:center;white-space:nowrap;cursor:pointer;opacity:0;transform:translate(-6px) scale(.88);transition:opacity .16s ease,transform .2s cubic-bezier(.2,.8,.2,1),background .12s ease,color .12s ease,border-color .12s ease}.context-tool-popover.is-visible .sticky-color-btn,.context-tool-popover.is-visible .shape-fill-btn,.context-tool-popover.is-visible .shape-text-color-btn,.context-tool-popover.is-visible .text-size-btn,.context-tool-popover.is-visible .context-tool-divider{opacity:1;transform:translate(0) scale(1)}.context-tool-popover.is-visible>:nth-child(2){transition-delay:15ms}.context-tool-popover.is-visible>:nth-child(3){transition-delay:.03s}.context-tool-popover.is-visible>:nth-child(4){transition-delay:45ms}.context-tool-popover.is-visible>:nth-child(5){transition-delay:.06s}.context-tool-popover.is-visible>:nth-child(6){transition-delay:75ms}.context-tool-popover.is-visible>:nth-child(7){transition-delay:.09s}.context-tool-popover.is-visible>:nth-child(8){transition-delay:.105s}.sticky-color-btn:hover,.shape-fill-btn:hover{transform:translateY(-1px) scale(1.04);box-shadow:inset 0 0 0 1px #ffffff85,0 4px 12px #00000029}.sticky-color-btn:focus-visible,.shape-fill-btn:focus-visible{outline:2px solid var(--selection);outline-offset:3px}.text-size-btn:hover,.text-size-btn:focus-visible{background:var(--bg-hover);color:var(--text-primary);outline:none}.shape-text-color-btn:hover,.shape-text-color-btn:focus-visible{border-color:color-mix(in srgb,var(--selection) 45%,var(--border-subtle));box-shadow:0 4px 12px #00000024;outline:none}.sticky-color-btn.active,.shape-fill-btn.active{border-color:var(--brand-500);box-shadow:inset 0 0 0 1px #ffffff8a,0 0 0 3px #428d3033}.shape-text-color-btn.active{border-color:var(--brand-500);box-shadow:0 0 0 3px #428d3033}.text-size-btn.active{border-color:color-mix(in srgb,var(--selection) 36%,var(--border-subtle));background:var(--bg-active);color:var(--text-primary)}[data-theme=dark] .sticky-color-btn,[data-theme=dark] .shape-fill-btn{border-color:#ffffff2e;box-shadow:inset 0 0 0 1px #00000029}.layer-menu{position:fixed;min-width:176px;padding:6px;background:var(--surface-raised);border:1px solid var(--border-subtle);border-radius:12px;box-shadow:var(--shadow-modal);z-index:150}.layer-menu-label{padding:8px 10px 5px;color:var(--text-secondary);font-size:11px;font-weight:750;letter-spacing:.08em;text-transform:uppercase}.layer-menu button{width:100%;height:34px;padding:0 10px;border:0;border-radius:8px;background:transparent;color:var(--text-primary);font:inherit;font-size:13px;font-weight:650;text-align:left;cursor:pointer}.layer-menu button:hover,.layer-menu button:focus-visible{background:var(--bg-hover);outline:none}.layer-menu-divider{height:1px;margin:5px 6px;background:var(--border-subtle)}.toolbar-divider{width:1px;height:24px;background:var(--border-subtle);margin:0 4px}.tool-btn{position:relative;display:flex;align-items:center;justify-content:center;width:38px;height:38px;border:none;border-radius:9px;background:transparent;color:var(--text-primary);cursor:pointer;transition:background .12s ease}.tool-btn:hover{background:var(--bg-hover)}.tool-btn:focus-visible{outline:2px solid var(--selection);outline-offset:1px}.tool-btn.active{background:var(--bg-active);color:var(--selection)}.tool-btn svg{width:19px;height:19px;stroke:currentColor;fill:none;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}.tool-btn .tooltip{position:absolute;bottom:calc(100% + 10px);left:50%;transform:translate(-50%);white-space:nowrap;padding:5px 9px;font-size:11.5px;font-weight:500;border-radius:7px;background:var(--text-primary);color:var(--bg-panel);pointer-events:none;opacity:0;transition:opacity .12s ease}.tool-btn:hover .tooltip{opacity:1}.tooltip kbd{font-family:inherit;opacity:.65;margin-left:5px}.top-left{position:fixed;top:14px;left:14px;z-index:100;display:flex;align-items:center;gap:8px}.board-title{height:40px;padding:0 11px;background:var(--bg-toolbar);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border-radius:10px;box-shadow:var(--shadow-soft);font-size:13px;font-weight:600;color:var(--text-primary);border:1px solid var(--border-subtle);outline:none;min-width:60px;max-width:calc(100vw - 460px)}.board-title:focus{border-color:var(--selection)}.board-title-measure{position:absolute;visibility:hidden;pointer-events:none;white-space:pre;font-size:13px;font-weight:600;font-family:inherit}.top-right{position:fixed;top:14px;right:14px;z-index:100;display:flex;align-items:center;gap:8px}.control-group{display:flex;align-items:center;gap:2px;padding:4px;background:var(--bg-toolbar);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border:1px solid var(--border-subtle);border-radius:10px;box-shadow:var(--shadow-soft)}.control-btn{display:flex;align-items:center;justify-content:center;height:30px;min-width:30px;padding:0 8px;border:none;border-radius:7px;background:transparent;color:var(--text-primary);font-size:12px;font-weight:500;cursor:pointer;transition:background .12s ease;position:relative}.control-btn:hover{background:var(--bg-hover)}.control-btn.danger-control:hover{color:var(--danger)}.control-btn:focus-visible{outline:2px solid var(--selection)}.control-btn svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}.zoom-label{font-variant-numeric:tabular-nums;min-width:48px;text-align:center}.perf-overlay{position:fixed;top:60px;right:14px;z-index:99;padding:12px 14px;background:var(--bg-toolbar);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border:1px solid var(--border-subtle);border-radius:10px;box-shadow:var(--shadow-soft);font-family:SF Mono,ui-monospace,Menlo,monospace;font-size:11px;line-height:1.7;color:var(--text-primary);white-space:pre;pointer-events:none;display:none}.perf-overlay.visible{display:block}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#0006;z-index:200;display:flex;align-items:center;justify-content:center}.modal{background:var(--surface-raised);border:1px solid var(--border-subtle);border-radius:16px;box-shadow:var(--shadow-modal);width:520px;max-width:calc(100vw - 40px);max-height:calc(100vh - 80px);overflow-y:auto;padding:24px}.modal h2{font-size:16px;font-weight:600;margin-bottom:16px}.modal-close{float:right;border:none;background:transparent;color:var(--text-secondary);font-size:18px;cursor:pointer;line-height:1;padding:2px 6px;border-radius:6px}.modal-close:hover{background:var(--bg-hover)}.modal .board-title{height:38px;max-width:none;padding:0 10px;background:var(--bg-panel);-webkit-backdrop-filter:none;backdrop-filter:none;border:1px solid var(--border-subtle);border-radius:8px;box-shadow:none;font-size:13px;font-weight:500}.modal .board-title:focus{border-color:color-mix(in srgb,var(--accent) 48%,var(--border-subtle));box-shadow:none}.command-palette{position:fixed;top:0;right:0;bottom:0;left:0;z-index:650;display:none;align-items:flex-start;justify-content:center;padding-top:min(120px,14vh);background:#0f172a47}.command-palette.visible{display:flex}.command-panel{width:min(640px,calc(100vw - 32px));max-height:min(620px,calc(100vh - 80px));overflow:hidden;border:1px solid var(--border-subtle);border-radius:12px;background:var(--surface-raised);box-shadow:var(--shadow-modal)}.command-search{display:flex;align-items:center;gap:10px;padding:13px 16px;border-bottom:1px solid var(--border-subtle);color:var(--text-secondary)}.command-search svg{width:18px;height:18px;stroke:currentColor;fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}.command-search input{flex:1 1 auto;min-width:0;border:none;outline:none;background:transparent;color:var(--text-primary);font:inherit;font-size:15px}.command-results{max-height:min(520px,calc(100vh - 160px));overflow-y:auto;padding:6px}.command-result{display:block;padding:10px 12px;border-radius:8px;color:var(--text-primary);text-decoration:none}.command-result:hover,.command-result.active{background:var(--bg-active)}.command-result-title{font-size:14px;font-weight:600;line-height:1.35}.command-result-meta,.command-result-summary{margin-top:3px;font-size:12px;line-height:1.45;color:var(--text-secondary)}.command-result-summary{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.command-result mark{border-radius:4px;padding:0 2px;background:var(--accent-quiet);color:inherit}.command-empty{padding:28px 16px;text-align:center;color:var(--text-secondary);font-size:13px}.template-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}.template-card{display:flex;flex-direction:column;gap:4px;padding:14px;border:1px solid var(--border-subtle);border-radius:10px;background:transparent;color:var(--text-primary);cursor:pointer;text-align:left;transition:border-color .12s ease,background .12s ease}.template-card:hover{border-color:var(--selection);background:var(--bg-hover)}.template-card .t-name{font-size:13px;font-weight:600}.template-card .t-desc{font-size:11.5px;color:var(--text-secondary);line-height:1.4}.storage-row{display:flex;justify-content:space-between;padding:8px 0;font-size:13px;border-bottom:1px solid var(--border-subtle)}.storage-row span:last-child{color:var(--text-secondary);font-variant-numeric:tabular-nums}.modal-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:16px}.modal-copy{color:var(--text-secondary);font-size:13.5px;line-height:1.6}.btn{padding:8px 14px;border:1px solid var(--border-subtle);border-radius:8px;background:transparent;color:var(--text-primary);font-size:12.5px;font-weight:500;cursor:pointer;transition:background .12s ease}.btn:hover{background:var(--bg-hover)}.btn.danger{color:var(--danger);border-color:var(--danger)}.btn.primary{background:var(--accent-secondary);border-color:var(--selection);color:#fff}.stress-panel{position:fixed;bottom:84px;left:50%;transform:translate(-50%);z-index:99;display:none;flex-wrap:wrap;gap:6px;max-width:640px;justify-content:center;padding:10px;background:var(--bg-toolbar);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border:1px solid var(--border-subtle);border-radius:12px;box-shadow:var(--shadow-soft)}.stress-panel.visible{display:flex}.stress-panel .btn{font-size:11.5px;padding:6px 10px}.text-editor{position:absolute;z-index:50;border:1.5px solid var(--selection);border-radius:4px;background:transparent;color:inherit;resize:none;overflow:hidden;outline:none;padding:0;line-height:1.35}.toast{position:fixed;bottom:84px;left:50%;transform:translate(-50%) translateY(8px);z-index:300;padding:10px 18px;background:var(--text-primary);color:var(--bg-panel);border-radius:10px;font-size:13px;font-weight:500;box-shadow:var(--shadow-soft);opacity:0;transition:opacity .2s ease,transform .2s ease;pointer-events:none}.toast.visible{opacity:1;transform:translate(-50%) translateY(0)}@media (prefers-reduced-motion: reduce){*{transition:none!important}}.shell{display:flex;width:100%;height:100%;overflow:hidden}.shell-main{flex:1 1 auto;min-width:0;height:100%;display:flex;flex-direction:column}.shell.sidebar-collapsed .sidebar{display:none}.shell-topbar{position:relative;flex:0 0 auto;height:58px;display:flex;align-items:center;gap:10px;padding:12px 18px;border-bottom:1px solid var(--border-subtle);background:color-mix(in srgb,var(--bg-panel) 94%,transparent);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px)}.topbar-icon-btn,.topbar-search,.topbar-cart,.topbar-edit,.topbar-theme{height:34px;border:1px solid var(--border-subtle);border-radius:8px;background:transparent;color:var(--text-secondary);cursor:pointer;transition:background .12s ease,color .12s ease,border-color .12s ease}.topbar-icon-btn{width:34px;display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto}.topbar-icon-btn:hover,.topbar-search:hover,.topbar-cart:hover,.topbar-edit:hover,.topbar-theme:hover{background:var(--bg-hover);color:var(--text-primary)}.topbar-icon-btn:focus-visible,.topbar-search:focus-visible,.topbar-cart:focus-visible,.topbar-edit:focus-visible,.topbar-theme:focus-visible{outline:2px solid var(--selection);outline-offset:1px}.topbar-icon-btn svg,.topbar-search svg,.topbar-edit svg,.topbar-theme svg{width:17px;height:17px;stroke:currentColor;fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}.topbar-search{width:min(360px,42vw);display:inline-flex;align-items:center;gap:9px;padding:0 8px 0 10px;text-align:left;font-size:13px}.topbar-search span{flex:1 1 auto;min-width:0}.topbar-search kbd{flex:0 0 auto;padding:2px 6px;border-radius:5px;background:var(--bg-hover);color:var(--text-secondary);font:11px/1.3 SF Mono,ui-monospace,Menlo,monospace}.topbar-cart{display:inline-flex;align-items:center;gap:8px;padding:0 10px 0 12px;font-size:13px;font-weight:500}.topbar-search+.topbar-cart{margin-left:auto}.topbar-cart[hidden]{display:none}.topbar-cart:disabled{opacity:.58;cursor:default}.topbar-cart strong{min-width:22px;height:22px;display:inline-flex;align-items:center;justify-content:center;border-radius:999px;background:var(--accent-quiet);color:var(--selection);font-size:12px}.topbar-edit{display:inline-flex;align-items:center;gap:7px;padding:0 12px;font-size:13px;font-weight:500}.topbar-edit[hidden]{display:none}.topbar-cart[hidden]+.topbar-edit{margin-left:auto}.shell-topbar.editing-doc .topbar-cart{display:none}.topbar-cart-popover{position:absolute;top:calc(100% + 8px);right:58px;z-index:800;display:none;width:330px;filter:drop-shadow(0 16px 36px rgba(0,0,0,.16))}.topbar-cart-popover.visible{display:block}.topbar-cart-popover .capability-cart{position:static}.content.cart-popover-open .capability-layout>.capability-cart{visibility:hidden}.sidebar{flex:0 0 270px;width:270px;height:100%;min-height:0;display:flex;flex-direction:column;border-right:1px solid var(--border-subtle);background:var(--surface-raised);padding:0 12px}.sidebar-header{display:flex;align-items:center;height:58px;padding:0 12px;border-bottom:1px solid transparent}.sidebar-brand{font-size:17px;font-weight:700;letter-spacing:-.01em;color:var(--text-primary);text-decoration:none;border:none;background:none;cursor:pointer;padding:0;font-family:inherit}.sidebar-nav{flex:1 1 auto;min-height:0;overflow-y:auto;padding-bottom:18px}.sidebar-footer{flex:0 0 auto;padding:10px 0 14px;border-top:1px solid var(--border-subtle);background:var(--surface-raised)}.sidebar-add-repo{width:100%;height:36px;border:1px dashed color-mix(in srgb,var(--selection) 38%,var(--border-subtle));border-radius:8px;background:transparent;color:var(--text-secondary);font-size:13px;font-weight:600;cursor:pointer;transition:background .12s ease,color .12s ease,border-color .12s ease}.sidebar-add-repo:hover{background:var(--accent-soft);border-color:color-mix(in srgb,var(--selection) 58%,var(--border-subtle));color:var(--text-primary)}.nav-group{margin-bottom:18px}.nav-section-head,.nav-root-head{display:flex;align-items:center;justify-content:space-between;gap:10px}.nav-repo-group{margin-bottom:10px}.nav-repo-header,.nav-dir-toggle{width:100%;display:flex;align-items:center;gap:6px;padding:6px 8px;border:0;border-radius:7px;background:transparent;color:var(--text-secondary);font-size:11px;font-weight:700;letter-spacing:.06em;text-align:left;text-transform:uppercase;cursor:pointer}.nav-count-pill{flex:0 0 auto;padding:3px 8px;border:1px solid var(--border-subtle);border-radius:999px;background:color-mix(in srgb,var(--surface-raised) 82%,var(--accent-soft));color:var(--text-secondary);font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.nav-dir-toggle{padding:4px 6px;font-size:11px;text-transform:none;letter-spacing:0;font-weight:650}.nav-dir-project{opacity:.85;color:var(--text-secondary)}.nav-dir-project:hover{opacity:1}.nav-dir-docs{opacity:1;color:var(--text-secondary);font-weight:600}.nav-repo-header,.nav-dir-toggle{transition:background .12s ease,color .12s ease,opacity .12s ease}.nav-repo-header:hover,.nav-dir-toggle:hover{background:var(--bg-hover);color:var(--text-primary)}.nav-repo-header:focus-visible,.nav-dir-toggle:focus-visible{outline:2px solid var(--selection);outline-offset:1px}.nav-repo-header>span:not(.nav-repo-chevron),.nav-dir-toggle>span:not(.nav-repo-chevron){flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nav-repo-chevron{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:12px;transform:rotate(90deg);transition:transform .12s ease}.nav-repo-group.collapsed .nav-repo-chevron{transform:rotate(0)}.nav-collapsible-dir.collapsed>.nav-dir-header-row .nav-dir-toggle .nav-repo-chevron{transform:rotate(0)}.nav-dir-header-row{display:flex;align-items:center;gap:4px;position:relative}.nav-dir-header-row .nav-dir-toggle{flex:1 1 auto;min-width:0}.nav-dir-header-row .nav-dir-wiki-link{flex:0 0 auto}.nav-repo-body[hidden],.nav-dir-body[hidden]{display:none}.nav-label{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--text-secondary);padding:6px 8px}.nav-empty-copy{font-size:12px;font-weight:500;text-transform:none;letter-spacing:.01em;line-height:1.45}.nav-subgroup{margin:2px 0 2px 8px}.nav-subgroup .nav-label{font-size:11px;text-transform:none;letter-spacing:0;font-weight:600;color:var(--text-secondary);opacity:.85}.nav-docs-root{margin:0 0 2px}.nav-root-path-label{padding:4px 8px 3px;font-size:10px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--text-secondary);opacity:.6;cursor:default;-webkit-user-select:none;user-select:none}.nav-root-path-label:hover{opacity:1;color:var(--text-secondary)}.nav-path-seg-toggle{font-size:12px;font-weight:600;text-transform:none;letter-spacing:0;color:var(--text-secondary);opacity:.9}.nav-link{display:flex;align-items:center;padding:6px 10px;margin:1px 0;border-radius:7px;font-size:13px;line-height:1.4;color:var(--text-secondary);text-decoration:none;border-left:2px solid transparent;transition:background .12s ease,color .12s ease}.nav-link:hover{background:var(--bg-hover);color:var(--text-primary)}.nav-link-muted{font-size:12px;opacity:.82}.nav-link.active{background:var(--bg-active);color:var(--selection);font-weight:600}[data-theme=dark] .nav-link.active{color:var(--neutral-100)}.nav-node-icon{flex:0 0 auto;width:13px;height:13px;margin-right:5px;vertical-align:middle;fill:currentColor;stroke:none;opacity:.85;position:relative;top:-1px}.nav-node-icon-doc{fill:#4285f4;opacity:1}.nav-node-icon-board{fill:#8b5cf6;opacity:1}[data-theme=dark] .nav-node-icon-board{fill:#a78bfa}.nav-node-icon-capability{fill:#f59e0b;opacity:1}[data-theme=dark] .nav-node-icon-capability{fill:#fbbf24}:root{--nav-board-color: #8b5cf6;--nav-board-bg: rgba(139, 92, 246, .08);--nav-board-bg-active: rgba(139, 92, 246, .15);--nav-cap-color: #8a6800;--nav-cap-bg: rgba(138, 104, 0, .08);--nav-cap-bg-active: rgba(138, 104, 0, .15)}[data-theme=dark]{--nav-board-color: #a78bfa;--nav-board-bg: rgba(167, 139, 250, .08);--nav-board-bg-active: rgba(167, 139, 250, .14);--nav-cap-color: #d4a800;--nav-cap-bg: rgba(212, 168, 0, .08);--nav-cap-bg-active: rgba(212, 168, 0, .14)}.nav-link-board{display:flex;align-items:center;color:var(--nav-board-color)}.nav-link-board:hover{background:var(--nav-board-bg);color:var(--nav-board-color)}.nav-link-board.active{background:var(--nav-board-bg-active);color:var(--nav-board-color);font-weight:600}.nav-link-capability{display:flex;align-items:center;color:var(--nav-cap-color)}.nav-link-capability:hover{background:var(--nav-cap-bg);color:var(--nav-cap-color)}.nav-link-capability.active{background:var(--nav-cap-bg-active);color:var(--nav-cap-color);font-weight:600}.nav-project-boards-row{margin-top:4px;padding-top:4px;border-top:1px solid var(--border-subtle)}.nav-context-menu{z-index:900;min-width:168px;padding:5px;background:var(--surface-raised);border:1px solid var(--border-subtle);border-radius:10px;box-shadow:var(--shadow-modal);-webkit-user-select:none;user-select:none}.nav-context-label{padding:5px 10px 4px;font-size:10.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:180px}.nav-context-divider{height:1px;margin:4px 5px;background:var(--border-subtle)}.nav-context-item{width:100%;display:flex;align-items:center;gap:8px;height:32px;padding:0 10px;border:0;border-radius:7px;background:transparent;color:var(--text-primary);font:inherit;font-size:13px;text-align:left;cursor:pointer;white-space:nowrap}.nav-context-item:hover,.nav-context-item:focus-visible{background:var(--bg-hover);outline:none}.nav-context-item-danger{color:var(--danger)}.nav-context-item-danger:hover,.nav-context-item-danger:focus-visible{background:color-mix(in srgb,var(--danger) 8%,transparent)}.nav-dragging{opacity:.48;cursor:grabbing!important}.nav-link[draggable=true],.nav-dir-toggle[draggable=true]{cursor:pointer}.nav-drop-target>.nav-dir-toggle,.nav-drop-target>.nav-dir-header-row,.nav-drop-target.nav-repo-header,.nav-drop-target.nav-docs-root{background:color-mix(in srgb,var(--accent) 20%,transparent)!important;outline:2px solid var(--accent)!important;outline-offset:-2px;box-shadow:inset 0 0 8px color-mix(in srgb,var(--accent) 30%,transparent);border-radius:6px;position:relative}@keyframes dropPulse{0%,to{outline-color:var(--accent)}50%{outline-color:color-mix(in srgb,var(--accent) 60%,transparent)}}.nav-drop-target>.nav-dir-toggle,.nav-drop-target>.nav-dir-header-row,.nav-drop-target.nav-repo-header,.nav-drop-target.nav-docs-root{animation:dropPulse 1s ease-in-out infinite}.nav-ctx-icon{flex:0 0 auto;width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center}.nav-ctx-icon svg.nav-node-icon{width:13px;height:13px;fill:currentColor;stroke:none}.nav-ctx-svg{width:14px;height:14px}.nav-ctx-doc,.nav-ctx-dir{color:var(--text-secondary)}.nav-ctx-board{color:var(--nav-board-color)}.nav-ctx-cap{color:var(--nav-cap-color)}.nav-ctx-edit,.nav-ctx-rename{color:var(--text-secondary)}.nav-ctx-delete{color:var(--danger)}.content-scroll{flex:1 1 auto;min-height:0;overflow-y:auto}.content{max-width:820px;margin:0 auto;padding:36px 40px 120px}.content.content-wide{max-width:1240px}.external-doc-eyebrow{margin:0 0 18px;color:var(--text-secondary);font-size:12px;font-weight:650;letter-spacing:.05em;text-transform:uppercase}.external-repo-overview .page-bar{align-items:flex-start}.repo-source-pill{flex:0 0 auto;padding:6px 10px;border:1px solid var(--border-subtle);border-radius:999px;color:var(--text-secondary);font-size:12px;font-weight:600}.external-doc-dir-list{display:grid;gap:22px}.external-doc-dir h2{margin:0 0 10px;color:var(--text-secondary);font-size:12px;font-weight:700;letter-spacing:.05em;text-transform:uppercase}.external-doc-file-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:10px}.external-doc-card{display:flex;flex-direction:column;gap:4px;min-height:82px;padding:14px;border:1px solid var(--border-subtle);border-radius:8px;background:var(--surface-raised);color:var(--text-primary);text-decoration:none;transition:border-color .12s ease,background .12s ease,transform .12s ease}.external-doc-card:hover{border-color:color-mix(in srgb,var(--selection) 42%,var(--border-subtle));background:color-mix(in srgb,var(--accent) 4%,var(--surface-raised));transform:translateY(-1px)}.external-doc-card strong{font-size:14px;line-height:1.3}.external-doc-card span{color:var(--text-secondary);font-size:12px;line-height:1.35;overflow-wrap:anywhere}.page-bar{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:8px}.page-bar h1{margin:0}.page-bar-label{font-size:12px;font-weight:600;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.05em}.page-lead{color:var(--text-secondary);font-size:14px;line-height:1.6;margin:4px 0 24px}.card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:14px}.card{position:relative;display:flex;flex-direction:column;gap:10px;min-height:190px;padding:18px;border:1px solid var(--border-subtle);border-radius:8px;text-decoration:none;color:var(--text-primary);background:var(--surface-raised);transition:border-color .12s ease,background .12s ease,transform .12s ease}.card:hover{border-color:color-mix(in srgb,var(--selection) 42%,var(--border-subtle));transform:translateY(-1px)}.card.selected{border-color:color-mix(in srgb,var(--selection) 72%,var(--border-subtle));background:color-mix(in srgb,var(--accent) 5%,var(--surface-raised))}.card.selected:before{content:"";position:absolute;inset:0 auto 0 0;width:3px;border-radius:8px 0 0 8px;background:var(--selection)}.card-title{max-width:92%;font-size:16px;font-weight:650;line-height:1.25;letter-spacing:0}.card-title a{color:inherit;text-decoration:none}.card-title a:hover{color:var(--selection)}.card-desc{font-size:13px;color:var(--text-secondary);line-height:1.55}.card-tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:auto}.card-actions{padding-top:4px}.card-actions .btn{height:30px;padding:0 11px;border-radius:999px;font-size:12px}.card-actions .capability-add-btn.primary{background:transparent;border-color:color-mix(in srgb,var(--selection) 42%,var(--border-subtle));color:var(--selection)}.card-actions .capability-add-btn.primary:hover{background:var(--accent-soft)}.card-actions .capability-add-btn:not(.primary){border-color:transparent;background:var(--bg-hover);color:var(--text-secondary)}.tag{font-size:11px;padding:3px 8px;border-radius:999px;background:var(--accent-secondary-quiet);color:color-mix(in srgb,var(--accent-secondary) 72%,var(--text-primary))}.empty-note{grid-column:1 / -1;padding:32px;text-align:center;color:var(--text-secondary);border:1px dashed var(--border-subtle);border-radius:12px}.capability-layout{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:28px;align-items:start}.capability-grid{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px}.capability-library h1{font-size:32px;letter-spacing:0;margin-bottom:6px}.capability-library .page-lead{max-width:680px;margin-bottom:28px}.board-library .page-lead{max-width:760px}.board-grid{grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:18px}.token-library .page-bar{margin-bottom:6px}.token-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px}.token-section{margin-top:30px}.token-section h2{margin:0 0 14px;font-size:17px;font-weight:700}.token-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:12px}.token-card{position:relative;display:grid;grid-template-columns:minmax(0,1fr) 44px;align-items:stretch;min-height:72px;border:1px solid var(--border-subtle);border-radius:8px;background:var(--surface-raised);overflow:hidden;transition:border-color .12s ease,background .12s ease}.token-card:hover{border-color:color-mix(in srgb,var(--selection) 36%,var(--border-subtle))}.token-card.selected{border-color:var(--brand-500);background:color-mix(in srgb,var(--accent) 4%,var(--surface-raised))}.token-card input{position:absolute;opacity:0;pointer-events:none}.token-select-zone{display:grid;grid-template-columns:42px minmax(0,1fr);gap:12px;align-items:center;padding:10px;cursor:pointer}.token-copy-btn{display:flex;align-items:center;justify-content:center;width:44px;border:none;border-left:1px solid var(--border-subtle);background:transparent;color:var(--text-secondary);cursor:pointer;transition:background .12s ease,color .12s ease}.token-copy-btn:hover{background:var(--accent-soft);color:var(--selection)}.token-copy-btn:focus-visible{outline:2px solid var(--selection);outline-offset:-2px}.token-copy-btn svg{width:17px;height:17px;stroke:currentColor;fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}.token-swatch{width:42px;height:42px;border:1px solid var(--border-subtle);border-radius:7px;box-shadow:inset 0 0 0 1px #00000005}[data-theme=dark] .card,[data-theme=dark] .token-card,[data-theme=dark] .capability-cart,[data-theme=dark] .command-panel,[data-theme=dark] .modal{border-color:#ffffff14;box-shadow:0 1px #ffffff06,0 18px 48px #0000005c}[data-theme=dark] .card:hover,[data-theme=dark] .token-card:hover{border-color:color-mix(in srgb,var(--accent) 38%,rgba(255,255,255,.12))}[data-theme=dark] .shell-topbar,[data-theme=dark] .sidebar{border-color:#ffffff13}[data-theme=dark] .nav-link.active{background:#a3a27e29;color:#fff}[data-theme=dark] .btn.primary{color:#111312}.token-copy{min-width:0;display:grid;gap:2px}.token-copy strong{font-size:13px;line-height:1.25}.token-copy code{color:var(--text-secondary);font:12px/1.25 SF Mono,ui-monospace,Menlo,monospace;background:transparent}.token-copy small{color:var(--text-secondary);font-size:11.5px;line-height:1.3}.capability-cart{position:sticky;top:18px;border:1px solid var(--border-subtle);border-radius:8px;background:color-mix(in srgb,var(--bg-panel) 96%,var(--bg-hover));overflow:hidden;box-shadow:0 1px #00000005}.capability-cart-head,.capability-cart-actions{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:14px;border-bottom:1px solid var(--border-subtle)}.capability-cart-actions{border-top:1px solid var(--border-subtle);border-bottom:none}.capability-cart-head h2{margin:0;font-size:13px;font-weight:650;text-transform:uppercase;letter-spacing:.04em;color:var(--text-secondary)}.capability-cart-count{min-width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;border-radius:999px;background:var(--accent-quiet);color:var(--selection);font-size:12px;font-weight:700}.capability-cart-body{display:flex;flex-direction:column;gap:4px;max-height:420px;overflow-y:auto;padding:8px}.capability-cart-empty{padding:22px 12px;color:var(--text-secondary);font-size:12.5px;line-height:1.5}.capability-cart-item{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;padding:10px;border-radius:8px;background:var(--surface-raised);border:1px solid transparent}.capability-cart-item:hover{border-color:var(--border-subtle)}.capability-cart-item-title{font-size:13px;font-weight:600;line-height:1.35}.capability-cart-item-meta{margin-top:2px;font-size:11px;color:var(--text-secondary);line-height:1.35}.capability-cart-remove{border:none;background:transparent;color:var(--text-secondary);font-size:11.5px;cursor:pointer;padding:1px 0}.capability-cart-remove:hover{color:var(--danger)}.markdown-body{font-size:15px;line-height:1.7;color:var(--text-primary)}.markdown-body h1{font-size:30px;font-weight:700;margin:8px 0 20px;letter-spacing:-.015em}.markdown-body h2{font-size:22px;font-weight:650;margin:36px 0 14px;padding-bottom:8px;border-bottom:1px solid var(--border-subtle)}.markdown-body h3{font-size:17px;font-weight:650;margin:26px 0 10px}.markdown-body h4{font-size:15px;font-weight:650;margin:20px 0 8px}.markdown-body p{margin:14px 0}.markdown-body a{color:var(--selection);text-decoration:none}.markdown-body a:hover{text-decoration:underline}.markdown-body ul,.markdown-body ol{margin:14px 0;padding-left:26px}.markdown-body li{margin:5px 0}.markdown-body li.task{list-style:none;margin-left:-22px}.markdown-body li.task input{margin-right:8px}.markdown-body blockquote{margin:16px 0;padding:4px 16px;border-left:3px solid var(--selection);background:var(--bg-hover);border-radius:0 8px 8px 0;color:var(--text-secondary)}.markdown-body code{font-family:SF Mono,ui-monospace,Menlo,monospace;font-size:.86em;background:var(--bg-hover);padding:2px 6px;border-radius:5px}.markdown-body pre.code-block{margin:16px 0;padding:16px;background:var(--bg-hover);border:1px solid var(--border-subtle);border-radius:10px;overflow-x:auto}.markdown-body pre.code-block code{background:none;padding:0;font-size:13px;line-height:1.6}.markdown-body img{max-width:100%;border-radius:8px}.markdown-body hr{border:none;border-top:1px solid var(--border-subtle);margin:32px 0}.markdown-body table{width:100%;border-collapse:collapse;margin:18px 0;font-size:13.5px}.markdown-body th,.markdown-body td{border:1px solid var(--border-subtle);padding:8px 12px;text-align:left}.markdown-body th{background:var(--bg-hover);font-weight:600}.markdown-body .md-error{margin:16px 0;padding:14px 16px;border:1px solid #ef4444;border-radius:10px;background:#ef444414;color:var(--text-primary)}.markdown-body .md-error pre{margin:8px 0 0;font-size:12px;white-space:pre-wrap;color:var(--text-secondary)}.board-embed{margin:24px 0}.board-embed-frame{position:relative;width:100%;border:1px solid var(--border-subtle);border-radius:12px;overflow:hidden;background:var(--bg-canvas);box-shadow:var(--shadow-soft);display:flex;align-items:center;justify-content:center}.board-embed-frame canvas{display:block}.board-embed-frame.error{color:var(--text-secondary);font-size:13px}.board-embed-msg{padding:24px}.board-embed-open{position:absolute;bottom:10px;right:10px;padding:5px 10px;font-size:12px;font-weight:500;border-radius:8px;background:var(--bg-toolbar);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid var(--border-subtle);color:var(--text-primary);text-decoration:none;opacity:0;transition:opacity .15s ease}.board-embed-frame:hover .board-embed-open{opacity:1}.board-embed figcaption{margin-top:8px;font-size:12.5px;color:var(--text-secondary);text-align:center}.board-editor-host{position:fixed;top:0;right:0;bottom:0;left:0;z-index:500}.top-left .back-btn{height:40px;width:auto;gap:6px;padding:0 12px;background:var(--bg-toolbar);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border:1px solid var(--border-subtle);box-shadow:var(--shadow-soft);font-size:13px;font-weight:500}.top-left .back-btn span{line-height:1}.embed-select-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;cursor:crosshair;background:#0f172a2e}.embed-select-rect{position:absolute;border:1.5px solid var(--selection);background:color-mix(in srgb,var(--selection) 16%,transparent);box-shadow:0 0 0 9999px #0f172a1f;pointer-events:none}.embed-select-hint{position:fixed;top:16px;left:50%;transform:translate(-50%);padding:8px 14px;border-radius:10px;font-size:13px;font-weight:500;color:#fff;background:#0f172ad1;pointer-events:none}.doc-page{position:relative}.doc-actions{display:flex;justify-content:flex-end;gap:8px;margin-bottom:8px}.btn.doc-edit{background:transparent;border-color:var(--border-subtle);color:var(--text-secondary);font-weight:500}.btn.doc-edit:hover{background:var(--bg-hover);color:var(--text-primary)}.capability-doc-actions{align-items:center}.capability-doc-actions .capability-detail-btn,.capability-doc-actions .capability-detail-btn.primary{height:34px;padding:0 13px;border-radius:999px;background:transparent;border-color:color-mix(in srgb,var(--selection) 34%,var(--border-subtle));color:var(--text-primary);font-size:12.5px;font-weight:500}.capability-doc-actions .capability-detail-btn:hover,.capability-doc-actions .capability-detail-btn.primary:hover{background:var(--accent-soft);color:var(--text-primary)}.capability-doc-actions .capability-detail-btn.is-selected{background:var(--accent-secondary);border-color:var(--accent-secondary);color:#fff}.capability-doc-actions .capability-detail-btn.is-selected:hover{background:color-mix(in srgb,var(--accent-secondary) 88%,#000);color:#fff}.markdown-body figure.board-embed.embed-chip{display:flex;align-items:center;gap:8px;padding:12px 16px;border:1px dashed var(--border-subtle);border-radius:10px;background:var(--bg-hover);color:var(--text-secondary);font-size:13px;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none}.markdown-body figure.board-embed.embed-chip:hover,.markdown-body figure.board-embed.embed-chip.selected,.markdown-body figure.board-embed.embed-chip:focus{border-color:color-mix(in srgb,var(--selection) 54%,var(--border-subtle));background:var(--accent-soft);color:var(--text-primary)}.embed-chip-icon{font-size:15px}.embed-chip-remove{margin-left:auto;color:var(--text-secondary);font-size:12px;font-weight:600;opacity:0;transition:opacity .12s ease}.embed-chip:hover .embed-chip-remove,.embed-chip.selected .embed-chip-remove,.embed-chip:focus .embed-chip-remove{opacity:.85}.doc-editor-surface .embed-caret-spacer{min-height:1.35em}.doc-editor{position:fixed;top:0;right:0;bottom:0;left:0;z-index:700;display:flex;flex-direction:column;background:var(--bg-canvas)}.doc-editor-bar{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:10px 16px;border-bottom:1px solid var(--border-subtle);background:var(--bg-canvas)}.doc-editor-bar-left{display:flex;align-items:center;gap:12px;min-width:0}.doc-editor-done{padding:7px 16px;border:1px solid var(--border-subtle);background:transparent;color:var(--text-secondary);border-radius:8px;font-size:13px;font-weight:500;cursor:pointer;transition:background .12s ease,color .12s ease}.doc-editor-done:hover{background:var(--bg-hover);color:var(--text-primary)}.doc-editor-path{font-size:12.5px;color:var(--text-secondary);font-family:SF Mono,ui-monospace,Menlo,monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.doc-editor-status{font-size:12px;color:var(--text-secondary);opacity:.6;white-space:nowrap}.doc-editor-status[data-state=error]{color:var(--danger);opacity:1;font-weight:600}.doc-editor-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:6px;padding:7px 16px;border-bottom:1px solid var(--border-subtle);background:var(--bg-canvas);position:sticky;top:0;z-index:1}.doc-editor-tb-group{display:flex;align-items:center;gap:3px;padding:3px;border:1px solid var(--border-subtle);border-radius:10px;background:color-mix(in srgb,var(--surface-raised) 72%,transparent)}.doc-editor-tb-btn{display:inline-flex;align-items:center;justify-content:center;min-width:32px;height:32px;padding:0 8px;border:none;border-radius:8px;background:transparent;color:var(--text-secondary);font-size:13px;font-weight:600;cursor:pointer;transition:background .12s ease,color .12s ease}.doc-editor-tb-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.doc-editor-tb-btn.active{background:var(--accent-secondary-quiet);color:var(--text-primary);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--accent-secondary) 28%,transparent)}.doc-editor-tb-btn:focus-visible{outline:2px solid var(--selection);outline-offset:2px}.doc-editor-tb-btn.icon svg{width:17px;height:17px;stroke:currentColor;fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}.doc-editor-scroll{flex:1 1 auto;overflow-y:auto}.doc-editor-surface{max-width:820px;margin:0 auto;padding:36px 40px 160px;min-height:100%;outline:none;background:transparent}.doc-editor-surface:focus{outline:none}.doc-editor-surface img{cursor:default}.doc-editor-surface:empty:before{content:"Start writing...";color:var(--text-secondary);opacity:.55}.doc-editor-surface a{cursor:text}.doc-editor-surface pre.code-block{position:relative}.doc-editor-surface pre.code-block:focus-within{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--selection) 34%,transparent)}.breadcrumb{display:flex;align-items:center;flex-wrap:wrap;gap:4px;margin-bottom:20px;font-size:12px;font-weight:500;color:var(--text-secondary)}.breadcrumb-link{color:var(--text-secondary);text-decoration:none;padding:2px 4px;border-radius:4px;transition:color .1s ease,background .1s ease}.breadcrumb-link:hover{color:var(--text-primary);background:var(--bg-hover)}.breadcrumb-sep{color:var(--text-secondary);opacity:.4;-webkit-user-select:none;user-select:none;padding:0 2px}.breadcrumb-current{color:var(--text-primary);font-weight:600}.page-nav{display:flex;align-items:stretch;justify-content:space-between;gap:12px;margin-top:56px;padding-top:20px;border-top:1px solid var(--border-subtle)}.page-nav-prev,.page-nav-next{display:flex;align-items:center;gap:10px;padding:12px 16px;border:1px solid var(--border-subtle);border-radius:10px;text-decoration:none;color:var(--text-secondary);background:var(--surface-raised);font-size:13px;font-weight:500;min-width:0;max-width:48%;transition:border-color .12s ease,background .12s ease,color .12s ease}.page-nav-prev:hover,.page-nav-next:hover{border-color:color-mix(in srgb,var(--selection) 45%,var(--border-subtle));background:var(--bg-hover);color:var(--text-primary)}.page-nav-prev{margin-right:auto}.page-nav-next{margin-left:auto;flex-direction:row-reverse}.page-nav-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.page-nav-arrow{flex:0 0 auto;font-size:15px;line-height:1;color:var(--text-secondary);transition:color .12s ease}.page-nav-prev:hover .page-nav-arrow,.page-nav-next:hover .page-nav-arrow{color:var(--text-primary)}.page-nav-spacer{flex:1}.sidebar-brand{border:none;background:none;cursor:pointer;font-size:17px;font-weight:700;letter-spacing:-.01em;color:var(--text-primary);text-decoration:none;padding:0;transition:color .12s ease}.sidebar-brand:hover{color:var(--selection)}.sidebar-brand:focus-visible{outline:2px solid var(--selection);outline-offset:3px;border-radius:4px}.sidebar-docs-mode .sidebar-brand{color:var(--selection)}.sidebar-docs-mode .sidebar-brand:after{content:" ·";opacity:.4}.docs-mode-back-row{padding:8px 0 4px}.docs-mode-back{display:flex;align-items:center;gap:6px;border:none;background:none;cursor:pointer;font-size:12px;font-weight:600;color:var(--text-secondary);padding:5px 8px;border-radius:7px;width:100%;text-align:left;transition:background .1s ease,color .1s ease}.docs-mode-back:hover{background:var(--bg-hover);color:var(--text-primary)}.docs-mode-back svg{width:12px;height:12px;flex:0 0 auto}.docs-mode-tree{padding-left:0}.home-page{padding-top:8px}.home-layout{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:36px;align-items:start}.home-guide{min-width:0}.home-hero-title{font-size:30px;font-weight:750;letter-spacing:-.02em;line-height:1.1;margin:0 0 8px;color:var(--text-primary)}.home-hero-sub{font-size:14px;line-height:1.65;color:var(--text-secondary);margin:0 0 32px}.home-feature{margin-bottom:28px;padding-bottom:28px;border-bottom:1px solid var(--border-subtle)}.home-feature:last-of-type{border-bottom:none}.home-feature-header{margin-bottom:8px}.home-feature-badge{display:inline-block;padding:2px 10px;border-radius:999px;font-size:11px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;border:1px solid var(--border-subtle);background:var(--accent-soft);color:var(--text-secondary)}.home-feature-badge-board{background:var(--nav-board-bg);color:var(--nav-board-color);border-color:color-mix(in srgb,var(--nav-board-color) 25%,var(--border-subtle))}.home-feature-badge-capability{background:var(--nav-cap-bg);color:var(--nav-cap-color);border-color:color-mix(in srgb,var(--nav-cap-color) 25%,var(--border-subtle))}.home-feature-badge-doc{background:var(--accent-soft);color:var(--text-secondary)}.home-feature-body{font-size:13.5px;line-height:1.65;color:var(--text-secondary);margin:0 0 10px}.home-feature-list{margin:0;padding-left:18px;display:flex;flex-direction:column;gap:4px}.home-feature-list li{font-size:13px;line-height:1.55;color:var(--text-secondary)}.home-shortcut-title{font-size:11px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--text-secondary);margin:32px 0 10px}.home-shortcut-table{display:grid;gap:1px;background:var(--border-subtle);border:1px solid var(--border-subtle);border-radius:10px;overflow:hidden}.home-shortcut-row{display:flex;align-items:center;gap:16px;padding:7px 12px;background:var(--surface-raised)}.home-shortcut-row:hover{background:var(--bg-hover)}.home-shortcut-key{flex:0 0 auto;min-width:200px;font:11.5px/1.4 SF Mono,ui-monospace,Menlo,monospace;color:var(--text-primary);background:transparent;border:none;padding:0}.home-shortcut-desc{font-size:12.5px;color:var(--text-secondary)}.home-panel{position:sticky;top:24px;border:1px solid var(--border-subtle);border-radius:12px;background:var(--surface-raised);overflow:hidden}.home-panel-head{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;border-bottom:1px solid var(--border-subtle)}.home-panel-title{font-size:11px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--text-secondary)}.home-panel-add{padding:4px 10px;font-size:12px;height:auto}.home-panel-empty{padding:20px 14px;font-size:13px;color:var(--text-secondary);line-height:1.5}.home-panel-project{border-bottom:1px solid var(--border-subtle)}.home-panel-project:last-child{border-bottom:none}.home-panel-project-head{display:flex;align-items:baseline;justify-content:space-between;gap:10px;padding:10px 14px 6px;text-decoration:none;border-bottom:1px solid var(--border-subtle);transition:background .1s ease}.home-panel-project-head:hover{background:var(--bg-hover)}.home-panel-project-name{font-size:13px;font-weight:650;color:var(--text-primary);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.home-panel-project-meta{flex:0 0 auto;font-size:11px;color:var(--text-secondary);white-space:nowrap}.home-panel-roots{display:flex;flex-direction:column}.home-panel-root{display:flex;align-items:baseline;justify-content:space-between;gap:8px;padding:5px 14px;text-decoration:none;transition:background .1s ease;border-bottom:1px solid color-mix(in srgb,var(--border-subtle) 50%,transparent)}.home-panel-root:last-of-type{border-bottom:none}.home-panel-root:hover{background:var(--bg-hover)}.home-panel-root-path{font-size:11.5px;font-family:SF Mono,ui-monospace,Menlo,monospace;color:var(--text-secondary);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.home-panel-root:hover .home-panel-root-path{color:var(--text-primary)}.home-panel-root-meta{flex:0 0 auto;font-size:10.5px;color:var(--text-secondary);opacity:.7;white-space:nowrap}.home-panel-more{display:block;padding:6px 14px 8px;font-size:11.5px;color:var(--text-secondary);text-decoration:none}.home-panel-more:hover{color:var(--text-primary)}.nav-repo-label-text{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nav-repo-wiki-link{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:5px;color:var(--text-secondary);opacity:0;transition:opacity .12s ease,background .12s ease;text-decoration:none}.nav-repo-header:hover .nav-repo-wiki-link,.nav-dir-toggle:hover .nav-repo-wiki-link,.nav-dir-header-row:hover .nav-dir-wiki-link,.nav-repo-wiki-link:focus-visible{opacity:1}.nav-dir-project~.nav-dir-wiki-link{opacity:0}.nav-dir-header-row:hover .nav-dir-project~.nav-dir-wiki-link{opacity:.7}.nav-repo-wiki-link:hover{background:var(--bg-active);color:var(--text-primary)}.nav-repo-wiki-link svg{width:12px;height:12px}.wiki-page{padding-top:4px}.wiki-head{margin-bottom:28px;padding-bottom:20px;border-bottom:1px solid var(--border-subtle)}.wiki-back{display:inline-block;font-size:12px;color:var(--text-secondary);text-decoration:none;margin-bottom:10px}.wiki-back:hover{color:var(--text-primary)}.wiki-title{font-size:26px;font-weight:750;letter-spacing:-.01em;margin:0 0 16px}.wiki-stats{display:flex;gap:24px;flex-wrap:wrap}.wiki-stat{text-align:left}.wiki-stat-val{font-size:22px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--text-primary);line-height:1}.wiki-stat-label{font-size:11px;color:var(--text-secondary);margin-top:2px;text-transform:uppercase;letter-spacing:.05em;font-weight:600}.wiki-root-section{margin-bottom:24px;padding-bottom:24px;border-bottom:1px solid var(--border-subtle)}.wiki-root-section:last-child{border-bottom:none}.wiki-root-head{margin-bottom:12px}.wiki-root-path{font-size:12px;font-weight:700;font-family:SF Mono,ui-monospace,Menlo,monospace;color:var(--text-secondary);letter-spacing:.01em}.wiki-root-empty{font-size:12px;color:var(--text-secondary);font-style:italic}.wiki-root-cols{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:16px}.wiki-col-head{font-size:10.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-secondary);margin-bottom:6px;padding-bottom:5px;border-bottom:1px solid var(--border-subtle)}.wiki-col-list{display:flex;flex-direction:column;gap:1px}.wiki-col-item{display:block;padding:4px 6px;border-radius:5px;font-size:12.5px;text-decoration:none;color:var(--text-secondary);transition:background .1s ease,color .1s ease;text-transform:capitalize}.wiki-col-item:hover{background:var(--bg-hover);color:var(--text-primary)}.wiki-col-item-board{color:var(--nav-board-color)}.wiki-col-item-board:hover{background:var(--nav-board-bg);color:var(--nav-board-color)}.wiki-col-item-cap{color:var(--nav-cap-color)}.wiki-col-item-cap:hover{background:var(--nav-cap-bg);color:var(--nav-cap-color)}.wiki-col-item-path{display:block;font-size:10.5px;font-family:SF Mono,ui-monospace,Menlo,monospace;color:var(--text-secondary);opacity:.6;margin-top:1px}@media (max-width: 720px){.sidebar{flex-basis:220px;width:220px}.shell-topbar{padding:10px 12px}.topbar-search{width:auto;flex:1 1 auto}.topbar-search kbd,.topbar-edit span{display:none}.topbar-edit{width:34px;padding:0;justify-content:center}.capability-layout{grid-template-columns:1fr}.capability-cart{position:static}.content{padding:32px 20px 100px}.doc-editor-surface{padding:24px 18px 140px}}.nav-repo-more{display:flex;align-items:center;justify-content:center;flex:0 0 auto;width:22px;height:22px;padding:0;margin-left:auto;margin-right:2px;background:transparent;border:none;border-radius:4px;color:var(--text-secondary);cursor:pointer;opacity:0;transition:opacity .12s ease,background .12s ease}.nav-repo-header:hover .nav-repo-more{opacity:.5}.nav-repo-more:hover{background:var(--bg-hover);opacity:1!important}.nav-browse-dir-toggle{display:flex;align-items:center;gap:4px;width:100%;padding:4px 8px;background:transparent;border:none;border-radius:6px;color:var(--text-secondary);font-size:13px;cursor:pointer;text-align:left;opacity:.45;transition:opacity .12s ease,background .12s ease}.nav-browse-dir-toggle:hover{background:var(--bg-hover);opacity:.75}.nav-inline-input{display:block;width:100%;padding:4px 8px;margin:1px 0;font:inherit;font-size:13px;color:var(--text-primary);background:var(--bg-canvas);border:1px solid var(--brand-300);border-radius:4px;outline:none;box-shadow:0 0 0 2px #0078d426}.nav-inline-input::placeholder{color:var(--text-secondary);opacity:.6}
|