dsh-plugin-core 0.18.0 → 0.19.1

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,84 @@
1
+ /**
2
+ * 组合输入框 —— 输入框 + 后置按钮组(+ 可选前置标题)焊成一体(L2 组件皮肤,P3)
3
+ *
4
+ * 外观与 {@link SplitGroup} 同一套口径:外框 / 圆角 / 相邻 1px 分隔 / 整体聚焦圈都由外壳画,
5
+ * 内件(Input、Button、IconButton)把自己的边框、圆角、外圈交出来。区别只有一条:
6
+ * **这里持状态** —— 输入值受控于调用方,提交点与撤销栈在控件内部。
7
+ *
8
+ * 用法:
9
+ * h(InputGroup, {
10
+ * label: '任务名', value, onChange: setValue, undoable: true,
11
+ * actions: [
12
+ * { label: '返回', variant: 'ghost', onClick: () => close() },
13
+ * { label: '确定', variant: 'primary', onClick: save },
14
+ * ],
15
+ * })
16
+ *
17
+ * 撤销口径:Enter / 失焦 / 点任一动作 = 一次提交,把提交前的值压栈;点撤销弹回栈顶。
18
+ * 父级直接改 `value`(如外部清空)不算编辑,不进栈。
19
+ */
20
+ import { createElement as h, type CSSProperties, type ReactNode } from 'react';
21
+ import { type ButtonVariant } from './Button.js';
22
+ import { type FieldSize } from './Field.js';
23
+ /** 后置按钮:只给 icon = 纯图标钮(正方形);给 label = 文字钮;两个都给 = 图标 + 文字。 */
24
+ export interface InputGroupAction {
25
+ /** 图标(任意 ReactNode)。 */
26
+ icon?: ReactNode;
27
+ /** 文案。不给且没图标 ⇒ 不渲染。 */
28
+ label?: string;
29
+ /**
30
+ * 外观档(默认 `info`)。要语义色就直接传这一档 —— `success` / `info` / `warning` / `danger`
31
+ * 都是 Button 现成的档,不是另外调色(用户 2026-11-02 定:别自造颜色,用这几档语义色,主要 success 与 info)。
32
+ */
33
+ variant?: ButtonVariant;
34
+ /** 单钮禁用。 */
35
+ disabled?: boolean;
36
+ /** 无障碍名:只有图标时必给(否则读屏只知道「按钮」)。 */
37
+ ariaLabel?: string;
38
+ /** 点击。 */
39
+ onClick: () => void;
40
+ }
41
+ export interface InputGroupProps {
42
+ /** 当前值。 */
43
+ value: string;
44
+ /** 变更回调。 */
45
+ onChange: (value: string) => void;
46
+ /** 前置标题:与输入框同格、灰底,和控件是一体的。 */
47
+ label?: string;
48
+ /** 占位。 */
49
+ placeholder?: string;
50
+ /** 高度档(默认 lg)。 */
51
+ size?: FieldSize;
52
+ /** 自定义高度(px):给了就压过 size 档。 */
53
+ height?: number;
54
+ /** 校验不通过:整组描红。 */
55
+ error?: boolean;
56
+ /** 禁用整组。 */
57
+ disabled?: boolean;
58
+ /** 后置按钮,顺序即布局顺序;一枚或多枚都行(如「返回」+「确定」)。 */
59
+ actions?: InputGroupAction[];
60
+ /** 开启撤销:按钮组最前面多一枚撤销钮,回到上一次提交前的值。 */
61
+ undoable?: boolean;
62
+ /** 撤销钮的无障碍名(默认「撤销」)。 */
63
+ undoLabel?: string;
64
+ /** Enter 提交回调(提交点之一,撤销栈照记)。 */
65
+ onSubmit?: (value: string) => void;
66
+ /** 无障碍名(整组 role=group)。 */
67
+ 'aria-label'?: string;
68
+ /** 根节点 id。 */
69
+ id?: string;
70
+ /** 追加 class(只补布局,不覆盖皮肤)。 */
71
+ className?: string;
72
+ /** 追加样式(只补布局)。 */
73
+ style?: CSSProperties;
74
+ /** 问号提示文字:给了就在整组后面挂标准 FieldHint。 */
75
+ hint?: string;
76
+ }
77
+ /**
78
+ * 渲染一个「输入框 + 按钮组」组合控件。
79
+ *
80
+ * @param props 见 {@link InputGroupProps}。
81
+ * @returns 组合控件元素。
82
+ */
83
+ export declare function InputGroup(props: InputGroupProps): ReturnType<typeof h>;
84
+ //# sourceMappingURL=InputGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputGroup.d.ts","sourceRoot":"","sources":["../../src/ui/InputGroup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,aAAa,IAAI,CAAC,EAAoB,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAChG,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AACpE,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,YAAY,CAAA;AAI5D,6DAA6D;AAC7D,MAAM,WAAW,gBAAgB;IAC/B,wBAAwB;IACxB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB,YAAY;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU;IACV,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW;IACX,KAAK,EAAE,MAAM,CAAA;IACb,YAAY;IACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU;IACV,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kBAAkB;IAClB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kBAAkB;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,YAAY;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,wCAAwC;IACxC,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,2BAA2B;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,cAAc;IACd,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kBAAkB;IAClB,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAyFvE"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * 组合输入框 —— 输入框 + 后置按钮组(+ 可选前置标题)焊成一体(L2 组件皮肤,P3)
3
+ *
4
+ * 外观与 {@link SplitGroup} 同一套口径:外框 / 圆角 / 相邻 1px 分隔 / 整体聚焦圈都由外壳画,
5
+ * 内件(Input、Button、IconButton)把自己的边框、圆角、外圈交出来。区别只有一条:
6
+ * **这里持状态** —— 输入值受控于调用方,提交点与撤销栈在控件内部。
7
+ *
8
+ * 用法:
9
+ * h(InputGroup, {
10
+ * label: '任务名', value, onChange: setValue, undoable: true,
11
+ * actions: [
12
+ * { label: '返回', variant: 'ghost', onClick: () => close() },
13
+ * { label: '确定', variant: 'primary', onClick: save },
14
+ * ],
15
+ * })
16
+ *
17
+ * 撤销口径:Enter / 失焦 / 点任一动作 = 一次提交,把提交前的值压栈;点撤销弹回栈顶。
18
+ * 父级直接改 `value`(如外部清空)不算编辑,不进栈。
19
+ */
20
+ import { createElement as h, useRef, useState } from 'react';
21
+ import { Button, IconButton } from './Button.js';
22
+ import { Input, withHint } from './Field.js';
23
+ import { ensureComponentStyles } from './css.js';
24
+ import { BUTTON_CSS, FIELD_CSS, INPUT_GROUP_CSS } from './controls-css.js';
25
+ /**
26
+ * 渲染一个「输入框 + 按钮组」组合控件。
27
+ *
28
+ * @param props 见 {@link InputGroupProps}。
29
+ * @returns 组合控件元素。
30
+ */
31
+ export function InputGroup(props) {
32
+ ensureComponentStyles('input-group', INPUT_GROUP_CSS);
33
+ ensureComponentStyles('field', FIELD_CSS);
34
+ ensureComponentStyles('button', BUTTON_CSS);
35
+ const { value, onChange, label, placeholder, size = 'lg', height, error, disabled, actions = [], undoable = false, undoLabel = '撤销', onSubmit, } = props;
36
+ const committed = useRef(value);
37
+ const [undoStack, setUndoStack] = useState([]);
38
+ const commit = () => {
39
+ if (value === committed.current)
40
+ return;
41
+ const prev = committed.current;
42
+ committed.current = value;
43
+ setUndoStack((stack) => [...stack, prev]);
44
+ };
45
+ const undo = () => {
46
+ const prev = undoStack[undoStack.length - 1];
47
+ if (prev === undefined)
48
+ return;
49
+ setUndoStack((stack) => stack.slice(0, -1));
50
+ committed.current = prev;
51
+ onChange(prev);
52
+ };
53
+ const nodes = [];
54
+ if (label !== undefined)
55
+ nodes.push(h('span', { key: 'label', className: 'dshpc-igroup__label' }, label));
56
+ nodes.push(h(Input, {
57
+ key: 'input',
58
+ value,
59
+ onChange,
60
+ placeholder,
61
+ size,
62
+ disabled,
63
+ 'aria-label': props['aria-label'],
64
+ onBlur: commit,
65
+ onKeyDown: (event) => {
66
+ if (event.key !== 'Enter')
67
+ return;
68
+ event.preventDefault();
69
+ commit();
70
+ if (onSubmit !== undefined)
71
+ onSubmit(value);
72
+ },
73
+ }));
74
+ if (undoable) {
75
+ nodes.push(h(IconButton, {
76
+ key: 'undo',
77
+ variant: 'plain',
78
+ size,
79
+ icon: '↶',
80
+ label: undoLabel,
81
+ disabled: disabled === true || undoStack.length === 0,
82
+ onClick: undo,
83
+ }));
84
+ }
85
+ actions.forEach((action, i) => {
86
+ if (action.label === undefined && (action.icon === undefined || action.icon === null))
87
+ return;
88
+ const run = () => { commit(); action.onClick(); };
89
+ const off = disabled === true || action.disabled === true;
90
+ const onlyIcon = action.label === undefined;
91
+ nodes.push(onlyIcon
92
+ ? h(IconButton, {
93
+ key: `action-${String(i)}`,
94
+ variant: 'plain',
95
+ size,
96
+ icon: action.icon,
97
+ label: action.ariaLabel ?? '操作',
98
+ disabled: off,
99
+ onClick: run,
100
+ })
101
+ : h(Button, {
102
+ key: `action-${String(i)}`,
103
+ variant: action.variant ?? 'info',
104
+ size,
105
+ icon: action.icon,
106
+ disabled: off,
107
+ onClick: run,
108
+ }, action.label));
109
+ });
110
+ const className = `dshpc-igroup dshpc-igroup--${size}`
111
+ + `${error === true ? ' dshpc-igroup--error' : ''}`
112
+ + `${props.className !== undefined && props.className !== '' ? ` ${props.className}` : ''}`;
113
+ return withHint(h('div', {
114
+ role: 'group',
115
+ 'aria-label': props['aria-label'] ?? label,
116
+ id: props.id,
117
+ className,
118
+ style: height === undefined ? props.style : { height, ...props.style },
119
+ }, nodes), props.hint);
120
+ }
121
+ //# sourceMappingURL=InputGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputGroup.js","sourceRoot":"","sources":["../../src/ui/InputGroup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const INPUT_GROUP_CSS = "\n/* \u2500\u2500 \u7EC4\u5408\u8F93\u5165\u6846 InputGroup \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 \u8F93\u5165\u6846 + \u540E\u7F6E\u6309\u94AE\uFF08\u4E00\u679A\u6216\u591A\u679A\uFF09+ \u53EF\u9009\u524D\u7F6E\u6807\u9898\uFF0C\u710A\u6210\u4E00\u4F53\u3002\n \u4E0E SplitGroup \u540C\u4E00\u5957\u5916\u89C2\u53E3\u5F84\uFF1A\u5916\u6846 / \u5706\u89D2 / \u76F8\u90BB 1px \u5206\u9694 / \u6574\u4F53\u805A\u7126\u5708\u90FD\u7531\u5916\u58F3\u753B\uFF0C\n \u5185\u4EF6\uFF08.dshpc-input / .dshpc-btn / .dshpc-iconbtn\uFF09\u628A\u81EA\u5DF1\u7684\u8FB9\u6846\u3001\u5706\u89D2\u3001\u5916\u5708\u4EA4\u51FA\u6765\u3002\n\n \u9AD8\u5EA6\u9ED8\u8BA4\u5403 --dshpc-control-h-*\uFF08sm 24 / md 28 / lg 32\uFF09\uFF1B\u8C03\u7528\u65B9\u8981\u81EA\u5B9A\u4E49\u5C31\u5728\u6839\u8282\u70B9\n \u5185\u8054 height\uFF0C\u8FD9\u91CC\u8BA9\u5185\u4EF6 height:100% \u8DDF\u4E0A \u2014\u2014 \u5185\u4EF6\u6863\u4F4D\u9AD8\u5EA6\u53EA\u6709 0,1,0\uFF0C\u88AB\u672C\u6587\u4EF6\u7684\n 0,2,0 \u538B\u6389\uFF0C\u4E0D\u4F1A\u51FA\u73B0\u300C\u5916\u58F3\u53D8\u9AD8\u4E86\u3001\u91CC\u9762\u7684\u6846\u8FD8\u662F 32\u300D\u3002\n \uFF08\u26A0\uFE0F \u522B\u6539\u6210\u4E0D\u5199 height:100% \u53EA\u9760 stretch\uFF1Ainput \u6709\u786E\u5B9A\u9AD8\u5EA6\u65F6 flex \u4E0D\u4F1A\u62C9\u4F38\u5B83\u3002\uFF09 */\n/* min-width\uFF1A\u8F93\u5165\u683C\u662F flex:1\uFF0C\u6CA1\u6709\u5B83\u65F6 inline-flex \u6309\u5360\u4F4D\u6587\u5B57\u5BBD\u6536\u5F97\u5F88\u7A84\uFF08\u641C\u7D22\u6846 + \u6309\u94AE\u7684\u5178\u578B\u7528\u6CD5\u4F1A\u96BE\u770B\uFF09\u3002\n \u8981\u66F4\u5BBD / \u66F4\u7A84\u7531\u8C03\u7528\u65B9\u5728\u5916\u9762\u5957\u58F3\u6216\u7ED9 className\uFF0C\u4E0D\u8BB8\u5728\u8FD9\u91CC\u5199\u6B7B max-width\u3002 */\n.dshpc-igroup{display:inline-flex;align-items:stretch;min-width:200px;max-width:100%;box-sizing:border-box;overflow:hidden;\n border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);background:var(--dshpc-surface-1);}\n.dshpc-igroup--sm{height:var(--dshpc-control-h-sm);}\n.dshpc-igroup--md{height:var(--dshpc-control-h-md);}\n.dshpc-igroup--lg{height:var(--dshpc-control-h-lg);}\n.dshpc-igroup--error{border-color:var(--dshpc-danger);}\n/* \u6574\u4F53\u805A\u7126\uFF1A\u5185\u4EF6\u81EA\u5DF1\u7684\u7126\u70B9\u5708\u4EA4\u51FA\u6765\uFF0C\u7531\u5916\u58F3\u753B\u4E00\u6574\u5708\uFF08\u5404\u753B\u5404\u7684\u4F1A\u53D8\u6210\u683C\u5185\u534A\u5708\uFF09 */\n.dshpc-igroup:focus-within{border-color:var(--dshpc-focus);box-shadow:0 0 0 1px var(--dshpc-focus);}\n\n/* \u524D\u7F6E\u6807\u9898\uFF1A\u4E0E\u8F93\u5165\u6846\u540C\u683C\uFF0C\u7070\u5E95\u533A\u5206\uFF08\u4E0E SplitGroup \u5DE6\u683C\u540C\u4E00\u53E3\u5F84\uFF09 */\n.dshpc-igroup__label{display:inline-flex;align-items:center;flex:none;padding:0 8px;white-space:nowrap;\n background:var(--dshpc-surface-sunken);color:var(--dshpc-fg-2);\n font-size:var(--dshpc-font-sm);line-height:var(--dshpc-line-sm);}\n.dshpc-igroup--md .dshpc-igroup__label,.dshpc-igroup--lg .dshpc-igroup__label{font-size:var(--dshpc-font-md);line-height:var(--dshpc-line-md);}\n\n/* \u8F93\u5165\u683C\uFF1A\u4EA4\u51FA\u8FB9\u6846 / \u5706\u89D2 / \u5E95\u8272 / \u7126\u70B9\u5708\uFF1B\u5BBD\u5EA6\u4EA4\u7ED9 flex\uFF08\u539F\u751F width:100% \u4F1A\u548C flex-basis \u6253\u67B6\uFF09 */\n.dshpc-igroup > .dshpc-input{flex:1 1 auto;width:auto;min-width:0;height:100%;border:0;border-radius:0;background:transparent;}\n.dshpc-igroup > .dshpc-input:focus{box-shadow:none;}\n\n/* \u6309\u94AE\u683C\uFF1A\u4EA4\u51FA\u8FB9\u6846\u4E0E\u5706\u89D2\uFF1B\u5B9E\u5FC3\u5E95\u8272\u4FDD\u7559\uFF08\u53F3\u4FA7\u300C\u786E\u5B9A\u300D\u8BE5\u6709\u91CD\u91CF\uFF09\u3002\n \u7EAF\u56FE\u6807\u94AE\u672C\u8EAB\u662F\u56FA\u5B9A\u5BBD\u7684\u65B9\u5757\uFF0C\u8FD9\u91CC\u6539\u6210\u6309\u9AD8\u5EA6\u6491\u51FA\u7684\u6B63\u65B9\u5F62\uFF0C\u81EA\u5B9A\u4E49\u9AD8\u5EA6\u65F6\u624D\u4E0D\u4F1A\u53D8\u6210\u7AD6\u957F\u6761\u3002 */\n.dshpc-igroup > .dshpc-btn,.dshpc-igroup > .dshpc-iconbtn{flex:none;height:100%;border-radius:0;}\n.dshpc-igroup > .dshpc-iconbtn{width:auto;aspect-ratio:1;}\n.dshpc-igroup > .dshpc-btn{border:0;}\n\n/* \u5206\u9694\u7EBF\uFF1A\u76F8\u90BB\u5144\u5F1F\u7684\u5DE6\u63CF\u8FB9\uFF0C\u4E0D\u989D\u5916\u63D2 DOM\u3002\u540E\u4E24\u6761\u662F\u7ED9\u300C\u6E05\u8FC7\u8FB9\u6846\u300D\u7684\u683C\u5B50\u8865\u56DE\u6765\u7684\uFF0C\n \u5FC5\u987B\u5199\u6210 0,2,0 \u4E14\u5199\u5728\u4E0A\u9762\u7684 border:0 \u4E4B\u540E \u2014\u2014 \u5426\u5219\u88AB border:0 \u538B\u6389\uFF0C\u683C\u5B50\u4E4B\u95F4\u6CA1\u5206\u9694\u3002 */\n.dshpc-igroup > * + *{box-sizing:border-box;border-left:1px solid var(--dshpc-border);}\n.dshpc-igroup > * + .dshpc-input{box-sizing:border-box;border-left:1px solid var(--dshpc-border);}\n.dshpc-igroup > * + .dshpc-btn{box-sizing:border-box;border-left:1px solid var(--dshpc-border);}\n";
2
+ //# sourceMappingURL=input-group-css.generated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-group-css.generated.d.ts","sourceRoot":"","sources":["../../../src/ui/controls/input-group-css.generated.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,ggKAAohF,CAAA"}
@@ -0,0 +1,4 @@
1
+ // ⚠️ 生成物,勿手改。真源 = src/ui/controls/input-group.css
2
+ // 由 scripts/gen-css.mjs 生成(`pnpm run gen:css`):改样式请改那个 .css 文件后重新生成。
3
+ export const INPUT_GROUP_CSS = "\n/* ── 组合输入框 InputGroup ─────────────────────────────────────────────\n 输入框 + 后置按钮(一枚或多枚)+ 可选前置标题,焊成一体。\n 与 SplitGroup 同一套外观口径:外框 / 圆角 / 相邻 1px 分隔 / 整体聚焦圈都由外壳画,\n 内件(.dshpc-input / .dshpc-btn / .dshpc-iconbtn)把自己的边框、圆角、外圈交出来。\n\n 高度默认吃 --dshpc-control-h-*(sm 24 / md 28 / lg 32);调用方要自定义就在根节点\n 内联 height,这里让内件 height:100% 跟上 —— 内件档位高度只有 0,1,0,被本文件的\n 0,2,0 压掉,不会出现「外壳变高了、里面的框还是 32」。\n (⚠️ 别改成不写 height:100% 只靠 stretch:input 有确定高度时 flex 不会拉伸它。) */\n/* min-width:输入格是 flex:1,没有它时 inline-flex 按占位文字宽收得很窄(搜索框 + 按钮的典型用法会难看)。\n 要更宽 / 更窄由调用方在外面套壳或给 className,不许在这里写死 max-width。 */\n.dshpc-igroup{display:inline-flex;align-items:stretch;min-width:200px;max-width:100%;box-sizing:border-box;overflow:hidden;\n border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);background:var(--dshpc-surface-1);}\n.dshpc-igroup--sm{height:var(--dshpc-control-h-sm);}\n.dshpc-igroup--md{height:var(--dshpc-control-h-md);}\n.dshpc-igroup--lg{height:var(--dshpc-control-h-lg);}\n.dshpc-igroup--error{border-color:var(--dshpc-danger);}\n/* 整体聚焦:内件自己的焦点圈交出来,由外壳画一整圈(各画各的会变成格内半圈) */\n.dshpc-igroup:focus-within{border-color:var(--dshpc-focus);box-shadow:0 0 0 1px var(--dshpc-focus);}\n\n/* 前置标题:与输入框同格,灰底区分(与 SplitGroup 左格同一口径) */\n.dshpc-igroup__label{display:inline-flex;align-items:center;flex:none;padding:0 8px;white-space:nowrap;\n background:var(--dshpc-surface-sunken);color:var(--dshpc-fg-2);\n font-size:var(--dshpc-font-sm);line-height:var(--dshpc-line-sm);}\n.dshpc-igroup--md .dshpc-igroup__label,.dshpc-igroup--lg .dshpc-igroup__label{font-size:var(--dshpc-font-md);line-height:var(--dshpc-line-md);}\n\n/* 输入格:交出边框 / 圆角 / 底色 / 焦点圈;宽度交给 flex(原生 width:100% 会和 flex-basis 打架) */\n.dshpc-igroup > .dshpc-input{flex:1 1 auto;width:auto;min-width:0;height:100%;border:0;border-radius:0;background:transparent;}\n.dshpc-igroup > .dshpc-input:focus{box-shadow:none;}\n\n/* 按钮格:交出边框与圆角;实心底色保留(右侧「确定」该有重量)。\n 纯图标钮本身是固定宽的方块,这里改成按高度撑出的正方形,自定义高度时才不会变成竖长条。 */\n.dshpc-igroup > .dshpc-btn,.dshpc-igroup > .dshpc-iconbtn{flex:none;height:100%;border-radius:0;}\n.dshpc-igroup > .dshpc-iconbtn{width:auto;aspect-ratio:1;}\n.dshpc-igroup > .dshpc-btn{border:0;}\n\n/* 分隔线:相邻兄弟的左描边,不额外插 DOM。后两条是给「清过边框」的格子补回来的,\n 必须写成 0,2,0 且写在上面的 border:0 之后 —— 否则被 border:0 压掉,格子之间没分隔。 */\n.dshpc-igroup > * + *{box-sizing:border-box;border-left:1px solid var(--dshpc-border);}\n.dshpc-igroup > * + .dshpc-input{box-sizing:border-box;border-left:1px solid var(--dshpc-border);}\n.dshpc-igroup > * + .dshpc-btn{box-sizing:border-box;border-left:1px solid var(--dshpc-border);}\n";
4
+ //# sourceMappingURL=input-group-css.generated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-group-css.generated.js","sourceRoot":"","sources":["../../../src/ui/controls/input-group-css.generated.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,qEAAqE;AACrE,MAAM,CAAC,MAAM,eAAe,GAAG,ihFAAihF,CAAA"}
@@ -8,6 +8,7 @@ export { QUICK_TOOLBAR_CSS } from './controls/quick-toolbar-css.generated.js';
8
8
  export { HINT_CSS } from './controls/hint-css.generated.js';
9
9
  export { DATETIME_CSS } from './controls/datetime-css.generated.js';
10
10
  export { SPLIT_GROUP_CSS } from './controls/split-group-css.generated.js';
11
+ export { INPUT_GROUP_CSS } from './controls/input-group-css.generated.js';
11
12
  export { TABLE_BASE_CSS } from './controls/table-css.generated.js';
12
13
  export { TABLE_PLAIN_CSS } from './controls/table-plain-css.generated.js';
13
14
  export { PAGINATION_CSS } from './controls/pagination-css.generated.js';
@@ -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,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAA;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAA;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AAEzE,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AAEzE,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAA;AAEvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,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,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAA;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAA;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AAEzE,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AAEzE,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAA;AAEvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAA"}
@@ -15,6 +15,7 @@ export { QUICK_TOOLBAR_CSS } from './controls/quick-toolbar-css.generated.js';
15
15
  export { HINT_CSS } from './controls/hint-css.generated.js';
16
16
  export { DATETIME_CSS } from './controls/datetime-css.generated.js';
17
17
  export { SPLIT_GROUP_CSS } from './controls/split-group-css.generated.js';
18
+ export { INPUT_GROUP_CSS } from './controls/input-group-css.generated.js';
18
19
  // 表格:基础层与各外观皮肤分开导出 —— 组件只 import 自己那一份(外观按需分包)。
19
20
  export { TABLE_BASE_CSS } from './controls/table-css.generated.js';
20
21
  export { TABLE_PLAIN_CSS } from './controls/table-plain-css.generated.js';
@@ -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,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAA;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAA;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AACzE,gDAAgD;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AACzE,6BAA6B;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAA;AACvE,uCAAuC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,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,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAA;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAA;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AACzE,gDAAgD;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AACzE,6BAA6B;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAA;AACvE,uCAAuC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAA"}
@@ -1,2 +1,2 @@
1
- export declare const FEEDBACK_CSS = "/* \u906E\u7F69\u4E0E\u5934\u90E8\u5DF2\u62BD\u5230 overlay.css\uFF08Modal / SideSheet \u5171\u7528\uFF09\uFF0C\u8FD9\u91CC\u53EA\u5269\u9762\u677F\u672C\u4F53\u4E0E\u5BB6\u65CF\u5C3A\u5BF8\u3002 */\n/* \u5927\u5F39\u7A97\u5BB6\u65CF\uFF08md/lg\uFF09\uFF1A\u6284\u5144\u5F1F\u9879\u76EE archive-session-css \u7684 .dsh-tdt-sv-panel\uFF08surface-base + border-l2 + radius 12 + shadow-2\uFF09\u3002 */\n.dshpc-modal{\n display:flex;flex-direction:column;box-sizing:border-box;\n background:var(--dshpc-surface-base);color:var(--dshpc-fg);\n border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);\n box-shadow:var(--dshpc-shadow-2);overflow:hidden;\n}\n/* body = \u552F\u4E00\u6EDA\u52A8\u5BB9\u5668\uFF1A\u5185\u8DDD\u4E0E\u6EDA\u52A8\u90FD\u5F52\u5B83\uFF08\u6EDA\u52A8\u6761\u8D34\u9762\u677F\u53F3\u7F18\uFF0C\u4E0D\u88AB\u5185\u8DDD\u6324\u8FDB\u6765\uFF09\uFF1B\n \u5185\u5BB9\u6309\u6D41\u6392\uFF0C\u4E0D\u8BBE height:100%\u3001\u4E0D\u81EA\u5DF1\u5F00\u6EDA\u52A8\u6761\u3002 */\n.dshpc-modal__body{flex:1 1 auto;min-height:0;overflow:auto;padding:17px 31px}\n.dshpc-modal__foot{display:flex;justify-content:flex-end;gap:8px;padding:12px 31px 18px}\n.dshpc-toast-host{\n position:fixed;z-index:1090;left:50%;bottom:32px;transform:translateX(-50%);\n display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none;\n}\n.dshpc-toast{\n padding:8px 14px;border-radius:8px;font-size:13px;color:var(--dshpc-fg);\n background:var(--dshpc-surface-menu);border:1px solid var(--dshpc-border);\n box-shadow:0 8px 24px rgba(15,23,42,.16);\n}\n.dshpc-toast--success{color:var(--dshpc-success);border-color:color-mix(in srgb,var(--dshpc-success) 40%,transparent)}\n.dshpc-toast--error{color:var(--dshpc-danger);border-color:color-mix(in srgb,var(--dshpc-danger) 40%,transparent)}\n.dshpc-error__retry{\n margin-top:8px;color:var(--dshpc-link);cursor:pointer;background:none;border:none;padding:0;\n}\n/* \u539F\u751F\u5F39\u7A97\u6F14\u793A\uFF1A\u7ECF\u5BBF\u4E3B Modal \u7684 contentClassName \u6CE8\u5165\uFF0C\u8BC1\u660E\u5BBF\u4E3B\u5185\u5BB9\u533A\u5C3A\u5BF8\u53EF\u7ECF\u7C7B\u540D\u81EA\u5B9A\u4E49\u3002 */\n.dshpc-native-demo-content{max-width:520px}\n/* \u5934\u90E8\u4FE1\u53F7\u56FE\u6807\uFF08AlertModal \u6309 severity \u6CE8\u5165\uFF09\uFF1A\u81EA\u542B\u914D\u8272\uFF0C\u4E0D\u4F9D\u8D56\u5BBF\u4E3B token\u3002 */\n.dshpc-alert-sev{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;font-size:12px;color:#fff;flex:none}\n.dshpc-alert-sev--info{background:#2563eb}\n.dshpc-alert-sev--success{background:#16a34a}\n.dshpc-alert-sev--warning{background:#d97706}\n.dshpc-alert-sev--error{background:#dc2626}\n/* \u5C0F\u786E\u8BA4\u6846\u5BB6\u65CF\uFF08sm\uFF09\uFF1A\u4E25\u683C\u6284\u5144\u5F1F\u9879\u76EE renderConfirm \u7684 dialogStyle\uFF08task-list.tsx:456\uFF09\u2014\u2014\n 360px \u5BBD / 18px \u5185\u8DDD / \u5934\u90E8\u65E0\u5206\u9694\u7EBF / \u8BF4\u660E\u6587\u5B57 fg-2 / \u5E95\u90E8\u6309\u94AE\u53F3\u5BF9\u9F50\u3002 */\n.dshpc-modal--sm{padding:18px}\n.dshpc-modal--sm .dshpc-overlay-head{padding:0 0 8px;border-bottom:none}\n.dshpc-modal--sm .dshpc-modal__body{padding:0 0 14px;overflow:visible;font-size:var(--dshpc-font-sm);color:var(--dshpc-fg-2);line-height:var(--dshpc-line-sm)}\n.dshpc-modal--sm .dshpc-modal__foot{padding:0}\n";
1
+ export declare const FEEDBACK_CSS = "/* \u906E\u7F69\u4E0E\u5934\u90E8\u5DF2\u62BD\u5230 overlay.css\uFF08Modal / SideSheet \u5171\u7528\uFF09\uFF0C\u8FD9\u91CC\u53EA\u5269\u9762\u677F\u672C\u4F53\u4E0E\u5BB6\u65CF\u5C3A\u5BF8\u3002 */\n/* \u5927\u5F39\u7A97\u5BB6\u65CF\uFF08md/lg\uFF09\uFF1A\u6284\u5144\u5F1F\u9879\u76EE archive-session-css \u7684 .dsh-tdt-sv-panel\uFF08surface-base + border-l2 + radius 12 + shadow-2\uFF09\u3002 */\n.dshpc-modal{\n display:flex;flex-direction:column;box-sizing:border-box;\n background:var(--dshpc-surface-base);color:var(--dshpc-fg);\n border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);\n box-shadow:var(--dshpc-shadow-2);overflow:hidden;\n}\n/* body = \u552F\u4E00\u6EDA\u52A8\u5BB9\u5668\uFF1A\u5185\u8DDD\u4E0E\u6EDA\u52A8\u90FD\u5F52\u5B83\uFF08\u6EDA\u52A8\u6761\u8D34\u9762\u677F\u53F3\u7F18\uFF0C\u4E0D\u88AB\u5185\u8DDD\u6324\u8FDB\u6765\uFF09\uFF1B\n \u5185\u5BB9\u6309\u6D41\u6392\uFF0C\u4E0D\u8BBE height:100%\u3001\u4E0D\u81EA\u5DF1\u5F00\u6EDA\u52A8\u6761\u3002 */\n.dshpc-modal__body{flex:1 1 auto;min-height:0;overflow:auto;padding:17px 18px}\n.dshpc-modal__foot{display:flex;justify-content:flex-end;gap:8px;padding:12px 18px 18px}\n.dshpc-toast-host{\n position:fixed;z-index:1090;left:50%;bottom:32px;transform:translateX(-50%);\n display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none;\n}\n.dshpc-toast{\n padding:8px 14px;border-radius:8px;font-size:13px;color:var(--dshpc-fg);\n background:var(--dshpc-surface-menu);border:1px solid var(--dshpc-border);\n box-shadow:0 8px 24px rgba(15,23,42,.16);\n}\n.dshpc-toast--success{color:var(--dshpc-success);border-color:color-mix(in srgb,var(--dshpc-success) 40%,transparent)}\n.dshpc-toast--error{color:var(--dshpc-danger);border-color:color-mix(in srgb,var(--dshpc-danger) 40%,transparent)}\n.dshpc-error__retry{\n margin-top:8px;color:var(--dshpc-link);cursor:pointer;background:none;border:none;padding:0;\n}\n/* \u539F\u751F\u5F39\u7A97\u6F14\u793A\uFF1A\u7ECF\u5BBF\u4E3B Modal \u7684 contentClassName \u6CE8\u5165\uFF0C\u8BC1\u660E\u5BBF\u4E3B\u5185\u5BB9\u533A\u5C3A\u5BF8\u53EF\u7ECF\u7C7B\u540D\u81EA\u5B9A\u4E49\u3002 */\n.dshpc-native-demo-content{max-width:520px}\n/* \u5934\u90E8\u4FE1\u53F7\u56FE\u6807\uFF08AlertModal \u6309 severity \u6CE8\u5165\uFF09\uFF1A\u81EA\u542B\u914D\u8272\uFF0C\u4E0D\u4F9D\u8D56\u5BBF\u4E3B token\u3002 */\n.dshpc-alert-sev{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;font-size:12px;color:#fff;flex:none}\n.dshpc-alert-sev--info{background:#2563eb}\n.dshpc-alert-sev--success{background:#16a34a}\n.dshpc-alert-sev--warning{background:#d97706}\n.dshpc-alert-sev--error{background:#dc2626}\n/* \u5C0F\u786E\u8BA4\u6846\u5BB6\u65CF\uFF08sm\uFF09\uFF1A\u4E25\u683C\u6284\u5144\u5F1F\u9879\u76EE renderConfirm \u7684 dialogStyle\uFF08task-list.tsx:456\uFF09\u2014\u2014\n 360px \u5BBD / 18px \u5185\u8DDD / \u5934\u90E8\u65E0\u5206\u9694\u7EBF / \u8BF4\u660E\u6587\u5B57 fg-2 / \u5E95\u90E8\u6309\u94AE\u53F3\u5BF9\u9F50\u3002 */\n.dshpc-modal--sm{padding:18px}\n.dshpc-modal--sm .dshpc-overlay-head{padding:0 0 8px;border-bottom:none}\n.dshpc-modal--sm .dshpc-modal__body{padding:0 0 14px;overflow:visible;font-size:var(--dshpc-font-sm);color:var(--dshpc-fg-2);line-height:var(--dshpc-line-sm)}\n.dshpc-modal--sm .dshpc-modal__foot{padding:0}\n";
2
2
  //# sourceMappingURL=feedback-css.generated.d.ts.map
@@ -1,4 +1,4 @@
1
1
  // ⚠️ 生成物,勿手改。真源 = src/ui/feedback.css
2
2
  // 由 scripts/gen-css.mjs 生成(`pnpm run gen:css`):改样式请改那个 .css 文件后重新生成。
3
- export const FEEDBACK_CSS = "/* 遮罩与头部已抽到 overlay.css(Modal / SideSheet 共用),这里只剩面板本体与家族尺寸。 */\n/* 大弹窗家族(md/lg):抄兄弟项目 archive-session-css 的 .dsh-tdt-sv-panel(surface-base + border-l2 + radius 12 + shadow-2)。 */\n.dshpc-modal{\n display:flex;flex-direction:column;box-sizing:border-box;\n background:var(--dshpc-surface-base);color:var(--dshpc-fg);\n border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);\n box-shadow:var(--dshpc-shadow-2);overflow:hidden;\n}\n/* body = 唯一滚动容器:内距与滚动都归它(滚动条贴面板右缘,不被内距挤进来);\n 内容按流排,不设 height:100%、不自己开滚动条。 */\n.dshpc-modal__body{flex:1 1 auto;min-height:0;overflow:auto;padding:17px 31px}\n.dshpc-modal__foot{display:flex;justify-content:flex-end;gap:8px;padding:12px 31px 18px}\n.dshpc-toast-host{\n position:fixed;z-index:1090;left:50%;bottom:32px;transform:translateX(-50%);\n display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none;\n}\n.dshpc-toast{\n padding:8px 14px;border-radius:8px;font-size:13px;color:var(--dshpc-fg);\n background:var(--dshpc-surface-menu);border:1px solid var(--dshpc-border);\n box-shadow:0 8px 24px rgba(15,23,42,.16);\n}\n.dshpc-toast--success{color:var(--dshpc-success);border-color:color-mix(in srgb,var(--dshpc-success) 40%,transparent)}\n.dshpc-toast--error{color:var(--dshpc-danger);border-color:color-mix(in srgb,var(--dshpc-danger) 40%,transparent)}\n.dshpc-error__retry{\n margin-top:8px;color:var(--dshpc-link);cursor:pointer;background:none;border:none;padding:0;\n}\n/* 原生弹窗演示:经宿主 Modal 的 contentClassName 注入,证明宿主内容区尺寸可经类名自定义。 */\n.dshpc-native-demo-content{max-width:520px}\n/* 头部信号图标(AlertModal 按 severity 注入):自含配色,不依赖宿主 token。 */\n.dshpc-alert-sev{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;font-size:12px;color:#fff;flex:none}\n.dshpc-alert-sev--info{background:#2563eb}\n.dshpc-alert-sev--success{background:#16a34a}\n.dshpc-alert-sev--warning{background:#d97706}\n.dshpc-alert-sev--error{background:#dc2626}\n/* 小确认框家族(sm):严格抄兄弟项目 renderConfirm 的 dialogStyle(task-list.tsx:456)——\n 360px 宽 / 18px 内距 / 头部无分隔线 / 说明文字 fg-2 / 底部按钮右对齐。 */\n.dshpc-modal--sm{padding:18px}\n.dshpc-modal--sm .dshpc-overlay-head{padding:0 0 8px;border-bottom:none}\n.dshpc-modal--sm .dshpc-modal__body{padding:0 0 14px;overflow:visible;font-size:var(--dshpc-font-sm);color:var(--dshpc-fg-2);line-height:var(--dshpc-line-sm)}\n.dshpc-modal--sm .dshpc-modal__foot{padding:0}\n";
3
+ export const FEEDBACK_CSS = "/* 遮罩与头部已抽到 overlay.css(Modal / SideSheet 共用),这里只剩面板本体与家族尺寸。 */\n/* 大弹窗家族(md/lg):抄兄弟项目 archive-session-css 的 .dsh-tdt-sv-panel(surface-base + border-l2 + radius 12 + shadow-2)。 */\n.dshpc-modal{\n display:flex;flex-direction:column;box-sizing:border-box;\n background:var(--dshpc-surface-base);color:var(--dshpc-fg);\n border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);\n box-shadow:var(--dshpc-shadow-2);overflow:hidden;\n}\n/* body = 唯一滚动容器:内距与滚动都归它(滚动条贴面板右缘,不被内距挤进来);\n 内容按流排,不设 height:100%、不自己开滚动条。 */\n.dshpc-modal__body{flex:1 1 auto;min-height:0;overflow:auto;padding:17px 18px}\n.dshpc-modal__foot{display:flex;justify-content:flex-end;gap:8px;padding:12px 18px 18px}\n.dshpc-toast-host{\n position:fixed;z-index:1090;left:50%;bottom:32px;transform:translateX(-50%);\n display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none;\n}\n.dshpc-toast{\n padding:8px 14px;border-radius:8px;font-size:13px;color:var(--dshpc-fg);\n background:var(--dshpc-surface-menu);border:1px solid var(--dshpc-border);\n box-shadow:0 8px 24px rgba(15,23,42,.16);\n}\n.dshpc-toast--success{color:var(--dshpc-success);border-color:color-mix(in srgb,var(--dshpc-success) 40%,transparent)}\n.dshpc-toast--error{color:var(--dshpc-danger);border-color:color-mix(in srgb,var(--dshpc-danger) 40%,transparent)}\n.dshpc-error__retry{\n margin-top:8px;color:var(--dshpc-link);cursor:pointer;background:none;border:none;padding:0;\n}\n/* 原生弹窗演示:经宿主 Modal 的 contentClassName 注入,证明宿主内容区尺寸可经类名自定义。 */\n.dshpc-native-demo-content{max-width:520px}\n/* 头部信号图标(AlertModal 按 severity 注入):自含配色,不依赖宿主 token。 */\n.dshpc-alert-sev{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;font-size:12px;color:#fff;flex:none}\n.dshpc-alert-sev--info{background:#2563eb}\n.dshpc-alert-sev--success{background:#16a34a}\n.dshpc-alert-sev--warning{background:#d97706}\n.dshpc-alert-sev--error{background:#dc2626}\n/* 小确认框家族(sm):严格抄兄弟项目 renderConfirm 的 dialogStyle(task-list.tsx:456)——\n 360px 宽 / 18px 内距 / 头部无分隔线 / 说明文字 fg-2 / 底部按钮右对齐。 */\n.dshpc-modal--sm{padding:18px}\n.dshpc-modal--sm .dshpc-overlay-head{padding:0 0 8px;border-bottom:none}\n.dshpc-modal--sm .dshpc-modal__body{padding:0 0 14px;overflow:visible;font-size:var(--dshpc-font-sm);color:var(--dshpc-fg-2);line-height:var(--dshpc-line-sm)}\n.dshpc-modal--sm .dshpc-modal__foot{padding:0}\n";
4
4
  //# sourceMappingURL=feedback-css.generated.js.map
@@ -22,6 +22,7 @@ export { showToast, notify, type ToastVariant, type ToastPosition, type ToastOpt
22
22
  export { Button, IconButton, type ButtonProps, type ButtonSize, type ButtonVariant, type IconButtonProps } from './Button.js';
23
23
  export { Segmented, type SegmentedProps, type SegmentedTone } from './Segmented.js';
24
24
  export { SplitGroup, type SplitGroupProps } from './SplitGroup.js';
25
+ export { InputGroup, type InputGroupAction, type InputGroupProps, } from './InputGroup.js';
25
26
  export { Textarea, type TextareaProps } from './Textarea.js';
26
27
  export { Checkbox, type CheckboxProps } from './Checkbox.js';
27
28
  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":"AAIA,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,EACX,KAAK,WAAW,EAChB,KAAK,YAAY,GAClB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AACvE,OAAO,EACL,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,YAAY,GAClB,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,EACb,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,OAAO,EACZ,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,SAAS,GACf,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC9F,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AACjF,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,UAAU,GAChB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACnF,OAAO,EACL,UAAU,EACV,KAAK,eAAe,EACpB,KAAK,aAAa,GACnB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,WAAW,GACjB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,UAAU,EACV,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,cAAc,GACpB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,YAAY,EACZ,IAAI,EACJ,SAAS,EACT,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,OAAO,EACP,YAAY,EACZ,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,WAAW,GACjB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAA;AAE9E,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAA;AAEnD,OAAO,EACL,UAAU,EACV,KAAK,eAAe,EACpB,KAAK,qBAAqB,GAC3B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,SAAS,EACT,WAAW,EACX,SAAS,EACT,SAAS,EACT,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,KAAK,eAAe,GACrB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,UAAU,EACV,YAAY,EACZ,eAAe,EACf,WAAW,EACX,UAAU,EACV,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,QAAQ,EACb,KAAK,SAAS,GACf,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,SAAS,EACT,MAAM,EACN,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,aAAa,GACnB,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7H,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACnF,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,EACL,UAAU,EACV,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3F,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/D,OAAO,EACL,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,WAAW,EACX,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,gBAAgB,GACtB,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAC7F,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/D,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,kBAAkB,EACvB,KAAK,eAAe,GACrB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,eAAe,GACrB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,sBAAsB,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAA;AACzE,OAAO,EACL,SAAS,EACT,SAAS,EACT,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,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,EACb,KAAK,SAAS,EACd,KAAK,UAAU,GAChB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,KAAK,EACL,WAAW,EACX,aAAa,EACb,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,GACxB,MAAM,YAAY,CAAA"}
package/dist/ui/index.js CHANGED
@@ -28,6 +28,7 @@ export { showToast, notify, } from './Toast.js';
28
28
  export { Button, IconButton } from './Button.js';
29
29
  export { Segmented } from './Segmented.js';
30
30
  export { SplitGroup } from './SplitGroup.js';
31
+ export { InputGroup, } from './InputGroup.js';
31
32
  export { Textarea } from './Textarea.js';
32
33
  export { Checkbox } from './Checkbox.js';
33
34
  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,uDAAuD;AACvD,4CAA4C;AAC5C,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,EAAE,SAAS,EAA2C,MAAM,gBAAgB,CAAA;AACnF,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,GAIV,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,OAAO,EACP,YAAY,GAMb,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,IAAI,EAAgD,MAAM,WAAW,CAAA;AAC9E,8DAA8D;AAC9D,OAAO,EAAE,KAAK,EAAmB,MAAM,YAAY,CAAA;AACnD,iDAAiD;AACjD,OAAO,EACL,UAAU,GAGX,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,SAAS,EACT,WAAW,EACX,SAAS,EACT,SAAS,GAIV,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,UAAU,EACV,YAAY,EACZ,eAAe,EACf,WAAW,EACX,UAAU,GAWX,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,SAAS,EACT,MAAM,GAMP,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,MAAM,EAAE,UAAU,EAA+E,MAAM,aAAa,CAAA;AAC7H,OAAO,EAAE,SAAS,EAA2C,MAAM,gBAAgB,CAAA;AACnF,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,MAAM,EAAyD,MAAM,aAAa,CAAA;AAC3F,OAAO,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAA;AAC/D,OAAO,EACL,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,WAAW,GAIZ,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,GAKjB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,WAAW,EAAiD,MAAM,kBAAkB,CAAA;AAC7F,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,EACL,YAAY,GAEb,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,GAMnB,MAAM,0BAA0B,CAAA;AACjC,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":"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"}
@@ -1,2 +1,2 @@
1
- export declare const OVERLAY_CSS = "/* \u6D6E\u5C42\u516C\u5171\u9AA8\u67B6\uFF1A\u906E\u7F69 + \u5934\u90E8\u3002Modal\uFF08\u5C45\u4E2D\uFF09/ SideSheet\uFF08\u4FA7\u8FB9\uFF09\u5171\u7528\u8FD9\u4E00\u4EFD\uFF0C\n \u4E24\u8FB9\u5404\u81EA registerStyle \u540C\u4E00\u4EFD\uFF08\u5E42\u7B49\uFF09\uFF0C\u8C01\u4E5F\u4E0D\u8BB8\u518D\u6284\u4E00\u4EFD\u906E\u7F69\u3002 */\n\n/* \u906E\u7F69 = \u5BBF\u4E3B\u906E\u7F69\u53D8\u91CF --dsw-alias-bg-mask-1\uFF08\u4E0E\u5B98\u65B9 Modal / \u5144\u5F1F\u9879\u76EE --tdt-mask \u540C\u4E00\u6761\u771F\u503C\uFF0C\u7528\u6237 2026-10-20\uFF09\u3002 */\n/* \u53F3\u8FB9\u754C\u8BA9\u4F4D\u9875\u9762\u7EA7\u5206\u680F\uFF08PanelDock \u53D1\u5E03\u7684 --dshpc-page-inset-right\uFF0C\u7528\u6237 2026-10-22\uFF09\uFF1A\n \u5206\u680F\u4E0D\u88AB\u538B\u6697\u3001\u7167\u5E38\u53EF\u70B9\uFF1B\u6D6E\u5C42\u5728\u8FD9\u5757**\u5269\u4E0B**\u7684\u533A\u57DF\u91CC\u6392\u7248\uFF0C\u5C31\u50CF\u6574\u9875\u88AB\u63A8\u51FA\u53BB\u4E00\u6837\u3002 */\n.dshpc-overlay{\n position:fixed;inset:0 var(--dshpc-page-inset-right,0px) 0 0;\n background:var(--dshpc-mask);\n}\n/* \u5C45\u4E2D\u6863\uFF08Modal\uFF09\uFF1Az \u8D70 modal \u6863\u3002 */\n.dshpc-overlay--center{\n display:flex;align-items:center;justify-content:center;\n z-index:var(--dshpc-z-modal);\n}\n/* \u4FA7\u8FB9\u6863\uFF08SideSheet\uFF09\uFF1A\u9762\u677F absolute \u8D34\u8FB9\uFF0C\u4E0D\u9700\u8981 flex \u5C45\u4E2D\uFF1Bz \u8D70 drawer \u6863\uFF08\u4F4E\u4E8E modal\uFF09\u3002 */\n.dshpc-overlay--side{z-index:var(--dshpc-z-drawer)}\n\n/* \u5934\u90E8\u56DB\u69FD\uFF1A\u5DE6\u56FE\u6807 / \u6807\u9898\u7EC4 / \u5F39\u6027\u95F4\u9694 / \u53F3\u4FA7\u52A8\u4F5C\u533A + \u5173\u95ED\u94AE\u3002 */\n.dshpc-overlay-head{\n display:flex;align-items:center;gap:8px;padding:18px 31px 12px;\n border-bottom:1px solid var(--dshpc-border);flex-wrap:wrap;\n}\n.dshpc-overlay-head__heading{display:flex;align-items:center;gap:8px;min-width:0;flex:0 1 auto}\n.dshpc-overlay-head__lead{flex:none;display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1}\n/* \u6807\u9898\u7EC4\uFF1A\u7B2C\u4E00\u884C = \u6807\u9898 + \u53F3\u4FA7\u5C0F\u5757\uFF08\u5FBD\u6807\u7D27\u8DDF\u6807\u9898\uFF09\uFF0C\u7B2C\u4E8C\u884C = \u526F\u6807\u9898\u3002 */\n.dshpc-overlay-head__titlegroup{display:flex;flex-direction:column;gap:2px;min-width:0;flex:0 1 auto}\n.dshpc-overlay-head__titlerow{display:flex;align-items:center;gap:8px;min-width:0}\n.dshpc-overlay-head__title{font-size:var(--dshpc-font-lg);font-weight:600;line-height:1.4;min-width:0}\n/* \u6807\u9898\u4E0B\u526F\u6807\u9898\u884C\uFF08\u5144\u5F1F\u9879\u76EE .dsh-tdt-sv-sid\uFF1A\u7B49\u5BBD\u5B57\u4F53\u3001caption \u8272\u3001\u53EF\u6362\u884C\uFF09\u3002 */\n.dshpc-overlay-head__sid{font-family:var(--ds-font-family-code,monospace);font-size:var(--dshpc-font-xs);color:var(--dshpc-fg-3);word-break:break-all}\n.dshpc-overlay-head__extra{flex:none;display:inline-flex;align-items:center}\n.dshpc-overlay-head__spacer{flex:1 1 auto;min-width:8px}\n.dshpc-overlay-head__actions{flex:none;display:flex;align-items:center;gap:8px}\n/* \u5173\u95ED\u6309\u94AE\uFF1A20\u00D720 \u65B9\u89D2\u56FE\u6807\u4F4D\uFF0C\u4E0D\u501F\u7528 Picker \u7684\u89E6\u53D1\u5668\u76AE\u80A4\uFF08\u90A3\u4EFD\u5E26 min-width:120px\uFF09\u3002 */\n.dshpc-overlay-head__close{\n display:inline-flex;align-items:center;justify-content:center;flex:none;\n width:20px;height:20px;padding:0;border:none;border-radius:var(--dshpc-radius-sm);\n background:transparent;color:var(--dshpc-fg-3);font-family:inherit;font-size:13px;line-height:1;cursor:pointer;\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n.dshpc-overlay-head__close:hover{background:var(--dshpc-hover);color:var(--dshpc-fg)}\n.dshpc-overlay-head__close:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n";
1
+ export declare const OVERLAY_CSS = "/* \u6D6E\u5C42\u516C\u5171\u9AA8\u67B6\uFF1A\u906E\u7F69 + \u5934\u90E8\u3002Modal\uFF08\u5C45\u4E2D\uFF09/ SideSheet\uFF08\u4FA7\u8FB9\uFF09\u5171\u7528\u8FD9\u4E00\u4EFD\uFF0C\n \u4E24\u8FB9\u5404\u81EA registerStyle \u540C\u4E00\u4EFD\uFF08\u5E42\u7B49\uFF09\uFF0C\u8C01\u4E5F\u4E0D\u8BB8\u518D\u6284\u4E00\u4EFD\u906E\u7F69\u3002 */\n\n/* \u906E\u7F69 = \u5BBF\u4E3B\u906E\u7F69\u53D8\u91CF --dsw-alias-bg-mask-1\uFF08\u4E0E\u5B98\u65B9 Modal / \u5144\u5F1F\u9879\u76EE --tdt-mask \u540C\u4E00\u6761\u771F\u503C\uFF0C\u7528\u6237 2026-10-20\uFF09\u3002 */\n/* \u53F3\u8FB9\u754C\u8BA9\u4F4D\u9875\u9762\u7EA7\u5206\u680F\uFF08PanelDock \u53D1\u5E03\u7684 --dshpc-page-inset-right\uFF0C\u7528\u6237 2026-10-22\uFF09\uFF1A\n \u5206\u680F\u4E0D\u88AB\u538B\u6697\u3001\u7167\u5E38\u53EF\u70B9\uFF1B\u6D6E\u5C42\u5728\u8FD9\u5757**\u5269\u4E0B**\u7684\u533A\u57DF\u91CC\u6392\u7248\uFF0C\u5C31\u50CF\u6574\u9875\u88AB\u63A8\u51FA\u53BB\u4E00\u6837\u3002 */\n.dshpc-overlay{\n position:fixed;inset:0 var(--dshpc-page-inset-right,0px) 0 0;\n background:var(--dshpc-mask);\n}\n/* \u5C45\u4E2D\u6863\uFF08Modal\uFF09\uFF1Az \u8D70 modal \u6863\u3002 */\n.dshpc-overlay--center{\n display:flex;align-items:center;justify-content:center;\n z-index:var(--dshpc-z-modal);\n}\n/* \u4FA7\u8FB9\u6863\uFF08SideSheet\uFF09\uFF1A\u9762\u677F absolute \u8D34\u8FB9\uFF0C\u4E0D\u9700\u8981 flex \u5C45\u4E2D\uFF1Bz \u8D70 drawer \u6863\uFF08\u4F4E\u4E8E modal\uFF09\u3002 */\n.dshpc-overlay--side{z-index:var(--dshpc-z-drawer)}\n\n/* \u5934\u90E8\u56DB\u69FD\uFF1A\u5DE6\u56FE\u6807 / \u6807\u9898\u7EC4 / \u5F39\u6027\u95F4\u9694 / \u53F3\u4FA7\u52A8\u4F5C\u533A + \u5173\u95ED\u94AE\u3002 */\n.dshpc-overlay-head{\n display:flex;align-items:center;gap:8px;padding:18px 18px 12px;\n border-bottom:1px solid var(--dshpc-border);flex-wrap:wrap;\n}\n.dshpc-overlay-head__heading{display:flex;align-items:center;gap:8px;min-width:0;flex:0 1 auto}\n.dshpc-overlay-head__lead{flex:none;display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1}\n/* \u6807\u9898\u7EC4\uFF1A\u7B2C\u4E00\u884C = \u6807\u9898 + \u53F3\u4FA7\u5C0F\u5757\uFF08\u5FBD\u6807\u7D27\u8DDF\u6807\u9898\uFF09\uFF0C\u7B2C\u4E8C\u884C = \u526F\u6807\u9898\u3002 */\n.dshpc-overlay-head__titlegroup{display:flex;flex-direction:column;gap:2px;min-width:0;flex:0 1 auto}\n.dshpc-overlay-head__titlerow{display:flex;align-items:center;gap:8px;min-width:0}\n.dshpc-overlay-head__title{font-size:var(--dshpc-font-lg);font-weight:600;line-height:1.4;min-width:0}\n/* \u6807\u9898\u4E0B\u526F\u6807\u9898\u884C\uFF08\u5144\u5F1F\u9879\u76EE .dsh-tdt-sv-sid\uFF1A\u7B49\u5BBD\u5B57\u4F53\u3001caption \u8272\u3001\u53EF\u6362\u884C\uFF09\u3002 */\n.dshpc-overlay-head__sid{font-family:var(--ds-font-family-code,monospace);font-size:var(--dshpc-font-xs);color:var(--dshpc-fg-3);word-break:break-all}\n.dshpc-overlay-head__extra{flex:none;display:inline-flex;align-items:center}\n.dshpc-overlay-head__spacer{flex:1 1 auto;min-width:8px}\n.dshpc-overlay-head__actions{flex:none;display:flex;align-items:center;gap:8px}\n/* \u5173\u95ED\u6309\u94AE\uFF1A20\u00D720 \u65B9\u89D2\u56FE\u6807\u4F4D\uFF0C\u4E0D\u501F\u7528 Picker \u7684\u89E6\u53D1\u5668\u76AE\u80A4\uFF08\u90A3\u4EFD\u5E26 min-width:120px\uFF09\u3002 */\n.dshpc-overlay-head__close{\n display:inline-flex;align-items:center;justify-content:center;flex:none;\n width:20px;height:20px;padding:0;border:none;border-radius:var(--dshpc-radius-sm);\n background:transparent;color:var(--dshpc-fg-3);font-family:inherit;font-size:13px;line-height:1;cursor:pointer;\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n.dshpc-overlay-head__close:hover{background:var(--dshpc-hover);color:var(--dshpc-fg)}\n.dshpc-overlay-head__close:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n";
2
2
  //# sourceMappingURL=overlay-css.generated.d.ts.map
@@ -1,4 +1,4 @@
1
1
  // ⚠️ 生成物,勿手改。真源 = src/ui/overlay.css
2
2
  // 由 scripts/gen-css.mjs 生成(`pnpm run gen:css`):改样式请改那个 .css 文件后重新生成。
3
- export const OVERLAY_CSS = "/* 浮层公共骨架:遮罩 + 头部。Modal(居中)/ SideSheet(侧边)共用这一份,\n 两边各自 registerStyle 同一份(幂等),谁也不许再抄一份遮罩。 */\n\n/* 遮罩 = 宿主遮罩变量 --dsw-alias-bg-mask-1(与官方 Modal / 兄弟项目 --tdt-mask 同一条真值,用户 2026-10-20)。 */\n/* 右边界让位页面级分栏(PanelDock 发布的 --dshpc-page-inset-right,用户 2026-10-22):\n 分栏不被压暗、照常可点;浮层在这块**剩下**的区域里排版,就像整页被推出去一样。 */\n.dshpc-overlay{\n position:fixed;inset:0 var(--dshpc-page-inset-right,0px) 0 0;\n background:var(--dshpc-mask);\n}\n/* 居中档(Modal):z 走 modal 档。 */\n.dshpc-overlay--center{\n display:flex;align-items:center;justify-content:center;\n z-index:var(--dshpc-z-modal);\n}\n/* 侧边档(SideSheet):面板 absolute 贴边,不需要 flex 居中;z 走 drawer 档(低于 modal)。 */\n.dshpc-overlay--side{z-index:var(--dshpc-z-drawer)}\n\n/* 头部四槽:左图标 / 标题组 / 弹性间隔 / 右侧动作区 + 关闭钮。 */\n.dshpc-overlay-head{\n display:flex;align-items:center;gap:8px;padding:18px 31px 12px;\n border-bottom:1px solid var(--dshpc-border);flex-wrap:wrap;\n}\n.dshpc-overlay-head__heading{display:flex;align-items:center;gap:8px;min-width:0;flex:0 1 auto}\n.dshpc-overlay-head__lead{flex:none;display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1}\n/* 标题组:第一行 = 标题 + 右侧小块(徽标紧跟标题),第二行 = 副标题。 */\n.dshpc-overlay-head__titlegroup{display:flex;flex-direction:column;gap:2px;min-width:0;flex:0 1 auto}\n.dshpc-overlay-head__titlerow{display:flex;align-items:center;gap:8px;min-width:0}\n.dshpc-overlay-head__title{font-size:var(--dshpc-font-lg);font-weight:600;line-height:1.4;min-width:0}\n/* 标题下副标题行(兄弟项目 .dsh-tdt-sv-sid:等宽字体、caption 色、可换行)。 */\n.dshpc-overlay-head__sid{font-family:var(--ds-font-family-code,monospace);font-size:var(--dshpc-font-xs);color:var(--dshpc-fg-3);word-break:break-all}\n.dshpc-overlay-head__extra{flex:none;display:inline-flex;align-items:center}\n.dshpc-overlay-head__spacer{flex:1 1 auto;min-width:8px}\n.dshpc-overlay-head__actions{flex:none;display:flex;align-items:center;gap:8px}\n/* 关闭按钮:20×20 方角图标位,不借用 Picker 的触发器皮肤(那份带 min-width:120px)。 */\n.dshpc-overlay-head__close{\n display:inline-flex;align-items:center;justify-content:center;flex:none;\n width:20px;height:20px;padding:0;border:none;border-radius:var(--dshpc-radius-sm);\n background:transparent;color:var(--dshpc-fg-3);font-family:inherit;font-size:13px;line-height:1;cursor:pointer;\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n.dshpc-overlay-head__close:hover{background:var(--dshpc-hover);color:var(--dshpc-fg)}\n.dshpc-overlay-head__close:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n";
3
+ export const OVERLAY_CSS = "/* 浮层公共骨架:遮罩 + 头部。Modal(居中)/ SideSheet(侧边)共用这一份,\n 两边各自 registerStyle 同一份(幂等),谁也不许再抄一份遮罩。 */\n\n/* 遮罩 = 宿主遮罩变量 --dsw-alias-bg-mask-1(与官方 Modal / 兄弟项目 --tdt-mask 同一条真值,用户 2026-10-20)。 */\n/* 右边界让位页面级分栏(PanelDock 发布的 --dshpc-page-inset-right,用户 2026-10-22):\n 分栏不被压暗、照常可点;浮层在这块**剩下**的区域里排版,就像整页被推出去一样。 */\n.dshpc-overlay{\n position:fixed;inset:0 var(--dshpc-page-inset-right,0px) 0 0;\n background:var(--dshpc-mask);\n}\n/* 居中档(Modal):z 走 modal 档。 */\n.dshpc-overlay--center{\n display:flex;align-items:center;justify-content:center;\n z-index:var(--dshpc-z-modal);\n}\n/* 侧边档(SideSheet):面板 absolute 贴边,不需要 flex 居中;z 走 drawer 档(低于 modal)。 */\n.dshpc-overlay--side{z-index:var(--dshpc-z-drawer)}\n\n/* 头部四槽:左图标 / 标题组 / 弹性间隔 / 右侧动作区 + 关闭钮。 */\n.dshpc-overlay-head{\n display:flex;align-items:center;gap:8px;padding:18px 18px 12px;\n border-bottom:1px solid var(--dshpc-border);flex-wrap:wrap;\n}\n.dshpc-overlay-head__heading{display:flex;align-items:center;gap:8px;min-width:0;flex:0 1 auto}\n.dshpc-overlay-head__lead{flex:none;display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1}\n/* 标题组:第一行 = 标题 + 右侧小块(徽标紧跟标题),第二行 = 副标题。 */\n.dshpc-overlay-head__titlegroup{display:flex;flex-direction:column;gap:2px;min-width:0;flex:0 1 auto}\n.dshpc-overlay-head__titlerow{display:flex;align-items:center;gap:8px;min-width:0}\n.dshpc-overlay-head__title{font-size:var(--dshpc-font-lg);font-weight:600;line-height:1.4;min-width:0}\n/* 标题下副标题行(兄弟项目 .dsh-tdt-sv-sid:等宽字体、caption 色、可换行)。 */\n.dshpc-overlay-head__sid{font-family:var(--ds-font-family-code,monospace);font-size:var(--dshpc-font-xs);color:var(--dshpc-fg-3);word-break:break-all}\n.dshpc-overlay-head__extra{flex:none;display:inline-flex;align-items:center}\n.dshpc-overlay-head__spacer{flex:1 1 auto;min-width:8px}\n.dshpc-overlay-head__actions{flex:none;display:flex;align-items:center;gap:8px}\n/* 关闭按钮:20×20 方角图标位,不借用 Picker 的触发器皮肤(那份带 min-width:120px)。 */\n.dshpc-overlay-head__close{\n display:inline-flex;align-items:center;justify-content:center;flex:none;\n width:20px;height:20px;padding:0;border:none;border-radius:var(--dshpc-radius-sm);\n background:transparent;color:var(--dshpc-fg-3);font-family:inherit;font-size:13px;line-height:1;cursor:pointer;\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n.dshpc-overlay-head__close:hover{background:var(--dshpc-hover);color:var(--dshpc-fg)}\n.dshpc-overlay-head__close:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n";
4
4
  //# sourceMappingURL=overlay-css.generated.js.map
@@ -53,6 +53,7 @@ dsh-plugin-core/
53
53
  │ ├── 选择 ✅ WorkspacePicker(选工作区,自取宿主快照)
54
54
  │ │ 通用 Picker 是纯零件;领域选择器经 connectHost 自取数(2026-10-20)
55
55
  │ ├── 组合 ✅ SplitGroup(两格焊成一体:只画外框 / 分隔 / 聚焦圈,不持状态)
56
+ │ │ InputGroup(输入框 + 按钮组焊成一体:可选前置标题 / 撤销 / 自定义高度)
56
57
  │ └── 布局 ✅ PanelDock / createPanelDock(可停靠分栏:多面板 + 拖拽拉栏)
57
58
  │ 组名 = 窗口一对一、同名覆盖、默认上限 3 超限拒绝;
58
59
  │ 不做 tab 切换 / 自动淘汰 / 浮动层(用户 2026-10-20 定案)
@@ -120,7 +121,7 @@ utils(谁都不依赖,谁都可以用)
120
121
  │ ├─ 动作 Button / IconButton
121
122
  │ ├─ 反馈 Modal / Toast
122
123
  │ ├─ 展示 Card / StripCard / Chip / Table / MarqueeText / SectionHead / FieldHint / LiveText
123
- │ ├─ 组合 SplitGroup(展示在选择器页)
124
+ │ ├─ 组合 SplitGroup(展示在选择器页)/ InputGroup(展示在表单页)
124
125
  │ └─ 布局 PanelDock / 拉栏 / QuickToolbar
125
126
  │
126
127
  ├─ ③ 高级空间
@@ -94,6 +94,34 @@ h(SplitGroup, null,
94
94
  h(Picker, { size: 'md', options: membersOf(scope), value: member, onChange: setMember, searchable: true }),
95
95
  )`
96
96
 
97
+ const inputGroupExample = `import { InputGroup } from 'dsh-plugin-core/ui'
98
+
99
+ // 输入框 + 按钮组焊成一体;label 是前置标题,undoable 在最前面加撤销钮
100
+ h(InputGroup, {
101
+ label: '任务名',
102
+ value: name, onChange: setName,
103
+ undoable: true,
104
+ onSubmit: save, // Enter 提交(提交点也会进撤销栈)
105
+ actions: [
106
+ { label: '返回', variant: 'ghost', onClick: back },
107
+ { label: '确定', variant: 'success', onClick: save }, // 语义色直接传档,不自己调色
108
+ ],
109
+ })
110
+
111
+ // 按钮三形:纯图标(正方形,ariaLabel 给读屏)/ 图标 + 文字 / 纯文字;size 三档
112
+ h(InputGroup, {
113
+ size: 'md', value: kw, onChange: setKw,
114
+ actions: [
115
+ { icon: h(IconRefreshOutlineRegular, { size: 14 }), ariaLabel: '重置', onClick: reset },
116
+ { icon: h(IconSearchOutlineRegular, { size: 14 }), label: '搜索', onClick: search },
117
+ ],
118
+ })
119
+
120
+ // 高度自定义:height 直接给 px,压过 size 档(内件跟着撑满)
121
+ h(InputGroup, {
122
+ value: kw, onChange: setKw, height: 44,
123
+ actions: [{ label: '确定', onClick: save }],
124
+ })`
97
125
  const tableExample = `import { Table, Chip } from 'dsh-plugin-core/ui'
98
126
 
99
127
  const columns = [
@@ -415,6 +443,41 @@ const doc: DocTopic = {
415
443
  ],
416
444
  code: [{ id: 'ui-splitgroup-example', lang: 'tsx', src: splitGroupExample }],
417
445
  },
446
+ {
447
+ id: 'input-group',
448
+ heading: { zh: 'InputGroup(组合输入框)', en: 'InputGroup (input with actions)' },
449
+ prose: [
450
+ {
451
+ zh: '输入框 + 后置按钮组焊成一体,外观与 SplitGroup 同一套口径(外框 / 圆角 / 相邻 1px 分隔 / 整体聚焦圈都由外壳画,内件把自己的边框、圆角交出来)。区别是这里**持状态**:值受控于调用方,提交点与撤销栈在控件内部。',
452
+ en: 'An input and a trailing button group welded into one shell, using the same skin rules as SplitGroup (frame, radius, 1px dividers and the focus ring all come from the shell; inner controls hand over their border and radius). The difference: this one **holds state** — the value is controlled by the caller, while commit points and the undo stack live inside.',
453
+ },
454
+ {
455
+ zh: '按钮可以是任意多枚(返回 + 确定、图标 / 图文 / 纯文字);`label` 是前置标题,与输入框同格灰底。`size` 三档(sm 24 / md 28 / lg 32),要别的就传 `height`(px),内件跟着撑满。',
456
+ en: 'Any number of buttons (back + confirm; icon / icon+text / text only); `label` is a leading title sharing the cell with a sunken background. Three sizes (sm 24 / md 28 / lg 32); pass `height` in px for anything else and the inner controls fill it.',
457
+ },
458
+ {
459
+ zh: '撤销口径:Enter / 失焦 / 点任一动作 = 一次提交,提交前的值进栈;点撤销弹回栈顶、栈空时按钮禁用。父级直接改 `value`(如外部清空)不算编辑,不进栈。',
460
+ en: 'Undo semantics: Enter / blur / clicking any action is one commit, and the value before it is pushed; the undo button pops the top and is disabled while the stack is empty. A `value` change made directly by the parent (such as an external clear) is not an edit and never enters the stack.',
461
+ },
462
+ ],
463
+ api: [
464
+ {
465
+ id: 'ui-input-group',
466
+ rows: [
467
+ { name: 'value / onChange(v)', type: 'string / (v: string) => void', def: '—', desc: { zh: '受控值', en: 'Controlled value' } },
468
+ { name: 'label', type: 'string', def: '—', desc: { zh: '前置标题(同格灰底);同时作为整组无障碍名的兜底', en: 'Leading title in the same cell (sunken background); also the fallback accessible name for the group' } },
469
+ { name: 'actions', type: 'InputGroupAction[]', def: '—', desc: { zh: '{ icon?, label?, variant?, disabled?, ariaLabel?, onClick };只给 icon 退化成正方形图标钮(ariaLabel 必给),给 label 走 Button;variant 默认 info,语义色就用 Button 现成的档(success / info / warning / danger),不另调色', en: '{ icon?, label?, variant?, disabled?, ariaLabel?, onClick }; icon-only degrades to a square icon button (pass ariaLabel), a label renders a Button; variant defaults to info — for a semantic colour pass Button’s own variant (success / info / warning / danger) instead of a custom colour' } },
470
+ { name: 'undoable / undoLabel', type: 'boolean / string', def: "false / '撤销'", desc: { zh: '最前面加撤销钮,回到上一次提交前的值', en: 'Prepends an undo button returning to the value before the last commit' } },
471
+ { name: 'size / height', type: "'sm' | 'md' | 'lg' / number(px)", def: "'lg' / —", desc: { zh: 'height 给了就压过 size 档', en: 'height overrides the size preset' } },
472
+ { name: 'error / disabled', type: 'boolean', def: '—', desc: { zh: 'error 描红整组;disabled 禁用输入与所有按钮', en: 'error turns the whole shell red; disabled disables the input and every button' } },
473
+ { name: 'onSubmit(v)', type: '(v: string) => void', def: '—', desc: { zh: 'Enter 提交(同时记一次撤销点)', en: 'Enter submit (also records an undo point)' } },
474
+ { name: 'hint', type: 'string', def: '—', desc: { zh: '整组后面挂标准 FieldHint', en: 'Attaches a standard FieldHint after the whole group' } },
475
+ { name: 'placeholder / aria-label / id / className / style', type: 'string', def: '—', desc: { zh: '占位 / 无障碍名 / 锚点 / 只补布局', en: 'Placeholder / accessible name / anchor / layout-only additions' } },
476
+ ],
477
+ },
478
+ ],
479
+ code: [{ id: 'ui-inputgroup-example', lang: 'tsx', src: inputGroupExample }],
480
+ },
418
481
  {
419
482
  id: 'datetime-picker',
420
483
  heading: { zh: 'DateTimePicker(日期时间选择)', en: 'DateTimePicker (date & time)' },
package/docs/help/ui.md CHANGED
@@ -177,6 +177,65 @@ h(SplitGroup, null,
177
177
  )
178
178
  ```
179
179
 
180
+ ## InputGroup(组合输入框)
181
+
182
+ > EN: InputGroup (input with actions)
183
+
184
+ 输入框 + 后置按钮组焊成一体,外观与 SplitGroup 同一套口径(外框 / 圆角 / 相邻 1px 分隔 / 整体聚焦圈都由外壳画,内件把自己的边框、圆角交出来)。区别是这里**持状态**:值受控于调用方,提交点与撤销栈在控件内部。
185
+
186
+ > EN: An input and a trailing button group welded into one shell, using the same skin rules as SplitGroup (frame, radius, 1px dividers and the focus ring all come from the shell; inner controls hand over their border and radius). The difference: this one **holds state** — the value is controlled by the caller, while commit points and the undo stack live inside.
187
+
188
+ 按钮可以是任意多枚(返回 + 确定、图标 / 图文 / 纯文字);`label` 是前置标题,与输入框同格灰底。`size` 三档(sm 24 / md 28 / lg 32),要别的就传 `height`(px),内件跟着撑满。
189
+
190
+ > EN: Any number of buttons (back + confirm; icon / icon+text / text only); `label` is a leading title sharing the cell with a sunken background. Three sizes (sm 24 / md 28 / lg 32); pass `height` in px for anything else and the inner controls fill it.
191
+
192
+ 撤销口径:Enter / 失焦 / 点任一动作 = 一次提交,提交前的值进栈;点撤销弹回栈顶、栈空时按钮禁用。父级直接改 `value`(如外部清空)不算编辑,不进栈。
193
+
194
+ > EN: Undo semantics: Enter / blur / clicking any action is one commit, and the value before it is pushed; the undo button pops the top and is disabled while the stack is empty. A `value` change made directly by the parent (such as an external clear) is not an edit and never enters the stack.
195
+
196
+ | 参数 | 类型 | 默认 | 说明(zh) | 说明(en) |
197
+ |---|---|---|---|---|
198
+ | `value / onChange(v)` | `string / (v: string) => void` | — | 受控值 | Controlled value |
199
+ | `label` | `string` | — | 前置标题(同格灰底);同时作为整组无障碍名的兜底 | Leading title in the same cell (sunken background); also the fallback accessible name for the group |
200
+ | `actions` | `InputGroupAction[]` | — | { icon?, label?, variant?, disabled?, ariaLabel?, onClick };只给 icon 退化成正方形图标钮(ariaLabel 必给),给 label 走 Button;variant 默认 info,语义色就用 Button 现成的档(success / info / warning / danger),不另调色 | { icon?, label?, variant?, disabled?, ariaLabel?, onClick }; icon-only degrades to a square icon button (pass ariaLabel), a label renders a Button; variant defaults to info — for a semantic colour pass Button’s own variant (success / info / warning / danger) instead of a custom colour |
201
+ | `undoable / undoLabel` | `boolean / string` | false / '撤销' | 最前面加撤销钮,回到上一次提交前的值 | Prepends an undo button returning to the value before the last commit |
202
+ | `size / height` | `'sm' \| 'md' \| 'lg' / number(px)` | 'lg' / — | height 给了就压过 size 档 | height overrides the size preset |
203
+ | `error / disabled` | `boolean` | — | error 描红整组;disabled 禁用输入与所有按钮 | error turns the whole shell red; disabled disables the input and every button |
204
+ | `onSubmit(v)` | `(v: string) => void` | — | Enter 提交(同时记一次撤销点) | Enter submit (also records an undo point) |
205
+ | `hint` | `string` | — | 整组后面挂标准 FieldHint | Attaches a standard FieldHint after the whole group |
206
+ | `placeholder / aria-label / id / className / style` | `string` | — | 占位 / 无障碍名 / 锚点 / 只补布局 | Placeholder / accessible name / anchor / layout-only additions |
207
+
208
+ ```tsx id="ui-inputgroup-example"
209
+ import { InputGroup } from 'dsh-plugin-core/ui'
210
+
211
+ // 输入框 + 按钮组焊成一体;label 是前置标题,undoable 在最前面加撤销钮
212
+ h(InputGroup, {
213
+ label: '任务名',
214
+ value: name, onChange: setName,
215
+ undoable: true,
216
+ onSubmit: save, // Enter 提交(提交点也会进撤销栈)
217
+ actions: [
218
+ { label: '返回', variant: 'ghost', onClick: back },
219
+ { label: '确定', variant: 'success', onClick: save }, // 语义色直接传档,不自己调色
220
+ ],
221
+ })
222
+
223
+ // 按钮三形:纯图标(正方形,ariaLabel 给读屏)/ 图标 + 文字 / 纯文字;size 三档
224
+ h(InputGroup, {
225
+ size: 'md', value: kw, onChange: setKw,
226
+ actions: [
227
+ { icon: h(IconRefreshOutlineRegular, { size: 14 }), ariaLabel: '重置', onClick: reset },
228
+ { icon: h(IconSearchOutlineRegular, { size: 14 }), label: '搜索', onClick: search },
229
+ ],
230
+ })
231
+
232
+ // 高度自定义:height 直接给 px,压过 size 档(内件跟着撑满)
233
+ h(InputGroup, {
234
+ value: kw, onChange: setKw, height: 44,
235
+ actions: [{ label: '确定', onClick: save }],
236
+ })
237
+ ```
238
+
180
239
  ## DateTimePicker(日期时间选择)
181
240
 
182
241
  > EN: DateTimePicker (date & time)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-plugin-core",
3
- "version": "0.18.0",
3
+ "version": "0.19.1",
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": [