@linkdesk/ui 0.2.35 → 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,30 @@
1
+ /**
2
+ * 只读文本展示件(M4 `AI#38.12` · P-2 拍板 A)——**通用原语**,与 Toggle/SelectBox 同层级
3
+ * (`@linkdesk/ui` 单实例供给,任何插件可 import)。
4
+ *
5
+ * 用途一(原有):设置页 `renderHint: "readonly"` 的状态行 · 多行只读明细(如 AI 接入的开放范围)。
6
+ * 用途二(本案 3.2 升级):**状态行值活起来**——声明 `statusCommand` 即进入轮询模式,
7
+ * 值来自运行时命令而不是静态 prop(原设置插件本地件 `ReadOnlyStatus` 整件退场,行为上移到这里)。
8
+ *
9
+ * 🔴 就是文字——不做可点、不做悬停花活(用户拍板「控件形态尽量基础」)。升级只加"值从哪来",
10
+ * 不加任何交互面。
11
+ *
12
+ * 值来源优先级:`statusCommand` 存在 ⇒ **轮询值优先**(`value` 被取代;未读到之前不渲染,
13
+ * 不拿静态值冒充实时读数);否则用 `value`。(执行句柄 `runCommand` 由使用方注入——
14
+ * 共享件不引宿主内核。)
15
+ */
16
+ import { type RunStatusCommand } from "./useStatusPolling";
17
+ interface ReadOnlyTextProps {
18
+ /** 展示文本(多行用 \n 分隔);声明 `statusCommand` 时被轮询值取代 */
19
+ value?: string;
20
+ /** true = 多行块(明细清单;pre-wrap 保留换行);缺省 = 单行(状态值,等宽字体) */
21
+ multiline?: boolean;
22
+ /** 轮询的命令 id——存在即进入轮询模式(值来自命令,不来自配置存储/静态 prop) */
23
+ statusCommand?: string;
24
+ /** 命令执行句柄(使用方注入,如 `window.linkdesk.commands.executeCommand`) */
25
+ runCommand?: RunStatusCommand;
26
+ /** 轮询间隔(毫秒),缺省 3000;仅 `statusCommand` 存在时生效 */
27
+ intervalMs?: number;
28
+ }
29
+ declare function ReadOnlyText({ value, multiline, statusCommand, runCommand, intervalMs }: ReadOnlyTextProps): import("react").JSX.Element | null;
30
+ export default ReadOnlyText;
@@ -0,0 +1,10 @@
1
+ /** 命令执行句柄——返回状态字符串;`null` / 非字符串一律按「没读到」处理(保持现值)。 */
2
+ export type RunStatusCommand = (commandId: string) => Promise<string | null>;
3
+ /**
4
+ * 轮询 `statusCommand` 指向的壳命令,返回最近一次读数。
5
+ *
6
+ * @param statusCommand 命令 id;缺省/空 ⇒ 不轮询(返回 null,一条定时器都不建)
7
+ * @param runCommand 命令执行句柄(使用方注入)
8
+ * @param intervalMs 轮询间隔,缺省 3000(仅 `statusCommand` 存在时生效)
9
+ */
10
+ export declare function useStatusPolling(statusCommand: string | undefined, runCommand: RunStatusCommand | undefined, intervalMs?: number): string | null;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 分节副标题件(M4 `AI#38.12` · P-3 拍板 A)——**通用原语**(`@linkdesk/ui`,任何插件可 import)。
3
+ *
4
+ * 用途:分区大标题 / 分节小标题(`group`)下面的一行说明小字——设置页从
5
+ * configuration contribution 的 `subtitle` / `groupDescriptions` 读到即渲染(零侵入:
6
+ * 未声明 = 不渲染)。🔴 就是文字(不做可点,用户拍板「控件形态尽量基础」)。
7
+ */
8
+ import type { ReactNode } from "react";
9
+ interface SectionSubtitleProps {
10
+ children: ReactNode;
11
+ }
12
+ declare function SectionSubtitle({ children }: SectionSubtitleProps): import("react").JSX.Element | null;
13
+ export default SectionSubtitle;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 分段控件段内预览两原子——文字极性(Aa 样本)+强调色来源(色块)。
3
+ * E6#87d 自设置仓 `toneControls.tsx` 的 FontTonePreview 抽出(判据 A:只搬预览原子,
4
+ * 两个 handler 留设置仓变薄绑定)。纯展示、零宿主耦合、零语义——「哪个 hint 值显示哪种
5
+ * 极性/色块」的映射住消费方。
6
+ *
7
+ * 几何=单一 swatch(52×30 + var(--radius-sm)),两原子共用(设置页原归一化结论 #3)。
8
+ * 颜色全走 CSS 变量(硬约束 1):极性取样壳 `--tone-*` 实色标尺;自定义强调色读 `--accent`
9
+ * (applyAccentColor 恒写 effective accent——三态全对,声明式读,零 IPC 零 DOM 读)。
10
+ */
11
+ /** `Aa` 分半/单半样本——halves 为极性名单("deep" | "light"),消费方按 hint 值给 */
12
+ export declare function SegmentPreviewText({ halves }: {
13
+ halves: readonly string[];
14
+ }): import("react").JSX.Element;
15
+ /** 色块样本——split = 中性分半(「主题决定强调色」示意);accent = 实时生效强调色 */
16
+ export declare function SegmentPreviewSwatch({ variant }: {
17
+ variant: "split" | "accent";
18
+ }): import("react").JSX.Element;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * 设置控件词表**正典**(运行时值半边)——「设置控件-词表正典与共享化」判据 B 的落地物。
3
+ *
4
+ * ── 为什么住这一层 ──
5
+ * `uiHint` / `renderHint` 是**宿主声明 ↔ 渲染层**之间的词表。声明的消费方(壳共享控件、
6
+ * 设置插件、第三方设置插件)都要读到**同一份**名单 ⇒ 正典住 `@linkdesk/ui`
7
+ * (判据 A:消费宿主声明的件,必须住在任何声明者与渲染者都取得到的层)。
8
+ *
9
+ * ── 与 contracts 的分工(一案两半,⛔ 别复制第三份)──
10
+ * · **类型**半边住 `@linkdesk/contracts`(`SettingsUiHint` / `SettingsRenderHint`)——那是
11
+ * 生成产物、纯类型、零运行时,写不出 `export const`;壳仓定义点在
12
+ * `src/core/api/linkdesk-api/types.ts`,随生成器进契约。
13
+ * · **运行时值**半边 = 本件(哨兵两枚 + 名单两枚 + 类型守卫一枚)——`contracts` 给不了值。
14
+ *
15
+ * ── 🔴 本件纪律:纯 TS,零 React、零 DOM、零 @src/ 依赖 ──
16
+ * 壳 core 会**反向 import** 本件(`services/ui/ThemeEngine/constants.ts` re-export 哨兵,
17
+ * 保住插件与老调用方的既有 import 路径;见 02 E4b)。带进任何组件/DOM/宿主耦合,
18
+ * 都会把核心的依赖图污染——共享层唯一的「core ← shared」边只许是这一条,且只许是纯值。
19
+ */
20
+ import type { SettingsRenderHint, SettingsUiHint } from "@linkdesk/contracts";
21
+ /** 显式「无」哨兵——配置值字面量契约:`__none__` = **绝对无**(背景图无图 / 字体族落系统栈),
22
+ * 与「空串 = 跟随主题」区分两语义(E5.8#87/#158)。跨边界契约:壳 core、共享控件、任何设置插件同读这一份。 */
23
+ export declare const CONFIG_NONE_SENTINEL = "__none__";
24
+ /** 混搭来源「跟随主题」哨兵——外观域 mix 来源键的缺省/播种值,也是来源徽标判定里
25
+ * 「域来源未生效」的那一支(`deriveSourceBadge`)。同族跨边界字符串契约,与
26
+ * `CONFIG_NONE_SENTINEL` 一处一个正典(⛔ 不新开第二个「哨兵件」)。 */
27
+ export declare const MIX_FOLLOW_THEME_SENTINEL = "followTheme";
28
+ /** 声明式控件词表——13 枚,与 `SettingsUiHint` 联合类型一一对应(正典表本体见
29
+ * 「设置控件-词表正典与共享化」01 §0.2)。
30
+ * ⚠️ 加值/改值必须**同笔**动三处:`SettingsUiHint`(contracts)· 本数组 · 作者面 schema description
31
+ * (轻门禁守同步);漏一处 = 门禁红。 */
32
+ export declare const SETTINGS_UI_HINTS: readonly SettingsUiHint[];
33
+ /** 渲染提示词表——3 枚(`renderHint` 的已知值)。
34
+ * ⚠️ `"color"` 是阶段 1.1 全量对账补上的第 3 值(壳 `app.accentColor` / `app.glassTint` 已用),
35
+ * 漏了它 = 壳侧收窄类型当场红。 */
36
+ export declare const SETTINGS_RENDER_HINTS: readonly SettingsRenderHint[];
37
+ /**
38
+ * 词表守卫——「声明的 uiHint 是不是正典认识的形态」。
39
+ *
40
+ * 渲染层降级契约据此分流:**不认识 ⇒ 只读展示当前值 + title 说明**(⛔ 不再落进可编辑文本框,
41
+ * 防裸字符串写穿值域——`app.backgroundImage` 露 `__none__` 那类)。
42
+ *
43
+ * ⚠️ **「没声明」≠「未知」**:`undefined` / `""` 也要先由调用方判成「未声明」,那是大多数键的
44
+ * 正常路径(按 `type` 渲染,一字不动,见 02 E2)。本守卫只管「值在不在正典里」。
45
+ */
46
+ export declare function isSettingsUiHint(v: unknown): v is SettingsUiHint;
@@ -1,5 +1,5 @@
1
1
  {
2
- "shellVersion": "0.2.33",
3
- "commit": "d0a8c66cf",
4
- "cutAt": "2026-10-01"
2
+ "shellVersion": "0.2.38",
3
+ "commit": "56311cead",
4
+ "cutAt": "2026-10-03"
5
5
  }
@@ -6,17 +6,36 @@
6
6
  * 无障碍(原生 range = role="slider" + aria-valuemin/max/now),不手写 pointer 拖拽状态机(B 类 bug 高发区)。
7
7
  * 填充 = inline `--slider-pct` CSS 变量 → linear-gradient(mockup fill 语义,见 Slider.css)。
8
8
  * prefers-reduced-motion:原生 range 无动画,天然满足(无 transition 可禁)。
9
+ *
10
+ * 能力扩展(2026-10-03,docs/04-软件更新/待抉择池/滑杆件-Slider能力扩展)——
11
+ * 「值标签」与「细调步进」自设置仓包裹层下沉进组件(D3:组件自带能力,声明即显、不声明即无):
12
+ * - unit / unitPosition:值标签(当前值+单位一体,D1)。⚠️ 空串 ≠ 未声明——未声明 = 不渲染标签
13
+ * (裸滑杆);"" = 有标签无单位(如设置页不透明度的 0.5)。方位 D5:before/after 贴「按钮对」外侧,
14
+ * above/below 脱离行内流居中压轨道中线(配置键一律用缺省 after——上下方位撑破固定行高)。
15
+ * - stepper:轨道两侧常驻 −/+(D2,单击单发、长按连发不做);按 step 步进、min/max 夹取、
16
+ * 触边置灰、disabled 联动;步进按 step 小数位收敛浮点误差(E7)。按钮可聚焦(E5——
17
+ * ⛔ 不做「不可聚焦」的偷懒解法),键盘全链 = Tab − → 轨道 → +。
18
+ * 结构(E13):声明了任一能力时根节点 = .ldk-slider-root 网格盒;两者都不声明 = 返回裸 input
19
+ * (与历史 DOM 逐字节一致,第三方零感知)。.ldk-slider 类名仍留在 input 上(后代选择器兼容);
20
+ * style prop 仍落在 input 上(不改既有 API 语义)。
9
21
  */
22
+ type UnitPosition = "before" | "after" | "above" | "below";
10
23
  interface SliderProps {
11
24
  value: number;
12
25
  onChange: (v: number) => void;
13
26
  min?: number;
14
27
  max?: number;
15
28
  step?: number;
16
- /** 无障碍标签(设置行 label 由 SettingRow 显示,此处供读屏) */
29
+ /** 单位文案(px / ms / × / 毫米…由声明者自定)——声明了才有值标签;空串 = 有标签无单位 */
30
+ unit?: string;
31
+ /** 值标签方位(缺省 after);above/below 只留插件自绘场景(撑破固定行高) */
32
+ unitPosition?: UnitPosition;
33
+ /** 轨道两侧 −/+ 细调按钮(常驻,单击单发);不声明 = 一个 DOM 都不多 */
34
+ stepper?: boolean;
35
+ /** 无障碍标签(设置行 label 由 SettingRow 显示,此处供读屏;stepper 按钮连带「减少/增加」+此标签) */
17
36
  ariaLabel?: string;
18
37
  disabled?: boolean;
19
38
  style?: React.CSSProperties;
20
39
  }
21
- declare function Slider({ value, onChange, min, max, step, ariaLabel, disabled, style }: SliderProps): import("react").JSX.Element;
40
+ declare function Slider({ value, onChange, min, max, step, unit, unitPosition, stepper, ariaLabel, disabled, style, }: SliderProps): import("react").JSX.Element;
22
41
  export default Slider;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * 滑杆值标签格式化——E5.8#77 数值显示。
3
+ * 纯函数零依赖:unit "×" → 倍数前缀 + 1 位小数(mockup ×1.0);"px" → 数值 + 后缀;
4
+ * 空 → 裸数值(0-1 不透明度 0.45)。
5
+ * 滑杆件能力扩展(2026-10-03):自设置仓迁入组件本体(能力搬家,非复制)——
6
+ * 设置仓那份已删除,组件值标签统一走这里(⛔ 不造第二套格式化器)。
7
+ */
8
+ /**
9
+ * 把滑杆当前值格式化为带单位标签。
10
+ * - 非有限值(val 解析失败)→ 空串(防御)。
11
+ * - "×":前置 + toFixed(1)(×1.0 / ×1.5,mockup 倍数语义)。
12
+ * - 其余单位:数值规整(去尾零)+ 单位后缀(16px / 0.5px)。
13
+ * - 空单位:裸数值(0.45 / 1——不透明度直接显示)。
14
+ */
15
+ export declare function formatSliderValue(v: number, unit?: string): string;
@@ -0,0 +1,12 @@
1
+ /** 来源域——宿主的读数语义(含默认态 `theme`);⛔ 与 `EffectiveBadge` 的「生效值」不是一回事 */
2
+ export type SourceBadgeSource = "theme" | "user" | "mix";
3
+ /** 可显徽标的来源(降噪:`theme` 不显) */
4
+ export type SourceBadgeKind = Exclude<SourceBadgeSource, "theme">;
5
+ export interface SourceBadgeProps {
6
+ /** 来源种类(可显示的两种;`theme` 由调用方自行不渲染) */
7
+ source: SourceBadgeKind;
8
+ /** 徽标文案(调用方 `t()` 已译,如「来源:用户覆盖」)——同时用作悬停提示 */
9
+ label: string;
10
+ }
11
+ declare function SourceBadge({ source, label }: SourceBadgeProps): import("react").JSX.Element;
12
+ export default SourceBadge;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * stringList 控件的前置计算——「锁定行 / 可编辑行」切分(纯函数,零 React 零宿主耦合)。
3
+ * E6#87d 自设置仓 `renderControl/stringList.ts` 平移(判据 A:消费宿主 `uiHint:"stringList"`
4
+ * 声明的计算住共享层,任何声明者与渲染者都取得到)。
5
+ *
6
+ * E6#30c:default 数组 = locked 固定行(官方源「内置」徽标 + 锁——不可删、不入 onChange 值、
7
+ * 永不落盘,读时由消费方恒前置去重);effective 值(含 default)减 locked 后 = 作者源(可删)。
8
+ * 身份规则(E6#30c):相减与行内判重用同一把钥匙 urlSourceKey——github 源归 owner/repo、分支
9
+ * 无关;官方源的「其他形态」(仓库主页/HEAD 直链)在此一并滤除。urlSourceKey 非 github 输入
10
+ * 返 null → 回精确比较。本函数对任何 uiHint:"stringList" 配置通用,零插件域依赖。
11
+ *
12
+ * 入参只读 `prop.default` 一个字段 ⇒ 形参收窄为结构类型 `{ default?: unknown }`,
13
+ * 消费方 ConfigProperty 直接传得进(LSP 兼容),共享层不引插件类型。
14
+ */
15
+ /** 锁定行(default 声明)+ 可编辑行(effective 值滤掉锁定身份后的剩余) */
16
+ export declare function splitStringList(prop: {
17
+ default?: unknown;
18
+ }, value: unknown): {
19
+ locked: string[];
20
+ editable: string[];
21
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@linkdesk/ui",
3
- "version": "0.2.35",
3
+ "version": "0.2.37",
4
4
  "description": "@linkdesk/ui——LinkDesk 共享 UI 组件的类型契约 + dev 解析体。L9 集中供给:组件代码与样式在运行时由壳池 vendor 单实例供给(壳改一处全生态跟随);npm i 装的是类型与本地解析体,插件源码不 import 本包 css(lint 腿 check-ui-css-import 判红)。版本号自走(E6#166 对货不对号:2026-10-01 起与壳脱钩,壳发版只查作者面货不落后)。",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",