@manohub/ui 1.0.4 → 1.0.6

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.
Files changed (140) hide show
  1. package/README.md +8 -2
  2. package/dist/components/badge/index.d.ts +24 -46
  3. package/dist/components/badge/index.js +7 -11
  4. package/dist/components/button/index.d.ts +11 -31
  5. package/dist/components/capsule/index.d.ts +13 -27
  6. package/dist/components/card/index.d.ts +28 -62
  7. package/dist/components/checkbox/index.d.ts +1 -9
  8. package/dist/components/code-block/index.d.ts +28 -55
  9. package/dist/components/collapse/index.d.ts +2 -0
  10. package/dist/components/dialog/index.d.ts +9 -18
  11. package/dist/components/dialog/index.js +3 -2
  12. package/dist/components/divider/index.d.ts +1 -12
  13. package/dist/components/drawer/index.d.ts +7 -15
  14. package/dist/components/filter/index.d.ts +27 -69
  15. package/dist/components/filter/index.js +3 -8
  16. package/dist/components/form/index.d.ts +86 -218
  17. package/dist/components/form/index.js +5 -12
  18. package/dist/components/input/bordered.d.ts +4 -6
  19. package/dist/components/input/index.d.ts +36 -83
  20. package/dist/components/input/index.js +6 -11
  21. package/dist/components/input/number-input.d.ts +11 -23
  22. package/dist/components/layout/index.d.ts +21 -28
  23. package/dist/components/layout/index.js +5 -8
  24. package/dist/components/list-view/index.d.ts +10 -43
  25. package/dist/components/loading/index.d.ts +8 -19
  26. package/dist/components/nav/index.d.ts +14 -35
  27. package/dist/components/nav/index.js +1 -3
  28. package/dist/components/notice/index.d.ts +13 -33
  29. package/dist/components/notice/index.js +3 -5
  30. package/dist/components/notification/index.d.ts +0 -9
  31. package/dist/components/page/index.d.ts +29 -71
  32. package/dist/components/page/split-resize.d.ts +9 -18
  33. package/dist/components/pagination/index.d.ts +1 -5
  34. package/dist/components/panel/index.d.ts +33 -70
  35. package/dist/components/panel/index.js +1 -4
  36. package/dist/components/part-padding.d.ts +5 -13
  37. package/dist/components/query-state/index.d.ts +8 -32
  38. package/dist/components/radio/index.d.ts +13 -17
  39. package/dist/components/search/index.d.ts +12 -32
  40. package/dist/components/select/index.d.ts +30 -49
  41. package/dist/components/select/index.js +3 -3
  42. package/dist/components/select/select-panel.d.ts +23 -35
  43. package/dist/components/select/select-panel.js +5 -10
  44. package/dist/components/select/select-shared.d.ts +18 -44
  45. package/dist/components/select/select-tree.d.ts +11 -16
  46. package/dist/components/select/select-trigger.d.ts +6 -16
  47. package/dist/components/select/select-trigger.js +5 -11
  48. package/dist/components/skeleton/index.d.ts +1 -5
  49. package/dist/components/steps/index.d.ts +55 -111
  50. package/dist/components/steps/index.js +8 -16
  51. package/dist/components/switch/index.d.ts +17 -33
  52. package/dist/components/switch/index.js +2 -4
  53. package/dist/components/tabbar/index.d.ts +1 -6
  54. package/dist/components/table/index.d.ts +20 -72
  55. package/dist/components/table/index.js +4 -8
  56. package/dist/components/tabs/index.d.ts +22 -44
  57. package/dist/components/text/index.d.ts +10 -21
  58. package/dist/components/toast/index.d.ts +4 -13
  59. package/dist/components/tooltip/index.d.ts +1 -12
  60. package/dist/components/tree/index.d.ts +51 -101
  61. package/dist/components/tree/index.js +17 -33
  62. package/dist/components/upload/index.d.ts +1 -4
  63. package/dist/index.d.ts +2 -2
  64. package/dist/services/base.d.ts +32 -8
  65. package/dist/services/dialog.d.ts +13 -23
  66. package/dist/services/dialog.js +2 -0
  67. package/dist/services/index.d.ts +2 -2
  68. package/dist/services/loading.d.ts +9 -12
  69. package/dist/services/loading.js +8 -1
  70. package/dist/services/toast.d.ts +4 -14
  71. package/dist/styles/components/avatar.css +5 -7
  72. package/dist/styles/components/avatar.tokens.css +4 -9
  73. package/dist/styles/components/badge.css +3 -6
  74. package/dist/styles/components/badge.tokens.css +5 -17
  75. package/dist/styles/components/button.css +35 -57
  76. package/dist/styles/components/button.tokens.css +5 -14
  77. package/dist/styles/components/capsule.css +13 -20
  78. package/dist/styles/components/capsule.tokens.css +4 -9
  79. package/dist/styles/components/card.css +13 -24
  80. package/dist/styles/components/checkbox.css +11 -15
  81. package/dist/styles/components/checkbox.tokens.css +4 -9
  82. package/dist/styles/components/code-block.css +30 -40
  83. package/dist/styles/components/code-block.tokens.css +7 -20
  84. package/dist/styles/components/collapse.css +6 -10
  85. package/dist/styles/components/collapse.tokens.css +4 -9
  86. package/dist/styles/components/dialog.css +19 -27
  87. package/dist/styles/components/dialog.tokens.css +9 -9
  88. package/dist/styles/components/divider.css +9 -14
  89. package/dist/styles/components/divider.tokens.css +4 -9
  90. package/dist/styles/components/drawer.css +12 -16
  91. package/dist/styles/components/drawer.tokens.css +7 -9
  92. package/dist/styles/components/filter.css +13 -24
  93. package/dist/styles/components/form.css +77 -149
  94. package/dist/styles/components/form.tokens.css +9 -6
  95. package/dist/styles/components/input.css +73 -177
  96. package/dist/styles/components/input.tokens.css +5 -13
  97. package/dist/styles/components/layout.css +13 -29
  98. package/dist/styles/components/loading.css +6 -10
  99. package/dist/styles/components/loading.tokens.css +4 -9
  100. package/dist/styles/components/notice.css +3 -1
  101. package/dist/styles/components/notice.tokens.css +8 -6
  102. package/dist/styles/components/notification.css +9 -12
  103. package/dist/styles/components/notification.tokens.css +4 -12
  104. package/dist/styles/components/page.css +32 -48
  105. package/dist/styles/components/pagination.css +14 -15
  106. package/dist/styles/components/pagination.tokens.css +4 -9
  107. package/dist/styles/components/query-state.css +1 -1
  108. package/dist/styles/components/query-state.tokens.css +6 -0
  109. package/dist/styles/components/radio.css +12 -25
  110. package/dist/styles/components/radio.tokens.css +4 -9
  111. package/dist/styles/components/search.css +8 -18
  112. package/dist/styles/components/select.css +63 -109
  113. package/dist/styles/components/select.tokens.css +4 -12
  114. package/dist/styles/components/skeleton.css +4 -7
  115. package/dist/styles/components/skeleton.tokens.css +4 -9
  116. package/dist/styles/components/steps.css +9 -12
  117. package/dist/styles/components/steps.tokens.css +4 -12
  118. package/dist/styles/components/switch.css +7 -8
  119. package/dist/styles/components/switch.tokens.css +4 -9
  120. package/dist/styles/components/tabbar.css +12 -11
  121. package/dist/styles/components/tabbar.tokens.css +4 -9
  122. package/dist/styles/components/table.css +52 -93
  123. package/dist/styles/components/table.tokens.css +5 -6
  124. package/dist/styles/components/tag.css +13 -23
  125. package/dist/styles/components/tag.tokens.css +5 -11
  126. package/dist/styles/components/text.css +11 -23
  127. package/dist/styles/components/toast.css +11 -18
  128. package/dist/styles/components/toast.tokens.css +6 -9
  129. package/dist/styles/components/tooltip.css +9 -11
  130. package/dist/styles/components/tooltip.tokens.css +5 -9
  131. package/dist/styles/components/tree.css +14 -27
  132. package/dist/styles/components/tree.tokens.css +5 -6
  133. package/dist/styles/components/upload.css +10 -13
  134. package/dist/styles/components/upload.tokens.css +4 -9
  135. package/dist/styles/index.css +27 -50
  136. package/dist/styles/operations/collapse.css +12 -25
  137. package/dist/styles/operations/popup.css +41 -79
  138. package/dist/styles/operations/tabs.css +14 -32
  139. package/dist/styles/reset.css +0 -61
  140. package/package.json +2 -2
@@ -5,37 +5,25 @@ export type FormPadding = Padding;
5
5
  /** label 列的水平对齐:`right`(默认,与 farris / 主流水平表单一致)或 `left` */
6
6
  export type FormLabelAlign = 'left' | 'right';
7
7
  /**
8
- * 字段行的排布档:
9
- *
10
- * - `1`(默认):逐行;
11
- * - `2 ~ 6`:**列数上限** —— 容器放得下 N 列就并排,放不下**少排一列**(不会把控件压成窄条)。
12
- * 高列数(5 / 6)在默认最小宽 320 下要容器 1632 / 1960px 才排得出来,普通表单页用不到 ——
13
- * 留着它是给「宽屏展示页 / 大屏看板」这类场景,配 `columnMinWidth` 才好落地;
14
- * - `'auto'`:**列数随容器宽度动态变化** —— 能排几列排几列,每列宽由 `columnMinWidth` 决定。
15
- *
16
- * 两类的差别是**可预期性**(不是能力高低):
17
- *
18
- * - 数字档承诺「最多 N 列」,所以「哪几个字段同排」在够宽的容器里是确定的;
19
- * - 动态档会一路排下去(默认参数下 1320px 就够 4 列),窄了就减 ——
20
- * 同一个表单在不同容器里列数不同 ⇒ **字段的相对位置会变**。要「两个字段必须并肩」就别用它。
8
+ * 字段行的排布档:`1`(默认,逐行);`2 ~ 6`(**列数上限** —— 放得下 N 列就并排、放不下少排一列,不会把控件压成
9
+ * 窄条;5 / 6 给宽屏展示页,默认最小宽 320 下要容器 1632 / 1960px);`'auto'`(**列数随容器宽度动态变化**,每列宽
10
+ * 由 `columnMinWidth` 决定)。
11
+ * 两类的差别是**可预期性**(不是能力高低):数字档承诺「最多 N 列」,够宽时「哪几个字段同排」是确定的;动态档窄了
12
+ * 就减,同一表单在不同容器里列数不同 ⇒ **字段的相对位置会变** —— 要「两个字段必须并肩」就别用它。
13
+ * 用法见 `docs/demos/form/`(每个维度一份可运行样例;文档页 `docs/components/form.md`)。
21
14
  */
22
15
  export type FormColumns = 1 | 2 | 3 | 4 | 5 | 6 | 'auto';
23
16
  /**
24
- * 行内**垂直**对齐(label 与控件在控件行内怎么对齐):
25
- *
26
- * - `center`(默认):label 文字与控件**中线**对齐 —— 单行控件(输入框 / 选择器 / 开关)用它;
27
- * - `start`:label 与控件**首行文字**对齐 —— 多行控件(文本域)与整块内容用它,
28
- * 否则 label 会落到整块高度的中间。
29
- *
30
- * 不传即**自动判定**(样式按控件类型切档:文本域行零配置就是顶对齐);
31
- * 显式传入优先于自动判定,用于自绘内容(卡片组 / 表格 / 富文本这类样式认不出来的块)。
17
+ * 行内**垂直**对齐(label 与控件在控件行内怎么对齐):`center`(默认,与控件**中线**对齐,单行控件用);`start`
18
+ * (与控件**首行文字**对齐,多行控件与整块内容用,否则 label 会落到整块高度中间)。不传即**自动判定**(样式按控件
19
+ * 类型切档),显式传入优先,用于自绘内容(卡片组 / 表格 / 富文本)。
32
20
  */
33
21
  export type FormItemAlign = 'center' | 'start';
34
22
  /** 表单值:**字段名 → 值**(键就是 `Form.Item` 的 `name`) */
35
23
  export type FormValues = Record<string, unknown>;
36
24
  /**
37
- * 带 `name` 的 `Form.Item` 的默认插槽作用域:控件由消费方渲染,本件只把绑定值交出去。
38
- * 不带 `name` 的项(纯布局 / 只读行)不需要这些,作用域里的值恒为 `undefined`。
25
+ * 带 `name` 的 `Form.Item` 的默认插槽作用域:控件由消费方渲染,本件只把绑定值交出去;不带 `name` 的项
26
+ * (纯布局 / 只读行)不需要这些,作用域里的值恒为 `undefined`。
39
27
  */
40
28
  export interface FormItemSlotScope {
41
29
  /** 当前字段值(Form 里的原值,不做任何归一) */
@@ -48,51 +36,34 @@ export interface FormItemSlotScope {
48
36
  export interface FormProps {
49
37
  /** 表单级 label 列宽(px);缺省取令牌 `--ui-form-label-width`(120)。px 不跟随根字号,见 CONTRACT「已知偏差」 */
50
38
  labelWidth?: number;
51
- /**
52
- * 表单级 label 对齐:`right`(默认,文本贴着控件列)或 `left`(所有 label 起点一致)。
53
- * `Form.Item` 上再写则只改那一行。
54
- */
39
+ /** 表单级 label 对齐:`right`(默认,文本贴着控件列)或 `left`(所有 label 起点一致);`Form.Item` 上再写则只改那一行。 */
55
40
  labelAlign?: FormLabelAlign;
56
41
  /**
57
- * 表单级控件列宽上限(px);缺省**撑满**剩余宽度。
58
- *
59
- * 宽表单(>600px)里让输入框一路拉到右边缘很难看,两种收法二选一:
60
- * ① 收宽度 —— 传 `controlWidth={360}`,控件列封顶、右侧留白;
61
- * ② 分列 —— 传 `columns`(`2 | 3 | 4` 上限档,或 `'auto'` 动态),把行并排起来(见下)。
42
+ * 表单级控件列宽上限(px);缺省**撑满**剩余宽度。宽表单(>600px)里让输入框一路拉到右边缘很难看,两种收法
43
+ * 二选一:① 收宽度(`controlWidth={360}`,控件列封顶、右侧留白);② 分列(`columns`,见下)。
62
44
  */
63
45
  controlWidth?: number;
64
46
  /**
65
- * 列数:`1`(默认,逐行)/ `2 ~ 6`(**容器够宽才并排**,窄了按列最小宽度自动回落一列)/
66
- * `'auto'`(列数随容器宽度动态变化,取舍见 `FormColumns`)。
67
- *
68
- * 多列下每一行都要能独立成格,所以「整行内容」(说明行、卡片组、表格、文本域)记得
69
- * 在对应 `Form.Item` 上给 `fullWidth`,否则会被压成一格。
47
+ * 列数:`1`(默认,逐行)/ `2 ~ 6`(**容器够宽才并排**,窄了自动回落一列)/ `'auto'`(列数随容器宽度动态变化)。
48
+ * 多列下「整行内容」(说明行 / 卡片组 / 表格 / 文本域)记得在对应 `Form.Item` 上给 `fullWidth`,否则会被压成一格。
70
49
  */
71
50
  columns?: FormColumns;
72
51
  /**
73
- * 一列的**最小宽度**(px);缺省取令牌 `--ui-form-column-min`(320 = 「label 120 + 一个还能用的
74
- * 输入框」的下限)。
75
- *
76
- * 它同时是**回落阈值**与**动态列数的除数**:数字档下容器窄于
77
- * `N × 最小宽 + (N − 1) × 行距` 就少排一列;动态档下列数 =
78
- * `floor((容器宽 + 行距) / (最小宽 + 行距))`。抽屉 / 弹窗里嫌字段太窄就调小(如 280),
79
- * 宽页面里嫌列太多就调大(如 380)。
52
+ * 一列的**最小宽度**(px);缺省取令牌 `--ui-form-column-min`(320 =「label 120 + 一个还能用的输入框」的下限)。
53
+ * 它同时是**回落阈值**与**动态列数的除数**:数字档下容器窄于 `N × 最小宽 + (N − 1) × 行距` 就少排一列;动态档下
54
+ * 列数 = `floor((容器宽 + 行距) / (最小宽 + 行距))`。抽屉 / 弹窗里嫌字段太窄就调小(如 280),宽页面里嫌列太多就调大。
80
55
  */
81
56
  columnMinWidth?: number;
82
57
  /**
83
- * 表单内距(**px 数字**,与 `Panel` 同一口径):`number` = 四边同值;`{ y, x }` = 上下 / 左右分别给。
84
- *
85
- * **缺省 0**:表单贴容器边,内距由所在容器给(页面里的表单在 `Panel.Body` 里,那块自带内距)。
86
- * 弹窗 / 抽屉里没有别的容器给内距时用它自带 —— 如 `padding={{ y: 16, x: 20 }}`,
87
- * 这样就不必再给表单挂一个「只写 padding」的应用侧类。
58
+ * 表单内距(**px 数字**,与 `Panel` 同一口径):`number` = 四边同值;`{ y, x }` = 上下 / 左右分别给。**缺省 0**
59
+ * (表单贴容器边,内距由所在容器给);弹窗 / 抽屉里没别的容器给内距时用它自带(如 `{ y: 16, x: 20 }`)。
88
60
  */
89
61
  padding?: FormPadding;
90
62
  /** 行距(px,字段行之间 / 与 `Form.Header` 之间);缺省沿用样式里的 8px 档 */
91
63
  gap?: number;
92
64
  /**
93
- * 受控表单值(**字段名 → 值**,键就是 `Form.Item` 的 `name`);不传即非受控(由 `defaultValue` 起)。
94
- *
95
- * 值变更时 `emit('update:modelValue')` 与 `onChange` **双走**(`v-model` 落地 + 回调)。
65
+ * 受控表单值(**字段名 → 值**,键就是 `Form.Item` 的 `name`);不传即非受控(由 `defaultValue` 起)。值变更时
66
+ * `emit('update:modelValue')` 与 `onChange` **双走**(`v-model` 落地 + 回调)。
96
67
  */
97
68
  modelValue?: FormValues;
98
69
  /** 非受控初值;其中的键会一并成为快照的键(不必等字段挂载) */
@@ -100,178 +71,104 @@ export interface FormProps {
100
71
  /** 值变更(快照含**全部已登记字段**,未设值的字段为 `undefined`) */
101
72
  onChange?: (values: FormValues) => void;
102
73
  /**
103
- * 根节点的键盘事件(**转发到表单根**)。
104
- *
105
- * 本件是 `inheritAttrs: false`,根节点只显式绑 `class` / `style` —— 不声明的监听器会被**静默丢掉**
106
- * (与该文件里已修过的「消费方 style 被静默丢弃」同款前科)。而根节点就是「全部字段行的容器」,
107
- * 故它是「字段区层面的委托」的落点:本包 `Filter` 的「字段区回车 = 查询」就搭在这条通道上
108
- * (构造 `Filter` 时因此不必再套一层只为挂事件的壳 —— 那会改变 `class` / `style` 的落点)。
109
- *
110
- * **有意只开这一条**:其它监听器(如 `onClick`)不转发;要把某一条也接进来,先当一次公开行为变更裁决。
111
- * 要不要拦、拦哪些按键(本包 `Filter` 收窄到「`<input>` 上的回车」)由调用方自己判断,本件只转发。
74
+ * 根节点的键盘事件(**转发到表单根**)。本件是 `inheritAttrs: false`,根节点只显式绑 `class` / `style` ——
75
+ * 不声明的监听器会被**静默丢掉**;而根节点就是「全部字段行的容器」,故它是「字段区层面的委托」的落点(`Filter`
76
+ * 的「字段区回车 = 查询」就搭在这条通道上,构造 `Filter` 时因此不必再套一层只为挂事件的壳)。
77
+ * **有意只开这一条**:其它监听器(如 `onClick`)不转发;判据(`Filter` 收窄到「`<input>` 上的回车」)由调用方
78
+ * 自己定,本件只转发。
112
79
  */
113
80
  onKeydown?: (event: KeyboardEvent) => void;
114
81
  }
115
82
  export interface FormItemProps {
116
83
  /**
117
- * **字段名**(绑定的键):带了它,本行就从 `Form` 取值并把写值交出去
118
- * (默认插槽作用域 `{ value, setValue, clear }`);不带则与从前一样 ——
119
- * 纯布局行,值由消费方自己在控件上绑定(静态摘要 / 只读行都属这一类)。
84
+ * **字段名**(绑定的键):带了它,本行就从 `Form` 取值并把写值交出去(默认插槽作用域 `{ value, setValue, clear }`);
85
+ * 不带则与从前一样 —— 纯布局行,值由消费方自己在控件上绑定(静态摘要 / 只读行都属这一类)。
120
86
  */
121
87
  name?: string;
122
- /**
123
- * 字段名(label 文本)。缺省且非必填时**不渲染 label 列**:控件列占满整行
124
- * —— 用于无字段名的整块内容(如列编辑区)与纯说明行。
125
- */
88
+ /** 字段名(label 文本)。缺省且非必填时**不渲染 label 列**(控件列占满整行)—— 用于无字段名的整块内容与纯说明行。 */
126
89
  label?: string;
127
- /**
128
- * 必填标记:星号渲染在 label 文本**之后**(`服务名称*`)—— 星号是字段名的一部分,
129
- * 跟着字段名走;与 farris 动态表单「星号在左」的写法**有意不同**(本仓口径)。
130
- */
90
+ /** 必填标记:星号渲染在 label 文本**之后**(`服务名称*`)—— 星号是字段名的一部分,跟着字段名走(与 farris「星号在左」有意不同)。 */
131
91
  required?: boolean;
132
92
  /** 校验错误文案:非空即进入 invalid 态,文案排布在控件**下方**(不遮挡后续行) */
133
93
  error?: string;
134
94
  /** 字段说明文案(常驻,排在错误之后) */
135
95
  hint?: string;
136
96
  /**
137
- * **label 旁的提示**(问号图标 + 悬停气泡,仅文本)。
138
- *
139
- * 与 `hint` 分工不同:`hint` 是**常驻**在控件下方的说明文案,`tip` 是**按需展开**的补充解释 ——
140
- * 不占版面,只在悬停(或键盘聚焦)问号图标时出现,两者可以同时给。
141
- *
142
- * 图标排在 label 文本与必填星号**之后**(`服务名称*ⓘ`);只给 `tip` 而不给 `label` 时同样保留
143
- * label 列(与「只给 required」同一判据)—— 否则图标没有列可落、静默消失。
144
- *
145
- * 用的是 `Tooltip` 的 **hover 档**(零 JS):显隐与定位全在 CSS,移入 / 聚焦即显、移开即隐,
146
- * 因此**不吃点击、不抢焦点**。代价一条:hover 档不进浏览器顶层浮层,会被祖先 `overflow` 裁切
147
- * —— 弹窗 / 抽屉里贴着裁剪边的字段可能看不全(要顶层浮层就得换 `Tooltip trigger="click"`,
148
- * 本件有意不暴露该维度,见文件头「label 提示」)。
97
+ * **label 旁的提示**(问号图标 + 悬停气泡,仅文本)。`hint` 是**常驻**在控件下方的说明,`tip` 是**按需展开**的
98
+ * 补充解释(不占版面,悬停 / 键盘聚焦时出现),两者可同时给。图标排在 label 文本与必填星号**之后**
99
+ * (`服务名称*ⓘ`);只给 `tip` 而不给 `label` 时同样保留 label 列(否则图标没有列可落、静默消失)。气泡用
100
+ * `Tooltip` 的 **hover 档**(零 JS、不吃点击、不抢焦点),代价一条:hover 档不进顶层浮层、会被祖先 `overflow` 裁切。
149
101
  */
150
102
  tip?: string;
151
103
  /** 本行 label 列宽(px);覆盖 `Form` 的表单级设置 */
152
104
  labelWidth?: number;
153
105
  /** 本行 label 对齐;覆盖 `Form` 的表单级设置 */
154
106
  labelAlign?: FormLabelAlign;
155
- /**
156
- * 本行控件列宽上限(px);覆盖 `Form` 的表单级设置。
157
- * 缺省撑满剩余宽度(宽表单里的选型字段用它收敛,避免长条下拉)。
158
- */
107
+ /** 本行控件列宽上限(px);覆盖 `Form` 的表单级设置,缺省撑满剩余宽度(宽表单里的选型字段用它收敛,避免长条下拉)。 */
159
108
  controlWidth?: number;
160
109
  /** 在两列表单里跨满整行(说明行 / 卡片组 / 表格 / 文本域等整块内容) */
161
110
  fullWidth?: boolean;
162
111
  /**
163
- * **只读展示行**:把 label 降一档**次要色**(与值拉开层级),内容仍走默认插槽。
164
- *
165
- * 用于「摘要 / 详情」这类只读行 —— 控件位可以是文本值,也可以是徽标 / 链接这类非文本内容:
166
- *
167
- * - **文本值**:控件位放 `<Input model-value={…} readonly bordered={false} />` ——
168
- * 几何复用输入面(与可编辑输入框**同高、同内距**,值文字落在同一条竖线与中线上),
169
- * 并且「无框 + 只读」会自动退掉输入框的交互线索(不显悬停底与聚焦框环,仍可选中复制);
170
- * 空值占位由业务侧自己拼(如 `model-value="v || '—'"`);
171
- * - **非文本内容**:内容直接从默认插槽进,`readonly` 只负责弱化 label。
112
+ * **只读展示行**(摘要 / 详情):把 label 降一档**次要色**(与值拉开层级),内容仍走默认插槽。文本值放
113
+ * `<Input model-value={…} readonly bordered={false} />` —— 几何复用输入面(与可编辑输入框同高、同内距,值文字落在
114
+ * 同一条竖线与中线上),且「无框 + 只读」自动退掉交互线索(不显悬停底与聚焦框环,仍可选中复制);空值占位由业务
115
+ * 侧自己拼。非文本内容(徽标 / 链接)直接从默认插槽进,`readonly` 只负责弱化 label。
172
116
  */
173
117
  readonly?: boolean;
174
- /**
175
- * 行内**垂直**对齐:`center`(默认,label 与控件中线对齐)/ `start`(label 与控件首行文字对齐,
176
- * 用于多行与整块内容)。不传即按控件类型自动判定(文本域自动顶对齐),显式传入优先。
177
- */
118
+ /** 行内**垂直**对齐:`center`(默认,与控件中线对齐)/ `start`(与首行文字对齐,用于多行与整块内容)。不传即按控件类型自动判定(文本域自动顶对齐),显式传入优先。 */
178
119
  align?: FormItemAlign;
179
120
  }
180
121
  /**
181
122
  * 表单行(**自建**):`label + 控件 + 错误 + 说明` 四件。
182
123
  *
183
- * 为什么不封装 farris 的 `FDynamicFormGroup`:那是动态表单(元数据驱动)体系里的分组件 ——
184
- * 控件要经 `editor` 描述对象交给它渲染,label 宽度 / 控件限宽由 farris 表单类写死
185
- * (inline 6rem 右对齐、字段 max-width 26.625rem),校验信息走**绝对定位的浮层提示条**。
186
- * 与本仓三条口径冲突:① 控件由消费方直接写(不构造底层配置对象);② 数据入参只收朴素业务值;
187
- * ③ 错误与说明按文档流排布(浮层在弹窗里会压住下一行的控件)。故按「缺件处置流程」自建,
188
- * 必填星号固定在 label 文本**之后**(`服务名称*`,有意偏离 farris 的「星号在左」);
189
- * **label 对齐是维度**(`labelAlign`,
190
- * 默认 `right`(与 farris / 主流水平表单一致),`left` 时所有 label 起点一致)。
124
+ * 为什么不封装 farris 的 `FDynamicFormGroup`:那是元数据驱动的动态表单分组件(控件经 `editor` 描述对象
125
+ * 渲染、label 宽度由 farris 表单类写死、校验信息走绝对定位的浮层提示条),与本仓三条口径冲突:控件由
126
+ * 消费方直接写、数据入参只收朴素业务值、错误与说明按文档流排布(浮层在弹窗里会压住下一行的控件)。故按
127
+ * 「缺件处置流程」自建;必填星号固定在 label 文本**之后**(`服务名称*`,有意偏离 farris 的「星号在左」);
128
+ * label 对齐是维度(`labelAlign`,默认 `right` 与主流水平表单一致,`left` 时所有 label 起点一致)。
191
129
  *
192
130
  * ## 宽表单怎么处理(两条杠杆,可叠加)
193
- *
194
131
  * - **限宽**:`controlWidth` 封顶控件列(表单级给默认、逐行可覆盖)—— 单列表单不至于把输入框拉成长条;
195
- * - **分列**:`columns` 让行并排,宽度用得更充分。档位见 `FormColumns`:
196
- * `2 ~ 6` 是**列数上限**(宽够就并排、窄了自动少排一列);`'auto'` 是**列数随宽度动态变化**。
197
- * 回落阈值与动态列数都由 `columnMinWidth`(缺省令牌 `--ui-form-column-min` = 320)决定,
198
- * **不需要消费方写媒体查询**;多列下「整块内容」记得 `fullWidth`。
132
+ * - **分列**:`columns` 让行并排(`2 ~ 6` 是**列数上限**,宽够才并排;`'auto'` 是列数随宽度动态变化)。
133
+ * 回落阈值与动态列数都由 `columnMinWidth`(缺省令牌 `--ui-form-column-min` = 320)决定,**不需要消费方
134
+ * 写媒体查询**;多列下「整块内容」记得 `fullWidth`。
199
135
  *
200
- * `Form.Item` 是唯一入口(`Form` 只承载表单级设置、行间距/列数与容器内距),
201
- * 控件从默认插槽进,因此输入框 / 下拉 / 文本域 / 自绘分组卡片共用同一个容器。
136
+ * `Form.Item` 是唯一入口(`Form` 只承载表单级设置、行间距 / 列数与容器内距),控件从默认插槽进。
202
137
  *
203
138
  * ## 行内垂直对齐(label 与控件怎么对齐)
204
- *
205
- * 对齐参照是**控件那一行**,不是整行:控件列与 label 同处第 1 行,错误 / 说明自然落第 2 行起 ——
206
- * 所以提示文案的有无与长短都不会带动 label 的位置。规则按控件形态自动切档,消费方零配置:
207
- *
208
- * - **单行控件**(输入框 / 选择器 / 开关 / 自绘单行内容):label 与控件**中线**对齐,**与控件高度无关**
209
- * —— 档位切 sm/md/lg、换主题、放自绘控件都自动成立;
210
- * - **多行与整块内容**(文本域这类样式认得出形态的):label 与控件**首行文字**对齐,不会落到整块中间;
211
- * - 样式认不出形态的自绘块(卡片组 / 表格 / 富文本)用 `align="start"` 显式声明;要强制居中用 `align="center"`。
212
- *
213
- * **本件不再依赖任何「控件高度」常量**:从前用一个外部注入的高度变量把 label 撑到控件高,
214
- * 而那个变量在骨架层没有任何出处(回退成 `auto`),于是 label 盒退化成一行文字并贴行顶 ——
215
- * 输入框中线偏高 6px、大号档偏高 10px、文本域偏高 9px,档位越高错得越多。
139
+ * 对齐参照是**控件那一行**,不是整行:控件列与 label 同处第 1 行、错误 / 说明自然落第 2 行起 —— 提示文案
140
+ * 的有无与长短都不会带动 label 的位置。规则按控件形态自动切档、消费方零配置:单行控件 → label 与控件
141
+ * **中线**对齐(**与控件高度无关**,切档 / 换主题 / 放自绘控件都成立);多行与整块内容(文本域这类样式
142
+ * 认得出形态的)→ **首行文字**对齐;样式认不出形态的自绘块(卡片组 / 表格 / 富文本)用 `align="start"`,
143
+ * 要强制居中用 `align="center"`。
144
+ * **本件不再依赖任何「控件高度」常量**:从前那个外部注入的高度变量在骨架层没有出处(回退成 `auto`),
145
+ * label 盒因此退化成一行文字并贴行顶 —— 档位越高错得越多。
216
146
  *
217
147
  * ## 容器内距(`padding`)
218
- *
219
- * 与 `Panel` **同一口径同一实现**(`src/components/part-padding.ts`):`number` 四边同值、
220
- * `{ y, x }` 上下 / 左右分别给,缺省 0(贴容器边)。页面里的表单在 `Panel.Body` 里、内距由那块给;
221
- * **弹窗 / 抽屉里没有别的容器**给内距,就用表单自带的 `padding={{ y: 16, x: 20 }}`。
148
+ * 与 `Panel` **同一口径同一实现**(`src/components/part-padding.ts`):`number` 四边同值、`{ y, x }` 分别
149
+ * 给,缺省 0(贴容器边)。页面里的表单在 `Panel.Body` 里、内距由那块给;**弹窗 / 抽屉里没有别的容器**
150
+ * 给内距,就用表单自带的 `padding={{ y: 16, x: 20 }}`。
222
151
  *
223
152
  * ## label 提示(`tip`)
224
- *
225
- * 字段名(与必填星号)之后挂一枚问号图标,悬停 / 键盘聚焦弹出说明气泡。它是**按需展开**的补充
226
- * 解释,不占版面;常驻说明仍归 `hint`(排在控件下方)。两者分工不同,也**不互相替代**。
227
- *
228
- * - 图标取 `@manohub/icon` 的 `help`(带圈问号),尺寸随主题图标档(`--ui-font-icon`);
229
- * - 图标**排在星号之后**(`服务名称*ⓘ`)—— 与「星号跟着字段名走」同一口径;
230
- * - 只给 `tip`(无 `label`、非必填)时**同样保留 label 列**(与「只给 required」同一判据),
231
- * 否则图标没有列可落、静默消失;
232
- * - 气泡用 `Tooltip` 的 **hover 档**(零 JS):不吃点击、不抢焦点;代价是 hover 档不进浏览器
233
- * 顶层浮层,会被祖先 `overflow` 裁切(弹窗 / 抽屉里贴着裁剪边的字段可能看不全)。
153
+ * 字段名(与必填星号)之后挂一枚问号图标,悬停 / 键盘聚焦弹出说明气泡 —— 按需展开的补充解释、不占版面;
154
+ * 常驻说明仍归 `hint`(排在控件下方),两者不互相替代。图标取 `help`(带圈问号)字形、尺寸随主题图标档、
155
+ * **排在星号之后**(`服务名称*ⓘ`);只给 `tip`(无 `label`、非必填)时**同样保留 label 列**,否则图标
156
+ * 没有列可落、静默消失。气泡用 `Tooltip` 的 **hover 档**(零 JS、不吃点击、不抢焦点),代价是 hover 档
157
+ * 不进浏览器顶层浮层,会被祖先 `overflow` 裁切(弹窗 / 抽屉里贴着裁剪边的字段可能看不全)。
234
158
  *
235
159
  * ## 键盘事件(`onKeydown` 转发到根节点)
236
- *
237
- * `onKeydown` 是本件的**声明式入口**(缺省不绑):传进来的处理器绑在根节点上 ——
238
- * 本件是 `inheritAttrs: false`,根节点只显式绑 `class` / `style`,不声明的监听器会被静默丢掉。
239
- * 根节点即「全部字段行的容器」,因此它是「字段区层面的委托」的落点:本包 `Filter` 的
240
- * 「字段区回车 = 查询」就搭在这里,构造 `Filter` 时**不必**再套一层只为挂事件的壳
241
- * (那会改变 `class` / `style` 的落点)。要不要拦、拦哪些按键由调用方自己判断,本件只转发。
242
- * **有意只开这一条**:其它监听器不转发,扩张要先当一次公开行为变更裁决。
160
+ * `onKeydown` 是本件的**声明式入口**(缺省不绑):本件是 `inheritAttrs: false`,根节点只显式绑
161
+ * `class` / `style`,不声明的监听器会被静默丢掉。根节点即「全部字段行的容器」,故它是「字段区层面的委托」
162
+ * 的落点 —— `Filter` 的「字段区回车 = 查询」就搭在这里,构造 `Filter` 时**不必**再套一层只为挂事件的壳
163
+ * (那会改变 `class` / `style` 的落点)。要不要拦、拦哪些按键由调用方判断,本件只转发;**有意只开这一条**,
164
+ * 其它监听器不转发,扩张要先当一次公开行为变更裁决。
243
165
  *
244
166
  * ## 只读值(摘要 / 详情)
245
- *
246
- * 「向导最后一步的确认摘要」「详情弹窗」不需要另起一套描述列表件 —— 只用表单行本身,
247
- * label 列宽、行距、错误与说明全部复用。控件位放**只读 + 无框**的输入框即可(本件不给
248
- * 「静态文本」形态:那套几何与输入框迟早会漂开 —— 从前它没有高度与内距,值文字既不在
249
- * 输入框那条竖线上、也不在同一条中线上):
250
- *
251
- * ```tsx
252
- * <Form.Item label="创建人" readonly>
253
- * <Input model-value={row.creator || '—'} readonly bordered={false} />
254
- * </Form.Item>
255
- * ```
256
- *
257
- * - **几何与可编辑行完全一致**:值文字与输入框内的值同高、同左缘、同中线,混排时节奏整齐;
258
- * - **没有「可编辑」的线索**:不显悬停底色、不给聚焦边框与主色环,但仍可点进去选中 / 复制;
259
- * - **空值占位归业务**:组件不再替你把 `''` 显示成 `—`,按上面的写法自己拼;
260
- * - **label 弱化**:传 `readonly` 把 label 降一档次要色,字段名与取值一眼分得开;
261
- * - 控件位是徽标 / 链接这类**非文本**只读内容时同样传 `readonly`:内容直接走默认插槽。
262
- *
263
- * @example
264
- * <Form labelWidth={120} columns={2}>
265
- * <Form.Item label="编码" required error={errors.code} hint="保存后不可修改">
266
- * <Input modelValue={form.code} onChange={(v) => (form.code = v)} />
267
- * </Form.Item>
268
- * <Form.Item label="缓存策略" controlWidth={360} tip="命中即不请求后端">
269
- * <Select options={cacheOptions} modelValue={form.cache} onChange={…} />
270
- * </Form.Item>
271
- * <Form.Item label="过滤条件" fullWidth>
272
- * <Textarea modelValue={form.filter} onChange={…} />
273
- * </Form.Item>
274
- * </Form>
167
+ * 「向导最后一步的确认摘要」「详情弹窗」不需要另起一套描述列表件 —— 只用表单行本身(label 列宽 / 行距 /
168
+ * 错误与说明全部复用),控件位放**只读 + 无框**的输入框即可(本件不给「静态文本」形态:那套几何与输入框
169
+ * 迟早会漂开)。几何与可编辑行完全一致;没有「可编辑」的线索(不显悬停底色、不给聚焦框与主色环,仍可点
170
+ * 进去选中 / 复制);**空值占位归业务**(组件不替你把 `''` 显示成 `—`);传 `readonly` 把 label 降一档
171
+ * 次要色;控件位是徽标 / 链接这类**非文本**只读内容时同样传 `readonly`,内容直接走默认插槽。
275
172
  */
276
173
  export declare const FormItem: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
277
174
  /** 字段名(绑定的键);不传即纯布局行(值由消费方自己在控件上绑定) */
@@ -396,10 +293,7 @@ export declare const FormItem: import("vue").DefineComponent<import("vue").Extra
396
293
  default?: (scope: FormItemSlotScope) => VNodeChild;
397
294
  }>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
398
295
  export interface FormHeaderProps {
399
- /**
400
- * 表单头标题。不传则该行不渲染标题文本 —— 但给了 `extra` 时这一行**照渲染**
401
- * (右端操作位不能凭空消失,与 `Panel`「只给 toolbar / actions、不给 title」同一条口径)。
402
- */
296
+ /** 表单头标题。不传则该行不渲染标题文本 —— 但给了 `extra` 时这一行**照渲染**(右端操作位不能凭空消失,与 `Panel`「只给 toolbar / actions、不给 title」同口径)。 */
403
297
  title?: string;
404
298
  /** 标题下的说明小字(一行话,讲清这块表单是做什么的) */
405
299
  description?: string;
@@ -412,17 +306,6 @@ export interface FormHeaderProps {
412
306
  *
413
307
  * 它只做**标题排版**与操作位,不承担区块分组(那是 `Panel` 的职责);三样(`title` /
414
308
  * `extra` / `description`)都没有时整组不渲染 —— 空盒子同样占一档 `Form` 的 gap,会凭空多出间距。
415
- *
416
- * @example 筛选条的头(标题 + 右侧查询/重置)—— 插槽走 `h()` 的对象形态:
417
- * TSX 的 `v-slots={{…}}` 在 vitest 的 JSX 管线里会被当**普通属性**丢掉(见 `list-view/index.tsx` 同款记录)
418
- * {h(Form, {}, {
419
- * default: () => [
420
- * h(Form.Header, { title: '高级筛选' }, { extra: () => h(Button, { variant: 'primary' }, '筛选') }),
421
- * h(Form.Item, { name: 'keyword', label: '技能名称' }, { default: () => h(Input) }),
422
- * ],
423
- * })}
424
- *
425
- * @example 只要操作位(不要标题):`h(Form.Header, {}, { extra: () => … })`
426
309
  */
427
310
  export declare const FormHeader: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
428
311
  title: {
@@ -482,19 +365,14 @@ export declare const Form: {
482
365
  default: undefined;
483
366
  };
484
367
  /**
485
- * 排布:`horizontal`(label 在左,缺省)/ `vertical`(label 在控件上方)。
486
- *
487
- * 窄容器(抽屉 / 移动端)与「字段名很长」的场景请用纵向 —— 横向时 label 列宽会把控件压得很窄。
368
+ * 排布:`horizontal`(label 在左,缺省)/ `vertical`(label 在控件上方)。窄容器(抽屉 / 移动端)与「字段名很
369
+ * 长」的场景请用纵向 —— 横向时 label 列宽会把控件压得很窄。
488
370
  */
489
371
  layout: {
490
372
  type: PropType<"horizontal" | "vertical">;
491
373
  default: string;
492
374
  };
493
- /**
494
- * 行距(px,字段行之间 / 与 `Form.Header` 之间);缺省沿用样式里的 8px 档。
495
- *
496
- * 筛选条这类「上行 + 一行字段」的紧凑排布要 16(设计稿口径);长表单也可以调松。
497
- */
375
+ /** 行距(px,字段行之间 / 与 `Form.Header` 之间);缺省沿用样式里的 8px 档。筛选条这类「上行 + 一行字段」的紧凑排布要 16(设计稿口径),长表单也可以调松。 */
498
376
  gap: {
499
377
  type: NumberConstructor;
500
378
  default: undefined;
@@ -577,19 +455,14 @@ export declare const Form: {
577
455
  default: undefined;
578
456
  };
579
457
  /**
580
- * 排布:`horizontal`(label 在左,缺省)/ `vertical`(label 在控件上方)。
581
- *
582
- * 窄容器(抽屉 / 移动端)与「字段名很长」的场景请用纵向 —— 横向时 label 列宽会把控件压得很窄。
458
+ * 排布:`horizontal`(label 在左,缺省)/ `vertical`(label 在控件上方)。窄容器(抽屉 / 移动端)与「字段名很
459
+ * 长」的场景请用纵向 —— 横向时 label 列宽会把控件压得很窄。
583
460
  */
584
461
  layout: {
585
462
  type: PropType<"horizontal" | "vertical">;
586
463
  default: string;
587
464
  };
588
- /**
589
- * 行距(px,字段行之间 / 与 `Form.Header` 之间);缺省沿用样式里的 8px 档。
590
- *
591
- * 筛选条这类「上行 + 一行字段」的紧凑排布要 16(设计稿口径);长表单也可以调松。
592
- */
465
+ /** 行距(px,字段行之间 / 与 `Form.Header` 之间);缺省沿用样式里的 8px 档。筛选条这类「上行 + 一行字段」的紧凑排布要 16(设计稿口径),长表单也可以调松。 */
593
466
  gap: {
594
467
  type: NumberConstructor;
595
468
  default: undefined;
@@ -665,19 +538,14 @@ export declare const Form: {
665
538
  default: undefined;
666
539
  };
667
540
  /**
668
- * 排布:`horizontal`(label 在左,缺省)/ `vertical`(label 在控件上方)。
669
- *
670
- * 窄容器(抽屉 / 移动端)与「字段名很长」的场景请用纵向 —— 横向时 label 列宽会把控件压得很窄。
541
+ * 排布:`horizontal`(label 在左,缺省)/ `vertical`(label 在控件上方)。窄容器(抽屉 / 移动端)与「字段名很
542
+ * 长」的场景请用纵向 —— 横向时 label 列宽会把控件压得很窄。
671
543
  */
672
544
  layout: {
673
545
  type: PropType<"horizontal" | "vertical">;
674
546
  default: string;
675
547
  };
676
- /**
677
- * 行距(px,字段行之间 / 与 `Form.Header` 之间);缺省沿用样式里的 8px 档。
678
- *
679
- * 筛选条这类「上行 + 一行字段」的紧凑排布要 16(设计稿口径);长表单也可以调松。
680
- */
548
+ /** 行距(px,字段行之间 / 与 `Form.Header` 之间);缺省沿用样式里的 8px 档。筛选条这类「上行 + 一行字段」的紧凑排布要 16(设计稿口径),长表单也可以调松。 */
681
549
  gap: {
682
550
  type: NumberConstructor;
683
551
  default: undefined;
@@ -230,19 +230,14 @@ const FormRoot = /* @__PURE__ */ defineComponent({
230
230
  default: void 0
231
231
  },
232
232
  /**
233
- * 排布:`horizontal`(label 在左,缺省)/ `vertical`(label 在控件上方)。
234
- *
235
- * 窄容器(抽屉 / 移动端)与「字段名很长」的场景请用纵向 —— 横向时 label 列宽会把控件压得很窄。
233
+ * 排布:`horizontal`(label 在左,缺省)/ `vertical`(label 在控件上方)。窄容器(抽屉 / 移动端)与「字段名很
234
+ * 长」的场景请用纵向 —— 横向时 label 列宽会把控件压得很窄。
236
235
  */
237
236
  layout: {
238
237
  type: String,
239
238
  default: "horizontal"
240
239
  },
241
- /**
242
- * 行距(px,字段行之间 / 与 `Form.Header` 之间);缺省沿用样式里的 8px 档。
243
- *
244
- * 筛选条这类「上行 + 一行字段」的紧凑排布要 16(设计稿口径);长表单也可以调松。
245
- */
240
+ /** 行距(px,字段行之间 / 与 `Form.Header` 之间);缺省沿用样式里的 8px 档。筛选条这类「上行 + 一行字段」的紧凑排布要 16(设计稿口径),长表单也可以调松。 */
246
241
  gap: {
247
242
  type: Number,
248
243
  default: void 0
@@ -316,10 +311,8 @@ const FormRoot = /* @__PURE__ */ defineComponent({
316
311
  /** 当前快照(含全部已登记字段) */
317
312
  getValues: () => values.value,
318
313
  /**
319
- * 清空全部字段(置 `undefined`;受控模式下同样会发 `update:modelValue`)。
320
- *
321
- * **返回清空后的快照**:受控时外部还没回写 `modelValue`,调用方此刻再 `getValues()`
322
- * 会读到清空前的旧值 —— 直接吃返回值才不依赖回写时序。
314
+ * 清空全部字段(置 `undefined`;受控模式下同样会发 `update:modelValue`)。**返回清空后的快照**:受控时外部
315
+ * 还没回写 `modelValue`,调用方此刻再 `getValues()` 会读到清空前的旧值 —— 直接吃返回值才不依赖回写时序。
323
316
  */
324
317
  clear: () => {
325
318
  const cleared = {};
@@ -1,10 +1,8 @@
1
1
  /**
2
- * `bordered` 三档 → 控件类名(**唯一来源**)。
3
- *
4
- * 输入族三个件(`Input` / `Textarea` / `NumberInput`)共用同一份面与同一个 prop,判定表抄三份必然漂,
5
- * 故收在这里。类名口径:prop 是**肯定式**(`bordered`)、类名是**否定式**(`--borderless`)——
6
- * 那一对的反差是库内既定口径(见 `docs/guide/naming-and-defaults.md` §2.1);
7
- * `'focus'` 档的类名 `--border-on-focus` 是这套口径下的新成员:它说的就是「聚焦时才有框」。
2
+ * `bordered` 三档 → 控件类名(**唯一来源**):输入族三个件(`Input` / `Textarea` / `NumberInput`)共用同一份面与同一个
3
+ * prop,判定表抄三份必然漂,故收在这里。类名口径:prop 是**肯定式**(`bordered`)、类名是**否定式**(`--borderless`)
4
+ * —— 那对反差是库内既定口径(见 `docs/guide/naming-and-defaults.md` §2.1);`'focus'` 档的
5
+ * `.mh-input--border-on-focus` 是这套口径下的新成员(它说的就是「聚焦时才有框」)。
8
6
  *
9
7
  * | `bordered` | 类名 | 常态 | 悬停 | 聚焦 |
10
8
  * | --- | --- | --- | --- | --- |