@linkdesk/ui 0.2.36 → 0.2.37

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.
@@ -0,0 +1,15 @@
1
+ /**
2
+ * E6#30.14b 壳 Badge/Capsule 基础件——小圆角徽标/胶囊(对标 VS Code badge,如详情页「内置」chip)。
3
+ * 色走既有 --badge-background/--badge-foreground(= accent/on-accent 别名,主题可经 colorway 覆盖);
4
+ * 圆角 var(--radius-sm) / 字号 var(--font-size-2xs)(硬约束 1/6)。壳只给形状基础件——
5
+ * 业务内容(文案/数据)由调用方决定(10-市场UI拥有权.md §四·二「数据自 catalog」)。
6
+ * 消费方:marketplace 详情「内置」chip(mpd-badge-core 收编,E6#30.14b)。
7
+ */
8
+ import type { ReactNode } from "react";
9
+ interface BadgeProps {
10
+ children: ReactNode;
11
+ /** 悬停提示(如完整值,超长截断场景) */
12
+ title?: string;
13
+ }
14
+ declare function Badge({ children, title }: BadgeProps): import("react").JSX.Element;
15
+ export default Badge;
@@ -0,0 +1,10 @@
1
+ export interface EffectiveBadgeProps {
2
+ /** 前缀文案(调用方 `t()` 已译,如「生效:」);缺省 = 只显值 */
3
+ label?: string;
4
+ /** 生效值原文(宿主解好);空 ⇒ 不渲染 */
5
+ value?: string;
6
+ /** 值为色值形态时给的颜色 ⇒ 行内色块(由 `formatEffectiveValue` 判定,本件不判形态) */
7
+ color?: string;
8
+ }
9
+ declare function EffectiveBadge({ label, value, color }: EffectiveBadgeProps): import("react").JSX.Element | null;
10
+ export default EffectiveBadge;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * formatEffectiveValue——生效值展示形态(纯函数,零 React 零宿主耦合)。
3
+ * E6#87d 自设置仓 `SettingsView/effectiveBadge.ts` 平移(判据 C:呈现格式化随数据显示,
4
+ * ⛔ 各家插件自算)。判定(哪把 token、跟随主题与否)住宿主;格式化(截首族/配色块)住此处
5
+ * ——设置插件、第三方面板、命令面板谁渲染都是同一个答案。
6
+ *
7
+ * 展示形态按值驱动(色值带色块,字体栈截首族),不认任何 token 键名——调用方对 token 语义零知识。
8
+ */
9
+ /** 生效值展示形态——色值带色块;字体栈截断逗号显首族(栈过长徽标只显主族名) */
10
+ export declare function formatEffectiveValue(value: string): {
11
+ label: string;
12
+ color?: string;
13
+ };
@@ -0,0 +1,47 @@
1
+ /**
2
+ * FileIconResolver——数据驱动文件图标解析器(共享服务单一副本)。E6#69g 归一化铁律。
3
+ * E4a #93:按扩展名/文件名解析图标,消费 fileIconMappings.ts 默认数据。
4
+ *
5
+ * 🔥 自 plugins/file-tree/src/services/FileIconResolver.ts 上移共享(#69g:禁 file-tree 私有双源 /
6
+ * 禁 editor 跨插件 import file-tree / 禁复制一份)。消费方:
7
+ * - 壳 windowLayout.serializeGroups——文件标签图标(随 app.iconTheme mappings 即时重算)
8
+ * - file-tree 插件——树行 + 搜索行(经 @linkdesk/ui 同源 import)
9
+ * 三方同消费同一解析器 + 同一默认表 + 同一 theme mappings → 同文件同图。
10
+ *
11
+ * v2 扩展点:customMappings 注入——图标主题插件(IconRegistry 贡献)替换全部映射。
12
+ * E5.8#133.3 双形态:class → codicon span / imagePath → linkdesk:// img(消费方按边界各自转渲染)。
13
+ *
14
+ * 形状 = core IconThemeMappings(@linkdesk/contracts 类型,零 @src/core 运行时耦合);
15
+ * 方法签名取元数据基元(文件名/是否根目录)——零插件类型耦合,任何消费方传路径基名即可解析。
16
+ */
17
+ import type { IconThemeMappings } from "@linkdesk/contracts";
18
+ /** 解析结果渲染描述符——双形态(E5.8#133 ④ 拍板:class → span / imagePath → img) */
19
+ export type IconDescriptor = {
20
+ kind: "class";
21
+ className: string;
22
+ color?: string;
23
+ } | {
24
+ kind: "image";
25
+ url: string;
26
+ };
27
+ export declare class FileIconResolver {
28
+ private _fileMap;
29
+ private _extMap;
30
+ private _folderMap;
31
+ private _folderOpenMap;
32
+ private _defaultFile?;
33
+ private _defaultFolder?;
34
+ private _defaultFolderOpen?;
35
+ private _defaultRoot?;
36
+ private _defaultRootOpen?;
37
+ constructor(custom?: IconThemeMappings);
38
+ /** 解析映射条目 → 渲染描述符(glyph → class / image → 壳解析好的 linkdesk:// url) */
39
+ private resolve;
40
+ /** 文件图标——按文件名解析(E6#69g:tab 传路径基名即可) */
41
+ getFileIcon(name: string): IconDescriptor;
42
+ /** 文件夹图标 */
43
+ getFolderIcon(name: string, isRoot: boolean): IconDescriptor;
44
+ /** 获取展开状态的文件夹图标 */
45
+ getFolderIconOpened(name: string, isRoot: boolean): IconDescriptor;
46
+ private _getExt;
47
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * 文件图标默认映射表——数据驱动,声明式。
3
+ * E4a #93:加新图标只改此文件不改解析器。对标 VS Code seti/vscode-icons 图标主题。
4
+ *
5
+ * E6#69g(14 档案批次三·归一化铁律):自 plugins/file-tree/src/utils/icon-mappings.ts 上移共享——
6
+ * 文件图标默认数据单一副本:壳 windowLayout(文件标签图标)+ file-tree(树行/搜索行)同消费。
7
+ * 图标主题插件经 IconRegistry 贡献的 IconThemeMappings 整体替换本默认表(theme 在 → theme 优先)。
8
+ */
9
+ /** 文件名精确匹配(优先级最高) */
10
+ export declare const FILE_ICON_MAP: Record<string, string>;
11
+ /** 扩展名匹配 */
12
+ export declare const EXT_ICON_MAP: Record<string, string>;
13
+ /** 文件夹名特殊匹配 */
14
+ export declare const FOLDER_ICON_MAP: Record<string, string>;
15
+ /** 默认图标(未命中任意映射/主题)——与 VS Code 默认文件图标同位 */
16
+ export declare const DEFAULT_FILE_ICON = "codicon-file";
17
+ export declare const DEFAULT_FOLDER_ICON = "codicon-folder";
18
+ export declare const DEFAULT_FOLDER_OPEN_ICON = "codicon-folder-opened";
19
+ export declare const DEFAULT_ROOT_ICON = "codicon-root-folder";
@@ -0,0 +1,36 @@
1
+ export interface HintCardProps {
2
+ /** 卡正文(1–3 句——调用方给的**用户可见句子**;⛔ 空数组 ⇒ 不出卡) */
3
+ lines: string[];
4
+ /** 卡标题(可选;如状态词本身) */
5
+ title?: string;
6
+ /** 卡页脚小字(可选;如「在你本机自动核对」这类注脚) */
7
+ note?: string;
8
+ /** 首选贴边:默认 `bottom`(标下缘);空间不足自动翻面 */
9
+ placement?: "top" | "bottom";
10
+ /** 悬停意图延时 ms(默认 400——防鼠标划过闪一下) */
11
+ openDelayMs?: number;
12
+ /** 锚元素(唯一子代;触发事件由本件挂在这个包装上,靠 React onFocus 冒泡语义) */
13
+ children: React.ReactNode;
14
+ }
15
+ /** 矩形(只取本件用得到的四元组——jsdom/真机同形) */
16
+ export interface RectLike {
17
+ top: number;
18
+ bottom: number;
19
+ left: number;
20
+ width: number;
21
+ height: number;
22
+ }
23
+ /**
24
+ * 卡的落点(**纯函数**——翻面与夹紧判据的单一实现,单测直接钉):
25
+ * 首选 `placement` 贴不下 ⇒ 翻另一面;两面都贴不下 ⇒ 夹紧到视口边缘(⛔ 不裁字)。
26
+ */
27
+ export declare function computeCardPosition(anchor: Pick<RectLike, "top" | "bottom" | "left">, card: Pick<RectLike, "width" | "height">, viewport: {
28
+ width: number;
29
+ height: number;
30
+ }, placement: "top" | "bottom"): {
31
+ top: number;
32
+ left: number;
33
+ placement: "top" | "bottom";
34
+ };
35
+ declare function HintCard({ lines, title, note, placement, openDelayMs, children }: HintCardProps): import("react").JSX.Element;
36
+ export default HintCard;
@@ -0,0 +1,15 @@
1
+ import type { TipPlacement } from "./placement";
2
+ export interface HintTipProps {
3
+ /** 提示主文案(给 `command` 时本项可省——渲染器取命令 title 当文案) */
4
+ label?: string;
5
+ /** 命令 id——自动补文案与快捷键(与右键菜单同源) */
6
+ command?: string;
7
+ /** 首选方位(缺省 `top`;贴不下自动翻面) */
8
+ placement?: TipPlacement;
9
+ /** 意图延时覆盖(ms)——揭示「被截断的字」传 `0` */
10
+ openDelayMs?: number;
11
+ /** 锚元素(**唯一子代**——属性挂到它身上,DOM 结构零变化) */
12
+ children: React.ReactElement<Record<string, unknown>>;
13
+ }
14
+ declare function HintTip({ label, command, placement, openDelayMs, children }: HintTipProps): import("react").ReactElement<Record<string, unknown>, string | import("react").JSXElementConstructor<any>>;
15
+ export default HintTip;
@@ -0,0 +1,118 @@
1
+ /**
2
+ * HintTip 落点/尖角/指针归属——**纯函数**(04「悬停提示系统」件 1;2026-09-27 落点返工版;
3
+ * 2026-09-30 补 `isPointerOnAnchor` 指针归属判据)。
4
+ *
5
+ * ── 为什么推翻初版判据(用户实机挑出的三处毛病,诊断全文见返工件 00-README §二)──
6
+ * 初版把「贴不贴得下」判成**双轴整条 fits**,于是同一个机制长出三张脸:
7
+ * ① **副轴否决主轴**——✕ 在窗口最右缘:首选 top 主轴放不下、想翻 bottom,可 bottom 的**横向**
8
+ * 也越界 ⇒ 唯一退路"翻面"被否 ⇒ 只剩夹紧 ⇒ 条被拉回来**铺在 ✕ 身上**
9
+ * (用户原话「直接盖在 × 的表面上」的真机制;⛔ 不是他猜的"居不了中所以坐标乱了"——本函数
10
+ * 从头到尾没有居中那一步);
11
+ * ② **边对齐不居中**——条与锚**左缘**对齐,而锚往往不是提示的中点(图标栏 42×42 命中框里的字形
12
+ * 只有 24×24)⇒ 条看着"悬空"(用户「图标肯定比显示它的看不见的框小一点」的那个 15px 观感);
13
+ * ③ **没有"绝不压锚"的硬保证**——夹紧是唯一兜底,而兜底方向正好是回锚。
14
+ *
15
+ * ── 现行几何约定(用户 2026-09-27 同日拍板「案 C:气泡」后的五条,改动前先读)──
16
+ * ① **`GAP_PX = 6` 不许再放大**——条与锚的归属感全靠贴紧(尖角是"补足指向"的第二只手,见 ⑤);
17
+ * ② **主轴判可贴 · 副轴居中后夹紧**——主轴只问"那一侧够不够 条长 + GAP",⛔ 副轴越界**不再**否决
18
+ * 翻面;副轴一律先与锚**中心**对齐,再夹进视口;
19
+ * ③ **绝不压锚**——落点若"离锚太近"(不只压住,连 GAP 都没保住:夹紧把条拉回锚上、尖角会插进锚里),
20
+ * 先换**同一轴的对面**(top↔bottom / left↔right),对面也不行才退回**四面里空间最大**的一侧;
21
+ * ⛔ 次序不许颠倒(2026-09-30 标签栏现场:直接跳四面临 ⇒ 宽窗口里常选中"右",条被甩到旁边轴上、
22
+ * 横着压住下一个标签;案卷 04「标签提示落到右侧挡住下一个」)。两条都照 `HintCard` 保底:
23
+ * 宁可换方位,也不盖住用户正指着的东西;
24
+ * ④ **夹紧不裁字**——仍只吐 `top/left`,尺寸由调用方原样使用(保底②,⛔ 不靠截断文字换贴合);
25
+ * ⑤ **气泡尖角**——用户同日**改判**:初版那条拍板「不要小箭头,就是一个框型」**作废**,
26
+ * 归属感从此由"贴紧 + 尖角指向"共同承担。尖角指向锚的**副轴中心**(`computeTailOffset`)。
27
+ *
28
+ * ⛔ 本函数只管"条落在哪",不管"长什么样"(样式在 `HintTip.css`、DOM 在 `HintTipRenderer.tsx`)。
29
+ */
30
+ /** 锚与条的间距(见上 ①——不许放大) */
31
+ export declare const GAP_PX = 6;
32
+ /** 视口边缘夹紧余量(同 HintCard) */
33
+ export declare const EDGE_PX = 8;
34
+ /** 尖角边长(`rotate(45deg)` 的正方形——对角线 ≈11.3px,露出约半个指向锚) */
35
+ export declare const TAIL_SIZE_PX = 8;
36
+ /** 尖角**近端外缘**距条两端的最小距离(= `--radius-sm` 4px:尖角不许压在圆角上) */
37
+ export declare const TAIL_EDGE_INSET_PX = 4;
38
+ /** 四向首选方位——`top` 为缺省(贴锚上方),主轴放不下翻反面 */
39
+ export type TipPlacement = "top" | "bottom" | "left" | "right";
40
+ /** 锚矩形(只取本件用得到的四元组——`getBoundingClientRect()` 可直接喂) */
41
+ export interface TipAnchorRect {
42
+ top: number;
43
+ bottom: number;
44
+ left: number;
45
+ right: number;
46
+ }
47
+ /** 条的实测尺寸(先渲染再量——`max-content` 宽度不预知) */
48
+ export interface TipSize {
49
+ width: number;
50
+ height: number;
51
+ }
52
+ export interface TipPosition {
53
+ top: number;
54
+ left: number;
55
+ /** 实际落点方位(可能与传入的 `placement` 不同——翻过面或被迫换边) */
56
+ placement: TipPlacement;
57
+ }
58
+ /**
59
+ * 条的落点:首选方位够放 ⇒ 采用;不够 ⇒ 翻**主轴反面**;翻面也够不着 ⇒ 取空间最大的一侧;
60
+ * 最后若"离锚太近"(夹紧把条拉回了锚上)⇒ 先换**同一轴的对面**,对面也不行才换空间最大的一侧重落。
61
+ * ⛔ 任何一步都不裁字。
62
+ *
63
+ * @param anchor 锚矩形(视口坐标——本件用 `position: fixed`,与 `getBoundingClientRect()` 同系)
64
+ * @param tip 条的**实测**尺寸(先渲染后量;本函数不估计)
65
+ * @param viewport 视口尺寸(`innerWidth/innerHeight`)
66
+ * @param placement 首选方位(`data-hint-placement` / 组件 `placement` 给的)
67
+ */
68
+ export declare function computeTipPosition(anchor: TipAnchorRect, tip: TipSize, viewport: TipSize, placement: TipPlacement): TipPosition;
69
+ /**
70
+ * 尖角沿条边的落位——**返回元素的 `left`/`top` 值**(已减半边长,即元素左上角坐标)。
71
+ *
72
+ * 方向约定(`rotate(45deg)` 的 8×8 正方形):**留哪两条边 = 指向哪**,与 `HintTip.css` 的
73
+ * `[data-tip-placement]` 四条规则**必须配套**(改一处就要改另一处,否则尖角会指歪 90°——
74
+ * 参考图里踩过这个坑,见返工件 00-README §六)。
75
+ * 落位 = 锚的**副轴中心**投影到条上,再夹进"两端各留 `half + TAIL_EDGE_INSET_PX`"的区间;
76
+ * 条太窄以至于区间反向(`hi <= lo`)时取正中——宁可尖角压圆角,也不让它跑到条外面去。
77
+ */
78
+ export declare function computeTailOffset(anchor: TipAnchorRect, tip: TipSize, pos: {
79
+ top: number;
80
+ left: number;
81
+ }, placement: TipPlacement): number;
82
+ /**
83
+ * 尖角落位该写进**哪个属性**——横条(top/bottom)沿横轴走写 `left`,竖条(left/right)写 `top`。
84
+ * 这是渲染器与 `HintTip.css` 的**共同口径**:CSS 那边只管"主轴那一侧露出来"(`bottom/top/left/right`
85
+ * 四个偏移),副轴那一维的值一律由本函数算、由渲染器内联写。
86
+ */
87
+ export declare function tailAxisOf(placement: TipPlacement): "left" | "top";
88
+ /** 视口坐标下的一个点(`PointerEvent.clientX/clientY` 直接喂——与 `getBoundingClientRect()` 同系) */
89
+ export interface TipPoint {
90
+ x: number;
91
+ y: number;
92
+ }
93
+ /**
94
+ * 「几何变了之后,指针**还在锚上**吗」——收条判据的**唯一入口**(2026-09-30 用户实机立案)。
95
+ *
96
+ * ── 为什么要有这条判据 ──
97
+ * 条的生命周期原本只有四个收条动作:移开 / 失焦 / Esc / 点下 / 拖拽,而 `scroll`・`resize` 只**重算落点**
98
+ * (设计 §六·⑥「随锚滚动/移动重算」——那半句本身没错)。漏掉的是另一半:**鼠标不动、内容滚动的时刻**,
99
+ * 指针坐标没变、是锚从指针底下走掉了——浏览器**不会**发 `pointerout`(指针没动,动的是元素),
100
+ * 于是条既收不掉、又跟着旧锚一路滚出视口(用户原话「hint-tip 反而跟着滚动容器的东西往上滚动,直到我鼠标移动一下」)。
101
+ * 判据放在"几何重算"这一个点上,一并覆盖 resize / 分栏拖拽 / 面板折叠等**同族**场景——它们都走调用方的 `follow()`。
102
+ *
103
+ * ── 为什么是命中测试,而不是 `anchor.matches(":hover")` ──
104
+ * `:hover` 的刷新时机由引擎自己的指针重算决定,**恰恰在"滚动后指针没动"这个时刻不保证已更新**
105
+ * (要拦的就是它);且 jsdom 恒为 false ⇒ 不可测。命中测试的输入全是显式的,能钉。
106
+ *
107
+ * ── 返回值三态(🔴 别把 `undefined` 当"不在锚上")──
108
+ * - `true`:指针在锚上(含其后代)⇒ 照旧跟随;
109
+ * - `false`:指针已不在锚上 ⇒ 调用方收条;
110
+ * - `undefined`:**无从判断**——没记到坐标(键盘路径、合成事件不带 `clientX`)或环境没有
111
+ * `document.elementFromPoint`(jsdom)。**调用方照旧跟随**:宁可不收,也不许凭猜误收。
112
+ *
113
+ * @param anchor 锚元素(含其后代——指针落在锚内部任何位置都算"还在锚上")
114
+ * @param point 最后已知的指针位置(`null` = 没记到)
115
+ * @param hitTest 命中测试(生产传 `document.elementFromPoint`;注入是**为了纯函数可测**——
116
+ * 本函数不读 `document`/`window`,也就无所谓运行环境)
117
+ */
118
+ export declare function isPointerOnAnchor(anchor: Element, point: TipPoint | null, hitTest: (x: number, y: number) => Element | null): boolean | undefined;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * BackgroundImagePicker——背景图选择控件(uiHint "image")。E6#87d 自设置插件搬入
3
+ * (判据 A:消费宿主声明的控件必须住在任何声明者与渲染者都取得到的层)。
4
+ *
5
+ * 原行为照抄(E5.8#50.11 / #87):对话框选图(图像扩展名过滤)→ 拷入受控存储
6
+ * (用户任选路径不可直读)→ 受控路径持久化。清除语义三态并存——「清除图片」= 回主题
7
+ * (空,presence 门控回落主题图);「无背景」= 绝对无图(显式 __none__,盖掉主题/mix 图);
8
+ * 路径区显示友好态文案(跟随主题/无背景)。
9
+ *
10
+ * 🔴 能力注入式(本案 02 E12):共享件**不得**直接调 `window.linkdesk`——选图与入库两步由使用方
11
+ * 经 props 注入(onPick / onImport);清除/复位是纯值写入,留在件内。文案自持
12
+ * (useTranslation,同 FontFamilySelect 先例)——三个键均在随包种子字典内。
13
+ */
14
+ export interface BackgroundImagePickerProps {
15
+ value: string;
16
+ onChange: (value: unknown) => void;
17
+ /** 打开图片选择对话框(标题/过滤器由使用方决定);取消返回 null */
18
+ onPick: () => Promise<string | null | undefined>;
19
+ /** 把 onPick 给的路径拷入受控存储,返回受控路径;失败/取消返回 null */
20
+ onImport: (pickedPath: string) => Promise<string | null | undefined>;
21
+ }
22
+ declare function BackgroundImagePicker({ value, onChange, onPick, onImport }: BackgroundImagePickerProps): import("react").JSX.Element;
23
+ export default BackgroundImagePicker;
package/dist/index.css CHANGED
@@ -1 +1 @@
1
- .ldk-badge{display:inline-flex;align-items:center;background:var(--badge-background);color:var(--badge-foreground);border-radius:var(--radius-sm);padding:1px 6px;font-size:var(--font-size-2xs);font-weight:500;line-height:1.4;white-space:nowrap;flex-shrink:0}.ldk-mdv{color:var(--text-primary);font-size:var(--font-size-md);line-height:1.6;overflow-wrap:break-word}.ldk-mdv>:first-child{margin-top:0}.ldk-mdv>:last-child{margin-bottom:0}.ldk-mdv h1,.ldk-mdv h2,.ldk-mdv h3,.ldk-mdv h4,.ldk-mdv h5,.ldk-mdv h6{color:var(--text-primary);font-weight:600;line-height:1.25;margin:1.2em 0 .5em}.ldk-mdv h1{font-size:var(--font-size-2xl);padding-bottom:.3em;border-bottom:1px solid var(--border)}.ldk-mdv h2{font-size:var(--font-size-xl);padding-bottom:.3em;border-bottom:1px solid var(--border)}.ldk-mdv h3{font-size:var(--font-size-lg)}.ldk-mdv h4{font-size:var(--font-size-md)}.ldk-mdv h5,.ldk-mdv h6{font-size:var(--font-size-sm);color:var(--text-secondary)}.ldk-mdv p{margin:.6em 0}.ldk-mdv ul,.ldk-mdv ol{margin:.6em 0;padding-left:1.6em}.ldk-mdv li{margin:.25em 0}.ldk-mdv li>p{margin:.3em 0}.ldk-mdv hr{border:none;border-top:1px solid var(--border);margin:1.2em 0}.ldk-mdv blockquote{margin:.8em 0;padding:.1em 1em;border-left:3px solid var(--accent);background:var(--bg-input);color:var(--text-secondary)}.ldk-mdv blockquote>:first-child{margin-top:.6em}.ldk-mdv blockquote>:last-child{margin-bottom:.6em}.ldk-mdv a{color:var(--accent);text-decoration:none}.ldk-mdv a:hover{text-decoration:underline}.ldk-mdv code{font-family:var(--font-mono);font-size:.9em;background:var(--bg-input);border-radius:var(--radius-xs);padding:.15em .4em}.ldk-mdv pre{margin:.8em 0;padding:.8em 1em;background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-md);overflow:auto}.ldk-mdv pre code{background:transparent;padding:0;font-size:var(--font-size-sm);border-radius:0}.ldk-mdv table{border-collapse:collapse;margin:.8em 0;width:max-content;max-width:100%;font-size:var(--font-size-sm)}.ldk-mdv th,.ldk-mdv td{border:1px solid var(--border);padding:.35em .8em}.ldk-mdv th{font-weight:600;background:var(--bg-input)}.ldk-mdv img{max-width:100%;height:auto;border-radius:var(--radius-sm)}.ldk-mdv video,.ldk-mdv iframe{max-width:100%}.ldk-mdv input[type=checkbox]{margin-right:.4em;vertical-align:middle;accent-color:var(--accent)}.ldk-mdv del{color:var(--text-muted)}.ldk-button{background:var(--accent);color:var(--text-on-accent);border:1px solid transparent;border-radius:var(--radius-sm);padding:4px 12px;font-size:var(--font-size-sm);cursor:pointer;white-space:nowrap}.ldk-button:hover:not(:disabled){opacity:.85}.ldk-button:disabled{opacity:.5;cursor:default}.ldk-button--sm{display:inline-flex;align-items:center;height:22px;padding:0 12px;font-size:var(--font-size-xs)}.ldk-button--success{background:var(--success);border-color:var(--success);color:var(--badge-text)}.ldk-button--ghost{background:transparent;border-color:var(--separator);color:var(--text-secondary)}.ldk-button--ghost:hover:not(:disabled){background:var(--hover-overlay);color:var(--text-primary);opacity:1}.ldk-button--danger{background:transparent;border-color:color-mix(in srgb,var(--danger) 45%,transparent);color:var(--danger)}.ldk-button--danger:hover:not(:disabled){background:color-mix(in srgb,var(--danger) 10%,transparent);border-color:color-mix(in srgb,var(--danger) 75%,transparent);opacity:1}.ldk-colorpicker-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--z-overlay-backdrop)}.ldk-colorpicker-panel{position:fixed;z-index:var(--z-overlay);background:var(--bg-window);border:1px solid var(--separator);border-radius:var(--radius-md);padding:12px;box-shadow:var(--shadow-float);display:flex;flex-wrap:wrap;width:232px;gap:8px;top:50%;left:50%;transform:translate(-50%,-50%)}.ldk-colorpicker-panel[style]{transform:none}.ldk-colorpicker-sv{width:180px;height:150px;border-radius:var(--radius-sm);position:relative;cursor:crosshair;overflow:hidden;-webkit-user-select:none;user-select:none}.ldk-colorpicker-sv-white{position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(to right,#fff,transparent)}.ldk-colorpicker-sv-black{position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(to top,#000,transparent)}.ldk-colorpicker-sv-cursor{position:absolute;width:10px;height:10px;border:2px solid #fff;border-radius:var(--radius-full);box-shadow:var(--shadow-tiny);transform:translate(-50%,-50%);pointer-events:none}.ldk-colorpicker-hue{width:180px;height:14px;border-radius:var(--radius-md);position:relative;cursor:pointer;-webkit-user-select:none;user-select:none;background:linear-gradient(to right,red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.ldk-colorpicker-hue-cursor{position:absolute;top:-2px;width:4px;height:18px;background:#fff;border-radius:var(--radius-xs);box-shadow:var(--shadow-tiny);transform:translate(-50%);pointer-events:none}.ldk-colorpicker-footer{display:flex;align-items:center;gap:6px;width:100%}.ldk-colorpicker-preview{width:28px;height:28px;border-radius:var(--radius-sm);border:1px solid var(--separator);flex-shrink:0}.ldk-colorpicker-hex{flex:1;min-width:0;height:calc(26px * var(--ui-scale));padding:2px 6px;border:1px solid var(--separator);border-radius:var(--radius-sm);background:var(--bg-input);color:var(--text-primary);font-family:var(--font-mono);font-size:var(--font-size-sm);outline:none;box-sizing:border-box}.ldk-colorpicker-hex:focus{border-color:var(--accent)}.ldk-colorpicker-ok{height:calc(26px * var(--ui-scale));padding:0 12px;background:var(--accent);color:var(--text-on-accent);border:none;border-radius:var(--radius-sm);font-size:var(--font-size-sm);cursor:pointer;flex-shrink:0}.ldk-colorpicker-ok:hover{background:var(--accent-hover)}.ldk-colorpicker-presets{width:100%;display:flex;gap:6px;flex-wrap:wrap;padding-top:4px;border-top:1px solid var(--separator)}.ldk-colorpicker-preset{width:18px;height:18px;border-radius:var(--radius-full);border:1px solid var(--separator);cursor:pointer;transition:transform .1s}.ldk-colorpicker-preset:hover{transform:scale(1.2);border-color:var(--accent)}.ldk-combobox{position:relative;display:inline-block;min-width:100px}.ldk-combobox-field{display:flex;align-items:center;gap:4px;padding:3px 6px;background:var(--bg-input);color:var(--text-primary);border:1px solid var(--border);border-radius:var(--radius-xs);font-size:var(--font-size-md);line-height:1.6;cursor:text}.ldk-combobox-field:hover:not(.ldk-selectbox-disabled){border-color:var(--accent)}.ldk-combobox.ldk-selectbox-open .ldk-combobox-field{border-color:var(--accent)}.ldk-combobox .ldk-selectbox-arrow{cursor:pointer}.ldk-combobox-field:focus-within{border-color:var(--accent)}.ldk-combobox-input{flex:1;min-width:0;padding:0;background:transparent;border:none;outline:none;color:inherit;font:inherit;line-height:1.6}.ldk-combobox-input::placeholder{color:var(--text-muted)}.ldk-combobox-input:disabled{opacity:.5}.ldk-selectbox{position:relative;display:inline-block;min-width:100px;-webkit-user-select:none;user-select:none}.ldk-selectbox-trigger{display:flex;align-items:center;justify-content:space-between;gap:4px;width:100%;padding:3px 6px;background:var(--bg-input);color:var(--text-primary);border:1px solid var(--border);border-radius:var(--radius-xs);font-size:var(--font-size-md);line-height:1.6;cursor:pointer;font-family:inherit;text-align:left}.ldk-selectbox-trigger:hover:not(:disabled){border-color:var(--accent)}.ldk-selectbox-trigger:disabled{opacity:.5;cursor:default}.ldk-selectbox-open .ldk-selectbox-trigger{border-color:var(--accent)}.ldk-selectbox-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ldk-selectbox-swatch{display:inline-block;width:10px;height:10px;margin-right:5px;border-radius:50%;border:1px solid color-mix(in srgb,var(--text-primary) 35%,transparent);vertical-align:middle;flex-shrink:0}.ldk-selectbox-arrow{flex-shrink:0;font-size:var(--font-size-sm);transition:transform .15s ease}.ldk-selectbox-arrow-up{transform:rotate(180deg)}.ldk-selectbox-dropdown{position:absolute;top:100%;left:0;margin-top:2px;background:var(--bg-window);border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-pop);overflow:hidden;z-index:var(--z-dropdown);max-height:260px;max-width:calc(100vw - 24px);display:flex;flex-direction:column;animation:ldk-selectbox-in .1s ease-out}@keyframes ldk-selectbox-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.ldk-selectbox-search{padding:4px;border-bottom:1px solid var(--separator)}.ldk-selectbox-search-input{width:100%;padding:2px 6px;background:var(--bg-input);color:var(--text-primary);border:1px solid var(--border);border-radius:var(--radius-xs);font-size:var(--font-size-sm);font-family:inherit;outline:none;box-sizing:border-box}.ldk-selectbox-search-input:focus{border-color:var(--accent)}.ldk-selectbox-list{list-style:none;margin:0;padding:2px 0;overflow-y:auto;outline:none}.ldk-selectbox-item{padding:3px 8px;font-size:var(--font-size-md);line-height:1.6;color:var(--text-primary);cursor:pointer}.ldk-selectbox-item-focus{background:var(--accent);color:var(--text-on-accent)}.ldk-selectbox-item-selected:not(.ldk-selectbox-item-focus){background:var(--bg-selection)}.ldk-selectbox-empty{padding:6px 8px;font-size:var(--font-size-sm);color:var(--text-muted);text-align:center}.ldk-selectbox-disabled{pointer-events:none}.ldk-keybinding-hint{display:inline-flex;align-items:center;gap:3px}.ldk-keybinding-hint-chord{display:inline-flex;align-items:center}.ldk-keybinding-hint-chord--spaced{margin-left:6px}.ldk-keybinding-hint kbd{display:inline-block;padding:1px 5px;font-size:var(--font-size-2xs);font-family:var(--font-mono);background:var(--kbd-bg);border:1px solid var(--kbd-border);border-radius:var(--radius-sm);line-height:1.5}.ldk-keybinding-hint-sep{opacity:.4;margin:0 1px}.ldk-ctx-menu{position:fixed;min-width:140px;max-width:280px;background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-hairline),var(--context-menu-shadow);padding:4px 0;overflow:hidden;outline:none;opacity:0;transform:scale(.96);transform-origin:top left;transition:opacity .15s ease-out,transform .15s ease-out}.ldk-ctx-menu:focus-visible{outline:none}.ldk-ctx-menu.show{opacity:1;transform:scale(1)}.ldk-ctx-item{display:flex;align-items:center;gap:8px;padding:6px 12px;font-size:var(--font-size-md);font-weight:400;line-height:1.6;color:var(--text-primary);cursor:pointer;transition:background 60ms;-webkit-user-select:none;user-select:none}.ldk-ctx-item:hover,.ldk-ctx-item.focused{background:var(--tab-hover-bg);color:var(--text-primary);box-shadow:inset 2px 0 0 var(--accent)}.ldk-ctx-item-icon{flex-shrink:0;width:calc(16px * var(--ui-scale));height:calc(16px * var(--ui-scale));font-size:var(--font-size-lg);display:flex;align-items:center;justify-content:center;opacity:.75}.ldk-ctx-item:hover .ldk-ctx-item-icon,.ldk-ctx-item.focused .ldk-ctx-item-icon{opacity:1;color:var(--accent)}.ldk-ctx-item-shortcut{flex-shrink:0;margin-left:12px}.ldk-ctx-item-check{flex-shrink:0;width:16px;font-size:var(--font-size-sm);color:var(--accent);display:flex;align-items:center}.ldk-ctx-item-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ldk-ctx-divider{height:1px;background:var(--separator);margin:4px 12px}.ldk-ctx-item-danger{color:var(--danger)}.ldk-ctx-item-danger .ldk-ctx-item-icon{opacity:1}.ldk-ctx-item-danger:hover,.ldk-ctx-item-danger.focused{background:var(--tab-hover-bg);color:var(--danger);box-shadow:inset 2px 0 0 var(--danger)}.ldk-form-row{display:flex;align-items:center;gap:8px;margin-bottom:6px;font-size:var(--font-size-sm);color:var(--text-primary)}.ldk-form-row>label,.ldk-form-row>.form-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ldk-form-row>.ldk-toggle,.ldk-form-row>.ldk-input,.ldk-form-row>select,.ldk-form-row>.form-control{flex-shrink:0}.ldk-hint-card-host{display:inline-flex}.ldk-hint-card{position:fixed;z-index:var(--z-dropdown);width:300px;box-sizing:border-box;padding:12px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-window);box-shadow:var(--shadow-pop);pointer-events:none}.ldk-hint-card-title{margin-bottom:4px;font-size:var(--font-size-sm);font-weight:600;color:var(--text-primary)}.ldk-hint-card p{margin:0 0 4px;font-size:var(--font-size-sm);color:var(--text-secondary);line-height:1.7}.ldk-hint-card-note{margin-top:8px;padding-top:8px;border-top:1px solid var(--border);font-size:var(--font-size-xs);color:var(--text-muted)}.ldk-number-input{display:inline-flex;align-items:center;gap:0}.ldk-number-input-btn{display:flex;align-items:center;justify-content:center;width:calc(22px * var(--ui-scale));height:calc(24px * var(--ui-scale));padding:0;border:1px solid var(--border);background:var(--bg-input);color:var(--text-primary);font-size:var(--font-size-lg);line-height:1;cursor:pointer;transition:background .15s,border-color .15s;-webkit-user-select:none;user-select:none}.ldk-number-input-btn:first-child{border-radius:var(--radius-sm) 0 0 var(--radius-sm);border-right:none}.ldk-number-input-btn:last-child{border-radius:0 var(--radius-sm) var(--radius-sm) 0;border-left:none}.ldk-number-input-btn:hover:not(:disabled){background:var(--tab-hover-bg)}.ldk-number-input-btn:active:not(:disabled){background:var(--accent);color:var(--text-on-accent)}.ldk-number-input-btn:disabled{opacity:.3;cursor:default}.ldk-number-input-field{border-radius:0;text-align:center;width:44px}.ldk-number-input-unit{margin:0 6px 0 8px;color:var(--text-muted);font-size:var(--font-size-sm);line-height:1;-webkit-user-select:none;user-select:none}.ldk-readonly-text{font-family:var(--font-mono);font-size:var(--font-size-2xs);color:var(--text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ldk-readonly-text.multiline{font-family:inherit;white-space:pre-wrap;overflow:visible;text-overflow:unset;line-height:1.6}.ldk-section-subtitle{font-size:var(--font-size-2xs);color:var(--text-muted);line-height:1.6;margin-bottom:8px}.ldk-segmented-radio{display:flex;gap:4px}.ldk-segmented-radio__option{display:flex;flex-direction:column;align-items:center;gap:4px;padding:4px 8px;background:transparent;border:1px solid var(--separator);border-radius:var(--radius-sm);cursor:pointer;transition:border-color .12s ease,background .12s ease}.ldk-segmented-radio__option:hover{border-color:var(--text-muted);background:var(--hover-overlay)}.ldk-segmented-radio__option:focus-visible{outline:1px solid var(--accent);outline-offset:1px}.ldk-segmented-radio__option.is-selected{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,transparent)}.ldk-segmented-radio__label{font-size:var(--font-size-sm);color:var(--text-secondary);white-space:nowrap}.ldk-segmented-radio__option.is-selected .ldk-segmented-radio__label{color:var(--text-primary)}.ldk-slider{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:130px;height:4px;margin:0;border-radius:var(--radius-sm);background:linear-gradient(to right,var(--accent) var(--slider-pct, 0%),var(--border) var(--slider-pct, 0%));cursor:pointer;outline-offset:4px}.ldk-slider:disabled{opacity:.4;cursor:default}.ldk-slider::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:12px;height:12px;border-radius:50%;background:var(--text-primary);box-shadow:var(--shadow-tiny);cursor:grab}.ldk-slider::-webkit-slider-thumb:active{cursor:grabbing}.ldk-slider-root{--slider-gap: calc(6px * var(--ui-scale));--slider-btn: calc(20px * var(--ui-scale));display:inline-grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;column-gap:var(--slider-gap);row-gap:calc(2px * var(--ui-scale));max-width:100%}.ldk-slider-value{min-width:calc(44px * var(--ui-scale));font-size:calc(var(--font-size-sm) * var(--ui-scale));font-variant-numeric:tabular-nums;color:var(--text-secondary);white-space:nowrap;-webkit-user-select:none;user-select:none}.ldk-slider-step{width:var(--slider-btn);height:var(--slider-btn);display:inline-flex;align-items:center;justify-content:center;padding:0;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-input);color:var(--text-primary);cursor:pointer}.ldk-slider-step svg{width:calc(10px * var(--ui-scale));height:calc(10px * var(--ui-scale));display:block}.ldk-slider-step:hover:not(:disabled){border-color:var(--accent)}.ldk-slider-step:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.ldk-slider-step:disabled{opacity:.4;cursor:default}.ldk-slider-root[data-pos=after]{grid-template-columns:auto minmax(0,1fr) auto auto}.ldk-slider-root[data-pos=after] .ldk-slider-step[data-dir="-1"]{grid-row:1;grid-column:1}.ldk-slider-root[data-pos=after] .ldk-slider{grid-row:1;grid-column:2}.ldk-slider-root[data-pos=after] .ldk-slider-step[data-dir="1"]{grid-row:1;grid-column:3}.ldk-slider-root[data-pos=after] .ldk-slider-value{grid-row:1;grid-column:4}.ldk-slider-root[data-pos=before]{grid-template-columns:auto auto minmax(0,1fr) auto}.ldk-slider-root[data-pos=before] .ldk-slider-value{grid-row:1;grid-column:1}.ldk-slider-root[data-pos=before] .ldk-slider-step[data-dir="-1"]{grid-row:1;grid-column:2}.ldk-slider-root[data-pos=before] .ldk-slider{grid-row:1;grid-column:3}.ldk-slider-root[data-pos=before] .ldk-slider-step[data-dir="1"]{grid-row:1;grid-column:4}.ldk-slider-root[data-pos=above] .ldk-slider-value,.ldk-slider-root[data-pos=below] .ldk-slider-value{grid-column:2;min-width:0;justify-self:center;text-align:center}.ldk-slider-root[data-pos=above] .ldk-slider-value{grid-row:1}.ldk-slider-root[data-pos=above] .ldk-slider-step[data-dir="-1"]{grid-row:2;grid-column:1}.ldk-slider-root[data-pos=above] .ldk-slider{grid-row:2;grid-column:2}.ldk-slider-root[data-pos=above] .ldk-slider-step[data-dir="1"]{grid-row:2;grid-column:3}.ldk-slider-root[data-pos=below] .ldk-slider-step[data-dir="-1"]{grid-row:1;grid-column:1}.ldk-slider-root[data-pos=below] .ldk-slider{grid-row:1;grid-column:2}.ldk-slider-root[data-pos=below] .ldk-slider-step[data-dir="1"]{grid-row:1;grid-column:3}.ldk-slider-root[data-pos=below] .ldk-slider-value{grid-row:2}.ldk-slider-root[data-stepper=false][data-pos=after]{grid-template-columns:minmax(0,1fr) auto}.ldk-slider-root[data-stepper=false][data-pos=after] .ldk-slider{grid-row:1;grid-column:1}.ldk-slider-root[data-stepper=false][data-pos=after] .ldk-slider-value{grid-row:1;grid-column:2}.ldk-slider-root[data-stepper=false][data-pos=before]{grid-template-columns:auto minmax(0,1fr)}.ldk-slider-root[data-stepper=false][data-pos=before] .ldk-slider-value{grid-row:1;grid-column:1}.ldk-slider-root[data-stepper=false][data-pos=before] .ldk-slider{grid-row:1;grid-column:2}.ldk-slider-root[data-stepper=false][data-pos=above] .ldk-slider-value,.ldk-slider-root[data-stepper=false][data-pos=below] .ldk-slider-value,.ldk-slider-root[data-stepper=false][data-pos=above] .ldk-slider,.ldk-slider-root[data-stepper=false][data-pos=below] .ldk-slider{grid-column:1}.ldk-sle{display:flex;flex-direction:column;gap:4px;width:100%}.ldk-sle-row{display:flex;align-items:center;gap:6px;min-height:calc(24px * var(--ui-scale, 1));width:100%;box-sizing:border-box}.ldk-sle-glyph{font-size:var(--font-size-sm);color:var(--text-muted);flex-shrink:0}.ldk-sle-url{flex:1;min-width:0;font-family:var(--font-mono);font-size:var(--font-size-xs);color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ldk-sle-badge{flex-shrink:0;font-size:var(--font-size-2xs);color:var(--text-muted);background:var(--bg-window);padding:1px 4px;border-radius:3px;white-space:nowrap}.ldk-sle-lock{font-size:var(--font-size-sm);color:var(--text-muted);flex-shrink:0}.ldk-sle-del{display:flex;align-items:center;justify-content:center;width:calc(24px * var(--ui-scale, 1));height:calc(24px * var(--ui-scale, 1));padding:0;background:transparent;border:none;border-radius:3px;color:var(--text-muted);cursor:pointer;font-size:var(--font-size-sm);flex-shrink:0;transition:color .15s ease,background .15s ease}.ldk-sle-del:hover{color:var(--error);background:var(--hover-overlay)}.ldk-sle-add-row{display:flex;align-items:center;gap:6px;width:100%}.ldk-sle-input{flex:1;min-width:0;box-sizing:border-box;background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-sm);padding:4px 8px;color:var(--text-primary);font-family:var(--font-mono);font-size:var(--font-size-xs);transition:border-color .15s;outline:none}.ldk-sle-input:focus{border-color:var(--accent)}.ldk-sle-add-btn{flex-shrink:0;padding:3px 8px;border:1px solid var(--separator);border-radius:4px;background:transparent;color:var(--text-primary);cursor:pointer;font-size:var(--font-size-xs);font-family:inherit;white-space:nowrap}.ldk-sle-add-btn:hover:not(:disabled){background:var(--tab-hover-bg)}.ldk-sle-add-btn:disabled{opacity:.5;cursor:not-allowed}.ldk-sle-msg{display:block;font-size:var(--font-size-2xs);line-height:1.5;padding:0 2px}.ldk-sle-msg--error{color:var(--error)}.ldk-sle-msg--hint{color:var(--text-muted)}.ldk-theme-picker{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;width:100%}.ldk-theme-picker-card{border:1px solid var(--border);border-radius:var(--radius-lg);overflow:hidden;cursor:pointer;background:var(--bg-card);padding:0;text-align:left;color:inherit;font:inherit;transition:border-color .15s ease,transform .15s ease}.ldk-theme-picker-card:hover{border-color:var(--separator);transform:translateY(-1px)}.ldk-theme-picker-card:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.ldk-theme-picker-card.active{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}.ldk-theme-picker-preview{height:44px;display:flex;align-items:center;gap:3px;padding:8px;overflow:hidden}.ldk-theme-picker-preview .ldk-theme-picker-preview-bar{width:26px;height:12px;border-radius:var(--radius-xs)}.ldk-theme-picker-preview .ldk-theme-picker-preview-dots{display:flex;gap:3px}.ldk-theme-picker-preview .ldk-theme-picker-preview-dot{width:12px;height:12px;border-radius:50%;border:1px solid color-mix(in srgb,var(--text-primary) 35%,transparent)}.ldk-theme-picker-card .ldk-theme-picker-name{padding:6px 8px;font-size:var(--font-size-xs);color:var(--text-secondary);display:flex;align-items:center;justify-content:space-between;gap:4px;overflow:hidden}.ldk-theme-picker-card.active .ldk-theme-picker-name{color:var(--text-primary)}.ldk-theme-picker-card .ldk-theme-picker-name-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ldk-theme-picker-card .ldk-theme-picker-badge{font-size:var(--font-size-2xs);color:var(--accent);white-space:nowrap}.ldk-theme-picker-empty{color:var(--text-muted);font-size:var(--font-size-sm);padding:8px 0}.ldk-toggle{width:36px;height:20px;border-radius:var(--radius-pill);background:var(--border);transition:background .15s;cursor:pointer;position:relative;flex-shrink:0}.ldk-toggle.on{background:var(--accent)}.ldk-toggle:after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:var(--radius-pill);background:var(--toggle-knob);transition:transform .15s}.ldk-toggle.on:after{transform:translate(16px);background:var(--toggle-knob-on, var(--text-on-accent))}.ldk-toggle.disabled{opacity:.4;cursor:not-allowed}.ldk-inline-input{border:1px solid var(--border);background:var(--bg-input);color:var(--text-primary);font-family:inherit;outline:none;box-sizing:border-box;width:100%;transition:border-color .15s ease-out,box-shadow .15s ease-out}.ldk-inline-input:focus{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}.ldk-inline-input--compact{height:calc(22px * var(--ui-scale));font-size:var(--font-size-sm);padding:0 4px}.ldk-inline-input--normal{height:calc(32px * var(--ui-scale));font-size:var(--font-size-md);padding:0 8px}
1
+ .ldk-badge{display:inline-flex;align-items:center;background:var(--badge-background);color:var(--badge-foreground);border-radius:var(--radius-sm);padding:1px 6px;font-size:var(--font-size-2xs);font-weight:500;line-height:1.4;white-space:nowrap;flex-shrink:0}.ldk-mdv{color:var(--text-primary);font-size:var(--font-size-md);line-height:1.6;overflow-wrap:break-word}.ldk-mdv>:first-child{margin-top:0}.ldk-mdv>:last-child{margin-bottom:0}.ldk-mdv h1,.ldk-mdv h2,.ldk-mdv h3,.ldk-mdv h4,.ldk-mdv h5,.ldk-mdv h6{color:var(--text-primary);font-weight:600;line-height:1.25;margin:1.2em 0 .5em}.ldk-mdv h1{font-size:var(--font-size-2xl);padding-bottom:.3em;border-bottom:1px solid var(--border)}.ldk-mdv h2{font-size:var(--font-size-xl);padding-bottom:.3em;border-bottom:1px solid var(--border)}.ldk-mdv h3{font-size:var(--font-size-lg)}.ldk-mdv h4{font-size:var(--font-size-md)}.ldk-mdv h5,.ldk-mdv h6{font-size:var(--font-size-sm);color:var(--text-secondary)}.ldk-mdv p{margin:.6em 0}.ldk-mdv ul,.ldk-mdv ol{margin:.6em 0;padding-left:1.6em}.ldk-mdv li{margin:.25em 0}.ldk-mdv li>p{margin:.3em 0}.ldk-mdv hr{border:none;border-top:1px solid var(--border);margin:1.2em 0}.ldk-mdv blockquote{margin:.8em 0;padding:.1em 1em;border-left:3px solid var(--accent);background:var(--bg-input);color:var(--text-secondary)}.ldk-mdv blockquote>:first-child{margin-top:.6em}.ldk-mdv blockquote>:last-child{margin-bottom:.6em}.ldk-mdv a{color:var(--accent);text-decoration:none}.ldk-mdv a:hover{text-decoration:underline}.ldk-mdv code{font-family:var(--font-mono);font-size:.9em;background:var(--bg-input);border-radius:var(--radius-xs);padding:.15em .4em}.ldk-mdv pre{margin:.8em 0;padding:.8em 1em;background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-md);overflow:auto}.ldk-mdv pre code{background:transparent;padding:0;font-size:var(--font-size-sm);border-radius:0}.ldk-mdv table{border-collapse:collapse;margin:.8em 0;width:max-content;max-width:100%;font-size:var(--font-size-sm)}.ldk-mdv th,.ldk-mdv td{border:1px solid var(--border);padding:.35em .8em}.ldk-mdv th{font-weight:600;background:var(--bg-input)}.ldk-mdv img{max-width:100%;height:auto;border-radius:var(--radius-sm)}.ldk-mdv video,.ldk-mdv iframe{max-width:100%}.ldk-mdv input[type=checkbox]{margin-right:.4em;vertical-align:middle;accent-color:var(--accent)}.ldk-mdv del{color:var(--text-muted)}.ldk-button{background:var(--accent);color:var(--text-on-accent);border:1px solid transparent;border-radius:var(--radius-sm);padding:4px 12px;font-size:var(--font-size-sm);cursor:pointer;white-space:nowrap}.ldk-button:hover:not(:disabled){opacity:.85}.ldk-button:disabled{opacity:.5;cursor:default}.ldk-button--sm{display:inline-flex;align-items:center;height:22px;padding:0 12px;font-size:var(--font-size-xs)}.ldk-button--success{background:var(--success);border-color:var(--success);color:var(--badge-text)}.ldk-button--ghost{background:transparent;border-color:var(--separator);color:var(--text-secondary)}.ldk-button--ghost:hover:not(:disabled){background:var(--hover-overlay);color:var(--text-primary);opacity:1}.ldk-button--danger{background:transparent;border-color:color-mix(in srgb,var(--danger) 45%,transparent);color:var(--danger)}.ldk-button--danger:hover:not(:disabled){background:color-mix(in srgb,var(--danger) 10%,transparent);border-color:color-mix(in srgb,var(--danger) 75%,transparent);opacity:1}.ldk-colorpicker-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--z-overlay-backdrop)}.ldk-colorpicker-panel{position:fixed;z-index:var(--z-overlay);background:var(--bg-window);border:1px solid var(--separator);border-radius:var(--radius-md);padding:12px;box-shadow:var(--shadow-float);display:flex;flex-wrap:wrap;width:232px;gap:8px;top:50%;left:50%;transform:translate(-50%,-50%)}.ldk-colorpicker-panel[style]{transform:none}.ldk-colorpicker-sv{width:180px;height:150px;border-radius:var(--radius-sm);position:relative;cursor:crosshair;overflow:hidden;-webkit-user-select:none;user-select:none}.ldk-colorpicker-sv-white{position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(to right,#fff,transparent)}.ldk-colorpicker-sv-black{position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(to top,#000,transparent)}.ldk-colorpicker-sv-cursor{position:absolute;width:10px;height:10px;border:2px solid #fff;border-radius:var(--radius-full);box-shadow:var(--shadow-tiny);transform:translate(-50%,-50%);pointer-events:none}.ldk-colorpicker-hue{width:180px;height:14px;border-radius:var(--radius-md);position:relative;cursor:pointer;-webkit-user-select:none;user-select:none;background:linear-gradient(to right,red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.ldk-colorpicker-hue-cursor{position:absolute;top:-2px;width:4px;height:18px;background:#fff;border-radius:var(--radius-xs);box-shadow:var(--shadow-tiny);transform:translate(-50%);pointer-events:none}.ldk-colorpicker-footer{display:flex;align-items:center;gap:6px;width:100%}.ldk-colorpicker-preview{width:28px;height:28px;border-radius:var(--radius-sm);border:1px solid var(--separator);flex-shrink:0}.ldk-colorpicker-hex{flex:1;min-width:0;height:calc(26px * var(--ui-scale));padding:2px 6px;border:1px solid var(--separator);border-radius:var(--radius-sm);background:var(--bg-input);color:var(--text-primary);font-family:var(--font-mono);font-size:var(--font-size-sm);outline:none;box-sizing:border-box}.ldk-colorpicker-hex:focus{border-color:var(--accent)}.ldk-colorpicker-ok{height:calc(26px * var(--ui-scale));padding:0 12px;background:var(--accent);color:var(--text-on-accent);border:none;border-radius:var(--radius-sm);font-size:var(--font-size-sm);cursor:pointer;flex-shrink:0}.ldk-colorpicker-ok:hover{background:var(--accent-hover)}.ldk-colorpicker-presets{width:100%;display:flex;gap:6px;flex-wrap:wrap;padding-top:4px;border-top:1px solid var(--separator)}.ldk-colorpicker-preset{width:18px;height:18px;border-radius:var(--radius-full);border:1px solid var(--separator);cursor:pointer;transition:transform .1s}.ldk-colorpicker-preset:hover{transform:scale(1.2);border-color:var(--accent)}.ldk-combobox{position:relative;display:inline-block;min-width:100px}.ldk-combobox-field{display:flex;align-items:center;gap:4px;padding:3px 6px;background:var(--bg-input);color:var(--text-primary);border:1px solid var(--border);border-radius:var(--radius-xs);font-size:var(--font-size-md);line-height:1.6;cursor:text}.ldk-combobox-field:hover:not(.ldk-selectbox-disabled){border-color:var(--accent)}.ldk-combobox.ldk-selectbox-open .ldk-combobox-field{border-color:var(--accent)}.ldk-combobox .ldk-selectbox-arrow{cursor:pointer}.ldk-combobox-field:focus-within{border-color:var(--accent)}.ldk-combobox-input{flex:1;min-width:0;padding:0;background:transparent;border:none;outline:none;color:inherit;font:inherit;line-height:1.6}.ldk-combobox-input::placeholder{color:var(--text-muted)}.ldk-combobox-input:disabled{opacity:.5}.ldk-selectbox{position:relative;display:inline-block;min-width:100px;-webkit-user-select:none;user-select:none}.ldk-selectbox-trigger{display:flex;align-items:center;justify-content:space-between;gap:4px;width:100%;padding:3px 6px;background:var(--bg-input);color:var(--text-primary);border:1px solid var(--border);border-radius:var(--radius-xs);font-size:var(--font-size-md);line-height:1.6;cursor:pointer;font-family:inherit;text-align:left}.ldk-selectbox-trigger:hover:not(:disabled){border-color:var(--accent)}.ldk-selectbox-trigger:disabled{opacity:.5;cursor:default}.ldk-selectbox-open .ldk-selectbox-trigger{border-color:var(--accent)}.ldk-selectbox-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ldk-selectbox-swatch{display:inline-block;width:10px;height:10px;margin-right:5px;border-radius:50%;border:1px solid color-mix(in srgb,var(--text-primary) 35%,transparent);vertical-align:middle;flex-shrink:0}.ldk-selectbox-arrow{flex-shrink:0;font-size:var(--font-size-sm);transition:transform .15s ease}.ldk-selectbox-arrow-up{transform:rotate(180deg)}.ldk-selectbox-dropdown{position:absolute;top:100%;left:0;margin-top:2px;background:var(--bg-window);border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-pop);overflow:hidden;z-index:var(--z-dropdown);max-height:260px;max-width:calc(100vw - 24px);display:flex;flex-direction:column;animation:ldk-selectbox-in .1s ease-out}@keyframes ldk-selectbox-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.ldk-selectbox-search{padding:4px;border-bottom:1px solid var(--separator)}.ldk-selectbox-search-input{width:100%;padding:2px 6px;background:var(--bg-input);color:var(--text-primary);border:1px solid var(--border);border-radius:var(--radius-xs);font-size:var(--font-size-sm);font-family:inherit;outline:none;box-sizing:border-box}.ldk-selectbox-search-input:focus{border-color:var(--accent)}.ldk-selectbox-list{list-style:none;margin:0;padding:2px 0;overflow-y:auto;outline:none}.ldk-selectbox-item{padding:3px 8px;font-size:var(--font-size-md);line-height:1.6;color:var(--text-primary);cursor:pointer}.ldk-selectbox-item-focus{background:var(--accent);color:var(--text-on-accent)}.ldk-selectbox-item-selected:not(.ldk-selectbox-item-focus){background:var(--bg-selection)}.ldk-selectbox-empty{padding:6px 8px;font-size:var(--font-size-sm);color:var(--text-muted);text-align:center}.ldk-selectbox-disabled{pointer-events:none}.ldk-keybinding-hint{display:inline-flex;align-items:center;gap:3px}.ldk-keybinding-hint-chord{display:inline-flex;align-items:center}.ldk-keybinding-hint-chord--spaced{margin-left:6px}.ldk-keybinding-hint kbd{display:inline-block;padding:1px 5px;font-size:var(--font-size-2xs);font-family:var(--font-mono);background:var(--kbd-bg);border:1px solid var(--kbd-border);border-radius:var(--radius-sm);line-height:1.5}.ldk-keybinding-hint-sep{opacity:.4;margin:0 1px}.ldk-ctx-menu{position:fixed;min-width:140px;max-width:280px;background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-hairline),var(--context-menu-shadow);padding:4px 0;overflow:hidden;outline:none;opacity:0;transform:scale(.96);transform-origin:top left;transition:opacity .15s ease-out,transform .15s ease-out}.ldk-ctx-menu:focus-visible{outline:none}.ldk-ctx-menu.show{opacity:1;transform:scale(1)}.ldk-ctx-item{display:flex;align-items:center;gap:8px;padding:6px 12px;font-size:var(--font-size-md);font-weight:400;line-height:1.6;color:var(--text-primary);cursor:pointer;transition:background 60ms;-webkit-user-select:none;user-select:none}.ldk-ctx-item:hover,.ldk-ctx-item.focused{background:var(--tab-hover-bg);color:var(--text-primary);box-shadow:inset 2px 0 0 var(--accent)}.ldk-ctx-item-icon{flex-shrink:0;width:calc(16px * var(--ui-scale));height:calc(16px * var(--ui-scale));font-size:var(--font-size-lg);display:flex;align-items:center;justify-content:center;opacity:.75}.ldk-ctx-item:hover .ldk-ctx-item-icon,.ldk-ctx-item.focused .ldk-ctx-item-icon{opacity:1;color:var(--accent)}.ldk-ctx-item-shortcut{flex-shrink:0;margin-left:12px}.ldk-ctx-item-check{flex-shrink:0;width:16px;font-size:var(--font-size-sm);color:var(--accent);display:flex;align-items:center}.ldk-ctx-item-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ldk-ctx-divider{height:1px;background:var(--separator);margin:4px 12px}.ldk-ctx-item-danger{color:var(--danger)}.ldk-ctx-item-danger .ldk-ctx-item-icon{opacity:1}.ldk-ctx-item-danger:hover,.ldk-ctx-item-danger.focused{background:var(--tab-hover-bg);color:var(--danger);box-shadow:inset 2px 0 0 var(--danger)}.ldk-form-row{display:flex;align-items:center;gap:8px;margin-bottom:6px;font-size:var(--font-size-sm);color:var(--text-primary)}.ldk-form-row>label,.ldk-form-row>.form-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ldk-form-row>.ldk-toggle,.ldk-form-row>.ldk-input,.ldk-form-row>select,.ldk-form-row>.form-control{flex-shrink:0}.ldk-hint-card-host{display:inline-flex}.ldk-hint-card{position:fixed;z-index:var(--z-dropdown);width:300px;box-sizing:border-box;padding:12px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-window);box-shadow:var(--shadow-pop);pointer-events:none}.ldk-hint-card-title{margin-bottom:4px;font-size:var(--font-size-sm);font-weight:600;color:var(--text-primary)}.ldk-hint-card p{margin:0 0 4px;font-size:var(--font-size-sm);color:var(--text-secondary);line-height:1.7}.ldk-hint-card-note{margin-top:8px;padding-top:8px;border-top:1px solid var(--border);font-size:var(--font-size-xs);color:var(--text-muted)}.ldk-number-input{display:inline-flex;align-items:center;gap:0}.ldk-number-input-btn{display:flex;align-items:center;justify-content:center;width:calc(22px * var(--ui-scale));height:calc(24px * var(--ui-scale));padding:0;border:1px solid var(--border);background:var(--bg-input);color:var(--text-primary);font-size:var(--font-size-lg);line-height:1;cursor:pointer;transition:background .15s,border-color .15s;-webkit-user-select:none;user-select:none}.ldk-number-input-btn:first-child{border-radius:var(--radius-sm) 0 0 var(--radius-sm);border-right:none}.ldk-number-input-btn:last-child{border-radius:0 var(--radius-sm) var(--radius-sm) 0;border-left:none}.ldk-number-input-btn:hover:not(:disabled){background:var(--tab-hover-bg)}.ldk-number-input-btn:active:not(:disabled){background:var(--accent);color:var(--text-on-accent)}.ldk-number-input-btn:disabled{opacity:.3;cursor:default}.ldk-number-input-field{border-radius:0;text-align:center;width:44px}.ldk-number-input-unit{margin:0 6px 0 8px;color:var(--text-muted);font-size:var(--font-size-sm);line-height:1;-webkit-user-select:none;user-select:none}.ldk-readonly-text{font-family:var(--font-mono);font-size:var(--font-size-2xs);color:var(--text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ldk-readonly-text.multiline{font-family:inherit;white-space:pre-wrap;overflow:visible;text-overflow:unset;line-height:1.6}.ldk-section-subtitle{font-size:var(--font-size-2xs);color:var(--text-muted);line-height:1.6;margin-bottom:8px}.ldk-segmented-radio{display:flex;gap:4px}.ldk-segmented-radio__option{display:flex;flex-direction:column;align-items:center;gap:4px;padding:4px 8px;background:transparent;border:1px solid var(--separator);border-radius:var(--radius-sm);cursor:pointer;transition:border-color .12s ease,background .12s ease}.ldk-segmented-radio__option:hover{border-color:var(--text-muted);background:var(--hover-overlay)}.ldk-segmented-radio__option:focus-visible{outline:1px solid var(--accent);outline-offset:1px}.ldk-segmented-radio__option.is-selected{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,transparent)}.ldk-segmented-radio__label{font-size:var(--font-size-sm);color:var(--text-secondary);white-space:nowrap}.ldk-segmented-radio__option.is-selected .ldk-segmented-radio__label{color:var(--text-primary)}.ldk-slider{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:130px;height:4px;margin:0;border-radius:var(--radius-sm);background:linear-gradient(to right,var(--accent) var(--slider-pct, 0%),var(--border) var(--slider-pct, 0%));cursor:pointer;outline-offset:4px}.ldk-slider:disabled{opacity:.4;cursor:default}.ldk-slider::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:12px;height:12px;border-radius:50%;background:var(--text-primary);box-shadow:var(--shadow-tiny);cursor:grab}.ldk-slider::-webkit-slider-thumb:active{cursor:grabbing}.ldk-slider-root{--slider-gap: calc(6px * var(--ui-scale));--slider-btn: calc(20px * var(--ui-scale));display:inline-grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;column-gap:var(--slider-gap);row-gap:calc(2px * var(--ui-scale));max-width:100%}.ldk-slider-value{min-width:calc(44px * var(--ui-scale));font-size:calc(var(--font-size-sm) * var(--ui-scale));font-variant-numeric:tabular-nums;color:var(--text-secondary);white-space:nowrap;-webkit-user-select:none;user-select:none}.ldk-slider-step{width:var(--slider-btn);height:var(--slider-btn);display:inline-flex;align-items:center;justify-content:center;padding:0;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-input);color:var(--text-primary);cursor:pointer}.ldk-slider-step svg{width:calc(10px * var(--ui-scale));height:calc(10px * var(--ui-scale));display:block}.ldk-slider-step:hover:not(:disabled){border-color:var(--accent)}.ldk-slider-step:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.ldk-slider-step:disabled{opacity:.4;cursor:default}.ldk-slider-root[data-pos=after]{grid-template-columns:auto minmax(0,1fr) auto auto}.ldk-slider-root[data-pos=after] .ldk-slider-step[data-dir="-1"]{grid-row:1;grid-column:1}.ldk-slider-root[data-pos=after] .ldk-slider{grid-row:1;grid-column:2}.ldk-slider-root[data-pos=after] .ldk-slider-step[data-dir="1"]{grid-row:1;grid-column:3}.ldk-slider-root[data-pos=after] .ldk-slider-value{grid-row:1;grid-column:4}.ldk-slider-root[data-pos=before]{grid-template-columns:auto auto minmax(0,1fr) auto}.ldk-slider-root[data-pos=before] .ldk-slider-value{grid-row:1;grid-column:1}.ldk-slider-root[data-pos=before] .ldk-slider-step[data-dir="-1"]{grid-row:1;grid-column:2}.ldk-slider-root[data-pos=before] .ldk-slider{grid-row:1;grid-column:3}.ldk-slider-root[data-pos=before] .ldk-slider-step[data-dir="1"]{grid-row:1;grid-column:4}.ldk-slider-root[data-pos=above] .ldk-slider-value,.ldk-slider-root[data-pos=below] .ldk-slider-value{grid-column:2;min-width:0;justify-self:center;text-align:center}.ldk-slider-root[data-pos=above] .ldk-slider-value{grid-row:1}.ldk-slider-root[data-pos=above] .ldk-slider-step[data-dir="-1"]{grid-row:2;grid-column:1}.ldk-slider-root[data-pos=above] .ldk-slider{grid-row:2;grid-column:2}.ldk-slider-root[data-pos=above] .ldk-slider-step[data-dir="1"]{grid-row:2;grid-column:3}.ldk-slider-root[data-pos=below] .ldk-slider-step[data-dir="-1"]{grid-row:1;grid-column:1}.ldk-slider-root[data-pos=below] .ldk-slider{grid-row:1;grid-column:2}.ldk-slider-root[data-pos=below] .ldk-slider-step[data-dir="1"]{grid-row:1;grid-column:3}.ldk-slider-root[data-pos=below] .ldk-slider-value{grid-row:2}.ldk-slider-root[data-stepper=false][data-pos=after]{grid-template-columns:minmax(0,1fr) auto}.ldk-slider-root[data-stepper=false][data-pos=after] .ldk-slider{grid-row:1;grid-column:1}.ldk-slider-root[data-stepper=false][data-pos=after] .ldk-slider-value{grid-row:1;grid-column:2}.ldk-slider-root[data-stepper=false][data-pos=before]{grid-template-columns:auto minmax(0,1fr)}.ldk-slider-root[data-stepper=false][data-pos=before] .ldk-slider-value{grid-row:1;grid-column:1}.ldk-slider-root[data-stepper=false][data-pos=before] .ldk-slider{grid-row:1;grid-column:2}.ldk-slider-root[data-stepper=false][data-pos=above] .ldk-slider-value,.ldk-slider-root[data-stepper=false][data-pos=below] .ldk-slider-value,.ldk-slider-root[data-stepper=false][data-pos=above] .ldk-slider,.ldk-slider-root[data-stepper=false][data-pos=below] .ldk-slider{grid-column:1}.ldk-sle{display:flex;flex-direction:column;gap:4px;width:100%}.ldk-sle-row{display:flex;align-items:center;gap:6px;min-height:calc(24px * var(--ui-scale, 1));width:100%;box-sizing:border-box}.ldk-sle-glyph{font-size:var(--font-size-sm);color:var(--text-muted);flex-shrink:0}.ldk-sle-url{flex:1;min-width:0;font-family:var(--font-mono);font-size:var(--font-size-xs);color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ldk-sle-badge{flex-shrink:0;font-size:var(--font-size-2xs);color:var(--text-muted);background:var(--bg-window);padding:1px 4px;border-radius:3px;white-space:nowrap}.ldk-sle-lock{font-size:var(--font-size-sm);color:var(--text-muted);flex-shrink:0}.ldk-sle-del{display:flex;align-items:center;justify-content:center;width:calc(24px * var(--ui-scale, 1));height:calc(24px * var(--ui-scale, 1));padding:0;background:transparent;border:none;border-radius:3px;color:var(--text-muted);cursor:pointer;font-size:var(--font-size-sm);flex-shrink:0;transition:color .15s ease,background .15s ease}.ldk-sle-del:hover{color:var(--error);background:var(--hover-overlay)}.ldk-sle-add-row{display:flex;align-items:center;gap:6px;width:100%}.ldk-sle-input{flex:1;min-width:0;box-sizing:border-box;background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-sm);padding:4px 8px;color:var(--text-primary);font-family:var(--font-mono);font-size:var(--font-size-xs);transition:border-color .15s;outline:none}.ldk-sle-input:focus{border-color:var(--accent)}.ldk-sle-add-btn{flex-shrink:0;padding:3px 8px;border:1px solid var(--separator);border-radius:4px;background:transparent;color:var(--text-primary);cursor:pointer;font-size:var(--font-size-xs);font-family:inherit;white-space:nowrap}.ldk-sle-add-btn:hover:not(:disabled){background:var(--tab-hover-bg)}.ldk-sle-add-btn:disabled{opacity:.5;cursor:not-allowed}.ldk-sle-msg{display:block;font-size:var(--font-size-2xs);line-height:1.5;padding:0 2px}.ldk-sle-msg--error{color:var(--error)}.ldk-sle-msg--hint{color:var(--text-muted)}.ldk-theme-picker{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;width:100%}.ldk-theme-picker-card{border:1px solid var(--border);border-radius:var(--radius-lg);overflow:hidden;cursor:pointer;background:var(--bg-card);padding:0;text-align:left;color:inherit;font:inherit;transition:border-color .15s ease,transform .15s ease}.ldk-theme-picker-card:hover{border-color:var(--separator);transform:translateY(-1px)}.ldk-theme-picker-card:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.ldk-theme-picker-card.active{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}.ldk-theme-picker-preview{height:44px;display:flex;align-items:center;gap:3px;padding:8px;overflow:hidden}.ldk-theme-picker-preview .ldk-theme-picker-preview-bar{width:26px;height:12px;border-radius:var(--radius-xs)}.ldk-theme-picker-preview .ldk-theme-picker-preview-dots{display:flex;gap:3px}.ldk-theme-picker-preview .ldk-theme-picker-preview-dot{width:12px;height:12px;border-radius:50%;border:1px solid color-mix(in srgb,var(--text-primary) 35%,transparent)}.ldk-theme-picker-card .ldk-theme-picker-name{padding:6px 8px;font-size:var(--font-size-xs);color:var(--text-secondary);display:flex;align-items:center;justify-content:space-between;gap:4px;overflow:hidden}.ldk-theme-picker-card.active .ldk-theme-picker-name{color:var(--text-primary)}.ldk-theme-picker-card .ldk-theme-picker-name-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ldk-theme-picker-card .ldk-theme-picker-badge{font-size:var(--font-size-2xs);color:var(--accent);white-space:nowrap}.ldk-theme-picker-empty{color:var(--text-muted);font-size:var(--font-size-sm);padding:8px 0}.ldk-toggle{width:36px;height:20px;border-radius:var(--radius-pill);background:var(--border);transition:background .15s;cursor:pointer;position:relative;flex-shrink:0}.ldk-toggle.on{background:var(--accent)}.ldk-toggle:after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:var(--radius-pill);background:var(--toggle-knob);transition:transform .15s}.ldk-toggle.on:after{transform:translate(16px);background:var(--toggle-knob-on, var(--text-on-accent))}.ldk-toggle.disabled{opacity:.4;cursor:not-allowed}.ldk-inline-input{border:1px solid var(--border);background:var(--bg-input);color:var(--text-primary);font-family:inherit;outline:none;box-sizing:border-box;width:100%;transition:border-color .15s ease-out,box-shadow .15s ease-out}.ldk-inline-input:focus{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}.ldk-inline-input--compact{height:calc(22px * var(--ui-scale));font-size:var(--font-size-sm);padding:0 4px}.ldk-inline-input--normal{height:calc(32px * var(--ui-scale));font-size:var(--font-size-md);padding:0 8px}.ldk-image-picker{display:flex;align-items:center;gap:8px;min-width:0;flex-wrap:wrap}.ldk-image-picker__path{max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--font-size-sm);color:var(--text-muted)}.ldk-effective-badge{flex-shrink:0;display:inline-flex;align-items:center;gap:4px;margin-left:8px;font-size:var(--font-size-xs);line-height:1;padding:3px 6px;border-radius:var(--radius-sm);white-space:nowrap;color:var(--text-secondary);background:var(--tab-active-bg)}.ldk-effective-badge-label{color:var(--text-muted)}.ldk-effective-badge-value{display:inline-block;max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ldk-effective-badge .ldk-effective-badge-value .ldk-readonly-text,.ldk-effective-badge .ldk-effective-badge-value .ldk-readonly-text.multiline{font-family:inherit;font-size:inherit;line-height:inherit;white-space:nowrap;overflow:visible;text-overflow:clip}.ldk-effective-swatch{flex-shrink:0;width:10px;height:10px;border-radius:2px;border:1px solid var(--border)}.ldk-source-badge{flex-shrink:0;display:inline-flex;align-items:center;gap:3px;font-size:var(--font-size-xs);line-height:1;padding:3px 6px;border-radius:var(--radius-sm);white-space:nowrap}.ldk-source-badge .codicon{font-size:var(--font-size-xs)}.ldk-source-badge--user{color:var(--text-on-accent);background:var(--accent);opacity:.92}.ldk-source-badge--mix{color:var(--text-primary);background:var(--tab-active-bg)}.ldk-segment-preview{display:flex;width:52px;height:30px;border-radius:var(--radius-sm);overflow:hidden;border:1px solid var(--separator);flex-shrink:0}.ldk-segment-preview--split{background:linear-gradient(90deg,var(--tone-surface-deep) 50%,var(--tone-surface-light) 50%)}.ldk-segment-preview--accent{background:var(--accent)}.ldk-segment-preview__half{flex:1;min-width:0;display:flex;align-items:center;justify-content:center;font-size:var(--font-size-sm);font-weight:600;line-height:1;-webkit-user-select:none;user-select:none}.ldk-segment-preview__half--deep{background:var(--tone-surface-deep);color:var(--tone-ink-on-deep)}.ldk-segment-preview__half--light{background:var(--tone-surface-light);color:var(--tone-ink-on-light)}
package/dist/index.d.ts CHANGED
@@ -31,8 +31,20 @@ export { useDebouncedInput } from "./hooks/useDebouncedInput";
31
31
  export { FileIconResolver } from "./file-icon/FileIconResolver";
32
32
  export { inferSliderStep } from "./slider/sliderStep";
33
33
  export { urlSourceKey } from "./string-list-editor/urlSourceKey";
34
+ export { CONFIG_NONE_SENTINEL, MIX_FOLLOW_THEME_SENTINEL, SETTINGS_UI_HINTS, SETTINGS_RENDER_HINTS, isSettingsUiHint } from "./settings-hints/settingsHints";
35
+ export { formatEffectiveValue } from "./effective-badge/formatEffectiveValue";
36
+ export { splitStringList } from "./string-list-editor/splitStringList";
37
+ export { useStatusPolling } from "./readonly-text/useStatusPolling";
38
+ export { default as BackgroundImagePicker } from "./image-picker/BackgroundImagePicker";
39
+ export { default as EffectiveBadge } from "./effective-badge/EffectiveBadge";
40
+ export { default as SourceBadge } from "./source-badge/SourceBadge";
41
+ export { SegmentPreviewText, SegmentPreviewSwatch } from "./segment-preview/SegmentPreview";
34
42
  export type { HintTipProps } from "./hint-tip/HintTip";
35
43
  export type { IconDescriptor } from "./file-icon/FileIconResolver";
44
+ export type { RunStatusCommand } from "./readonly-text/useStatusPolling";
45
+ export type { BackgroundImagePickerProps } from "./image-picker/BackgroundImagePicker";
46
+ export type { EffectiveBadgeProps } from "./effective-badge/EffectiveBadge";
47
+ export type { SourceBadgeSource, SourceBadgeKind, SourceBadgeProps } from "./source-badge/SourceBadge";
36
48
  export type { InlineInputHandle } from "./inline-input/InlineInput";
37
49
  export type { ContextMenuProps } from "./context-menu/ContextMenu";
38
50
  export type { ManifestIconShape, ResolvedIcon } from "./plugin-icon/iconUtils";