dsh-plugin-core 0.7.4 → 0.8.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.
@@ -0,0 +1,37 @@
1
+ /**
2
+ * 拼接外壳 —— 两个控件在外观上焊成一体(L2 组件皮肤,P1)
3
+ *
4
+ * 只管样式:外框、圆角、两格之间那条 1px 分隔、整体聚焦圈。**不持状态、不出联动回调** ——
5
+ * 选中与联动全走内件自己的 `value` / `onChange`(2026-10-28 用户拍板:外壳不必知道
6
+ * 右边那个控件管什么,消费方自己拿两个控件去绑)。
7
+ *
8
+ * 固定两格:不做多格(用户 2026-10-28:「就是两个组合,我觉得就足够了」)。
9
+ *
10
+ * 用法:
11
+ * h(SplitGroup, null,
12
+ * h(Segmented, { size: 'md', items, value, onChange: v => { setA(v); setB(pickFor(v)) } }),
13
+ * h(Picker, { size: 'md', options: optsOf(a), value: b, onChange: setB }))
14
+ *
15
+ * 两格要等高,就给内件传**同一个 `size`**(sm 24 / md 28 / lg 32 —— 外壳跟着内件长,不写死高度)。
16
+ */
17
+ import { createElement as h, type CSSProperties, type ReactNode } from 'react';
18
+ export interface SplitGroupProps {
19
+ /** 两格内容(左、右)。元素顺序即布局顺序;固定两格,不做多格。 */
20
+ children?: ReactNode;
21
+ /** 无障碍组名(读屏用)。 */
22
+ label?: string;
23
+ /** 根节点 id(锚点 / 自动化测试用)。 */
24
+ id?: string;
25
+ /** 追加到根节点的 class(只允许补布局,不许覆盖皮肤)。 */
26
+ className?: string;
27
+ /** 外层追加样式(只允许补布局,不许覆盖皮肤)。 */
28
+ style?: CSSProperties;
29
+ }
30
+ /**
31
+ * 渲染一个两格拼接外壳。
32
+ *
33
+ * @param props 见 {@link SplitGroupProps}。
34
+ * @returns 外壳元素。
35
+ */
36
+ export declare function SplitGroup(props: SplitGroupProps): ReturnType<typeof h>;
37
+ //# sourceMappingURL=SplitGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SplitGroup.d.ts","sourceRoot":"","sources":["../../src/ui/SplitGroup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,aAAa,IAAI,CAAC,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAG9E,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,kBAAkB;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2BAA2B;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,aAAa,CAAA;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAavE"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * 拼接外壳 —— 两个控件在外观上焊成一体(L2 组件皮肤,P1)
3
+ *
4
+ * 只管样式:外框、圆角、两格之间那条 1px 分隔、整体聚焦圈。**不持状态、不出联动回调** ——
5
+ * 选中与联动全走内件自己的 `value` / `onChange`(2026-10-28 用户拍板:外壳不必知道
6
+ * 右边那个控件管什么,消费方自己拿两个控件去绑)。
7
+ *
8
+ * 固定两格:不做多格(用户 2026-10-28:「就是两个组合,我觉得就足够了」)。
9
+ *
10
+ * 用法:
11
+ * h(SplitGroup, null,
12
+ * h(Segmented, { size: 'md', items, value, onChange: v => { setA(v); setB(pickFor(v)) } }),
13
+ * h(Picker, { size: 'md', options: optsOf(a), value: b, onChange: setB }))
14
+ *
15
+ * 两格要等高,就给内件传**同一个 `size`**(sm 24 / md 28 / lg 32 —— 外壳跟着内件长,不写死高度)。
16
+ */
17
+ import { createElement as h } from 'react';
18
+ import { ensureControls } from './css.js';
19
+ /**
20
+ * 渲染一个两格拼接外壳。
21
+ *
22
+ * @param props 见 {@link SplitGroupProps}。
23
+ * @returns 外壳元素。
24
+ */
25
+ export function SplitGroup(props) {
26
+ ensureControls();
27
+ return h('div', {
28
+ role: 'group',
29
+ 'aria-label': props.label,
30
+ id: props.id,
31
+ className: `dshpc-split${props.className === undefined ? '' : ` ${props.className}`}`,
32
+ style: props.style,
33
+ }, props.children);
34
+ }
35
+ //# sourceMappingURL=SplitGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SplitGroup.js","sourceRoot":"","sources":["../../src/ui/SplitGroup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,aAAa,IAAI,CAAC,EAAsC,MAAM,OAAO,CAAA;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAezC;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,cAAc,EAAE,CAAA;IAChB,OAAO,CAAC,CACN,KAAK,EACL;QACE,IAAI,EAAE,OAAO;QACb,YAAY,EAAE,KAAK,CAAC,KAAK;QACzB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,SAAS,EAAE,cAAc,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,EAAE;QACrF,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,EACD,KAAK,CAAC,QAAQ,CACf,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const SPLIT_GROUP_CSS = "\n/* \u2500\u2500 \u62FC\u63A5\u5916\u58F3 SplitGroup \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n \u804C\u8D23\u53EA\u6709\u4E00\u6761\uFF1A\u628A\u4E24\u4E2A\u63A7\u4EF6\u5728\u5916\u89C2\u4E0A\u710A\u6210\u4E00\u4F53\uFF08\u5916\u6846 / \u5706\u89D2 / \u4E2D\u95F4 1px \u5206\u9694 / \u6574\u4F53\u805A\u7126\u5708\uFF09\u3002\n \u5B83**\u4E0D\u6301\u72B6\u6001\u3001\u4E0D\u51FA\u8054\u52A8\u56DE\u8C03** \u2014\u2014 \u9009\u4E2D\u4E0E\u8054\u52A8\u5168\u8D70\u5185\u4EF6\u81EA\u5DF1\u7684 value / onChange\n \uFF08\u7528\u6237 2026-10-28 \u62CD\u677F\uFF1A\u5916\u58F3\u4E0D\u5FC5\u77E5\u9053\u53F3\u8FB9\u90A3\u4E2A\u4E0B\u62C9\u7BA1\u4EC0\u4E48\uFF09\u3002\n\n \u26A0\uFE0F \u4E0E\u5185\u4EF6\u7C7B\u540D\u6709\u610F\u8026\u5408\uFF1A\u5185\u4EF6\u662F Picker / Segmented \u65F6\u7531\u4E0B\u9762\u51E0\u6761\u89C4\u5219\u628A\u5B83\u4EEC\u81EA\u5DF1\u7684\n \u8FB9\u6846 / \u5E95\u8272 / \u5706\u89D2\u4EA4\u51FA\u6765\uFF0C\u7531\u5916\u58F3\u7EDF\u4E00\u753B\u3002\u5185\u4EF6\u6539\u540D\u6216\u6539\u7ED3\u6784\u8981\u540C\u6B65\u6539\u8FD9\u91CC\uFF0C\n \u5426\u5219\u4F1A\u51FA\u73B0\u53CC\u8FB9\u6846\u3001\u53CC\u5E95\u8272\u3002\n\n \u9AD8\u5EA6\u4E0D\u5199\u6B7B\uFF1A\u5185\u4EF6\u81EA\u5DF1\u6309 size \u6863\uFF08sm 24 / md 28 / lg 32\uFF09\u6491\u5F00\uFF0C\u5916\u58F3\u8DDF\u7740\u957F\u3002\n \u4E24\u683C\u8981\u7B49\u9AD8\uFF0C\u5C31\u7ED9\u5185\u4EF6\u4F20**\u540C\u4E00\u4E2A size**\u3002\u4E07\u4E00\u4E24\u683C size \u4E0D\u4E00\u81F4\uFF0C\u5916\u58F3\u5185\u4EF6\u7528 align-items:center\n \u5C45\u4E2D\uFF08\u4E0D\u4F1A\u9876\u5BF9\u9F50\u9732\u767D\uFF0C\u7528\u6237 2026-10-28 \u622A\u56FE\u53CD\u9988\u300C\u672C\u6708\u504F\u4E0A\u300D\u540E\u7684\u5904\u7406\uFF09\uFF1B**\u522B\u7528 height:100%**\uFF0C\n \u5B83\u4F1A\u8986\u76D6\u4E09\u6863\u9AD8\u5EA6\uFF08\u4E0E --lg/--sm \u540C\u7279\u5F02\u6027\u4E14\u6CE8\u5165\u66F4\u665A\uFF09\u3002\n\n \u5DE6\u683C\u7EDF\u4E00\u7070\u5E95\uFF08\u7528\u6237 2026-10-28 \u62CD\u677F\uFF09\uFF1A\u6ED1\u5757\u4FDD\u7559\u81EA\u5DF1\u7684\u7070\u8F68\uFF0C\u5DE6\u683C\u4E0B\u62C9\u628A\u5E95\u8272\u6362\u6210\n surface-sunken\uFF1B\u53F3\u683C\u4FDD\u6301\u539F\u6837\u3002\u5C42\u6B21\u611F = \u5DE6\u683C\u662F\u300C\u6863\u4F4D/\u8303\u56F4\u300D\uFF0C\u53F3\u683C\u662F\u300C\u503C\u300D\u3002 */\n .dshpc-split{display:inline-flex;align-items:stretch;max-width:100%;overflow:hidden;border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);background:var(--dshpc-surface-1);}\n /* \u4E24\u683C\u5BBD\u5EA6\u90FD\u7531\u5185\u5BB9\u7ED9\uFF1B\u5BB9\u5668\u518D\u7A84\u4E5F\u8BA9\u5185\u4EF6\u81EA\u5DF1\u7701\u7565\uFF0C\u4E0D\u8BA9\u5916\u58F3\u88AB\u6491\u7834 */\n .dshpc-split > *{min-width:0;max-width:100%;}\n /* \u5206\u9694\uFF1A\u76F8\u90BB\u5144\u5F1F\u7684\u5DE6\u63CF\u8FB9\uFF0C\u4E0D\u989D\u5916\u63D2 DOM\uFF0Chover / focus \u65F6\u4E5F\u4E0D\u4F1A\u65AD */\n .dshpc-split > * + *{box-sizing:border-box;border-left:1px solid var(--dshpc-border);}\n /* \u6574\u4F53\u805A\u7126\uFF1A\u5185\u4EF6\u81EA\u5DF1\u7684\u5916\u5708\u4EA4\u51FA\u6765\uFF0C\u7531\u5916\u58F3\u753B\u4E00\u6574\u5708\uFF08\u5185\u4EF6\u5404\u81EA\u753B\u4F1A\u53D8\u6210\u683C\u5185\u534A\u5708\uFF09 */\n .dshpc-split:focus-within{border-color:var(--dshpc-focus);box-shadow:0 0 0 1px var(--dshpc-focus);}\n /* Picker\uFF1A\u53BB\u6389\u81EA\u8EAB\u5916\u6846\u4E0E\u5E95\u8272\uFF1Bdisplay \u6539\u6210 flex\uFF0C\u6D88\u6389 inline-block \u884C\u76D2\u5E26\u6765\u7684\u57FA\u7EBF\u95F4\u9699\u3002\n \u6CE8\u610F**\u4E0D\u80FD\u7528 height:100%**\uFF1A\u5B83\u4F1A\u548C .dshpc-picker__trigger--lg / --sm \u540C\u7279\u5F02\u6027\uFF08\u90FD\u662F\u4E24\u4E2A\u7C7B\uFF09\uFF0C\n \u4E14 split-group.css \u5728 picker.css \u4E4B\u540E\u6CE8\u5165\uFF0C\u4F1A\u628A\u4E09\u6863\u9AD8\u5EA6\u5168\u5403\u6389\uFF08md/lg \u770B\u8D77\u6765\u4E00\u6837\u5927\uFF09\u3002\n \u6539\u7528 align-items:center \u2014\u2014 \u540C size \u65F6\u4E24\u683C\u81EA\u7136\u7B49\u9AD8\u7684\u540C\u65F6\u6587\u5B57\u5782\u76F4\u5C45\u4E2D\uFF1B\u4E07\u4E00\u4E24\u683C size \u4E0D\u4E00\u81F4\uFF0C\n \u8F83\u77EE\u7684\u683C\u4E5F\u53EA\u662F\u5C45\u4E2D\u3001\u4E0D\u4F1A\u9876\u5BF9\u9F50\u9732\u767D\u3002 */\n .dshpc-split .dshpc-picker{display:flex;align-items:center;}\n .dshpc-split .dshpc-picker__trigger{border:0;border-radius:0;background:transparent;}\n .dshpc-split .dshpc-picker__trigger:focus-visible{outline:0;}\n /* \u5DE6\u683C\u4E0B\u62C9\uFF1A\u7070\u5E95\uFF08\u6ED1\u5757\u7684\u7070\u8F68\u662F\u5B83\u81EA\u5DF1\u7684 --dshpc-seg-track\uFF0C\u4E0D\u5728\u8FD9\u91CC\u8986\u76D6\uFF09 */\n .dshpc-split > :first-child .dshpc-picker__trigger{background:var(--dshpc-surface-sunken);}\n /* Segmented\uFF1A\u53EA\u53BB\u5916\u5706\u89D2\u4E0E\u63CF\u8FB9\uFF0C\u7070\u8F68\u4FDD\u7559\uFF1Bpadding \u4FDD\u6301 3px \u4E0D\u52A8 \u2014\u2014 \u5B83\u662F\u9AD8\u5EA6\u5951\u7EA6\u7684\u4E00\u90E8\u5206\n \uFF083 + item + 3 = control-h\uFF09\u3002bordered \u90A3\u6863\u53BB\u6389\u63CF\u8FB9\u3001\u628A\u8BA9\u7ED9\u63CF\u8FB9\u7684 1px \u8FD8\u56DE padding\uFF0C\n \u5426\u5219\u4F1A\u6BD4\u53F3\u8FB9\u77EE 2px\u3002 */\n .dshpc-split .dshpc-seg{border-radius:0;border:0;}\n .dshpc-split .dshpc-seg--bordered{padding:3px;}\n";
2
+ //# sourceMappingURL=split-group-css.generated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split-group-css.generated.d.ts","sourceRoot":"","sources":["../../../src/ui/controls/split-group-css.generated.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,26KAA+pE,CAAA"}
@@ -0,0 +1,4 @@
1
+ // ⚠️ 生成物,勿手改。真源 = src/ui/controls/split-group.css
2
+ // 由 scripts/gen-css.mjs 生成(`pnpm run gen:css`):改样式请改那个 .css 文件后重新生成。
3
+ export const SPLIT_GROUP_CSS = "\n/* ── 拼接外壳 SplitGroup ──────────────────────────────────────────────\n 职责只有一条:把两个控件在外观上焊成一体(外框 / 圆角 / 中间 1px 分隔 / 整体聚焦圈)。\n 它**不持状态、不出联动回调** —— 选中与联动全走内件自己的 value / onChange\n (用户 2026-10-28 拍板:外壳不必知道右边那个下拉管什么)。\n\n ⚠️ 与内件类名有意耦合:内件是 Picker / Segmented 时由下面几条规则把它们自己的\n 边框 / 底色 / 圆角交出来,由外壳统一画。内件改名或改结构要同步改这里,\n 否则会出现双边框、双底色。\n\n 高度不写死:内件自己按 size 档(sm 24 / md 28 / lg 32)撑开,外壳跟着长。\n 两格要等高,就给内件传**同一个 size**。万一两格 size 不一致,外壳内件用 align-items:center\n 居中(不会顶对齐露白,用户 2026-10-28 截图反馈「本月偏上」后的处理);**别用 height:100%**,\n 它会覆盖三档高度(与 --lg/--sm 同特异性且注入更晚)。\n\n 左格统一灰底(用户 2026-10-28 拍板):滑块保留自己的灰轨,左格下拉把底色换成\n surface-sunken;右格保持原样。层次感 = 左格是「档位/范围」,右格是「值」。 */\n .dshpc-split{display:inline-flex;align-items:stretch;max-width:100%;overflow:hidden;border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);background:var(--dshpc-surface-1);}\n /* 两格宽度都由内容给;容器再窄也让内件自己省略,不让外壳被撑破 */\n .dshpc-split > *{min-width:0;max-width:100%;}\n /* 分隔:相邻兄弟的左描边,不额外插 DOM,hover / focus 时也不会断 */\n .dshpc-split > * + *{box-sizing:border-box;border-left:1px solid var(--dshpc-border);}\n /* 整体聚焦:内件自己的外圈交出来,由外壳画一整圈(内件各自画会变成格内半圈) */\n .dshpc-split:focus-within{border-color:var(--dshpc-focus);box-shadow:0 0 0 1px var(--dshpc-focus);}\n /* Picker:去掉自身外框与底色;display 改成 flex,消掉 inline-block 行盒带来的基线间隙。\n 注意**不能用 height:100%**:它会和 .dshpc-picker__trigger--lg / --sm 同特异性(都是两个类),\n 且 split-group.css 在 picker.css 之后注入,会把三档高度全吃掉(md/lg 看起来一样大)。\n 改用 align-items:center —— 同 size 时两格自然等高的同时文字垂直居中;万一两格 size 不一致,\n 较矮的格也只是居中、不会顶对齐露白。 */\n .dshpc-split .dshpc-picker{display:flex;align-items:center;}\n .dshpc-split .dshpc-picker__trigger{border:0;border-radius:0;background:transparent;}\n .dshpc-split .dshpc-picker__trigger:focus-visible{outline:0;}\n /* 左格下拉:灰底(滑块的灰轨是它自己的 --dshpc-seg-track,不在这里覆盖) */\n .dshpc-split > :first-child .dshpc-picker__trigger{background:var(--dshpc-surface-sunken);}\n /* Segmented:只去外圆角与描边,灰轨保留;padding 保持 3px 不动 —— 它是高度契约的一部分\n (3 + item + 3 = control-h)。bordered 那档去掉描边、把让给描边的 1px 还回 padding,\n 否则会比右边矮 2px。 */\n .dshpc-split .dshpc-seg{border-radius:0;border:0;}\n .dshpc-split .dshpc-seg--bordered{padding:3px;}\n";
4
+ //# sourceMappingURL=split-group-css.generated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split-group-css.generated.js","sourceRoot":"","sources":["../../../src/ui/controls/split-group-css.generated.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,qEAAqE;AACrE,MAAM,CAAC,MAAM,eAAe,GAAG,4pEAA4pE,CAAA"}
@@ -5,4 +5,5 @@ export { LOADING_CSS } from './controls/loading-css.generated.js';
5
5
  export { BACK_TO_TOP_CSS } from './controls/back-to-top-css.generated.js';
6
6
  export { HINT_CSS } from './controls/hint-css.generated.js';
7
7
  export { DATETIME_CSS } from './controls/datetime-css.generated.js';
8
+ export { SPLIT_GROUP_CSS } from './controls/split-group-css.generated.js';
8
9
  //# sourceMappingURL=controls-css.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"controls-css.d.ts","sourceRoot":"","sources":["../../src/ui/controls-css.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAA;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA"}
1
+ {"version":3,"file":"controls-css.d.ts","sourceRoot":"","sources":["../../src/ui/controls-css.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAA;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA"}
@@ -12,4 +12,5 @@ export { LOADING_CSS } from './controls/loading-css.generated.js';
12
12
  export { BACK_TO_TOP_CSS } from './controls/back-to-top-css.generated.js';
13
13
  export { HINT_CSS } from './controls/hint-css.generated.js';
14
14
  export { DATETIME_CSS } from './controls/datetime-css.generated.js';
15
+ export { SPLIT_GROUP_CSS } from './controls/split-group-css.generated.js';
15
16
  //# sourceMappingURL=controls-css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"controls-css.js","sourceRoot":"","sources":["../../src/ui/controls-css.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAE3B,mCAAmC;AACnC,8DAA8D;AAC9D,kEAAkE;AAClE,gDAAgD;AAChD,kDAAkD;AAClD,4DAA4D;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAA;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA"}
1
+ {"version":3,"file":"controls-css.js","sourceRoot":"","sources":["../../src/ui/controls-css.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAE3B,mCAAmC;AACnC,8DAA8D;AAC9D,kEAAkE;AAClE,gDAAgD;AAChD,kDAAkD;AAClD,4DAA4D;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAA;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../../src/ui/css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAoBlE,eAAO,MAAM,eAAe,aAAa,CAAA;AAEzC;;;GAGG;AACH,eAAO,MAAM,YAAY,QAiBb,CAAA;AAWZ,wBAAgB,WAAW,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAE/C;AAED,wBAAgB,WAAW,IAAI,QAAQ,CAEtC;AAED,gCAAgC;AAChC,wBAAgB,cAAc,CAAC,GAAG,GAAE,QAAkB,GAAG,IAAI,CAG5D"}
1
+ {"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../../src/ui/css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAqBlE,eAAO,MAAM,eAAe,aAAa,CAAA;AAEzC;;;GAGG;AACH,eAAO,MAAM,YAAY,QAkBb,CAAA;AAWZ,wBAAgB,WAAW,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAE/C;AAED,wBAAgB,WAAW,IAAI,QAAQ,CAEtC;AAED,gCAAgC;AAChC,wBAAgB,cAAc,CAAC,GAAG,GAAE,QAAkB,GAAG,IAAI,CAG5D"}
package/dist/ui/css.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { createStyleKit } from '../design/index.js';
2
- import { BACK_TO_TOP_CSS, BUTTON_CSS, DATETIME_CSS, FIELD_CSS, HINT_CSS, LOADING_CSS, SEGMENTED_CSS, } from './controls-css.js';
2
+ import { BACK_TO_TOP_CSS, BUTTON_CSS, DATETIME_CSS, FIELD_CSS, HINT_CSS, LOADING_CSS, SEGMENTED_CSS, SPLIT_GROUP_CSS, } from './controls-css.js';
3
3
  import { MARQUEE_CSS } from './marquee-css.js';
4
4
  import { PICKER_CSS } from './picker-css.js';
5
5
  import { FEEDBACK_CSS } from './feedback-css.js';
@@ -31,6 +31,7 @@ export const CONTROLS_CSS = [
31
31
  MARQUEE_CSS,
32
32
  PANEL_DOCK_CSS,
33
33
  CODE_VIEWER_CSS,
34
+ SPLIT_GROUP_CSS,
34
35
  ].join('\n');
35
36
  /**
36
37
  * 当前插件的样式设施。
@@ -1 +1 @@
1
- {"version":3,"file":"css.js","sourceRoot":"","sources":["../../src/ui/css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAiB,MAAM,oBAAoB,CAAA;AAClE,OAAO,EACL,eAAe,EACf,UAAU,EACV,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,WAAW,EACX,aAAa,GACd,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAEvD,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAA;AAEzC;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,aAAa;IACb,UAAU;IACV,SAAS;IACT,WAAW;IACX,eAAe;IACf,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,WAAW;IACX,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,cAAc;IACd,eAAe;CAChB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ;;;;;;GAMG;AACH,IAAI,OAAO,GAAa,cAAc,CAAC,EAAE,EAAE,EAAE,oBAAoB,EAAE,CAAC,CAAA;AAEpE,MAAM,UAAU,WAAW,CAAC,GAAa;IACvC,OAAO,GAAG,GAAG,CAAA;AACf,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,cAAc,CAAC,MAAgB,OAAO;IACpD,GAAG,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;IAC1C,GAAG,CAAC,UAAU,CAAC,eAAe,EAAE,YAAY,CAAC,CAAA;AAC/C,CAAC"}
1
+ {"version":3,"file":"css.js","sourceRoot":"","sources":["../../src/ui/css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAiB,MAAM,oBAAoB,CAAA;AAClE,OAAO,EACL,eAAe,EACf,UAAU,EACV,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,WAAW,EACX,aAAa,EACb,eAAe,GAChB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAEvD,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAA;AAEzC;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,aAAa;IACb,UAAU;IACV,SAAS;IACT,WAAW;IACX,eAAe;IACf,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,WAAW;IACX,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,cAAc;IACd,eAAe;IACf,eAAe;CAChB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ;;;;;;GAMG;AACH,IAAI,OAAO,GAAa,cAAc,CAAC,EAAE,EAAE,EAAE,oBAAoB,EAAE,CAAC,CAAA;AAEpE,MAAM,UAAU,WAAW,CAAC,GAAa;IACvC,OAAO,GAAG,GAAG,CAAA;AACf,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,cAAc,CAAC,MAAgB,OAAO;IACpD,GAAG,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;IAC1C,GAAG,CAAC,UAAU,CAAC,eAAe,EAAE,YAAY,CAAC,CAAA;AAC/C,CAAC"}
@@ -15,6 +15,7 @@ export { Chip, type ChipProps, type ChipSize, type ChipTone } from './Chip.js';
15
15
  export { showToast, notify, type ToastVariant, type ToastPosition, type ToastOptions, type ToastAction, type NotifyOptions, } from './Toast.js';
16
16
  export { Button, IconButton, type ButtonProps, type ButtonSize, type ButtonVariant, type IconButtonProps } from './Button.js';
17
17
  export { Segmented, type SegmentedProps } from './Segmented.js';
18
+ export { SplitGroup, type SplitGroupProps } from './SplitGroup.js';
18
19
  export { Textarea, type TextareaProps } from './Textarea.js';
19
20
  export { Checkbox, type CheckboxProps } from './Checkbox.js';
20
21
  export { MarqueeText } from './MarqueeText.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"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"}
package/dist/ui/index.js CHANGED
@@ -18,6 +18,7 @@ export { Chip } from './Chip.js';
18
18
  export { showToast, notify, } from './Toast.js';
19
19
  export { Button, IconButton } from './Button.js';
20
20
  export { Segmented } from './Segmented.js';
21
+ export { SplitGroup } from './SplitGroup.js';
21
22
  export { Textarea } from './Textarea.js';
22
23
  export { Checkbox } from './Checkbox.js';
23
24
  export { MarqueeText } from './MarqueeText.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,sDAAsD;AACtD,gDAAgD;AAChD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACpF,OAAO,EACL,YAAY,EACZ,cAAc,EACd,OAAO,EACP,QAAQ,EACR,oBAAoB,EACpB,QAAQ,EACR,WAAW,GAGZ,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,MAAM,EAAqC,MAAM,aAAa,CAAA;AACvE,OAAO,EACL,cAAc,GAIf,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,eAAe,EACf,eAAe,EACf,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,UAAU,EACV,aAAa,EACb,OAAO,EACP,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,OAAO,EACP,QAAQ,EACR,UAAU,EACV,aAAa,GAQd,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,WAAW,EAAkD,MAAM,kBAAkB,CAAA;AAC9F,OAAO,EAAE,eAAe,EAA6B,MAAM,sBAAsB,CAAA;AACjF,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,aAAa,GAOd,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,KAAK,EAAmC,MAAM,YAAY,CAAA;AACnE,OAAO,EACL,UAAU,GAGX,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,YAAY,GAGb,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,UAAU,EACV,YAAY,GAGb,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,YAAY,EACZ,IAAI,EACJ,SAAS,GAGV,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,IAAI,EAAgD,MAAM,WAAW,CAAA;AAC9E,OAAO,EACL,SAAS,EACT,MAAM,GAMP,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,MAAM,EAAE,UAAU,EAA+E,MAAM,aAAa,CAAA;AAC7H,OAAO,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAA;AAC/D,OAAO,EAAE,QAAQ,EAAsB,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,QAAQ,EAAsB,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,aAAa,EAAqB,MAAM,cAAc,CAAA;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAA;AAC/D,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GAGnB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAA;AAC/D,OAAO,EAAE,sBAAsB,EAAsB,MAAM,cAAc,CAAA;AACzE,OAAO,EACL,SAAS,EACT,SAAS,EACT,eAAe,GAOhB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,aAAa,EACb,SAAS,EACT,WAAW,EACX,WAAW,EACX,MAAM,EACN,SAAS,EACT,WAAW,EACX,aAAa,GAGd,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,KAAK,EACL,WAAW,EACX,aAAa,EACb,cAAc,GAMf,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,sDAAsD;AACtD,gDAAgD;AAChD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACpF,OAAO,EACL,YAAY,EACZ,cAAc,EACd,OAAO,EACP,QAAQ,EACR,oBAAoB,EACpB,QAAQ,EACR,WAAW,GAGZ,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,MAAM,EAAqC,MAAM,aAAa,CAAA;AACvE,OAAO,EACL,cAAc,GAIf,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,eAAe,EACf,eAAe,EACf,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,UAAU,EACV,aAAa,EACb,OAAO,EACP,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,OAAO,EACP,QAAQ,EACR,UAAU,EACV,aAAa,GAQd,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,WAAW,EAAkD,MAAM,kBAAkB,CAAA;AAC9F,OAAO,EAAE,eAAe,EAA6B,MAAM,sBAAsB,CAAA;AACjF,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,aAAa,GAOd,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,KAAK,EAAmC,MAAM,YAAY,CAAA;AACnE,OAAO,EACL,UAAU,GAGX,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,YAAY,GAGb,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,UAAU,EACV,YAAY,GAGb,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,YAAY,EACZ,IAAI,EACJ,SAAS,GAGV,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,IAAI,EAAgD,MAAM,WAAW,CAAA;AAC9E,OAAO,EACL,SAAS,EACT,MAAM,GAMP,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,MAAM,EAAE,UAAU,EAA+E,MAAM,aAAa,CAAA;AAC7H,OAAO,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAA;AAC/D,OAAO,EAAE,UAAU,EAAwB,MAAM,iBAAiB,CAAA;AAClE,OAAO,EAAE,QAAQ,EAAsB,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,QAAQ,EAAsB,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,aAAa,EAAqB,MAAM,cAAc,CAAA;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAA;AAC/D,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GAGnB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAA;AAC/D,OAAO,EAAE,sBAAsB,EAAsB,MAAM,cAAc,CAAA;AACzE,OAAO,EACL,SAAS,EACT,SAAS,EACT,eAAe,GAOhB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,aAAa,EACb,SAAS,EACT,WAAW,EACX,WAAW,EACX,MAAM,EACN,SAAS,EACT,WAAW,EACX,aAAa,GAGd,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,KAAK,EACL,WAAW,EACX,aAAa,EACb,cAAc,GAMf,MAAM,YAAY,CAAA"}
@@ -47,6 +47,7 @@ dsh-plugin-core/
47
47
  │ │ SectionHead / FieldHint / LiveText / BackToTop
48
48
  │ ├── 选择 ✅ WorkspacePicker(选工作区,自取宿主快照)
49
49
  │ │ 通用 Picker 是纯零件;领域选择器经 connectHost 自取数(2026-10-20)
50
+ │ ├── 组合 ✅ SplitGroup(两格焊成一体:只画外框 / 分隔 / 聚焦圈,不持状态)
50
51
  │ └── 布局 ✅ PanelDock / createPanelDock(可停靠分栏:多面板 + 拖拽拉栏)
51
52
  │ 组名 = 窗口一对一、同名覆盖、默认上限 3 超限拒绝;
52
53
  │ 不做 tab 切换 / 自动淘汰 / 浮动层(用户 2026-10-20 定案)
@@ -112,6 +113,7 @@ utils(谁都不依赖,谁都可以用)
112
113
  │ ├─ 动作 Button / IconButton
113
114
  │ ├─ 反馈 Modal / Toast
114
115
  │ ├─ 展示 Card / StripCard / Chip / MarqueeText / SectionHead / FieldHint / LiveText / BackToTop
116
+ │ ├─ 组合 SplitGroup(展示在选择器页)
115
117
  │ └─ 布局 PanelDock / 拉栏
116
118
  │
117
119
  ├─ ③ 高级空间
@@ -67,6 +67,32 @@ its own assertion.
67
67
  EN: The `ui` layer has no official dependency, so every arrow comes from the self-drawn chevron in
68
68
  `src/ui/chevron.ts`. Never write a glyph arrow again; a test enforces it.
69
69
 
70
+ ## 拼成一体:外壳持框,内件交边
71
+
72
+ > EN: Welding controls together: the shell owns the frame, the cells hand over their borders
73
+
74
+ 多个控件拼成一个外观(`SplitGroup`、`PrefixedInput`、`NumberInput`、`DateTimePicker` 的 range 触发器)
75
+ 只有一种写法:**外壳持边框 + 圆角 + `overflow:hidden` + 整体 `:focus-within`;内件把边框、底色、圆角
76
+ 交出来**(`border:0; border-radius:0; background:transparent`)。不给内件再套第二个外框,也不让内件
77
+ 自己画 `:focus-visible` 圈——否则格子里会冒出半圈描边。
78
+
79
+ `SplitGroup` 用后代选择器直接压内件(`.dshpc-split .dshpc-picker__trigger` / `.dshpc-split .dshpc-seg`),
80
+ 所以**内件类名就是耦合点**:改这些类名或结构必须同步改 `src/ui/controls/split-group.css`,否则拼接
81
+ 静默失效(双边框、底色错位),没有自检能替你发现。高度不写死——内件按自己的 `size`(sm 24 /
82
+ md 28 / lg 32)撑开,外壳跟着长;两格传同一个 `size` 才逐像素等高。**外壳绝不能用 `height:100%`
83
+ 拉满内件**:它和 `.dshpc-picker__trigger--lg` / `--sm` 同特异性(两个类)且 `split-group.css`
84
+ 注入更晚,会把三档高度全吃掉(md/lg 看起来一样大,2026-10-28 踩过)。万一两格 `size` 不一致,
85
+ 靠外壳内 `align-items:center` 居中即可。
86
+
87
+ **左格统一灰底**(用户 2026-10-28 拍板):第一格无论是滑块(保留自己的灰轨
88
+ `--dshpc-seg-track`)还是下拉(`> :first-child .dshpc-picker__trigger` 上 `surface-sunken`),
89
+ 都呈现灰底;右格保持原样。层次感 = 左格选「档位 / 范围」,右格选「值」。
90
+
91
+ EN: Welding controls into one visual unit has exactly one recipe: the shell owns border, radius,
92
+ `overflow:hidden` and the shared `:focus-within` ring; the cells hand over border, background and radius.
93
+ `SplitGroup` overrides inner classes with descendant selectors, so those class names are the coupling point —
94
+ rename them and you must update `src/ui/controls/split-group.css`, or the weld fails silently.
95
+
70
96
  ## 三条硬规矩
71
97
 
72
98
  > EN: Three hard rules
@@ -54,10 +54,25 @@ h(DateTimePicker, {
54
54
  onChange: setRange, // → ['2026-10-24T00:00:00.000', '2026-10-24T23:59:59.999']
55
55
  })`
56
56
 
57
+ const splitGroupExample = `import { SplitGroup, Segmented, Picker } from 'dsh-plugin-core/ui'
58
+
59
+ // 两格焊成一体:外框 / 圆角 / 中间 1px 分隔 / 整体聚焦圈都由外壳画
60
+ // 联动不归外壳管 —— 左格选完,在它自己的 onChange 里改右格的数据
61
+ h(SplitGroup, null,
62
+ h(Segmented, { size: 'md', items: periods, value: period, onChange: (v) => { setPeriod(v); setBucket('') } }),
63
+ h(Picker, { size: 'md', options: bucketsOf(period), value: bucket, onChange: setBucket, clearable: true }),
64
+ )
65
+
66
+ // 两个下拉同样只是换内件,外壳不变
67
+ h(SplitGroup, null,
68
+ h(Picker, { size: 'md', options: scopes, value: scope, onChange: setScope }),
69
+ h(Picker, { size: 'md', options: membersOf(scope), value: member, onChange: setMember, searchable: true }),
70
+ )`
71
+
57
72
  const doc: DocTopic = {
58
73
  title: { zh: 'ui —— 基础控件', en: 'ui — base controls' },
59
74
  exports: [
60
- 'Button', 'IconButton', 'Segmented', 'Input', 'PrefixedInput', 'NumberInput', 'Textarea',
75
+ 'Button', 'IconButton', 'Segmented', 'SplitGroup', 'Input', 'PrefixedInput', 'NumberInput', 'Textarea',
61
76
  'Checkbox', 'fieldMetricsOf', 'Picker', 'WorkspacePicker', 'ModelPicker', 'DateTimePicker', 'Card', 'StripCard',
62
77
  'Chip', 'Modal', 'FieldHint', 'setTooltipRenderer', 'showToast', 'notify', 'showHostToast',
63
78
  'Loading', 'RunningBlocks', 'SectionHead', 'MarqueeText', 'LiveText',
@@ -202,6 +217,35 @@ const doc: DocTopic = {
202
217
  ],
203
218
  code: [{ id: 'ui-workspacepicker-example', lang: 'tsx', src: workspacePickerExample }],
204
219
  },
220
+ {
221
+ id: 'split-group',
222
+ heading: { zh: 'SplitGroup(组合选择框)', en: 'SplitGroup (combined selectors)' },
223
+ prose: [
224
+ {
225
+ zh: '只做一件事:把两个控件在**外观上**焊成一体——外框、圆角、两格之间那条 1px 分隔、整体聚焦圈都由外壳画;内件仍是原来的控件(它们把边框、底色、圆角交出来)。形态随便换:滑块 + 下拉、下拉 + 下拉,外壳不变。',
226
+ en: 'Does one thing: welds two controls into one **visually** — outer frame, corner radius, the 1px divider between the cells and the shared focus ring all come from the shell; the inner controls stay the original ones (they hand over border, background and radius). Swap the cells freely: segmented + dropdown, dropdown + dropdown — the shell does not change.',
227
+ },
228
+ {
229
+ zh: '外壳**不持状态、不出联动回调**:联动就是让左格自己的 `onChange` 去改右格的数据源,两个控件原本怎么用,拼起来还怎么用。固定两格,不做多格。',
230
+ en: 'The shell holds **no state and emits no linking callback**: linking means the left cell’s own `onChange` updates the right cell’s data. Each control behaves exactly as it does on its own. Exactly two cells, never more.',
231
+ },
232
+ {
233
+ zh: '高度不写死:内件按自己的 `size`(sm 24 / md 28 / lg 32)撑开,外壳跟着长,两格传**同一个 size** 才逐像素等高。下拉菜单 portal 到 body,不受外壳 `overflow:hidden` 裁剪。',
234
+ en: 'Height is never hard-coded: each cell grows to its own `size` (sm 24 / md 28 / lg 32) and the shell follows; give both cells the **same size** for pixel-identical heights. Menus portal to body, so the shell’s `overflow:hidden` never clips them.',
235
+ },
236
+ ],
237
+ api: [
238
+ {
239
+ id: 'ui-split-group',
240
+ rows: [
241
+ { name: 'children', type: 'ReactNode', def: '—', desc: { zh: '两格内容(左、右);元素顺序即布局顺序', en: 'Two cells (left, right); order is layout order' } },
242
+ { name: 'label', type: 'string', def: '—', desc: { zh: '无障碍组名(role=group)', en: 'Accessible group name (role=group)' } },
243
+ { name: 'id / className / style', type: 'string / string / CSSProperties', def: '—', desc: { zh: '锚点 / 只补布局,不覆盖皮肤', en: 'Anchor / layout-only additions, never skin overrides' } },
244
+ ],
245
+ },
246
+ ],
247
+ code: [{ id: 'ui-splitgroup-example', lang: 'tsx', src: splitGroupExample }],
248
+ },
205
249
  {
206
250
  id: 'datetime-picker',
207
251
  heading: { zh: 'DateTimePicker(日期时间选择)', en: 'DateTimePicker (date & time)' },
package/docs/help/ui.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  > EN: ui — base controls
6
6
 
7
- 导出:Button、IconButton、Segmented、Input、PrefixedInput、NumberInput、Textarea、Checkbox、fieldMetricsOf、Picker、WorkspacePicker、ModelPicker、DateTimePicker、Card、StripCard、Chip、Modal、FieldHint、setTooltipRenderer、showToast、notify、showHostToast、Loading、RunningBlocks、SectionHead、MarqueeText、LiveText、BackToTop、startResizeLayoutWidth、PanelDock、createPanelDock、DockPanel、ensureControls、setStyleKit
7
+ 导出:Button、IconButton、Segmented、SplitGroup、Input、PrefixedInput、NumberInput、Textarea、Checkbox、fieldMetricsOf、Picker、WorkspacePicker、ModelPicker、DateTimePicker、Card、StripCard、Chip、Modal、FieldHint、setTooltipRenderer、showToast、notify、showHostToast、Loading、RunningBlocks、SectionHead、MarqueeText、LiveText、BackToTop、startResizeLayoutWidth、PanelDock、createPanelDock、DockPanel、ensureControls、setStyleKit
8
8
 
9
9
  ## 概览
10
10
 
@@ -134,6 +134,45 @@ import { WorkspacePicker, connectHost } from 'dsh-plugin-core/ui'
134
134
  h(WorkspacePicker, { value: cur, onChange: setCur, clearable: true })
135
135
  ```
136
136
 
137
+ ## SplitGroup(组合选择框)
138
+
139
+ > EN: SplitGroup (combined selectors)
140
+
141
+ 只做一件事:把两个控件在**外观上**焊成一体——外框、圆角、两格之间那条 1px 分隔、整体聚焦圈都由外壳画;内件仍是原来的控件(它们把边框、底色、圆角交出来)。形态随便换:滑块 + 下拉、下拉 + 下拉,外壳不变。
142
+
143
+ > EN: Does one thing: welds two controls into one **visually** — outer frame, corner radius, the 1px divider between the cells and the shared focus ring all come from the shell; the inner controls stay the original ones (they hand over border, background and radius). Swap the cells freely: segmented + dropdown, dropdown + dropdown — the shell does not change.
144
+
145
+ 外壳**不持状态、不出联动回调**:联动就是让左格自己的 `onChange` 去改右格的数据源,两个控件原本怎么用,拼起来还怎么用。固定两格,不做多格。
146
+
147
+ > EN: The shell holds **no state and emits no linking callback**: linking means the left cell’s own `onChange` updates the right cell’s data. Each control behaves exactly as it does on its own. Exactly two cells, never more.
148
+
149
+ 高度不写死:内件按自己的 `size`(sm 24 / md 28 / lg 32)撑开,外壳跟着长,两格传**同一个 size** 才逐像素等高。下拉菜单 portal 到 body,不受外壳 `overflow:hidden` 裁剪。
150
+
151
+ > EN: Height is never hard-coded: each cell grows to its own `size` (sm 24 / md 28 / lg 32) and the shell follows; give both cells the **same size** for pixel-identical heights. Menus portal to body, so the shell’s `overflow:hidden` never clips them.
152
+
153
+ | 参数 | 类型 | 默认 | 说明(zh) | 说明(en) |
154
+ |---|---|---|---|---|
155
+ | `children` | `ReactNode` | — | 两格内容(左、右);元素顺序即布局顺序 | Two cells (left, right); order is layout order |
156
+ | `label` | `string` | — | 无障碍组名(role=group) | Accessible group name (role=group) |
157
+ | `id / className / style` | `string / string / CSSProperties` | — | 锚点 / 只补布局,不覆盖皮肤 | Anchor / layout-only additions, never skin overrides |
158
+
159
+ ```tsx id="ui-splitgroup-example"
160
+ import { SplitGroup, Segmented, Picker } from 'dsh-plugin-core/ui'
161
+
162
+ // 两格焊成一体:外框 / 圆角 / 中间 1px 分隔 / 整体聚焦圈都由外壳画
163
+ // 联动不归外壳管 —— 左格选完,在它自己的 onChange 里改右格的数据
164
+ h(SplitGroup, null,
165
+ h(Segmented, { size: 'md', items: periods, value: period, onChange: (v) => { setPeriod(v); setBucket('') } }),
166
+ h(Picker, { size: 'md', options: bucketsOf(period), value: bucket, onChange: setBucket, clearable: true }),
167
+ )
168
+
169
+ // 两个下拉同样只是换内件,外壳不变
170
+ h(SplitGroup, null,
171
+ h(Picker, { size: 'md', options: scopes, value: scope, onChange: setScope }),
172
+ h(Picker, { size: 'md', options: membersOf(scope), value: member, onChange: setMember, searchable: true }),
173
+ )
174
+ ```
175
+
137
176
  ## DateTimePicker(日期时间选择)
138
177
 
139
178
  > EN: DateTimePicker (date & time)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-plugin-core",
3
- "version": "0.7.4",
3
+ "version": "0.8.0",
4
4
  "packageManager": "pnpm@12.3.4",
5
5
  "description": "Shared base for DSH plugins: design tokens, UI controls, utils, workspace explorer, session preview",
6
6
  "keywords": [