@forsion/clip 0.0.0-stage → 2.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/README.md +138 -2
- package/chrome-mv3/_locales/en/messages.json +17 -0
- package/chrome-mv3/_locales/zh_CN/messages.json +17 -0
- package/chrome-mv3/assets/App-CTFaMeAz.css +1 -0
- package/chrome-mv3/assets/document-export-Dk8vjRKk.css +1 -0
- package/chrome-mv3/assets/imageHosts-4UXWVpSw.css +1 -0
- package/chrome-mv3/background.js +162 -0
- package/chrome-mv3/chunks/App-CjD26llS.js +408 -0
- package/chrome-mv3/chunks/_virtual_wxt-html-plugins-DPbbfBKe.js +1 -0
- package/chrome-mv3/chunks/document-export-DNFinZCF.js +22 -0
- package/chrome-mv3/chunks/imageHosts-Cmp3E2vS.js +58 -0
- package/chrome-mv3/chunks/offscreen-CogL61qx.js +1 -0
- package/chrome-mv3/content-scripts/content.js +668 -0
- package/chrome-mv3/document-export.html +27 -0
- package/chrome-mv3/icon/128.png +0 -0
- package/chrome-mv3/icon/16.png +0 -0
- package/chrome-mv3/icon/32.png +0 -0
- package/chrome-mv3/icon/48.png +0 -0
- package/chrome-mv3/icon/logo.png +0 -0
- package/chrome-mv3/manifest.json +1 -0
- package/chrome-mv3/offscreen.html +3 -0
- package/chrome-mv3/options.html +16 -0
- package/chrome-mv3/sidepanel.html +16 -0
- package/package.json +54 -4
package/README.md
CHANGED
|
@@ -1,3 +1,139 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Forsion Clip 2.1.0 / 浏览器剪藏
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A Chrome Manifest V3 extension connected to Forsion accounts, cloud vaults and Forsion Desktop. This independent repository lives at `Forsion/Forsion-Clip`, alongside `Forsion-Genesis`. The older reverse-engineering reference is archived locally under `apps/Archived/Forsion-Clip-reference` and is not part of this repository.
|
|
4
|
+
|
|
5
|
+
基于已确认的 Genesis 风格 Demo 实现。真正的 Chrome sidePanel、service worker、页面脚本、官方设备登录、云笔记接口和桌面 Unit 配对;没有把 Demo 的模拟状态带入安装包。
|
|
6
|
+
|
|
7
|
+
## Load in Chrome / 加载
|
|
8
|
+
|
|
9
|
+
1. Build with `npm ci && npm run build`, or unpack the supplied Chrome ZIP.
|
|
10
|
+
2. Open `chrome://extensions`, enable Developer mode, choose **Load unpacked**, and select `.output/chrome-mv3` (the directory containing `manifest.json`).
|
|
11
|
+
3. Open a normal HTTP(S) page and click **Forsion Clip**. Chrome's protected pages and the extension store cannot be clipped.
|
|
12
|
+
4. The arrow in the side panel opens the collection/settings workbench. Language and appearance follow the system initially and are configurable.
|
|
13
|
+
|
|
14
|
+
构建命令会从相邻的 Forsion-Genesis 仓库复用 `@lcl/components` ChatBox、SettingsRow/SettingsSwitch 以及真实主题 token。可用 `FORSION_GENESIS_ROOT` 指定源码根目录。安装后的扩展不依赖源码仓、开发服务器或 CDN。
|
|
15
|
+
|
|
16
|
+
## Forsion account / 账号
|
|
17
|
+
|
|
18
|
+
Settings → Forsion account → Sign in opens Forsion's official device authorization page. Complete sign-in there, approve the shown code, then the extension checks identity and stores its own session locally. The extension never asks for an account password.
|
|
19
|
+
|
|
20
|
+
登录后在剪藏底部选择 **Forsion cloud vault**,刷新并选择有写权限的智库及文件夹。默认仅新建笔记,不覆盖已有内容;云端成功回执和桌面本地保存是两个独立结果。登出会请求撤销当前会话并清除本地凭据。更换服务地址会清除旧会话,旧令牌不会带到新域名。
|
|
21
|
+
|
|
22
|
+
## Desktop / 桌面联动
|
|
23
|
+
|
|
24
|
+
1. In Forsion Desktop's device switcher, enable **Allow other devices to connect** and note its direct address. Existing paired devices/account devices may then access the host according to Desktop's policy.
|
|
25
|
+
2. In extension Settings → Desktop & MCP, enter the loopback address. Default: `http://127.0.0.1:8791`. Port collisions can change it; copy the actual address rather than scanning ports.
|
|
26
|
+
3. Request pairing, compare the code, and approve **Forsion Clip** in Desktop. Pairing grants the existing Unit vault capability; it is not a folder-only token. Revoke it in Desktop to remove access.
|
|
27
|
+
4. Refresh Desktop vault, then choose **Forsion Desktop vault** as a save destination. Changing vaults requires an explicit refresh; a save detects a changed binding and fails instead of writing to the wrong vault.
|
|
28
|
+
5. After a confirmed Desktop save, **Add reading task** creates a separate dated Markdown task linked to the note. **Continue in Chat** starts a real Chat session/run using a Desktop model; enable Desktop remote sessions and approve this device if requested. A started run is not a completed model answer.
|
|
29
|
+
|
|
30
|
+
桌面保存走现有 Unit RPC,并对同一客户端的库操作串行化。原协议不支持原子的 `expectedRoot` 写入参数;桌面进程在“校验库 → 写文件”的极小间隔内重启并换库仍是现有协议边界。不会修改 Calendar.db,不会用只负责导航的 `forsion://` 链接假装上传。
|
|
31
|
+
|
|
32
|
+
## Tangu browser control / Tangu 浏览器控制
|
|
33
|
+
|
|
34
|
+
Since 2.1.0 this extension also carries Tangu browser control (formerly the separate *Tangu for Chrome* extension). Copy the connect code from Forsion Desktop → Settings → Browser and paste it into Settings → Desktop & MCP → Tangu browser control. Tangu can then list your tabs, read and act in background tabs, and open its own pages in an orange "Tangu" tab group. The bridge is `src/lib/tanguBridge.ts`; the protocol (loopback WebSocket, two-way HMAC handshake, the token never goes over the wire) is unchanged.
|
|
35
|
+
|
|
36
|
+
2.1.0 起本扩展并入了原 Tangu for Chrome。扩展 ID 固定为 `gpajikakdmhjebadgcbmhidkkajclfoi`(`manifest.key`),Tangu 引擎只认这个来源;上架商店时把对应私钥作为 `key.pem` 放进 zip 根目录才能保住同一 ID。
|
|
37
|
+
|
|
38
|
+
Forsion Desktop bundles the build from the npm package `@forsion/clip` (built extension only, source stays private); `npm publish` runs `prepack`, which builds and copies `.output/chrome-mv3` to `chrome-mv3/`.
|
|
39
|
+
|
|
40
|
+
## Capture and reading / 剪藏与阅读
|
|
41
|
+
|
|
42
|
+
- Article, selection, multiple regions and link-only capture; full Markdown editing, source properties, tags and per-page drafts.
|
|
43
|
+
- Defuddle 0.19.5 site adapters, Bilibili part/CID/subtitles, WeChat image fallback, tables, formulas, code, footnotes and sub/sup preservation. Only content accessible to the page is captured; missing subtitles are disclosed.
|
|
44
|
+
- Five-color text and image highlights, notes, context-based restoration, global search/management and JSON/Markdown backup.
|
|
45
|
+
- In 2.0.1, selecting text or clicking a saved highlight opens the page toolbar: copy, highlight, save, translate, explain, grammar, mnemonic and vocabulary. Google/Bing/current AI translation supports 12 target languages, a separate result window, retry/stop, copying and saving. Settings → Selection toolbar controls order, visibility, colors, site exclusions and prompts. Automatic vocabulary is limited to words/phrases of 200 characters. / 2.0.1 补齐划词与已有划线菜单、独立翻译结果窗和选区设置;200 字符以上段落仍可翻译与保存,但不会自动加入生词本。
|
|
46
|
+
- Forsion AI and configured OpenAI-compatible, Anthropic, Gemini or Ollama providers. Summaries, full translation, explanations, grammar, questions and reading cards stream into the shared Genesis ChatBox. Source and question are sent only when you press send. Full translations are segmented; incomplete streams/output limits are reported and partial text is preserved. Sources over 350,000 characters require selecting a smaller region.
|
|
47
|
+
- Vocabulary meanings, context, search, review cards, speech and Markdown export.
|
|
48
|
+
- Persistent batches from URLs, selected tabs and selected bookmarks; daily and explicit auto-clip domains. Page concurrency (1–5) and destination concurrency (1–6) are configurable. Safe transient failures retry with persisted exponential deadlines (default 1/2/4 seconds); cancellation wins over pending retries. Requests with uncertain delivery or an already-created partial object require explicit retry. A request already sent may complete and its acknowledgement is retained. Interrupted jobs require explicit retry. Confirmed targets are skipped, and retries reuse the captured document.
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
### 2.0.2 parity additions / 本轮补齐
|
|
52
|
+
|
|
53
|
+
- A draggable page-edge launcher: quick capture, preview, AI reading, vocabulary cards, selection-menu toggle, region capture and highlight export. Actions can be reordered/hidden; position and site exclusions persist. Opening AI reading does not send a model request.
|
|
54
|
+
- Preview typography (Latin/Chinese font family, size, width and spacing) and a clickable outline derived from the actual rendered headings. / 预览支持字体、字号、宽度、行距和正文标题提纲。
|
|
55
|
+
- Standalone long PNG and Print / Save PDF from the current edited document, including selected front matter/highlights. Session-only one-time snapshot; image-load failures are visible. PNG over 32,760 px or 64 MP fails explicitly and offers PDF; no silent truncation.
|
|
56
|
+
- Cross-node whitespace-tolerant highlight restoration; WeChat lazy-image recovery; complete formula/table/footnote and video-part metadata preservation.
|
|
57
|
+
|
|
58
|
+
Focused regression tests: `node --import tsx --test tests/background.test.ts tests/queuePolicy.test.ts tests/floatingLauncher.test.ts tests/exportParity.test.ts tests/extractionParity.test.ts tests/paritySettingsUI.test.ts tests/documentExport.test.ts tests/core.test.ts tests/security.test.ts tests/imageBodyCancellation.test.ts tests/obsidianClipboard.test.ts`.
|
|
59
|
+
|
|
60
|
+
Reproducible real-component UI instruments: `node scripts/ui-fixture.mjs`, `node scripts/floating-ui-fixture.mjs` (8777), `node scripts/document-export-fixture.mjs` (8776). These use synthetic local state and do not access the installed extension's credentials. Live public extraction: `node --import tsx scripts/public-extraction-acceptance.mts`; its report separates public-page results from installed Chrome and authenticated-service acceptance.
|
|
61
|
+
|
|
62
|
+
## Destinations / 保存目标
|
|
63
|
+
|
|
64
|
+
18 compatible targets: Markdown download, clipboard, Obsidian, Notion, GitHub, flomo, SiYuan, Logseq, Joplin, Feishu, Yuque, Memos, Wolai, FlowUs, GetBiji, S3, OSS and COS. Forsion cloud and Desktop are additional native targets. Configure credentials in Settings → Save & sync; enabled additional targets receive each manual save. Each destination has its own result.
|
|
65
|
+
|
|
66
|
+
Image hosting supports S3, OSS, COS and Cloudinary. Failed uploads retain original image links and return a warning. External destination implementations use their documented APIs; API availability and account permissions still need real-account validation. Notion/Wolai/FlowUs support typed property mappings; GitHub/SiYuan/Joplin/Memos support opt-in native image attachments, and Joplin can synchronize tags. Image fetch/upload failures keep original links and warnings; a partially created remote document retains its ID and is never automatically duplicated. Protocol references and explicit format limits: [export adapter notes](src/lib/exports/README.md).
|
|
67
|
+
|
|
68
|
+
Markdown download can also produce an offline ZIP (`Save & sync → Markdown → Attachments`). It preserves the complete document and bundles public HTTP(S) Markdown and HTML images into a configurable asset directory; failed images keep their original link and are listed in the archive report. Limits: 20 MiB per image, 100 MiB total, 200 images. HTML images, picture/srcset and relative image URLs are resolved against the source page; data/blob URLs are preserved with a report. / Markdown 下载支持离线图片 ZIP,失败保留原链并附报告;上述格式与大小边界会明确提示。
|
|
69
|
+
|
|
70
|
+
Obsidian/Logseq return **handed off**, not a confirmed saved file. A manual Obsidian save above 30,000 encoded URI characters writes the complete document to the clipboard, then opens the official `clipboard=true` URI after that write succeeds. Large Obsidian queue jobs and oversized Logseq URIs fail explicitly without truncation; queue workers cannot overwrite each other's clipboard handoffs. Chrome downloads return a download ID; completion is visible in Chrome's downloads page. Wolai unsupported rich constructs preserve the source as text with a warning.
|
|
71
|
+
|
|
72
|
+
## MCP
|
|
73
|
+
|
|
74
|
+
The bridge is opt-in. It listens on loopback only and requires a random token of at least 24 characters. The extension and MCP process must use the same token. No browser debugging port or native host installation is required.
|
|
75
|
+
|
|
76
|
+
Example MCP client configuration (replace paths and token locally; never commit real tokens):
|
|
77
|
+
|
|
78
|
+
```json
|
|
79
|
+
{
|
|
80
|
+
"mcpServers": {
|
|
81
|
+
"forsion-clip": {
|
|
82
|
+
"command": "node",
|
|
83
|
+
"args": ["/absolute/path/forsion-clip/scripts/mcp-server.mjs"],
|
|
84
|
+
"env": {
|
|
85
|
+
"FORSION_CLIP_BRIDGE_TOKEN": "replace-with-a-long-random-token",
|
|
86
|
+
"FORSION_CLIP_BRIDGE_PORT": "18365"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Install this project's dependencies before starting the server. In extension settings, use `ws://127.0.0.1:18365`, paste the matching token and enable the connection. Exposed tools: `browser_tabs`, `clip_extract`, `clip_save`. Enabling the bridge authorizes the connected local AI client to use those capabilities. Keep it disabled if unused.
|
|
94
|
+
|
|
95
|
+
The delivery also includes a minimal `forsion-clip-2.0.0-mcp.zip` companion. Unpack it and run `npm ci --omit=dev`; use its `mcp-server.mjs` path in the same configuration. / 也可使用交付中的独立 MCP 包,无需安装整个源码项目的开发依赖。
|
|
96
|
+
|
|
97
|
+
## Permissions and privacy / 权限
|
|
98
|
+
|
|
99
|
+
| Permission | Purpose |
|
|
100
|
+
|---|---|
|
|
101
|
+
| HTTP(S) host access, scripting, activeTab | Show the enabled selection toolbar on ordinary HTTP(S) pages, except disabled sites; hidden/disabled toolbar uses configured persistent sites. Selected text is sent to a translation/AI provider only after an explicit action. |
|
|
102
|
+
| tabs | Current-page identity and selected-tab batch capture |
|
|
103
|
+
| bookmarks | Display bookmarks for user selection before import |
|
|
104
|
+
| downloads, clipboardWrite, offscreen | Save Markdown/archives and copy in Chrome MV3 |
|
|
105
|
+
| storage, unlimitedStorage | Local credentials, drafts, vocabulary, annotations, history and durable queue |
|
|
106
|
+
| sidePanel, contextMenus | Native panel and page/text/image actions |
|
|
107
|
+
| alarms | Resume queued work and scheduled daily capture; reconnect Tangu browser control |
|
|
108
|
+
| tabGroups | Keep tabs opened by Tangu in their own "Tangu" group |
|
|
109
|
+
| debugger | Tangu only: run page JavaScript, take screenshots and send trusted key presses when asked; attached briefly per command. Chrome does not allow it as an optional permission |
|
|
110
|
+
|
|
111
|
+
Page scripts cannot access extension local storage. Token-bearing calls are confined to trusted extension contexts; page data crosses a narrow, source-validated message interface. Synthetic webpage clicks cannot trigger privileged toolbar saves. Credentials stay out of normal configuration exports; re-enter destination/image credentials after importing. No SmartClip private account service, telemetry, remote executable code, or browser history API is used. Chrome labels the tabs permission broadly as browsing access.
|
|
112
|
+
|
|
113
|
+
## Verification / 验证
|
|
114
|
+
|
|
115
|
+
```sh
|
|
116
|
+
npm run check
|
|
117
|
+
npm test
|
|
118
|
+
npm run build
|
|
119
|
+
npm run package
|
|
120
|
+
npm audit --omit=dev
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Tests include actual Defuddle DOM extraction, source fidelity, malicious synthetic clicks, account/Unit contract fixtures, cloud origin race, idempotency, queue cancellation/restart, streaming, 18 adapters and image signatures, UI vocabulary/annotation interactions, and the actual Node MCP stdio ↔ authenticated loopback WebSocket transport. Synthetic fixtures are not live account or third-party acceptance. The delivery report records real Chrome/desktop/account checks separately.
|
|
124
|
+
|
|
125
|
+
New tests never load a browser profile or perform real account writes. `tests/fixtures/article.html` is a synthetic, non-private article for explicit live acceptance.
|
|
126
|
+
|
|
127
|
+
For isolated selection UI verification, run `node scripts/selection-ui-fixture.mjs` and open its loopback URL. It uses real production toolbar/result modules with synthetic storage and deliveries. Optional live Google/Bing mode accepts only the fixture article text; it does not connect to an account or AI provider. / 隔离划词验收脚本使用正式组件与合成存储;可验证真实 Google/Bing 翻译,但不能据此声称已完成安装版端到端验收。
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
### 2.0.2 parity continuation (unreleased)
|
|
131
|
+
|
|
132
|
+
- Vocabulary now imports original-compatible CSV atomically with duplicate skipping, edits source sentences, filters by time/source and exports the current selection safely for spreadsheets.
|
|
133
|
+
- Document properties support enabled/visible fields, renamed keys, custom typed fields and date formatting. New captures snapshot the definitions; old drafts keep their original field names.
|
|
134
|
+
- Reading presets support create/edit/reorder/disable/reset. Long translations retain custom instructions in every source segment. Selected messages or a complete reading conversation can be saved without altering the source draft.
|
|
135
|
+
- Illustrated cards now have a real plan/review/generate/download workflow through Forsion account image models or a configured OpenAI-compatible image provider. Calls are serial, failures do not auto-retry, and completed images survive cancellation and panel navigation within the current page session. Download before closing/reloading the extension page.
|
|
136
|
+
- YouTube captions survive Defuddle sanitization, with chapter and timestamp links. Public production-module acceptance retained 129 caption segments and 12 chapters.
|
|
137
|
+
- Markdown filenames support `{date}`, `{time}`, `{slug}`, `{title}`, `{site}`; asset folders support `{fileName}`. Images can be preserved, zipped, or downloaded separately. All relative downloads stay below the browser download directory.
|
|
138
|
+
|
|
139
|
+
Evidence boundaries: production-module tests and HTTP component fixtures are distinct from installed Chrome. The browser tool rejects extension management/internal pages, so this revision has not been automatically reloaded into the user's Chrome. Cloud account image generation, third-party account writes and MV3 lifetime under actual slow image generation are not claimed as verified. See the current HTML acceptance report for exact evidence.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extensionName": {
|
|
3
|
+
"message": "Forsion Clip"
|
|
4
|
+
},
|
|
5
|
+
"extensionDescription": {
|
|
6
|
+
"message": "Clip web pages, annotate, read with AI, and save to Forsion and your favorite knowledge apps."
|
|
7
|
+
},
|
|
8
|
+
"openPanel": {
|
|
9
|
+
"message": "Open web clipper"
|
|
10
|
+
},
|
|
11
|
+
"quickClip": {
|
|
12
|
+
"message": "Quick clip"
|
|
13
|
+
},
|
|
14
|
+
"openSettings": {
|
|
15
|
+
"message": "Open settings"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extensionName": {
|
|
3
|
+
"message": "Forsion Clip"
|
|
4
|
+
},
|
|
5
|
+
"extensionDescription": {
|
|
6
|
+
"message": "剪藏网页、划线批注与 AI 阅读,保存到 Forsion 和你常用的知识应用。"
|
|
7
|
+
},
|
|
8
|
+
"openPanel": {
|
|
9
|
+
"message": "打开剪藏面板"
|
|
10
|
+
},
|
|
11
|
+
"quickClip": {
|
|
12
|
+
"message": "快速剪藏"
|
|
13
|
+
},
|
|
14
|
+
"openSettings": {
|
|
15
|
+
"message": "打开设置"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.t2c-card{--t2c-font-body: 13px;--t2c-font-control: var(--ui-font-meta);--t2c-font-meta: var(--ui-font-caption);position:relative;container-type:inline-size;background:var(--t2c-card-surface, var(--bg-card, var(--bg)));border:var(--border-width, 1px) solid transparent;border-radius:var(--radius-chat-surface, 20px);box-shadow:var(--card-shadow, 0 6px 22px rgba(0, 0, 0, .08));padding:12px 14px;transition:border-color var(--duration-fast, .15s)}.t2c-card.dragover{border-color:var(--accent-ink);background:color-mix(in srgb,var(--accent-ink) 6%,var(--t2c-card-surface, var(--bg-card, var(--bg))))}.t2c-ta{width:100%;border:none;outline:none;background:transparent;resize:none;color:var(--text);font-family:var(--font-ui);font-size:var(--t2c-font-body, 13px);line-height:1.6;min-height:1.6em;max-height:200px;display:block}.t2c-ta::placeholder{color:var(--text-faint, var(--text-muted));transition:opacity .3s ease}.t2c-ta[data-tip-fade]::placeholder{opacity:0}.t2c-ta[data-tip-tall]{min-height:3.2em}.t2c-row{display:flex;align-items:center;gap:6px;margin-top:8px;flex-wrap:nowrap}.t2c-grow{flex:1}.t2c-send{width:32px;height:32px;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;border:none;border-radius:var(--radius-pill, 999px);background:var(--action-fill);color:var(--on-action, #fff);cursor:pointer;transition:opacity var(--duration-fast, .15s),transform var(--duration-fast, .15s)}.t2c-send:hover:not(:disabled){transform:translateY(-1px)}.t2c-send:active:not(:disabled){transform:scale(.94);transition-duration:70ms}.t2c-send:disabled{opacity:.35;cursor:default;background:var(--overlay-medium, var(--overlay-light, rgba(127, 127, 127, .25)));color:var(--text-faint, var(--text-muted))}.selbar{z-index:100;user-select:none;-webkit-user-select:none;max-width:calc((100vw - 16px) / var(--uiz, 1));-webkit-app-region:no-drag}.selbar-row{display:flex;align-items:center;gap:1px;padding:4px;overflow-x:auto;overscroll-behavior-x:contain}.selbar-btn{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;gap:5px;min-width:28px;height:28px;padding:0 7px;border:none;border-radius:var(--radius-sm, 6px);background:transparent;color:var(--text-light);font:inherit;font-size:var(--ui-font-body, 13px);line-height:1;white-space:nowrap;cursor:pointer;transition:background var(--duration-fast, .12s) var(--ease-out, ease)}.selbar-btn:hover,.selbar-btn.on,.selbar-btn[aria-expanded=true]{background:var(--menu-hover);color:var(--text)}.selbar-btn:focus-visible,.selbar-dot:focus-visible,.selbar-menu-item:focus-visible{outline:var(--focus-ring, 1px) solid var(--signal-line, var(--accent-ink));outline-offset:-2px}.selbar-btn svg{flex:0 0 auto}.selbar-ico{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto}.selbar-ico>svg{width:15px;height:15px}.selbar-act{padding:0 8px;font-size:var(--ui-font-meta, 12px);color:var(--text)}.selbar-act.lead{font-weight:500;color:var(--accent-ink, var(--accent))}.selbar-sep{flex:0 0 auto;width:1px;align-self:stretch;margin:4px 2px;background:var(--border)}.selbar-dot{flex:0 0 auto;display:grid;place-items:center;width:22px;height:28px;padding:0;border:0;border-radius:var(--radius-sm, 6px);background:transparent;cursor:pointer}.selbar-dot:before{content:"";width:14px;height:14px;border-radius:50%;background:var(--c)}.selbar-dot:hover{background:var(--menu-hover)}.selbar-dot.on:before{outline:1.5px solid var(--text);outline-offset:2px}.selbar-panel{display:flex;flex-direction:column;gap:1px;max-height:300px;overflow-y:auto;padding:var(--menu-shell-padding, 4px);border-top:var(--border-width, 1px) solid var(--border)}.selbar-head{padding:6px 10px 3px;font-size:var(--ui-font-meta, 12px);font-weight:500;color:var(--text-muted)}.selbar-menu-item{display:flex;align-items:center;gap:8px;min-height:var(--menu-item-min-height, 32px);padding:6px 10px;border:none;border-radius:var(--radius-sm, 6px);background:transparent;color:var(--text-light);font:inherit;font-size:var(--menu-text-size, 14px);text-align:left;cursor:pointer}.selbar-menu-item:hover,.selbar-menu-item:focus-visible{background:var(--menu-hover);color:var(--text)}.selbar-menu-item>svg{flex:0 0 auto;color:var(--text-muted)}.selbar-menu-item>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.image-card-studio{display:grid;gap:12px;min-width:0}.image-card-studio h2,.image-card-studio h3,.image-card-studio p{margin:0}.ics-heading,.ics-actions,.ics-card-label{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.ics-heading{justify-content:space-between;align-items:flex-start}.ics-heading h2{font-size:var(--ui-font-title);margin-bottom:5px}.ics-source{font-size:var(--ui-font-caption);color:var(--text-muted);overflow-wrap:anywhere}.ics-controls{display:grid;grid-template-columns:minmax(0,1.5fr) minmax(0,1fr);gap:10px}.ics-controls label,.ics-field,.ics-card label{display:grid;gap:5px;font-size:var(--ui-font-caption);color:var(--text-muted);min-width:0}.image-card-studio input,.image-card-studio select,.image-card-studio textarea{width:100%;box-sizing:border-box;min-width:0;color:var(--text)}.image-card-studio textarea{resize:vertical;line-height:1.6}.ics-divider{border-top:1px solid var(--border);margin:3px 0}.ics-deck{display:grid;gap:12px}.ics-card{display:grid;gap:10px;padding:14px;border:1px solid var(--border);border-radius:var(--radius-lg, 12px);background:var(--bg-card);min-width:0}.ics-card-label{justify-content:space-between;color:var(--text-muted);font-size:var(--ui-font-caption)}.ics-card-label strong{font-variant-numeric:tabular-nums;color:var(--text)}.ics-image{display:block;width:100%;max-height:620px;object-fit:contain;border-radius:var(--radius-sm, 6px);background:var(--bg)}.ics-error{color:var(--danger);font-size:var(--ui-font-caption);line-height:1.6;overflow-wrap:anywhere}@media(max-width:370px){.ics-controls{grid-template-columns:1fr}.ics-card{padding:10px}}*{box-sizing:border-box}html,body,#app{height:100%;margin:0}body{font:var(--ui-font-body)/var(--ui-line-body) var(--font-ui);color:var(--text);background:var(--bg)}button,input,select,textarea{font:inherit;color:inherit}button{display:inline-flex;align-items:center;justify-content:center;gap:7px;border:0;background:transparent;border-radius:var(--radius-sm);padding:6px 8px;cursor:pointer}button:hover{background:var(--overlay-light)}button:disabled{opacity:.45;cursor:default}button:focus-visible,input:focus-visible,textarea:focus-visible,select:focus-visible{outline:2px solid var(--accent-ink);outline-offset:2px}input,textarea,select{border:1px solid var(--overlay-medium);border-radius:var(--radius-sm);background:var(--bg-card);padding:7px 9px;max-width:100%;min-width:0}textarea{width:100%;min-height:80px;resize:vertical;line-height:1.7}input[type=checkbox]{accent-color:var(--action-fill);width:14px;height:14px}a{color:var(--text-muted);text-decoration:none}a:hover{text-decoration:underline}h1,h2,h3,p{margin:0}h1{font-size:var(--ui-font-display);font-weight:650;line-height:1.4}h2{font-size:var(--ui-font-title);font-weight:600}h3{font-size:var(--ui-font-heading);font-weight:600}small,.caption{font-size:var(--ui-font-caption);color:var(--text-faint)}hr{height:1px;border:0;background:var(--border);margin:30px 0}.muted{color:var(--text-muted)}.grow{flex:1;min-width:0}.ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.primary{background:var(--action-fill)!important;color:var(--on-action)!important}.primary:hover{background:var(--action-fill-hover)!important}.btn{min-height:29px;gap:6px}.app-shell{height:100dvh;display:flex;overflow:hidden;background:var(--sidebar-bg)}.workbench{display:grid;grid-template-columns:44px 190px minmax(0,1fr)}.workbench.collapsed{grid-template-columns:44px minmax(0,1fr)}.collapsed .sidebar{display:none}.ribbon{display:flex;flex-direction:column;align-items:center;gap:9px;padding:9px 0;min-height:0}.ribbon button{width:32px;height:32px;padding:6px;color:var(--text-muted)}.ribbon button.active{background:var(--overlay-strong);color:var(--text)}.sidebar{display:flex;flex-direction:column;padding:0 8px 8px 5px;min-height:0;overflow:auto}.brand{display:flex;align-items:center;gap:8px;height:49px;padding:0 8px}.brand img{width:22px;height:22px}.sidebar>button{justify-content:flex-start;min-height:33px;color:var(--text-muted);text-align:left}.sidebar button.active{background:var(--overlay-medium);color:var(--text);position:relative}.sidebar button.active:before{position:absolute;content:"";left:0;height:16px;width:2px;background:var(--text-light);border-radius:2px}.sidebar>small{padding:22px 9px 7px}.sidebar-vault{display:flex;align-items:center;gap:9px;padding:9px;font-size:var(--ui-font-meta);color:var(--text-muted)}.sidebar-vault small{display:block;margin-top:4px}.avatar{display:flex;align-items:center;justify-content:center;width:33px;height:33px;flex-shrink:0;border-radius:50%;background:var(--overlay-medium);color:var(--text-muted)}.account-link{border-top:1px solid var(--border);border-radius:0;padding-block:13px!important}.account-link small{display:block}.workspace{min-width:0;min-height:0;display:flex;flex-direction:column;flex:1;padding-right:8px}.workspace-header{height:38px;flex-shrink:0;display:flex;align-items:center;gap:6px;color:var(--text-muted);font-size:var(--ui-font-meta);padding:0 9px}.workspace-header>span{display:flex;gap:8px;align-items:center}.workspace-header>button{font-size:11px}.status{display:flex;gap:8px;height:23px;align-items:center;flex-shrink:0;padding:0 10px;font-size:10px;color:var(--text-faint)}main{background:var(--bg);border-radius:var(--radius-md);flex:1;min-height:0;overflow:auto}.sidepanel .workspace{padding:0}.sidepanel main{border-radius:0}.sidepanel .workspace-header{height:32px}.clip-main{display:flex;flex-direction:column;max-width:800px}.workbench .clip-main{max-width:none}.panel-heading{display:flex;align-items:center;gap:7px;padding:12px 17px 7px;flex-shrink:0;min-height:42px}.panel-heading strong{font-size:var(--ui-font-heading);font-weight:600}.panel-heading .muted{font-size:var(--ui-font-caption)}.panel-tabs{display:flex;gap:4px;padding:5px 11px 12px;flex-shrink:0}.panel-tabs button{flex:1;color:var(--text-muted);min-height:29px;font-size:var(--ui-font-meta)}.panel-tabs .active{background:var(--overlay-medium);color:var(--text)}.panel-content{padding:4px 17px 20px;overflow:auto;flex:1;min-height:0}.workbench .panel-content{max-width:780px;width:100%;margin-inline:auto}.range{display:flex;width:100%;margin-bottom:18px}.range button{flex:1;min-height:28px}.field{display:flex;flex-direction:column;gap:7px;margin:17px 0}.field>span{color:var(--text-muted);font-size:var(--ui-font-meta)}.field>input,.field>select{width:100%}.field input{min-height:31px}.source{display:flex;justify-content:space-between;gap:12px;margin-block:25px;font-size:var(--ui-font-meta);color:var(--text-muted)}.source a{display:flex;align-items:center;gap:5px;overflow-wrap:anywhere}.preview{background:var(--bg-card);border:1px solid var(--overlay-light);border-radius:var(--radius-md);overflow:hidden;margin:22px 0 17px}.preview header,.preview footer{display:flex;align-items:center;gap:5px;padding:10px 12px;font-size:var(--ui-font-meta)}.preview header{padding-bottom:5px}.preview footer{color:var(--text-faint);font-size:var(--ui-font-caption)}.clip-preview{max-height:260px;overflow:auto;padding:12px}.body-editor{border:0;outline-offset:-3px;min-height:280px;border-radius:0;background:transparent;padding:12px;font-family:var(--font-mono);font-size:var(--ui-font-meta)}.check{display:flex;align-items:center;gap:8px;margin:14px 0;font-size:var(--ui-font-meta);color:var(--text-muted)}.subtle{display:flex;width:100%;color:var(--text-muted);font-size:var(--ui-font-meta);text-align:left;padding-inline:0}.save-footer{padding:10px 16px 9px;border-top:1px solid var(--overlay-medium);flex-shrink:0;display:flex;flex-direction:column;gap:8px}.save-footer .destination{display:flex;justify-content:flex-start;text-align:left;padding-inline:0;font-size:var(--ui-font-meta)}.destination small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100px}.save{width:100%;height:33px}.save-footer>small{text-align:center;font-size:10px}.save-results{display:flex;flex-direction:column;gap:5px;max-height:100px;overflow:auto;font-size:var(--ui-font-caption);color:var(--text-muted)}.save-results>div{display:flex;gap:6px;align-items:center;overflow-wrap:anywhere}.save-results svg{flex-shrink:0}.save-results span{flex:1}.failed{color:var(--danger, #b54a43)}.context{display:flex;align-items:center;gap:5px;color:var(--text-faint);font-size:var(--ui-font-caption);margin-bottom:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.panel-content>h3{margin:17px 0 8px}.panel-content>p{font-size:var(--ui-font-meta);line-height:1.7}.presets{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin-top:16px}.presets button{justify-content:flex-start;border:1px solid var(--overlay-medium);font-size:var(--ui-font-meta);padding:8px}.messages{display:flex;flex-direction:column;gap:20px;margin:25px 0}.message.user{padding:10px 12px;border-radius:var(--radius-md);background:var(--overlay-light);color:var(--text-muted);font-size:var(--ui-font-meta)}.message .actions{margin-top:12px;font-size:var(--ui-font-caption)}.t2c-card{margin-top:25px}.t2c-card .context{margin:0 0 8px}.t2c-card textarea{border:0;background:transparent;padding:0;min-height:42px;max-height:180px;font-size:var(--ui-font-body);resize:none}.t2c-card select{max-width:65%;border:0;background:var(--overlay-light);border-radius:var(--radius-pill);padding:4px 8px;font-size:var(--ui-font-caption)}.t2c-send{padding:0}.t2c-card+.caption{margin-top:9px;font-size:var(--ui-font-caption)}.highlight{border-left:3px solid;padding:0 0 0 12px;margin:20px 0}.highlight blockquote{margin:0 0 10px;color:var(--text-muted);font-size:var(--ui-font-meta)}.highlight img{max-width:100%;max-height:150px;object-fit:contain}.highlight textarea{font-size:var(--ui-font-meta);min-height:58px;background:var(--overlay-light);border:0}.highlight footer{display:flex}.page-main{padding:36px max(28px,calc((100% - 860px)/2))}.page-heading{display:flex;align-items:center;gap:15px;justify-content:space-between;margin-bottom:28px}.page-heading p,.settings-content>p{margin-top:7px;color:var(--text-muted);font-size:var(--ui-font-meta);line-height:1.8}.page-heading .btn{white-space:nowrap}.card{background:var(--bg-card);border-radius:var(--radius-md);border:1px solid var(--overlay-light);padding:18px;margin:18px 0}.section-title{display:flex;align-items:center;gap:10px;margin-bottom:12px}.section-title h1,.section-title h3{flex:1}.actions{display:flex;align-items:center;gap:9px;flex-wrap:wrap}.search{display:flex;align-items:center;gap:8px;border:1px solid var(--overlay-medium);border-radius:var(--radius-sm);padding:0 10px;margin-bottom:15px;max-width:400px;color:var(--text-faint)}.search input{border:0;flex:1;background:transparent}.collection-row{display:flex;align-items:center;gap:7px;padding:12px 0;border-bottom:1px solid var(--border)}.collection-row>button:first-child{flex:1;justify-content:flex-start;text-align:left;padding:6px 0;gap:16px;min-width:0}.collection-row strong{display:block;font-size:var(--ui-font-heading);font-weight:550}.collection-row small{display:block;margin-top:6px}.collection-row svg{flex-shrink:0;color:var(--text-faint)}.batch-input{min-height:160px;font-family:var(--font-mono);font-size:var(--ui-font-meta);margin-bottom:12px}.daily .settings-control-row{padding:0 0 15px;background:transparent}.daily .actions{margin:12px 0}.job{display:flex;gap:10px;align-items:center;padding:15px 0;border-bottom:1px solid var(--border)}.job strong{font-weight:500;font-size:var(--ui-font-meta);overflow-wrap:anywhere}.job small{display:block;margin-top:5px}.job p{font-size:var(--ui-font-caption);margin-top:8px}.job-dot{width:7px;height:7px;border-radius:50%;background:var(--text-faint);flex-shrink:0}.job-dot.saved{background:#508b66}.job-dot.running{background:var(--accent-ink)}.job-dot.failed{background:#b54a43}.word blockquote{margin:12px 0;border-left:2px solid var(--text-faint);padding-left:12px;color:var(--text-muted)}.word a{font-size:var(--ui-font-caption)}.settings-content{max-width:740px;margin:auto}.settings-content>h2{margin-top:29px;margin-bottom:10px}.settings-content>h1{margin-bottom:8px}.settings-content>.settings-control-row{margin-top:1px}.settings-content>.settings-control-row:first-of-type{margin-top:25px}.settings-content>p{margin-bottom:20px}.settings-control-row{border-radius:0}.settings-control-row .btn{font-size:var(--ui-font-meta);white-space:normal}.account-card{display:flex;align-items:center;gap:15px;padding:20px;border-radius:var(--radius-md);background:var(--bg-card);border:1px solid var(--overlay-medium);margin:24px 0 15px}.account-card small{display:block;margin-top:5px}.account-card .avatar{width:37px;height:37px}.auth-code code{display:block;font:26px var(--font-mono);letter-spacing:3px;margin:18px 0}.auth-code p{color:var(--text-muted);font-size:var(--ui-font-meta);margin:12px 0}.auth-code .btn{margin-right:8px}.destination-settings details{border-bottom:1px solid var(--border);padding:0 0 4px}.destination-settings summary{display:flex;gap:8px;cursor:pointer;padding:14px 0}.destination-settings summary>span:last-child{font-size:var(--ui-font-caption);color:var(--text-faint)}.template-row{display:flex;gap:8px;align-items:center;border-bottom:1px solid var(--border);padding:8px 0}.template-row>button:first-child{flex:1;display:block;text-align:left}.template-row strong,.template-row small{display:block}.settings-mobile{display:none}.error{display:flex;gap:8px;padding:12px 14px;background:var(--overlay-light);color:var(--danger, #b54a43);font-size:var(--ui-font-meta);overflow-wrap:anywhere;flex-shrink:0;max-height:130px;overflow:auto}.error button{margin-left:auto;align-self:flex-start}.notice-inline{font-size:var(--ui-font-meta);padding:10px 14px;margin:5px 0;background:var(--overlay-light);color:var(--text-muted)}.notice-inline button{text-decoration:underline}.empty{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:16px;padding:60px 25px;color:var(--text-muted);flex:1}.empty h2{font-size:var(--ui-font-title)}.empty p{font-size:var(--ui-font-meta);line-height:1.7;max-width:360px}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--overlay-scrim);z-index:60;display:flex;align-items:center;justify-content:center;padding:20px}.modal{width:min(760px,100%);max-height:90dvh;display:flex;flex-direction:column;background:var(--bg-card);border:1px solid var(--overlay-medium);border-radius:var(--radius-lg);box-shadow:var(--card-shadow);overflow:hidden}.modal>header,.modal>footer{padding:15px 20px;display:flex;align-items:center;justify-content:space-between;gap:14px;flex-shrink:0}.modal>header h2{font-size:var(--ui-font-title)}.modal>footer{justify-content:flex-end;border-top:1px solid var(--border)}.modal-body{overflow:auto;padding:3px 20px 20px;min-height:0}.modal-body>p{line-height:1.8;margin:12px 0}.modal-body>.markdown{margin-block:25px}.import-row{display:flex;align-items:center;gap:12px;width:100%;padding:12px 0;border-bottom:1px solid var(--border);text-align:left}.import-row span{min-width:0;overflow-wrap:anywhere}.import-row small{display:block;margin-top:5px}.markdown{font-size:var(--ui-font-body);line-height:1.8;overflow-wrap:anywhere}.markdown p{margin:9px 0}.markdown h1,.markdown h2,.markdown h3{margin:20px 0 10px;line-height:1.5}.markdown h1{font-size:24px}.markdown h2{font-size:20px}.markdown h3{font-size:16px}.markdown img{max-width:100%;height:auto}.markdown pre{overflow:auto;padding:12px;background:var(--overlay-light);border-radius:var(--radius-sm);font-size:12px}.markdown table{border-collapse:collapse;display:block;overflow:auto;max-width:100%}.markdown th,.markdown td{border:1px solid var(--border);padding:7px 9px}.markdown blockquote{padding-left:12px;margin-left:0;border-left:2px solid var(--text-faint);color:var(--text-muted)}.markdown a{color:var(--accent-ink);text-decoration:underline}.markdown iframe{max-width:100%}@media(max-width:1000px){.workbench{grid-template-columns:44px 164px minmax(0,1fr)}.page-main{padding:28px}.sidebar{font-size:var(--ui-font-meta)}}@media(max-width:760px){.workbench,.workbench.collapsed{grid-template-columns:40px minmax(0,1fr)}.workbench .sidebar{display:none}.workspace{padding-right:5px}.ribbon button{width:30px;height:30px}.page-main{padding:24px 18px}.settings-mobile{display:block;margin-bottom:20px}.settings-mobile select{width:100%}.page-heading{align-items:flex-start}.page-heading h1{font-size:var(--ui-font-title)}.page-heading p{max-width:40ch}.page-heading .btn{font-size:var(--ui-font-caption)}.modal-backdrop{padding:10px}.modal>header,.modal>footer{padding:13px 16px}.modal-body{padding-inline:16px}.collection-row strong{font-size:var(--ui-font-body)}}@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;animation:none!important;transition:none!important}}.property-mappings{margin-top:20px;padding-top:16px;border-top:1px solid var(--border)}.property-mappings>p,.queue-settings>p{margin:10px 0 16px;line-height:1.6}.mapping-row{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(0,1fr) minmax(0,1fr) 30px;align-items:end;gap:8px;margin-bottom:12px}.mapping-row .field{margin:0;min-width:0}.mapping-row .mapping-value{grid-column:1 / -1}.mapping-row>button{margin-bottom:3px}.queue-settings>summary{cursor:pointer;font-weight:500}.queue-fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 16px}.queue-heading{flex-wrap:wrap}.queue-heading>h3{flex-basis:100%}.job>div{min-width:0}.job-result{padding-left:10px;border-left:1px solid var(--border);margin-top:10px;overflow-wrap:anywhere}.job-result a{color:var(--accent-ink);text-decoration:underline}@media(max-width:520px){.queue-fields{grid-template-columns:minmax(0,1fr)}.mapping-row{grid-template-columns:minmax(0,1fr) 30px}.mapping-row .field{grid-column:1}.mapping-row>button{grid-column:2;grid-row:1}}.floating-settings{margin-top:28px;padding-top:20px;border-top:1px solid var(--border)}.floating-settings h2{margin-bottom:12px}.floating-settings>.caption{margin-bottom:12px}.reading-tools{padding:12px;border-bottom:1px solid var(--border)}.reading-tools>summary{cursor:pointer;font-size:var(--ui-font-meta)}.reading-fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 10px;margin-top:14px}.reading-fields .field{min-width:0}.reading-outline{max-height:190px;overflow:auto}.reading-outline button{display:block;width:100%;text-align:start;font-size:var(--ui-font-meta);overflow-wrap:anywhere}.reading-preview{margin-inline:auto;width:100%}.reading-preview h1{font-size:1.6em}.reading-preview h2{font-size:1.3em}.reading-preview h3{font-size:1.15em}.document-export-actions{margin:12px 0}.vocabulary-filters{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(160px,100%),1fr));gap:10px}.vocabulary-filters .field{min-width:0}.vocabulary-import{padding:14px;margin-block:12px;border-radius:var(--radius-md);background:var(--bg-card)}.vocabulary-import input[type=file]{max-width:100%}.frontmatter-settings{margin-block:24px}.fm-fields{display:grid;gap:10px;margin-block:12px}.fm-field{min-width:0;border:1px solid hsl(var(--border));border-radius:8px;padding:10px 12px}.fm-field legend{color:hsl(var(--muted-foreground));padding-inline:4px}.fm-field-row{display:flex;align-items:center;flex-wrap:wrap;gap:10px;margin-block:4px}.fm-field-row>input{flex:1 1 140px;min-width:100px;width:0}.fm-field-row>select{max-width:100%;flex:0 1 150px}.fm-field-row>label{display:flex;gap:6px;align-items:center}.fm-field-row input[type=checkbox]{width:auto}.reader-preset-settings{margin-block:24px}.reader-preset-settings .page-heading{flex-wrap:wrap}.reader-preset-editor{padding:14px;margin-block:12px;border-radius:var(--radius-md);background:var(--bg-card)}.reader-preset-row{display:flex;align-items:center;flex-wrap:wrap;justify-content:space-between;gap:8px;padding-block:8px;border-bottom:1px solid var(--border)}.reader-preset-name{display:flex;align-items:center;gap:8px;min-width:0;overflow-wrap:anywhere}.reader-preset-name input{flex:0 0 auto}.chat-selection-row{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px;margin-bottom:8px}.chat-selection-row label{display:flex;align-items:center;gap:5px}.chat-selection-row input{width:auto}.selection-settings>h2{margin:28px 0 10px}.selection-settings>p{margin:8px 0 16px;font-size:var(--ui-font-meta);line-height:var(--ui-line-meta)}.selection-settings .settings-control-row{margin-top:1px}.selection-settings .settings-control-copy{min-width:0}.selection-settings .settings-row-control select{max-width:210px}.selection-color-control{display:flex;align-items:center;gap:8px}.selection-color-preview{width:18px;height:18px;flex-shrink:0;border:1px solid var(--border);border-radius:var(--radius-sm)}.selection-action-list{list-style:none;padding:0;margin:12px 0}.selection-action-list .actions{flex-wrap:nowrap;gap:4px}.selection-settings-footer{margin-top:24px;padding:16px 0;border-top:1px solid var(--border)}.selection-settings-footer>p{margin:0 0 12px;overflow-wrap:anywhere}@media(max-width:480px){.selection-settings .settings-control-row{gap:12px}.selection-settings .settings-row-control select{max-width:150px}.selection-action-list .settings-row-control{flex-shrink:0}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font-family:var(--font-ui);font-size:var(--ui-font-body)}.export-toolbar{max-width:1000px;margin:auto;padding:24px;display:flex;justify-content:space-between;gap:20px;align-items:center}.export-toolbar strong{font-size:var(--ui-font-title);font-weight:600}#view-label{margin-left:12px;color:var(--text-muted)}nav{display:flex;flex-wrap:wrap;gap:8px;align-items:center}button,select{font:inherit;color:var(--text);background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-sm);min-height:32px;padding:6px 10px}button{cursor:pointer}button:hover{background:var(--bg-hover)}button:disabled{opacity:.5;cursor:wait}button:focus-visible,select:focus-visible{outline:var(--focus-ring) solid var(--accent-ink);outline-offset:2px}#scale-label{display:flex;gap:8px;align-items:center;color:var(--text-muted)}#status,#warning{max-width:952px;margin:0 auto 16px;padding:0 12px;font-size:var(--ui-font-meta);line-height:var(--ui-line-meta)}#warning{color:var(--warning)}main{overflow-x:auto;padding:8px 20px 60px}#document{width:800px;margin:auto;background:#fff;color:#242424;padding:56px 64px;border:1px solid #eae9e7;border-radius:4px;font-family:ui-sans-serif,system-ui,-apple-system,PingFang SC,Microsoft YaHei,sans-serif;font-size:16px;line-height:1.75;overflow-wrap:anywhere}.document-title{font-size:32px;line-height:1.3;font-weight:600;margin:0 0 12px}.document-source{margin:0 0 28px;font-size:12px;color:#666}#document a{color:#4a5665;text-decoration:underline}#document pre{white-space:pre-wrap;overflow-wrap:anywhere;background:#f8f7f6;padding:16px;border-radius:4px;font:13px/1.6 ui-monospace,monospace}#document .document-metadata{margin:0 0 32px;color:#62615f;font-size:12px}#document h1,#document h2,#document h3{line-height:1.4;font-weight:600}#document h2{margin-top:1.5em;font-size:24px}#document h3{margin-top:1.5em;font-size:20px}#document p{margin:0 0 1em}#document img{display:block;max-width:100%;height:auto;margin:20px auto}#document table{border-collapse:collapse;width:100%;margin:20px 0;font-size:14px;table-layout:fixed}#document td,#document th{border:1px solid #eae9e7;padding:8px;text-align:left}#document th{color:#666;font-weight:500}#document blockquote{border-left:3px solid #d9d8d6;margin:24px 0;padding:0 20px;color:#666}.document-image-failure{display:block;border:1px dashed #aaa;color:#777;padding:16px;margin:16px 0;font-size:13px}@media(max-width:820px){.export-toolbar{align-items:flex-start;flex-direction:column;padding:20px}#document{margin:0}}@media print{@page{size:A4;margin:16mm}body{background:#fff;color:#242424}.export-toolbar,#status,#warning{display:none!important}main{padding:0;overflow:visible}#document{width:auto!important;max-width:none;margin:0;padding:0;border:0;border-radius:0}#document h1,#document h2,#document h3{break-after:avoid}#document pre,#document img,#document tr{break-inside:avoid}#document table{table-layout:auto}#document img{max-height:245mm;object-fit:contain}#document{print-color-adjust:exact;-webkit-print-color-adjust:exact}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--bg: #f8f7f6;--bg-card: #fdfdfc;--bg-glass: rgba(248, 247, 246, .9);--sidebar-bg: #f2f1ef;--text: #1c1c1c;--text-light: rgba(28, 28, 28, .82);--text-muted: #5f5f5d;--text-faint: #726c67;--text-ghost: rgba(28, 28, 28, .28);--border: #eae9e7;--border-width: 1px;--shadow: rgba(0, 0, 0, .05);--accent: #1c1c1c;--accent-ink: var(--accent);--accent-hover: #000000;--accent-light: rgba(28, 28, 28, .05);--accent-rgb: 28, 28, 28;--green: #4f6f52;--danger: #a3503f;--on-danger: #ffffff;--danger-light: rgba(163, 80, 63, .08);--warning: #806000;--model-tag-blue: #2877b8;--model-tag-purple: #8254b3;--warning-light: rgba(128, 96, 0, .1);--overlay-subtle: rgba(28, 28, 28, .03);--overlay-light: rgba(28, 28, 28, .04);--overlay-medium: rgba(28, 28, 28, .07);--overlay-strong: rgba(28, 28, 28, .14);--radius-sm: 6px;--radius-md: 12px;--radius-lg: 16px;--radius-chat-surface: var(--radius-lg);--radius-chat-card: var(--radius-md);--font-ui: "Hanken Grotesk", ui-sans-serif, system-ui, -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif;--ui-font-caption: 11px;--ui-font-meta: 12px;--ui-font-body: 13px;--ui-font-heading: 14px;--ui-font-title: 16px;--ui-font-display: 20px;--ui-line-caption: 14px;--ui-line-meta: 18px;--ui-line-body: 18px;--ui-line-heading: 20px;--ui-line-title: 22px;--ui-line-display: 28px;--ui-control-height: 28px;--ui-control-pad-block: 4px;--radius-pill: 999px;--font-body: var(--font-ui);--font-mono: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, monospace;--user-bg: rgba(28, 28, 28, .04);--tool-bg: rgba(28, 28, 28, .03);--tool-text: #5f5f5d;--panel-blur: none;--text-dim: var(--text-faint);--bg-hover: var(--overlay-light);--bg-input: var(--bg-card);--accent-soft: var(--accent-light);--overlay-scrim: rgba(0, 0, 0, .35);--sel-line: var(--overlay-strong);--sel-fill: var(--accent-light);--focus-ring: 1px;--menu-action-min: 168px;--menu-action-max: 184px;--menu-select-width: 224px;--menu-shell-padding: 4px;--menu-text-size: var(--ui-font-heading);--menu-line-height: var(--ui-line-heading);--menu-item-min-height: 32px;--menu-item-pad-block: 6px;--menu-item-pad-inline: 8px;--menu-hover: var(--overlay-medium);--db-text-size: var(--ui-font-body);--db-meta-size: var(--ui-font-meta);--db-line-height: 20px;--db-meta-line-height: var(--ui-line-meta);--db-title-size: var(--ui-font-title);--db-title-line-height: var(--ui-line-title);--db-cell-height: 32px;--db-cell-pad-block: 6px;--db-cell-pad-inline: 8px;--db-control-height: var(--ui-control-height);--db-control-pad-block: var(--ui-control-pad-block);--db-chip-height: 20px;--db-page-title-size: 30px;--db-page-text-size: 16px;--db-page-line-height: 26px;--duration-instant: .1s;--duration-fast: .15s;--duration-slow: .25s;--ease-out: cubic-bezier(.16, 1, .3, 1);--ease-spring: cubic-bezier(.2, .8, .3, 1);--on-accent: #fbfbfa;--on-accent-ink: var(--on-accent);--action-fill: var(--accent-ink);--action-fill-hover: var(--accent-ink);--on-action: var(--on-accent-ink);--inset: rgba(255, 255, 255, .2) 0 .5px 0 0 inset, rgba(0, 0, 0, .2) 0 0 0 .5px inset, rgba(0, 0, 0, .05) 0 1px 2px 0;--focus: rgba(0, 0, 0, .1) 0 4px 12px;--card-shadow: 0 1px 2px rgba(42, 36, 26, .04), 0 10px 26px rgba(42, 36, 26, .05);--btn-shadow: var(--inset);--icon-shadow: var(--inset)}:root.dark{--bg: #2a292b;--bg-card: #323134;--bg-glass: rgba(28, 26, 22, .9);--sidebar-bg: #262528;--text: #f2efe8;--text-light: rgba(242, 239, 232, .82);--text-muted: #aca59b;--text-faint: #a39e98;--text-ghost: rgba(242, 239, 232, .3);--border: #3e3d41;--shadow: rgba(0, 0, 0, .4);--accent: #f8f7f6;--accent-hover: #f9f8f8;--accent-light: rgba(248, 247, 246, .16);--accent-rgb: 248, 247, 246;--on-accent: #161018;--green: #8fb295;--danger: #d99080;--on-danger: #161018;--danger-light: rgba(217, 144, 128, .12);--warning: #e0b85b;--model-tag-blue: #73b9ef;--model-tag-purple: #bc9be8;--warning-light: rgba(224, 184, 91, .14);--overlay-subtle: rgba(242, 239, 232, .03);--overlay-light: rgba(242, 239, 232, .05);--overlay-medium: rgba(242, 239, 232, .08);--overlay-strong: rgba(242, 239, 232, .15);--user-bg: rgba(248, 247, 246, .16);--tool-bg: rgba(242, 239, 232, .04);--tool-text: #b0a99f;--card-shadow: 0 1px 2px rgba(0, 0, 0, .3), 0 10px 26px rgba(0, 0, 0, .35);--btn-shadow: 0 1px 2px rgba(0, 0, 0, .4);--icon-shadow: 0 1px 2px rgba(0, 0, 0, .3);--glow: radial-gradient(110% 75% at 82% -12%, rgba(206, 192, 168, .12), transparent 56%);--overlay-scrim: rgba(0, 0, 0, .55)}@supports (color: color-mix(in srgb,red 50%,transparent)){:root{--sel-line: color-mix(in srgb, var(--accent-ink) 36%, transparent);--sel-fill: color-mix(in srgb, var(--accent-ink) 7%, var(--bg-card));--action-fill-hover: color-mix(in srgb, var(--accent-ink) 88%, var(--text))}}html:root[data-mode=light]{--card-shadow: 0 1px 3px rgba(0, 0, 0, .025), 0 8px 24px -6px rgba(0, 0, 0, .05);--btn-shadow: none;--icon-shadow: none}html:root[data-mode=dark]{--card-shadow: 0 1px 3px rgba(0, 0, 0, .1), 0 8px 24px -6px rgba(0, 0, 0, .18);--btn-shadow: none;--icon-shadow: none}html:root[data-mode][data-flat="1"]{--card-shadow: none;--btn-shadow: none;--icon-shadow: none}:root[data-mode=light]{color-scheme:light}:root[data-mode=dark]{color-scheme:dark}:root{--menu-enter-duration: .18s;--menu-enter-ease: cubic-bezier(.2, 0, .2, 1)}[data-theme=lovable]{--border-width: 1px;--radius-sm: 6px;--radius-md: 12px;--radius-lg: 16px;--radius-chat-surface: var(--radius-lg);--radius-chat-card: var(--radius-md);--panel-blur: none;--inset: rgba(255, 255, 255, .2) 0 .5px 0 0 inset, rgba(0, 0, 0, .2) 0 0 0 .5px inset, rgba(0, 0, 0, .05) 0 1px 2px 0;--card-shadow: 0 1px 2px rgba(42, 36, 26, .04), 0 10px 26px rgba(42, 36, 26, .05);--btn-shadow: var(--inset);--icon-shadow: var(--inset)}.dark[data-theme=lovable]{--card-shadow: 0 1px 2px rgba(0, 0, 0, .3), 0 10px 26px rgba(0, 0, 0, .35);--btn-shadow: 0 1px 2px rgba(0, 0, 0, .4);--icon-shadow: 0 1px 2px rgba(0, 0, 0, .3)}:root[data-skin=cream]{--accent: #1c1c1c;--accent-ink: #1c1c1c;--accent-hover: #000000;--accent-light: rgba(28, 28, 28, .05);--accent-rgb: 28, 28, 28;--on-accent: #fbfbfa;--user-bg: rgba(28, 28, 28, .04)}:root[data-bg=cream]{--bg: #f8f7f6;--bg-card: #fdfdfc;--bg-glass: rgba(248, 247, 246, .9);--sidebar-bg: #f2f1ef;--text: #1c1c1c;--text-light: rgba(28, 28, 28, .82);--text-muted: #5f5f5d;--text-faint: #726c67;--text-ghost: rgba(28, 28, 28, .28);--border: #eae9e7;--shadow: rgba(0, 0, 0, .05);--green: #4f6f52;--danger: #a3503f;--danger-light: rgba(163, 80, 63, .08);--overlay-subtle: rgba(28, 28, 28, .03);--overlay-light: rgba(28, 28, 28, .04);--overlay-medium: rgba(28, 28, 28, .07);--overlay-strong: rgba(28, 28, 28, .14);--tool-bg: rgba(28, 28, 28, .03);--tool-text: #5f5f5d;--glow: radial-gradient(110% 75% at 82% -12%, rgba(191, 188, 182, .14), transparent 56%)}:root.dark[data-skin=cream]{--accent: #f8f7f6;--accent-ink: #f8f7f6;--accent-hover: #f9f8f8;--accent-light: rgba(248, 247, 246, .16);--accent-rgb: 248, 247, 246;--on-accent: #161018;--user-bg: rgba(248, 247, 246, .16);--action-fill: #d4d2ce;--action-fill-hover: #e2e0dc}:root.dark[data-bg=cream]{--bg: #2a292b;--bg-card: #323134;--bg-glass: rgba(28, 26, 22, .9);--sidebar-bg: #262528;--sidebar-card-bg: var(--bg-card);--text: #f2efe8;--text-light: rgba(242, 239, 232, .82);--text-muted: #aca59b;--text-faint: #a39e98;--text-ghost: rgba(242, 239, 232, .3);--border: #3e3d41;--shadow: rgba(0, 0, 0, .4);--green: #8fb295;--danger: #d99080;--danger-light: rgba(217, 144, 128, .12);--overlay-subtle: rgba(242, 239, 232, .03);--overlay-light: rgba(242, 239, 232, .05);--overlay-medium: rgba(242, 239, 232, .08);--overlay-strong: rgba(242, 239, 232, .15);--tool-bg: rgba(242, 239, 232, .04);--tool-text: #b0a99f;--glow: radial-gradient(110% 75% at 82% -12%, rgba(214, 188, 150, .14), transparent 56%)}:root[data-skin=coral]{--accent: #ff8a6b;--accent-ink: #99462f;--accent-hover: #ff987d;--accent-light: rgba(255, 138, 107, .12);--accent-rgb: 255, 138, 107;--on-accent: #2a160f;--on-accent-ink: #ffffff;--user-bg: rgba(255, 138, 107, .12)}:root[data-bg=coral]{--bg: #f7e5dc;--bg-card: #fdf5f1;--bg-glass: rgba(253, 245, 241, .84);--sidebar-bg: #f0d9ce;--text: #36291f;--text-light: #5c4d42;--text-muted: #695950;--text-faint: #6b5c53;--text-ghost: #bca99f;--border: #e4cfc5;--shadow: rgba(190, 140, 110, .12);--green: #376849;--danger: #98463d;--danger-light: rgba(224, 104, 90, .1);--overlay-subtle: rgba(120, 80, 55, .03);--overlay-light: rgba(120, 80, 55, .05);--overlay-medium: rgba(120, 80, 55, .09);--overlay-strong: rgba(120, 80, 55, .16);--tool-bg: rgba(255, 138, 107, .07);--tool-text: #695950;--glow: radial-gradient(110% 75% at 82% -12%, rgba(255, 160, 120, .32), transparent 56%)}:root.dark[data-skin=coral]{--accent: #ff9a7d;--accent-ink: #ff9a7d;--accent-hover: #ffa68d;--accent-light: rgba(255, 154, 125, .14);--accent-rgb: 255, 154, 125;--on-accent: #2a160f;--on-accent-ink: #2a160f;--user-bg: rgba(255, 154, 125, .14)}:root.dark[data-bg=coral]{--bg: #292727;--bg-card: #353232;--bg-glass: rgba(41, 39, 39, .9);--sidebar-bg: #302e2e;--text: #f3efed;--text-light: rgba(243, 239, 237, .82);--text-muted: #b0a8a4;--text-faint: #a29b98;--text-ghost: rgba(243, 239, 237, .3);--border: #473e3b;--shadow: rgba(0, 0, 0, .4);--green: #6fbf8a;--danger: #f08a7a;--danger-light: rgba(240, 138, 122, .14);--overlay-subtle: rgba(255, 255, 255, .03);--overlay-light: rgba(255, 255, 255, .05);--overlay-medium: rgba(255, 255, 255, .08);--overlay-strong: rgba(255, 255, 255, .15);--tool-bg: rgba(255, 154, 125, .05);--tool-text: #b0a8a4;--glow: radial-gradient(110% 75% at 82% -12%, rgba(255, 150, 120, .1), transparent 56%)}:root[data-skin=teal]{--accent: #4d8794;--accent-ink: #38636d;--accent-hover: #6295a1;--accent-light: rgba(77, 135, 148, .1);--accent-rgb: 77, 135, 148;--on-accent: #081719;--on-accent-ink: #ffffff;--user-bg: rgba(77, 135, 148, .09)}:root[data-bg=teal]{--bg: #dff1ea;--bg-card: #f4faf8;--bg-glass: rgba(244, 250, 248, .86);--sidebar-bg: #d4e9e3;--text: #1d1d1f;--text-light: #3a3a3c;--text-muted: #545d5c;--text-faint: #606866;--text-ghost: #9baca8;--border: #c8ded8;--shadow: rgba(0, 0, 0, .04);--green: #416b4f;--danger: #9e4a40;--danger-light: rgba(207, 97, 85, .1);--overlay-subtle: rgba(0, 0, 0, .025);--overlay-light: rgba(0, 0, 0, .035);--overlay-medium: rgba(0, 0, 0, .06);--overlay-strong: rgba(0, 0, 0, .12);--tool-bg: rgba(0, 0, 0, .025);--tool-text: #545d5c;--glow: radial-gradient(110% 75% at 82% -12%, rgba(95, 163, 178, .22), transparent 56%)}:root.dark[data-skin=teal]{--accent: #5fa3b2;--accent-ink: #72b4c1;--accent-hover: #72aebb;--accent-light: rgba(95, 163, 178, .14);--accent-rgb: 95, 163, 178;--on-accent: #102126;--on-accent-ink: #102126;--user-bg: rgba(95, 163, 178, .13)}:root.dark[data-bg=teal]{--bg: #272a2a;--bg-card: #333636;--bg-glass: rgba(39, 42, 42, .9);--sidebar-bg: #2e3131;--text: #eff3f2;--text-light: rgba(239, 243, 242, .82);--text-muted: #a8afad;--text-faint: #9ca3a1;--text-ghost: rgba(239, 243, 242, .28);--border: #3a4442;--shadow: rgba(0, 0, 0, .4);--green: #6fb085;--danger: #e0857a;--danger-light: rgba(224, 133, 122, .14);--overlay-subtle: rgba(255, 255, 255, .03);--overlay-light: rgba(255, 255, 255, .05);--overlay-medium: rgba(255, 255, 255, .08);--overlay-strong: rgba(255, 255, 255, .14);--tool-bg: rgba(255, 255, 255, .03);--tool-text: #a8afad;--glow: radial-gradient(110% 75% at 82% -12%, rgba(95, 163, 178, .08), transparent 56%)}:root[data-skin=lavender]{--accent: #8b7fd6;--accent-ink: #5d548e;--accent-hover: #998edb;--accent-light: rgba(139, 127, 214, .12);--accent-rgb: 139, 127, 214;--on-accent: #1c1726;--on-accent-ink: #ffffff;--user-bg: rgba(139, 127, 214, .1)}:root[data-bg=lavender]{--bg: #ede0f5;--bg-card: #faf5fc;--bg-glass: rgba(250, 245, 252, .86);--sidebar-bg: #e5d5ef;--text: #2e2a36;--text-light: rgba(46, 42, 54, .82);--text-muted: #5b5363;--text-faint: #655d6d;--text-ghost: #b9aac3;--border: #d9c8e5;--shadow: rgba(90, 70, 130, .12);--green: #366547;--danger: #95443a;--danger-light: rgba(224, 104, 90, .1);--overlay-subtle: rgba(46, 42, 54, .03);--overlay-light: rgba(46, 42, 54, .05);--overlay-medium: rgba(46, 42, 54, .08);--overlay-strong: rgba(46, 42, 54, .14);--tool-bg: rgba(139, 127, 214, .06);--tool-text: #5b5363;--glow: radial-gradient(110% 75% at 82% -12%, rgba(244, 196, 176, .55), transparent 56%)}:root.dark[data-skin=lavender]{--accent: #a99cf0;--accent-ink: #a99cf0;--accent-hover: #b3a8f2;--accent-light: rgba(169, 156, 240, .16);--accent-rgb: 169, 156, 240;--on-accent: #1c1726;--on-accent-ink: #1c1726;--user-bg: rgba(169, 156, 240, .12)}:root.dark[data-bg=lavender]{--bg: #29272c;--bg-card: #353239;--bg-glass: rgba(41, 39, 44, .9);--sidebar-bg: #302e34;--text: #f1eef4;--text-light: rgba(241, 238, 244, .82);--text-muted: #aca7b2;--text-faint: #9f9aa6;--text-ghost: rgba(241, 238, 244, .28);--border: #423c4a;--shadow: rgba(0, 0, 0, .4);--green: #6fbf8a;--danger: #f0897a;--danger-light: rgba(240, 137, 122, .16);--overlay-subtle: rgba(239, 233, 246, .03);--overlay-light: rgba(239, 233, 246, .05);--overlay-medium: rgba(239, 233, 246, .08);--overlay-strong: rgba(239, 233, 246, .15);--tool-bg: rgba(169, 156, 240, .05);--tool-text: #aca7b2;--glow: radial-gradient(110% 75% at 82% -12%, rgba(150, 120, 205, .12), transparent 56%)}:root[data-skin=zhi]{--accent: #1e96eb;--accent-ink: #12649d;--accent-hover: #39a3ed;--accent-light: rgba(30, 150, 235, .1);--accent-rgb: 30, 150, 235;--on-accent: #071924;--on-accent-ink: #ffffff;--user-bg: rgba(30, 150, 235, .08)}:root[data-bg=zhi]{--bg: #dcecfb;--bg-card: #f3f8fd;--bg-glass: rgba(243, 248, 253, .9);--sidebar-bg: #d1e4f5;--text: #121212;--text-light: rgba(18, 18, 18, .78);--text-muted: #59616a;--text-faint: #5d646c;--text-ghost: #91a1b0;--border: #c5d9eb;--shadow: rgba(66, 65, 73, .14);--green: #086e48;--danger: #b13228;--danger-light: #fdeceb;--overlay-subtle: rgba(0, 0, 0, .02);--overlay-light: rgba(0, 0, 0, .04);--overlay-medium: rgba(0, 0, 0, .1);--overlay-strong: rgba(0, 0, 0, .15);--overlay-scrim: rgba(0, 0, 0, .75);--tool-bg: #e8f2fa;--tool-text: #59616a;--glow: radial-gradient(120% 80% at 82% -12%, rgba(0, 0, 0, .02), transparent 58%)}:root.dark[data-skin=zhi]{--accent: #1c9ee4;--accent-ink: #55b6e8;--accent-hover: #37aae7;--accent-light: rgba(28, 158, 228, .14);--accent-rgb: 28, 158, 228;--on-accent: #071924;--on-accent-ink: #071924;--user-bg: rgba(28, 158, 228, .14)}:root.dark[data-bg=zhi]{--bg: #272a2e;--bg-card: #33363c;--bg-glass: rgba(39, 42, 46, .9);--sidebar-bg: #2e3237;--text: #eef2f6;--text-light: rgba(238, 242, 246, .82);--text-muted: #a5acb5;--text-faint: #99a0aa;--text-ghost: rgba(238, 242, 246, .28);--border: #3a4553;--shadow: rgba(0, 0, 0, .24);--green: #35b989;--danger: #e08e87;--danger-light: #2e1a18;--overlay-subtle: rgba(255, 255, 255, .03);--overlay-light: rgba(255, 255, 255, .05);--overlay-medium: rgba(255, 255, 255, .08);--overlay-strong: rgba(255, 255, 255, .15);--overlay-scrim: rgba(0, 0, 0, .5);--tool-bg: rgba(85, 182, 232, .05);--tool-text: #a5acb5;--glow: radial-gradient(120% 80% at 82% -12%, rgba(28, 158, 228, .08), transparent 58%)}:root[data-skin=ink]{--accent: #2b2723;--accent-ink: #2b2723;--accent-hover: #000000;--accent-light: rgba(43, 39, 35, .05);--accent-rgb: 43, 39, 35;--on-accent: #fbfaf8;--user-bg: rgba(43, 39, 35, .04)}:root[data-bg=ink]{--bg: #f7f6f3;--bg-card: #fdfcfa;--bg-glass: rgba(247, 246, 243, .9);--sidebar-bg: #f0eee9;--text: #1f1d1a;--text-light: rgba(31, 29, 26, .82);--text-muted: #615d57;--text-faint: #6c6760;--text-ghost: rgba(31, 29, 26, .28);--border: #e8e5df;--shadow: rgba(0, 0, 0, .05);--green: #4f6f52;--danger: #a3503f;--danger-light: rgba(163, 80, 63, .08);--overlay-subtle: rgba(31, 29, 26, .03);--overlay-light: rgba(31, 29, 26, .04);--overlay-medium: rgba(31, 29, 26, .07);--overlay-strong: rgba(31, 29, 26, .14);--tool-bg: rgba(31, 29, 26, .03);--tool-text: #615d57;--glow: radial-gradient(110% 75% at 82% -12%, rgba(196, 184, 166, .14), transparent 56%)}:root.dark[data-skin=ink]{--accent: #ecebe7;--accent-ink: #ecebe7;--accent-hover: #ffffff;--accent-light: rgba(236, 235, 231, .14);--accent-rgb: 236, 235, 231;--on-accent: #1b1a19;--user-bg: rgba(236, 235, 231, .1);--action-fill: #cfcdc7;--action-fill-hover: #dddbd5}:root.dark[data-bg=ink]{--bg: #201f1d;--bg-card: #282624;--bg-glass: rgba(27, 26, 25, .9);--sidebar-bg: #1b1a19;--sidebar-card-bg: var(--bg-card);--text: #ecebe7;--text-light: rgba(236, 235, 231, .84);--text-muted: #a19d96;--text-faint: #948f88;--text-ghost: rgba(236, 235, 231, .28);--border: #353330;--shadow: rgba(0, 0, 0, .4);--green: #8fb295;--danger: #d99080;--danger-light: rgba(217, 144, 128, .12);--overlay-subtle: rgba(236, 235, 231, .03);--overlay-light: rgba(236, 235, 231, .05);--overlay-medium: rgba(236, 235, 231, .08);--overlay-strong: rgba(236, 235, 231, .15);--tool-bg: rgba(236, 235, 231, .035);--tool-text: #a19d96;--glow: radial-gradient(110% 75% at 82% -12%, rgba(214, 188, 150, .1), transparent 56%)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:6px 14px;font-size:var(--ui-font-body, 13px);border-radius:var(--radius-sm);border:var(--border-width) solid transparent;transition:background var(--duration-fast),border-color var(--duration-fast),color var(--duration-fast)}.btn.primary{background:var(--action-fill);color:var(--on-action);box-shadow:var(--btn-shadow)}.btn.primary:hover{background:var(--action-fill-hover)}.btn.primary:disabled{background:var(--text-ghost);box-shadow:none;cursor:not-allowed}.btn.ghost{border-color:var(--overlay-strong);color:var(--text);background:transparent}.btn.ghost:hover{border-color:var(--accent-ink);color:var(--accent-ink)}.btn.danger{border-color:var(--danger);color:var(--danger);background:none}.btn.danger:hover{background:var(--danger-light)}.btn.sm{padding:4px 10px;font-size:var(--ui-font-meta, 12px)}.btn:where(:not(.primary,.ghost,.danger)){border-color:var(--overlay-strong);color:var(--text)}.btn:where(:not(.primary,.ghost,.danger)):hover:not(:disabled){border-color:var(--accent-ink);color:var(--accent-ink)}.btn:where(:not(.primary)):disabled{opacity:.5;cursor:not-allowed}.settings-panel{overflow:hidden;margin-bottom:12px;border:var(--border-width) solid var(--overlay-medium, rgba(127, 127, 127, .12));border-radius:var(--radius-lg);background:var(--bg-card)}.settings-panel-head{min-height:58px;display:flex;align-items:center;gap:11px;padding:13px 15px;border-bottom:var(--border-width) solid var(--border)}.settings-panel-head--actions{padding-right:10px}.settings-panel-head>div:not(.settings-panel-actions){min-width:0;flex:1}.settings-panel-head strong{display:block;color:var(--text);font-size:var(--ui-font-body, 13px);font-weight:650}.settings-panel-head p{margin:3px 0 0;color:var(--text-faint);font-size:var(--ui-font-caption, 11px);line-height:1.45}.settings-panel-icon,.settings-choice-icon,.settings-overview-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;color:var(--accent-ink);background:var(--accent-light)}.settings-panel-icon{width:30px;height:30px;border-radius:var(--radius-sm)}.settings-panel-actions{display:flex;gap:3px}.settings-panel-actions .btn{width:30px;height:30px;padding:0;justify-content:center}.settings-panel-actions--wide{align-items:center}.settings-panel-actions--wide .btn{width:auto;padding:0 10px}.settings-control-list,.settings-font-list{display:flex;flex-direction:column}.settings-control-row,.settings-font-row{min-height:56px;display:flex;align-items:center;gap:16px;padding:10px 15px}.settings-control-row+.settings-control-row,.settings-font-row+.settings-font-row{border-top:var(--border-width) solid var(--border)}.settings-control-copy{min-width:0;flex:1;display:flex;align-items:flex-start;gap:9px;color:var(--text-faint)}.settings-control-copy>span{min-width:0}.settings-control-copy strong{display:block;color:var(--text);font-size:var(--ui-font-meta, 12px);font-weight:620}.settings-control-copy small{display:block;max-width:45ch;margin-top:2px;color:var(--text-faint);font-size:var(--ui-font-caption, 11px);line-height:1.4}.settings-control-row .seg{flex:0 0 auto}.settings-row-notes{display:grid;gap:4px;padding:0 15px 12px}.settings-control-row .seg button{display:inline-flex;align-items:center;justify-content:center;gap:4px}.settings-setting-row{justify-content:space-between}.settings-row-control{flex:0 1 260px;display:flex;justify-content:flex-end;min-width:0}.settings-row-control>select,.settings-row-control>input{width:min(100%,220px)}.settings-row-wide-control{flex:0 1 410px;min-width:260px}.settings-switch{position:relative;flex:0 0 auto;width:34px;height:20px;padding:0;border:var(--border-width) solid var(--overlay-medium, rgba(127, 127, 127, .18));border-radius:var(--radius-pill, 999px);background:var(--overlay-medium);cursor:pointer;transition:border-color var(--duration-fast),background var(--duration-fast)}.settings-switch>span{position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;background:var(--bg-card);box-shadow:var(--btn-shadow);transition:transform var(--duration-fast),background var(--duration-fast)}:root[data-mode=dark] .settings-switch:not(.active)>span{background:var(--text-faint)}.settings-switch.active{border-color:var(--accent-ink);background:var(--accent-ink)}.settings-switch.active>span{transform:translate(14px);background:var(--bg-card)}.settings-switch:focus-visible{outline:var(--focus-ring) solid var(--accent-ink);outline-offset:2px}.settings-switch:disabled{cursor:not-allowed}.settings-panel-toolbar{min-height:48px;display:flex;align-items:center;gap:12px;padding:8px 15px;border-bottom:var(--border-width) solid var(--border)}.settings-panel-toolbar>span{margin-left:auto;color:var(--text-faint);font-size:var(--ui-font-caption, 11px);white-space:nowrap}.settings-panel-footer{display:flex;align-items:center;gap:10px;padding:11px 15px;border-top:var(--border-width) solid var(--border)}.settings-state{min-height:220px;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:30px;color:var(--text-faint);text-align:center}.settings-state-icon{width:42px;height:42px;display:inline-flex;align-items:center;justify-content:center;margin-bottom:12px;border-radius:var(--radius-md);background:var(--accent-light);color:var(--accent-ink)}.settings-state-icon.is-busy svg{animation:spin .9s linear infinite}.settings-state>strong{color:var(--text);font-size:var(--ui-font-body, 13px);font-weight:650}.settings-state>p{max-width:48ch;margin:6px 0 0;font-size:var(--ui-font-caption, 11px);line-height:1.5}.settings-state-actions{margin-top:14px}@media(max-width:820px){.settings-control-row{align-items:flex-start;flex-direction:column}.settings-row-control,.settings-row-wide-control{width:100%;flex-basis:auto;justify-content:flex-start;min-width:0}.settings-row-control>select,.settings-row-control>input{width:100%;max-width:none}}.seg{display:inline-flex;border:var(--border-width) solid var(--overlay-medium, rgba(127, 127, 127, .12));border-radius:var(--radius-md);overflow:hidden}.seg button{padding:5px 13px;font-size:var(--ui-font-meta, 12px);color:var(--text-muted);transition:background var(--duration-fast),color var(--duration-fast)}.seg button+button{border-left:var(--border-width) solid var(--overlay-medium, rgba(127, 127, 127, .12))}.seg button.active{background:var(--accent-light);color:var(--accent-ink)}.seg.seg-sm button{padding:3px 12px;font-size:var(--ui-font-meta, 12px)}
|