@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
@@ -27,23 +27,7 @@ export interface TextareaAutoSize {
27
27
  * (`id` / `name` / `aria-*` / `data-*` / `title` / 原生事件)—— 壳只是排版容器,属性落它上面等于丢掉
28
28
  * —— 见 `forwardAttrs`;触发器形态另有 `controlClass` / `controlAttrs` 两个**专口子**(同名键以它为准)。
29
29
  *
30
- * @example 受控 + 可清除
31
- * <Input modelValue={kw} placeholder="搜索" clearable prefix={<Icon name="search" />} onChange={setKw} />
32
- *
33
- * @example 密码(右端图标切换明/密文)
34
- * <Input type="password" modelValue={pwd} onChange={setPwd} />
35
- *
36
- * @example 校验态与尺寸
37
- * <Input status="error" size="lg" placeholder="请输入任务名" />
38
- *
39
- * @example 多行 + 字数 + 自适应高度
40
- * <Textarea modelValue={note} autoSize={{ minRows: 2, maxRows: 6 }} maxlength={500} showCount onChange={setNote} />
41
- *
42
- * @example 触发器形态(复合件用:控件换成 `<button>`,表壳 / 清除位 / 右侧图标位全部复用)
43
- * <Input as="button" clearable hasValue={!!value} placeholder="请选择" controlClass="my-picker"
44
- * controlAttrs={{ popovertarget: id }}>
45
- * {{ default: () => value, suffix: () => <Icon name="chevron-down" /> }}
46
- * </Input>
30
+ * 用法见 `docs/demos/input/`(每个维度一份可运行样例;文档页 `docs/components/input.md`)。
47
31
  */
48
32
  export declare const Input: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
49
33
  /** 受控值 */
@@ -57,11 +41,9 @@ export declare const Input: import("vue").DefineComponent<import("vue").ExtractP
57
41
  default: string;
58
42
  };
59
43
  /**
60
- * 占位文案。两种形态都消费它:
61
- * - 缺省(`as="input"`)走原生 `::placeholder` 伪元素;
62
- * - 触发器形态(`as="button"`)**没有 `::placeholder` 可用**,改由一个 span 承载
63
- * (`.mh-input__placeholder`)—— 当且仅当 `hasValue === false` 且本 prop 有值时渲染它,
64
- * 并**取代** `default` 插槽(见上面触发器一节)。没传 `hasValue` 的调用方行为不变。
44
+ * 占位文案(两种形态都消费它):缺省(`as="input"`)走原生 `::placeholder` 伪元素;触发器形态
45
+ * (`as="button"`)**没有 `::placeholder` 可用**,改由一个 span 承载(`.mh-input__placeholder`)—— 当且仅当
46
+ * `hasValue === false` 且本 prop 有值时渲染它,并**取代** `default` 插槽。
65
47
  */
66
48
  placeholder: {
67
49
  type: StringConstructor;
@@ -82,12 +64,9 @@ export declare const Input: import("vue").DefineComponent<import("vue").ExtractP
82
64
  default: boolean;
83
65
  };
84
66
  /**
85
- * **只读**:值可选中 / 复制,但不能改。
86
- *
87
- * 与 `bordered={false}` 组合即**只读值档**(摘要 / 详情里回显业务值,也是 `Form.Item`
88
- * 的 `readonly` 行推荐的写法):几何与可编辑输入框**完全一致**(同高、同内距、值文字同左缘),
89
- * 但滑过不亮浅底、聚焦不给边框与主色环 —— 一眼看去是「值」而不是「输入位」。
90
- * 只读 ≠ 禁用:它照旧可聚焦、可选中复制,也不变灰。
67
+ * **只读**:值可选中 / 复制,但不能改。与 `bordered={false}` 组合即**只读值档**(摘要 / 详情里回显业务值,也是
68
+ * `Form.Item` 的 `readonly` 行推荐写法):几何与可编辑输入框**完全一致**(同高 / 同内距 / 值文字同左缘),但滑过
69
+ * 不亮浅底、聚焦不给边框与主色环 —— 一眼看去是「值」而不是「输入位」;只读 ≠ 禁用(照旧可聚焦、可复制、不变灰)。
91
70
  */
92
71
  readonly: {
93
72
  type: BooleanConstructor;
@@ -184,11 +163,9 @@ export declare const Input: import("vue").DefineComponent<import("vue").ExtractP
184
163
  default: string;
185
164
  };
186
165
  /**
187
- * 占位文案。两种形态都消费它:
188
- * - 缺省(`as="input"`)走原生 `::placeholder` 伪元素;
189
- * - 触发器形态(`as="button"`)**没有 `::placeholder` 可用**,改由一个 span 承载
190
- * (`.mh-input__placeholder`)—— 当且仅当 `hasValue === false` 且本 prop 有值时渲染它,
191
- * 并**取代** `default` 插槽(见上面触发器一节)。没传 `hasValue` 的调用方行为不变。
166
+ * 占位文案(两种形态都消费它):缺省(`as="input"`)走原生 `::placeholder` 伪元素;触发器形态
167
+ * (`as="button"`)**没有 `::placeholder` 可用**,改由一个 span 承载(`.mh-input__placeholder`)—— 当且仅当
168
+ * `hasValue === false` 且本 prop 有值时渲染它,并**取代** `default` 插槽。
192
169
  */
193
170
  placeholder: {
194
171
  type: StringConstructor;
@@ -209,12 +186,9 @@ export declare const Input: import("vue").DefineComponent<import("vue").ExtractP
209
186
  default: boolean;
210
187
  };
211
188
  /**
212
- * **只读**:值可选中 / 复制,但不能改。
213
- *
214
- * 与 `bordered={false}` 组合即**只读值档**(摘要 / 详情里回显业务值,也是 `Form.Item`
215
- * 的 `readonly` 行推荐的写法):几何与可编辑输入框**完全一致**(同高、同内距、值文字同左缘),
216
- * 但滑过不亮浅底、聚焦不给边框与主色环 —— 一眼看去是「值」而不是「输入位」。
217
- * 只读 ≠ 禁用:它照旧可聚焦、可选中复制,也不变灰。
189
+ * **只读**:值可选中 / 复制,但不能改。与 `bordered={false}` 组合即**只读值档**(摘要 / 详情里回显业务值,也是
190
+ * `Form.Item` 的 `readonly` 行推荐写法):几何与可编辑输入框**完全一致**(同高 / 同内距 / 值文字同左缘),但滑过
191
+ * 不亮浅底、聚焦不给边框与主色环 —— 一眼看去是「值」而不是「输入位」;只读 ≠ 禁用(照旧可聚焦、可复制、不变灰)。
218
192
  */
219
193
  readonly: {
220
194
  type: BooleanConstructor;
@@ -354,13 +328,8 @@ export interface TextareaProps {
354
328
  }
355
329
  /**
356
330
  * 多行输入(同一份面;结构与单行不同,故单列一个件)。
357
- *
358
- * ⚠️ **输入族没有 `mono` 档**(`Input` 与 `Textarea` 都没有)。要等宽的输入框别拿 `Text mono` 去包
359
- * —— 那会丢掉输入能力;目前只能由应用侧保留一条带 `font-family: var(--ui-font-mono)` 的样式登记
360
- * (缺件登记见下游仓 `aihub-frontend/docs/kit-gaps.md`,本仓不复制那份台账)。
361
- *
362
- * @example 备注框:自适应 2~6 行 + 限长计数
363
- * <Textarea modelValue={note} autoSize={{ minRows: 2, maxRows: 6 }} maxlength={500} showCount onChange={setNote} />
331
+ * ⚠️ **输入族没有 `mono` 档**(`Input` 与 `Textarea` 都没有):要等宽的输入框别拿 `Text mono` 去包(那会丢掉输入
332
+ * 能力),目前只能由应用侧保留一条带 `font-family: var(--ui-font-mono)` 的样式登记。
364
333
  */
365
334
  export declare const Textarea: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
366
335
  modelValue: {
@@ -524,11 +493,9 @@ export declare const InputCompound: {
524
493
  default: string;
525
494
  };
526
495
  /**
527
- * 占位文案。两种形态都消费它:
528
- * - 缺省(`as="input"`)走原生 `::placeholder` 伪元素;
529
- * - 触发器形态(`as="button"`)**没有 `::placeholder` 可用**,改由一个 span 承载
530
- * (`.mh-input__placeholder`)—— 当且仅当 `hasValue === false` 且本 prop 有值时渲染它,
531
- * 并**取代** `default` 插槽(见上面触发器一节)。没传 `hasValue` 的调用方行为不变。
496
+ * 占位文案(两种形态都消费它):缺省(`as="input"`)走原生 `::placeholder` 伪元素;触发器形态
497
+ * (`as="button"`)**没有 `::placeholder` 可用**,改由一个 span 承载(`.mh-input__placeholder`)—— 当且仅当
498
+ * `hasValue === false` 且本 prop 有值时渲染它,并**取代** `default` 插槽。
532
499
  */
533
500
  placeholder: {
534
501
  type: StringConstructor;
@@ -549,12 +516,9 @@ export declare const InputCompound: {
549
516
  default: boolean;
550
517
  };
551
518
  /**
552
- * **只读**:值可选中 / 复制,但不能改。
553
- *
554
- * 与 `bordered={false}` 组合即**只读值档**(摘要 / 详情里回显业务值,也是 `Form.Item`
555
- * 的 `readonly` 行推荐的写法):几何与可编辑输入框**完全一致**(同高、同内距、值文字同左缘),
556
- * 但滑过不亮浅底、聚焦不给边框与主色环 —— 一眼看去是「值」而不是「输入位」。
557
- * 只读 ≠ 禁用:它照旧可聚焦、可选中复制,也不变灰。
519
+ * **只读**:值可选中 / 复制,但不能改。与 `bordered={false}` 组合即**只读值档**(摘要 / 详情里回显业务值,也是
520
+ * `Form.Item` 的 `readonly` 行推荐写法):几何与可编辑输入框**完全一致**(同高 / 同内距 / 值文字同左缘),但滑过
521
+ * 不亮浅底、聚焦不给边框与主色环 —— 一眼看去是「值」而不是「输入位」;只读 ≠ 禁用(照旧可聚焦、可复制、不变灰)。
558
522
  */
559
523
  readonly: {
560
524
  type: BooleanConstructor;
@@ -685,11 +649,9 @@ export declare const InputCompound: {
685
649
  default: string;
686
650
  };
687
651
  /**
688
- * 占位文案。两种形态都消费它:
689
- * - 缺省(`as="input"`)走原生 `::placeholder` 伪元素;
690
- * - 触发器形态(`as="button"`)**没有 `::placeholder` 可用**,改由一个 span 承载
691
- * (`.mh-input__placeholder`)—— 当且仅当 `hasValue === false` 且本 prop 有值时渲染它,
692
- * 并**取代** `default` 插槽(见上面触发器一节)。没传 `hasValue` 的调用方行为不变。
652
+ * 占位文案(两种形态都消费它):缺省(`as="input"`)走原生 `::placeholder` 伪元素;触发器形态
653
+ * (`as="button"`)**没有 `::placeholder` 可用**,改由一个 span 承载(`.mh-input__placeholder`)—— 当且仅当
654
+ * `hasValue === false` 且本 prop 有值时渲染它,并**取代** `default` 插槽。
693
655
  */
694
656
  placeholder: {
695
657
  type: StringConstructor;
@@ -710,12 +672,9 @@ export declare const InputCompound: {
710
672
  default: boolean;
711
673
  };
712
674
  /**
713
- * **只读**:值可选中 / 复制,但不能改。
714
- *
715
- * 与 `bordered={false}` 组合即**只读值档**(摘要 / 详情里回显业务值,也是 `Form.Item`
716
- * 的 `readonly` 行推荐的写法):几何与可编辑输入框**完全一致**(同高、同内距、值文字同左缘),
717
- * 但滑过不亮浅底、聚焦不给边框与主色环 —— 一眼看去是「值」而不是「输入位」。
718
- * 只读 ≠ 禁用:它照旧可聚焦、可选中复制,也不变灰。
675
+ * **只读**:值可选中 / 复制,但不能改。与 `bordered={false}` 组合即**只读值档**(摘要 / 详情里回显业务值,也是
676
+ * `Form.Item` 的 `readonly` 行推荐写法):几何与可编辑输入框**完全一致**(同高 / 同内距 / 值文字同左缘),但滑过
677
+ * 不亮浅底、聚焦不给边框与主色环 —— 一眼看去是「值」而不是「输入位」;只读 ≠ 禁用(照旧可聚焦、可复制、不变灰)。
719
678
  */
720
679
  readonly: {
721
680
  type: BooleanConstructor;
@@ -837,11 +796,9 @@ export declare const InputCompound: {
837
796
  default: string;
838
797
  };
839
798
  /**
840
- * 占位文案。两种形态都消费它:
841
- * - 缺省(`as="input"`)走原生 `::placeholder` 伪元素;
842
- * - 触发器形态(`as="button"`)**没有 `::placeholder` 可用**,改由一个 span 承载
843
- * (`.mh-input__placeholder`)—— 当且仅当 `hasValue === false` 且本 prop 有值时渲染它,
844
- * 并**取代** `default` 插槽(见上面触发器一节)。没传 `hasValue` 的调用方行为不变。
799
+ * 占位文案(两种形态都消费它):缺省(`as="input"`)走原生 `::placeholder` 伪元素;触发器形态
800
+ * (`as="button"`)**没有 `::placeholder` 可用**,改由一个 span 承载(`.mh-input__placeholder`)—— 当且仅当
801
+ * `hasValue === false` 且本 prop 有值时渲染它,并**取代** `default` 插槽。
845
802
  */
846
803
  placeholder: {
847
804
  type: StringConstructor;
@@ -862,12 +819,9 @@ export declare const InputCompound: {
862
819
  default: boolean;
863
820
  };
864
821
  /**
865
- * **只读**:值可选中 / 复制,但不能改。
866
- *
867
- * 与 `bordered={false}` 组合即**只读值档**(摘要 / 详情里回显业务值,也是 `Form.Item`
868
- * 的 `readonly` 行推荐的写法):几何与可编辑输入框**完全一致**(同高、同内距、值文字同左缘),
869
- * 但滑过不亮浅底、聚焦不给边框与主色环 —— 一眼看去是「值」而不是「输入位」。
870
- * 只读 ≠ 禁用:它照旧可聚焦、可选中复制,也不变灰。
822
+ * **只读**:值可选中 / 复制,但不能改。与 `bordered={false}` 组合即**只读值档**(摘要 / 详情里回显业务值,也是
823
+ * `Form.Item` 的 `readonly` 行推荐写法):几何与可编辑输入框**完全一致**(同高 / 同内距 / 值文字同左缘),但滑过
824
+ * 不亮浅底、聚焦不给边框与主色环 —— 一眼看去是「值」而不是「输入位」;只读 ≠ 禁用(照旧可聚焦、可复制、不变灰)。
871
825
  */
872
826
  readonly: {
873
827
  type: BooleanConstructor;
@@ -1147,9 +1101,8 @@ export declare const InputCompound: {
1147
1101
  };
1148
1102
  export type InputCompoundType = typeof InputCompound;
1149
1103
  /**
1150
- * 数字输入与 `Input` **同族**(同一个表壳 / 内距 / 状态协议,同一份面 `input.css`),
1151
- * 故与 `Textarea` 同款处置:**平级导出、共用本目录**(`AGENTS.md` 硬约束 1)。
1152
- * 它**不是** `Input` 的点号成员 —— 成员位留给「同一件自己的形态」(`.Textarea` / `.Display`),
1153
- * 而数字输入是另一件(值模型 `number | null` vs `string`)。
1104
+ * 数字输入与 `Input` **同族**(同一个表壳 / 内距 / 状态协议,同一份面 `input.css`),故与 `Textarea` 同款处置:
1105
+ * **平级导出、共用本目录**。它**不是** `Input` 的点号成员 —— 成员位留给「同一件自己的形态」(`.Textarea` /
1106
+ * `.Display`),而数字输入是另一件(值模型 `number | null` vs `string`)。
1154
1107
  */
1155
1108
  export { NumberInput, type NumberInputProps } from './number-input';
@@ -16,11 +16,9 @@ const Input = /* @__PURE__ */ defineComponent({
16
16
  default: ""
17
17
  },
18
18
  /**
19
- * 占位文案。两种形态都消费它:
20
- * - 缺省(`as="input"`)走原生 `::placeholder` 伪元素;
21
- * - 触发器形态(`as="button"`)**没有 `::placeholder` 可用**,改由一个 span 承载
22
- * (`.mh-input__placeholder`)—— 当且仅当 `hasValue === false` 且本 prop 有值时渲染它,
23
- * 并**取代** `default` 插槽(见上面触发器一节)。没传 `hasValue` 的调用方行为不变。
19
+ * 占位文案(两种形态都消费它):缺省(`as="input"`)走原生 `::placeholder` 伪元素;触发器形态
20
+ * (`as="button"`)**没有 `::placeholder` 可用**,改由一个 span 承载(`.mh-input__placeholder`)—— 当且仅当
21
+ * `hasValue === false` 且本 prop 有值时渲染它,并**取代** `default` 插槽。
24
22
  */
25
23
  placeholder: {
26
24
  type: String,
@@ -41,12 +39,9 @@ const Input = /* @__PURE__ */ defineComponent({
41
39
  default: false
42
40
  },
43
41
  /**
44
- * **只读**:值可选中 / 复制,但不能改。
45
- *
46
- * 与 `bordered={false}` 组合即**只读值档**(摘要 / 详情里回显业务值,也是 `Form.Item`
47
- * 的 `readonly` 行推荐的写法):几何与可编辑输入框**完全一致**(同高、同内距、值文字同左缘),
48
- * 但滑过不亮浅底、聚焦不给边框与主色环 —— 一眼看去是「值」而不是「输入位」。
49
- * 只读 ≠ 禁用:它照旧可聚焦、可选中复制,也不变灰。
42
+ * **只读**:值可选中 / 复制,但不能改。与 `bordered={false}` 组合即**只读值档**(摘要 / 详情里回显业务值,也是
43
+ * `Form.Item` 的 `readonly` 行推荐写法):几何与可编辑输入框**完全一致**(同高 / 同内距 / 值文字同左缘),但滑过
44
+ * 不亮浅底、聚焦不给边框与主色环 —— 一眼看去是「值」而不是「输入位」;只读 ≠ 禁用(照旧可聚焦、可复制、不变灰)。
50
45
  */
51
46
  readonly: {
52
47
  type: Boolean,
@@ -4,38 +4,26 @@ import type { InputStatus } from './index';
4
4
  /**
5
5
  * 数字输入(**自绘**)。
6
6
  *
7
- * 与 `Input` **同族同面**(同一个表壳 / 内距 / 状态协议,样式归 `styles/components/input.css`),
8
- * 按 `AGENTS.md` 硬约束 1 的「同族两件可并排平级导出、共用同一目录与同一份面」处置
9
- * —— 与 `Input` / `Textarea` 的关系同款,故不另开组件目录、不新增面文件。
7
+ * 与 `Input` **同族同面**(同一个表壳 / 内距 / 状态协议,样式归 `styles/components/input.css`),按「同族两件
8
+ * 可并排平级导出、共用同一目录与同一份面」处置 —— 故不另开组件目录、不新增面文件。
10
9
  *
11
- * 为什么单列一个件而不是加进 `Input`:`Input` 的 `modelValue` 是 **string**,且已串起
12
- * 「密码可见切换 / 清除位 / 字数统计 / 触发器形态」一条链;把数值语义(`min` / `max` / `step` /
13
- * `precision` / 钳制 / 舍入 / 步进按钮)塞进去会污染统一词表(`AGENTS.md` 硬约束 8)。
14
- * 本件也**不接** `Input` 的 `as="button"` 触发器形态 —— 那是复合件(`Select` 一族)的口子。
10
+ * 为什么单列一件而不是加进 `Input`:`Input` 的 `modelValue` 是 **string**,且已串起「密码可见切换 / 清除位 /
11
+ * 字数统计 / 触发器形态」一条链;把数值语义(`min` / `max` / `step` / `precision` / 钳制 / 舍入 / 步进按钮)
12
+ * 塞进去会污染统一词表。本件也**不接** `Input` 的 `as="button"` 触发器形态(那是复合件一族的口子)。
15
13
  *
16
14
  * 统一词表(与 `Checkbox` / `Switch` / `Input` 同款):`modelValue` / `onChange` / `disabled` / `size`;
17
15
  * 值变更时 `emit('update:modelValue')` 与 `onChange` **双走**。
18
16
  *
19
- * ## 值域口径(三条,都是「原生数字框最被讨厌的点」的反面)
20
- *
17
+ * ## 值域口径(都是「原生数字框最被讨厌的点」的反面)
21
18
  * 1. **空值是 `null`,不是 `0`**:留空与「填了 0」是两件事,前者不提交、后者要提交。
22
- * 2. **输入中途不钳制**:`-` / `1.` / 空串这些中间态一律原样留着(打一半就被改掉会打断输入);
23
- * 钳制与舍入发生在**归一时刻** —— `blur` / `Enter` / 步进按钮 / `min`·`max`·`precision` 变化。
19
+ * 2. **输入中途不钳制**:`-` / `1.` / 空串这些中间态一律原样留着(打一半就被改掉会打断输入);钳制与舍入发生
20
+ * 在**归一时刻** —— `blur` / `Enter` / 步进按钮 / `min`·`max`·`precision` 变化。
24
21
  * 3. **非法输入回滚**:解析不出来(如 `1a`)就退回上一个合法值,**不静默变 0**。
25
22
  *
26
- * 属性落点与 `Input` 完全同款:`class` / `style` → 表壳 `.mh-input__wrap`;其余 attrs 一律透传到
27
- * 控件(`id` / `name` / `aria-*` / `data-*` / 原生事件),见 `forwardAttrs`。
28
- *
29
- * @example 受控 + 区间
30
- * <NumberInput modelValue={timeout} min={0} max={43200} onChange={setTimeout} />
31
- *
32
- * @example 表格内 / 行内编辑档(无框)
33
- * <NumberInput modelValue={row.value} bordered={false} precision={0} onChange={set} />
23
+ * 属性落点与 `Input` 完全同款:`class` / `style` → 表壳 `.mh-input__wrap`;其余 attrs 一律透传到控件
24
+ * (`id` / `name` / `aria-*` / `data-*` / 原生事件),见 `forwardAttrs`。
34
25
  *
35
- * @example 带单位后缀
36
- * <NumberInput modelValue={size} min={1}>
37
- * {{ suffix: () => 'MB' }}
38
- * </NumberInput>
26
+ * 用法见 `docs/demos/number-input/`(每个维度一份可运行样例;文档页 `docs/components/number-input.md`)。
39
27
  */
40
28
  export interface NumberInputProps {
41
29
  /** 受控值(空值为 `null`,不是 `0`) */
@@ -1,10 +1,11 @@
1
1
  import { type PropType, type SlotsType, type VNodeChild } from 'vue';
2
2
  import { type Padding } from '../part-padding';
3
3
  /**
4
- * 布局间距档:**只开放令牌档位,不开放任意 px**(`none/sm/md/lg/xl` → `0 / --ui-space-1/2/3/4`)。
4
+ * 布局间距档:**只开放令牌档位,不开放任意 px**(`none/sm/md/lg/xl` → `0 / --ui-space-1/2/3/4`)。间距一旦可以随手
5
+ * 写,同一个页面里就会出现 6/7/9/10/14 这些「看着差不多」的值、并在不同缩放档与不同人手里继续分叉 —— 与「应用侧只写
6
+ * 布局」是同一条理由的另一面。
5
7
  *
6
- * 间距一旦可以随手写,同一个页面里就会出现 6/7/9/10/14 这些「看着差不多」的值,
7
- * 而它们在不同缩放档、不同人手里会继续分叉 —— 与「应用侧只写布局」是同一条理由的另一面。
8
+ * 用法见 `docs/demos/layout/`(每个维度一份可运行样例;文档页 `docs/components/layout.md`)。
8
9
  */
9
10
  export type LayoutGap = 'none' | 'sm' | 'md' | 'lg' | 'xl';
10
11
  /** 交叉轴对齐(`align-items`);主轴排布用 `justify` */
@@ -25,18 +26,16 @@ export type LayoutSpan = 1 | 2 | 3 | 4;
25
26
  *
26
27
  * ## 命名与方向口径(别再改回去)
27
28
  *
28
- * - **方向按表格语义定**:行与行上下相邻 ⇒ `Row` 竖排;列与列左右相邻 ⇒ `Column` 横排。
29
- * - `columns` 说的是「**这一行分几列**」(每行摆几格),不是「这个容器有几种方向」。
30
- * - 嵌套:要分栏 / 栅格就 `Row columns={n}` + `Column`;一格里要上下堆,就在 `Column` 里再放 `Row`。
31
- * - **公开面只出 `Layout`**,不平级导出 `Row` / `Column` —— 通用词会与 `TableColumn`
32
- * 在一份 import 清单里混读,也破坏「成族子件用点号」的约定(`Page.Header` / `Form.Item`)。
29
+ * **方向按表格语义定**(行与行上下相邻 ⇒ `Row` 竖排;列与列左右相邻 ⇒ `Column` 横排);`columns` 说的是
30
+ * 「**这一行分几列**」(每行摆几格),不是「这个容器有几种方向」;嵌套上要分栏 / 栅格就 `Row columns={n}` +
31
+ * `Column`,一格里要上下堆就在 `Column` 里再放 `Row`。**公开面只出 `Layout`**,不平级导出 `Row` / `Column`
32
+ * —— 通用词会与 `TableColumn` 在一份 import 清单里混读,也破坏「成族子件用点号」的约定。
33
33
  *
34
34
  * ## 与其它件的边界
35
35
  *
36
- * - 表单里并排字段用 `Form` 的 `columns`(它管 label 列、行距与**回落**),不要用本族拼表单
37
- * —— 本族的列数是**恒定**的,窄了只等分收窄,表单会被压出不可用的窄控件;
38
- * - 页面级两栏(各自滚动)用 `Page.Split`;
39
- * - 只有「块与块怎么摆」这一件事归本族,滚动 / 工具位 / 卡片外观都不归它。
36
+ * 表单里并排字段用 `Form` 的 `columns`(它管 label 列、行距与**回落**),不要用本族拼表单 —— 本族的列数是
37
+ * **恒定**的、窄了只等分收窄,表单会被压出不可用的窄控件;页面级两栏(各自滚动)用 `Page.Split`;只有
38
+ * 「块与块怎么摆」这一件事归本族(滚动 / 工具位 / 卡片外观都不归它)。
40
39
  */
41
40
  export declare const Layout: {
42
41
  Row: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
@@ -66,14 +65,11 @@ export declare const Layout: {
66
65
  default: undefined;
67
66
  };
68
67
  /**
69
- * 内距:**走骨架件共享口径**(`Padding`,同 `Card` / `Form` / `Page` / `Panel`)——
70
- * `number` 四边同值、`{ y, x }` 分上下 / 左右、`string` 原样下发(CSS 简写,**逃生舱**)。
71
- * 口径与理由见 `part-padding.ts`。
72
- *
73
- * ⚠️ 与 `gap` 不同口径:`gap` 只开放令牌档(防间距分叉),`padding` 接具体值 ——
74
- * 内距在设计稿里常是**确定坐标**,令牌梯度(最大 24px)表达不了。
75
- * ⚠️ 用它之前先想一次:这个数真是「内距」吗?若是「与某个内容列对齐」这类**布局坐标**,
76
- * 优先改由结构表达(同轴容器 / `columns` / `minColumnWidth`)。
68
+ * 内距:**走骨架件共享口径**(`Padding`,同 `Card` / `Form` / `Page` / `Panel`)—— `number` 四边同值、
69
+ * `{ y, x }` 分上下 / 左右、`string` 原样下发(CSS 简写,**逃生舱**),口径与理由见 `part-padding.ts`。
70
+ * ⚠️ 与 `gap` 不同口径:`gap` 只开放令牌档(防间距分叉),`padding` 接具体值 —— 内距在设计稿里常是**确定坐标**,
71
+ * 令牌梯度(最大 24px)表达不了。⚠️ 用它之前先想一次:这个数真是「内距」吗?若是「与某个内容列对齐」这类**布局
72
+ * 坐标**,优先改由结构表达(同轴容器 / `columns` / `minColumnWidth`)。
77
73
  */
78
74
  padding: {
79
75
  type: PropType<Padding>;
@@ -106,14 +102,11 @@ export declare const Layout: {
106
102
  default: undefined;
107
103
  };
108
104
  /**
109
- * 内距:**走骨架件共享口径**(`Padding`,同 `Card` / `Form` / `Page` / `Panel`)——
110
- * `number` 四边同值、`{ y, x }` 分上下 / 左右、`string` 原样下发(CSS 简写,**逃生舱**)。
111
- * 口径与理由见 `part-padding.ts`。
112
- *
113
- * ⚠️ 与 `gap` 不同口径:`gap` 只开放令牌档(防间距分叉),`padding` 接具体值 ——
114
- * 内距在设计稿里常是**确定坐标**,令牌梯度(最大 24px)表达不了。
115
- * ⚠️ 用它之前先想一次:这个数真是「内距」吗?若是「与某个内容列对齐」这类**布局坐标**,
116
- * 优先改由结构表达(同轴容器 / `columns` / `minColumnWidth`)。
105
+ * 内距:**走骨架件共享口径**(`Padding`,同 `Card` / `Form` / `Page` / `Panel`)—— `number` 四边同值、
106
+ * `{ y, x }` 分上下 / 左右、`string` 原样下发(CSS 简写,**逃生舱**),口径与理由见 `part-padding.ts`。
107
+ * ⚠️ 与 `gap` 不同口径:`gap` 只开放令牌档(防间距分叉),`padding` 接具体值 —— 内距在设计稿里常是**确定坐标**,
108
+ * 令牌梯度(最大 24px)表达不了。⚠️ 用它之前先想一次:这个数真是「内距」吗?若是「与某个内容列对齐」这类**布局
109
+ * 坐标**,优先改由结构表达(同轴容器 / `columns` / `minColumnWidth`)。
117
110
  */
118
111
  padding: {
119
112
  type: PropType<Padding>;
@@ -79,14 +79,11 @@ const LayoutRow = /* @__PURE__ */ defineComponent({
79
79
  default: void 0
80
80
  },
81
81
  /**
82
- * 内距:**走骨架件共享口径**(`Padding`,同 `Card` / `Form` / `Page` / `Panel`)——
83
- * `number` 四边同值、`{ y, x }` 分上下 / 左右、`string` 原样下发(CSS 简写,**逃生舱**)。
84
- * 口径与理由见 `part-padding.ts`。
85
- *
86
- * ⚠️ 与 `gap` 不同口径:`gap` 只开放令牌档(防间距分叉),`padding` 接具体值 ——
87
- * 内距在设计稿里常是**确定坐标**,令牌梯度(最大 24px)表达不了。
88
- * ⚠️ 用它之前先想一次:这个数真是「内距」吗?若是「与某个内容列对齐」这类**布局坐标**,
89
- * 优先改由结构表达(同轴容器 / `columns` / `minColumnWidth`)。
82
+ * 内距:**走骨架件共享口径**(`Padding`,同 `Card` / `Form` / `Page` / `Panel`)—— `number` 四边同值、
83
+ * `{ y, x }` 分上下 / 左右、`string` 原样下发(CSS 简写,**逃生舱**),口径与理由见 `part-padding.ts`。
84
+ * ⚠️ 与 `gap` 不同口径:`gap` 只开放令牌档(防间距分叉),`padding` 接具体值 —— 内距在设计稿里常是**确定坐标**,
85
+ * 令牌梯度(最大 24px)表达不了。⚠️ 用它之前先想一次:这个数真是「内距」吗?若是「与某个内容列对齐」这类**布局
86
+ * 坐标**,优先改由结构表达(同轴容器 / `columns` / `minColumnWidth`)。
90
87
  */
91
88
  padding: {
92
89
  type: [Number, Object, String],
@@ -21,31 +21,13 @@ export interface ListViewStatus {
21
21
  * ## 三态
22
22
  *
23
23
  * - `loading` → **骨架卡网格**(与卡片同尺寸占位,避免加载完成时高度跳动);
24
- * - `error` / `empty` → 委托 `QueryState`(口径同 CONTRACT §4.6:**错误不得塞进空态**,
25
- * 两条各自的恢复入口由 `errorActionText` / `emptyActionText` 给)。
24
+ * - `error` / `empty` → 委托 `QueryState`(口径同 CONTRACT §4.6:**错误不得塞进空态**,两条各自的恢复入口由
25
+ * `errorActionText` / `emptyActionText` 给)。
26
26
  *
27
27
  * 无数据或失败时消费方**不要渲染分页**(分页归属见 CONTRACT §4.17)。
28
+ * **卡片外观**:列表项一律用 `ListView.CardItem`(内部以 `Card interactive` 为壳),消费方不得自绘卡片外观。
28
29
  *
29
- * ## 卡片外观
30
- *
31
- * 列表项一律用 `ListView.CardItem`(内部以 `Card interactive` 为壳),消费方不得自绘卡片外观。
32
- *
33
- * @example 服务卡片列表(三态;分页由承载它的容器给)
34
- * <ListView
35
- * minItemWidth={320}
36
- * loading={query.isPending.value}
37
- * error={query.isError.value}
38
- * errorActionText="重试"
39
- * onErrorAction={() => void query.refetch()}
40
- * // 空态:传字符串即空态标题(传 true 会用内置的「暂无数据」)
41
- * empty={items.value.length === 0 ? '暂无服务' : false}>
42
- * {items.value.map((item) => (
43
- * <ListView.CardItem key={item.id} title={item.name} description={item.desc}
44
- * status={{ label: '在线', tone: 'success', dot: true }}
45
- * onClick={() => openDetail(item.id)}
46
- * actions={() => <Button title="编辑" onClick={() => openEdit(item.id)} />} />
47
- * ))}
48
- * </ListView>
30
+ * 用法见 `docs/demos/list-view/`(每个维度一份可运行样例;文档页 `docs/components/list-view.md`)。
49
31
  */
50
32
  export interface ListViewProps {
51
33
  /**
@@ -82,28 +64,13 @@ export interface ListViewProps {
82
64
  /**
83
65
  * 列表卡片项:卡片的**结构化形态**(图标 / 标题 / 副标题 / 描述 / 标签 / 状态胶囊 / 统计 / 操作位)。
84
66
  *
85
- * 以 `Card interactive` 为壳,卡片外观与悬浮反馈都来自它;本件只管卡片**内部**的排版与几何
86
- * (最小高 144、图标 36、标题 16/600、描述两行截断、尾部贴底、胶囊与标签片),
87
- * 几何来源同 `Card`(技能市场卡片实测)。
88
- *
89
- * 三处「有意为之」:
90
- * 1. **操作位默认隐藏**(`opacity: 0`),卡片悬浮或卡内获得焦点时显形;触屏(无 hover 能力)恒显形 ——
91
- * 因此按钮始终可聚焦、可点,只是平时不抢视觉;
92
- * 2. **操作位点击不冒泡**:卡内按钮(编辑 / 删除)不会顺带触发整卡的 `onClick`(打开详情);
93
- * 3. **状态胶囊与标签片由本件自绘**,不复用 `Badge`:原型是**全圆角胶囊**与无最小宽的标签片,
94
- * 而 `Badge` 的几何是方角 + 最小宽(给徽标列宽用的),套进来会改变原型几何。
67
+ * 以 `Card interactive` 为壳,卡片外观与悬浮反馈都来自它;本件只管卡片**内部**的排版与几何(最小高 144、
68
+ * 图标 36、标题 16/600、描述两行截断、尾部贴底、胶囊与标签片),几何来源同 `Card`(技能市场卡片实测)。
95
69
  *
96
- * @example 带状态、标签与操作位的卡片项
97
- * <ListView.CardItem
98
- * icon={resolveIcon(item.icon)}
99
- * title={item.name}
100
- * subtitle={`V${item.version}`}
101
- * description={item.desc}
102
- * tags={[item.topic, item.domain]}
103
- * status={{ label: '在线', tone: 'success', dot: true }}
104
- * extra={() => <><Icon name="download" size={14} />{item.downloadCount}</>}
105
- * actions={() => <Button title="编辑" onClick={() => openEdit(item.id)} />}
106
- * onClick={() => openDetail(item.id)} />
70
+ * 三处「有意为之」:① **操作位默认隐藏**(`opacity: 0`),卡片悬浮或卡内获得焦点时显形、触屏恒显形 —— 因此
71
+ * 按钮始终可聚焦、可点,只是平时不抢视觉;② **操作位点击不冒泡**(卡内按钮不会顺带触发整卡的 `onClick`);
72
+ * ③ **状态胶囊与标签片由本件自绘**,不复用 `Badge` —— 原型是**全圆角胶囊**与无最小宽的标签片,而 `Badge` 的
73
+ * 几何是方角 + 最小宽(给徽标列宽用的),套进来会改变原型几何。
107
74
  */
108
75
  export interface ListViewCardItemProps {
109
76
  /** 图标:图片地址(`<img>`,`alt` 走空串——名称已由标题承担)或自定义节点 / 返回节点的函数 */
@@ -14,33 +14,22 @@ export interface LoadingProps {
14
14
  * 加载态(转圈 + 可选文案;三种形态)。
15
15
  *
16
16
  * ## 三态与三个不同的东西
17
- *
18
17
  * | 形态 | 用什么 | 为什么不是本件 |
19
18
  * | --- | --- | --- |
20
- * | 区域/页面的加载中 | `QueryState` 的 `loading` | 那件带骨架屏与三态切换,是「容器」 |
19
+ * | 区域 / 页面的加载中 | `QueryState` 的 `loading` | 那件带骨架屏与三态切换,是「容器」 |
21
20
  * | 内容占位 | `Skeleton` | 骨架屏表达「这里将出现什么」,不是「正在忙」 |
22
21
  * | **正在忙、请等待** | 本件 | 遮罩 + 转圈,**拦住交互**才是它的职责 |
23
22
  *
24
23
  * ## 覆盖档必须由消费方给出定位上下文
24
+ * `overlay="area"` 走 `position: absolute`:它铺的是**最近的定位祖先**,故宿主元素要有 `position: relative`
25
+ * (`Panel.Body` / `Card.Body` 这类件自带)。宿主没有定位上下文时它会跑到更外层去 —— 这是 CSS 的规则,不是本件的缺陷;
26
+ * 界面上看不出错位但覆盖范围不对时,先查这一条。`overlay="screen"` 走 `position: fixed`:铺整个视口,层级压在 `Toast`
27
+ * 堆叠(1080)之上、模态层(原生 `<dialog>` 的 top layer)之下。
25
28
  *
26
- * `overlay="area"` 走 `position: absolute`:它铺的是**最近的定位祖先**,所以宿主元素要有
27
- * `position: relative`(`Panel.Body` / `Card.Body` 这类件自带)。宿主没有定位上下文时它会跑到
28
- * 更外层去 —— 这是 CSS 的规则,不是本件的缺陷;界面上看不出错位但覆盖范围不对时,先查这一条。
29
- *
30
- * `overlay="screen"` 走 `position: fixed`:铺整个视口,层级压在 `Toast` 堆叠(1080)之上、
31
- * 模态层(原生 `<dialog>` 的 top layer)之下。
32
- *
33
- * 转圈走 `@manohub/icon` 的 `loading` 字形 + CSS 旋转(**不手绘 SVG**);尺寸按全局图标档
34
- * `--ui-font-icon` 用 `calc()` 派生,换主题时与其它图标一起缩放。
35
- *
36
- * @example 行内:小转圈 + 文案
37
- * <Loading text="加载中" />
38
- *
39
- * @example 区域遮罩(宿主需自带 position: relative)
40
- * <Panel.Body><Loading overlay="area" text="保存中" /></Panel.Body>
29
+ * 转圈走 `@manohub/icon` 的 `loading` 字形 + CSS 旋转(**不手绘 SVG**);尺寸按全局图标档 `--ui-font-icon` 用
30
+ * `calc()` 派生,换主题时与其它图标一起缩放。
41
31
  *
42
- * @example 全屏遮罩
43
- * <Loading overlay="screen" text="正在导入,请勿关闭页面" />
32
+ * 用法见 `docs/demos/loading/`(每个维度一份可运行样例;文档页 `docs/components/loading.md`)。
44
33
  */
45
34
  export declare const Loading: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
46
35
  text: {
@@ -6,38 +6,21 @@ export type NavVariant = 'tree' | 'list';
6
6
  * 侧栏导航(单列、固定宽、内滚):**`tree` / `list` 两态,行渲染完全复用 `Tree`**。
7
7
  *
8
8
  * ## 为什么不是 `Tree` 的一个 prop
9
+ * `Tree` 是**展示件**(层级数据怎么显示);导航是另一种语义:选中驱动右侧内容、单列固定宽、外壳自己滚动。两者对**行**
10
+ * 的几何要求完全一致,故本件不重写行渲染 —— 数据、展开态、选中态、缩进、三态全部交给 `Tree`(不存在第二棵树);两态
11
+ * 的差异只有一处:`variant="list"` 隐藏箭头占位(扁平导航没有层级)。
9
12
  *
10
- * `Tree` 是**展示件**(层级数据怎么显示);导航是另一种语义:选中驱动右侧内容、单列固定宽、
11
- * 外壳自己滚动。两者对**行**的几何要求完全一致,所以本件不重写行渲染 —— 数据、展开态、选中态、
12
- * 缩进、三态全部交给 `Tree`,改一处两处同时生效(不存在第二棵树)。
13
- * 两态的差异只有一处:`variant="list"` 隐藏箭头占位(扁平导航没有层级,不需要那一段缩进)。
13
+ * ## 滚动归属 / 宽度
14
+ * 根件 `overflow: hidden`,**只有 `mh-nav__body` 滚**(与 `Panel.Body` 同一口径)。缺省**填满所在栏**
15
+ * (`width: var(--mh-nav-width, 100%)`)—— 列宽由 `Page.Split` 的侧栏列或外层布局决定,不重复锁一个可能与栏宽不符的
16
+ * 数;独立使用需要固定宽时传 `width`(px 数字)。
14
17
  *
15
- * ## 滚动归属
18
+ * ## 行尾操作 / 图标
19
+ * `renderActions` 直接透传给 `Tree`(默认隐藏、行悬浮或行内获得焦点时显形、点击不冒泡)—— 应用侧只给节点,不要自己写
20
+ * 显隐 CSS,也不要塞进 `renderNode`(那是常驻附加内容)。导航项图标走 `renderIcon`,**不要**用 `renderLabel` 拼
21
+ * 「图标 + 文字」:标签槽承担省略号与行内对齐,图标进去会被裁掉、也不成列。
16
22
  *
17
- * 根件 `overflow: hidden`,**只有 `mh-nav__body` 滚**(与 `Panel.Body` 同一口径):
18
- * 侧栏滚动不再由应用侧写 `overflow-y: auto` 的应用侧类来顶。
19
- *
20
- * ## 宽度
21
- *
22
- * 缺省**填满所在栏**(`width: var(--mh-nav-width, 100%)`):列宽由 `Page.Split` 的侧栏列
23
- * 或外层布局决定,导航件不重复锁一个可能与栏宽不符的数;独立使用需要固定宽时传 `width`(px 数字)。
24
- *
25
- * ## 行尾操作
26
- *
27
- * `renderActions` 直接透传给 `Tree`:默认隐藏、行悬浮或行内获得焦点时显形、点击不冒泡(§4.16)。
28
- * 应用侧只给节点,不要自己写显隐 CSS,也不要把它塞进 `renderNode`(那是常驻附加内容)。
29
- *
30
- * ## 图标
31
- *
32
- * 导航项图标走 `renderIcon`(标签前的一位图标,口径同 `Tree.renderIcon`)—— **不要**用
33
- * `renderLabel` 拼「图标 + 文字」:标签槽承担省略号与行内对齐,图标进去会被裁掉,也不成列。
34
- *
35
- * @example 分类导航树(选中驱动右侧 + 行尾管理操作)
36
- * <Nav variant="tree" nodes={categoryNodes.value} rowKey="id" labelKey="name" width={220}
37
- * selected={categoryId.value} onSelect={(node) => (categoryId.value = node.id)}
38
- * expandedKeys={expandedKeys.value} onExpandChange={(keys) => (expandedKeys.value = keys)}
39
- * loading={query.isPending.value} error={query.isError.value} empty="暂无分类"
40
- * renderActions={(node) => <Button title="删除" onClick={() => removeCategory(node.id)} />} />
23
+ * 用法见 `docs/demos/nav/`(每个维度一份可运行样例;文档页 `docs/components/nav.md`)。
41
24
  */
42
25
  export declare const Nav: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
43
26
  /** 导航形态:`tree`(默认,层级 + 箭头)/ `list`(扁平,无箭头占位) */
@@ -138,9 +121,7 @@ export declare const Nav: import("vue").DefineComponent<import("vue").ExtractPro
138
121
  default: undefined;
139
122
  };
140
123
  /**
141
- * 错误态(truthy 即触发)。
142
- *
143
- * **构造器顺序同 `Tree.error`:`String` 必须排在 `Boolean` 前** —— 顺序写反时,成功态传的
124
+ * 错误态(truthy 即触发)。**构造器顺序同 `Tree.error`:`String` 必须排在 `Boolean` 前** —— 顺序写反时,成功态传的
144
125
  * 空字符串会被 Vue 的布尔转换判成 `true`,侧栏永远停在错误态。
145
126
  */
146
127
  error: {
@@ -265,9 +246,7 @@ export declare const Nav: import("vue").DefineComponent<import("vue").ExtractPro
265
246
  default: undefined;
266
247
  };
267
248
  /**
268
- * 错误态(truthy 即触发)。
269
- *
270
- * **构造器顺序同 `Tree.error`:`String` 必须排在 `Boolean` 前** —— 顺序写反时,成功态传的
249
+ * 错误态(truthy 即触发)。**构造器顺序同 `Tree.error`:`String` 必须排在 `Boolean` 前** —— 顺序写反时,成功态传的
271
250
  * 空字符串会被 Vue 的布尔转换判成 `true`,侧栏永远停在错误态。
272
251
  */
273
252
  error: {
@@ -102,9 +102,7 @@ const Nav = /* @__PURE__ */ defineComponent({
102
102
  default: void 0
103
103
  },
104
104
  /**
105
- * 错误态(truthy 即触发)。
106
- *
107
- * **构造器顺序同 `Tree.error`:`String` 必须排在 `Boolean` 前** —— 顺序写反时,成功态传的
105
+ * 错误态(truthy 即触发)。**构造器顺序同 `Tree.error`:`String` 必须排在 `Boolean` 前** —— 顺序写反时,成功态传的
108
106
  * 空字符串会被 Vue 的布尔转换判成 `true`,侧栏永远停在错误态。
109
107
  */
110
108
  error: {