@manohub/ui 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/README.md +141 -0
  2. package/dist/components/avatar/index.d.ts +283 -0
  3. package/dist/components/avatar/index.js +167 -0
  4. package/dist/components/badge/index.d.ts +132 -0
  5. package/dist/components/badge/index.js +99 -0
  6. package/dist/components/button/index.d.ts +578 -0
  7. package/dist/components/button/index.js +191 -0
  8. package/dist/components/capsule/index.d.ts +161 -0
  9. package/dist/components/capsule/index.js +101 -0
  10. package/dist/components/card/index.d.ts +456 -0
  11. package/dist/components/card/index.js +231 -0
  12. package/dist/components/checkbox/index.d.ts +331 -0
  13. package/dist/components/checkbox/index.js +165 -0
  14. package/dist/components/code/index.d.ts +134 -0
  15. package/dist/components/code/index.js +117 -0
  16. package/dist/components/code-editor/index.d.ts +163 -0
  17. package/dist/components/code-editor/index.js +98 -0
  18. package/dist/components/collapse/index.d.ts +125 -0
  19. package/dist/components/collapse/index.js +95 -0
  20. package/dist/components/control-size.d.ts +8 -0
  21. package/dist/components/dialog/index.d.ts +224 -0
  22. package/dist/components/dialog/index.js +194 -0
  23. package/dist/components/divider/index.d.ts +64 -0
  24. package/dist/components/divider/index.js +62 -0
  25. package/dist/components/drawer/index.d.ts +226 -0
  26. package/dist/components/drawer/index.js +190 -0
  27. package/dist/components/filter/index.d.ts +391 -0
  28. package/dist/components/filter/index.js +203 -0
  29. package/dist/components/form/index.d.ts +704 -0
  30. package/dist/components/form/index.js +329 -0
  31. package/dist/components/input/index.d.ts +980 -0
  32. package/dist/components/input/index.js +334 -0
  33. package/dist/components/layout/index.d.ts +162 -0
  34. package/dist/components/layout/index.js +100 -0
  35. package/dist/components/list-view/index.d.ts +563 -0
  36. package/dist/components/list-view/index.js +221 -0
  37. package/dist/components/loading/index.d.ts +77 -0
  38. package/dist/components/loading/index.js +40 -0
  39. package/dist/components/nav/index.d.ts +293 -0
  40. package/dist/components/nav/index.js +164 -0
  41. package/dist/components/notice/index.d.ts +137 -0
  42. package/dist/components/notice/index.js +101 -0
  43. package/dist/components/notification/index.d.ts +118 -0
  44. package/dist/components/notification/index.js +99 -0
  45. package/dist/components/page/index.d.ts +276 -0
  46. package/dist/components/page/index.js +351 -0
  47. package/dist/components/page/split-resize.d.ts +42 -0
  48. package/dist/components/page/split-resize.js +36 -0
  49. package/dist/components/pagination/index.d.ts +171 -0
  50. package/dist/components/pagination/index.js +226 -0
  51. package/dist/components/panel/index.d.ts +401 -0
  52. package/dist/components/panel/index.js +193 -0
  53. package/dist/components/part-padding.d.ts +27 -0
  54. package/dist/components/part-padding.js +23 -0
  55. package/dist/components/query-state/index.d.ts +207 -0
  56. package/dist/components/query-state/index.js +181 -0
  57. package/dist/components/radio/index.d.ts +473 -0
  58. package/dist/components/radio/index.js +250 -0
  59. package/dist/components/search/index.d.ts +167 -0
  60. package/dist/components/search/index.js +105 -0
  61. package/dist/components/select/index.d.ts +252 -0
  62. package/dist/components/select/index.js +281 -0
  63. package/dist/components/skeleton/index.d.ts +88 -0
  64. package/dist/components/skeleton/index.js +56 -0
  65. package/dist/components/steps/index.d.ts +199 -0
  66. package/dist/components/steps/index.js +117 -0
  67. package/dist/components/switch/index.d.ts +150 -0
  68. package/dist/components/switch/index.js +103 -0
  69. package/dist/components/table/index.d.ts +351 -0
  70. package/dist/components/table/index.js +286 -0
  71. package/dist/components/tabs/index.d.ts +179 -0
  72. package/dist/components/tabs/index.js +153 -0
  73. package/dist/components/tabset/index.d.ts +105 -0
  74. package/dist/components/tabset/index.js +68 -0
  75. package/dist/components/tag/index.d.ts +203 -0
  76. package/dist/components/tag/index.js +144 -0
  77. package/dist/components/toast/index.d.ts +271 -0
  78. package/dist/components/toast/index.js +116 -0
  79. package/dist/components/tooltip/index.d.ts +126 -0
  80. package/dist/components/tooltip/index.js +97 -0
  81. package/dist/components/tree/index.d.ts +317 -0
  82. package/dist/components/tree/index.js +251 -0
  83. package/dist/components/upload/index.d.ts +384 -0
  84. package/dist/components/upload/index.js +172 -0
  85. package/dist/index.d.ts +63 -0
  86. package/dist/index.js +102 -0
  87. package/dist/services/base.d.ts +21 -0
  88. package/dist/services/base.js +42 -0
  89. package/dist/services/dialog.d.ts +41 -0
  90. package/dist/services/dialog.js +83 -0
  91. package/dist/services/index.d.ts +12 -0
  92. package/dist/services/loading.d.ts +21 -0
  93. package/dist/services/loading.js +41 -0
  94. package/dist/services/toast.d.ts +40 -0
  95. package/dist/services/toast.js +74 -0
  96. package/dist/styles/components/avatar.css +128 -0
  97. package/dist/styles/components/avatar.tokens.css +24 -0
  98. package/dist/styles/components/badge.css +237 -0
  99. package/dist/styles/components/button.css +454 -0
  100. package/dist/styles/components/button.tokens.css +56 -0
  101. package/dist/styles/components/capsule.css +120 -0
  102. package/dist/styles/components/capsule.tokens.css +27 -0
  103. package/dist/styles/components/card.css +192 -0
  104. package/dist/styles/components/checkbox.css +145 -0
  105. package/dist/styles/components/checkbox.tokens.css +26 -0
  106. package/dist/styles/components/code-editor.css +91 -0
  107. package/dist/styles/components/code-editor.tokens.css +24 -0
  108. package/dist/styles/components/code.css +153 -0
  109. package/dist/styles/components/code.tokens.css +29 -0
  110. package/dist/styles/components/collapse.css +62 -0
  111. package/dist/styles/components/collapse.tokens.css +20 -0
  112. package/dist/styles/components/dialog.css +106 -0
  113. package/dist/styles/components/dialog.tokens.css +24 -0
  114. package/dist/styles/components/divider.css +71 -0
  115. package/dist/styles/components/divider.tokens.css +21 -0
  116. package/dist/styles/components/drawer.css +143 -0
  117. package/dist/styles/components/drawer.tokens.css +22 -0
  118. package/dist/styles/components/filter.css +41 -0
  119. package/dist/styles/components/filter.tokens.css +14 -0
  120. package/dist/styles/components/form.css +220 -0
  121. package/dist/styles/components/form.tokens.css +15 -0
  122. package/dist/styles/components/input.css +445 -0
  123. package/dist/styles/components/input.tokens.css +41 -0
  124. package/dist/styles/components/layout.css +198 -0
  125. package/dist/styles/components/list-view.css +244 -0
  126. package/dist/styles/components/loading.css +76 -0
  127. package/dist/styles/components/loading.tokens.css +23 -0
  128. package/dist/styles/components/nav.css +48 -0
  129. package/dist/styles/components/notice.css +153 -0
  130. package/dist/styles/components/notice.tokens.css +17 -0
  131. package/dist/styles/components/notification.css +159 -0
  132. package/dist/styles/components/notification.tokens.css +37 -0
  133. package/dist/styles/components/page.css +473 -0
  134. package/dist/styles/components/pagination.css +297 -0
  135. package/dist/styles/components/pagination.tokens.css +32 -0
  136. package/dist/styles/components/panel.css +77 -0
  137. package/dist/styles/components/query-state.css +88 -0
  138. package/dist/styles/components/radio.css +271 -0
  139. package/dist/styles/components/radio.tokens.css +26 -0
  140. package/dist/styles/components/search.css +30 -0
  141. package/dist/styles/components/select.css +242 -0
  142. package/dist/styles/components/select.tokens.css +33 -0
  143. package/dist/styles/components/skeleton.css +60 -0
  144. package/dist/styles/components/skeleton.tokens.css +27 -0
  145. package/dist/styles/components/steps.css +157 -0
  146. package/dist/styles/components/steps.tokens.css +42 -0
  147. package/dist/styles/components/switch.css +165 -0
  148. package/dist/styles/components/switch.tokens.css +26 -0
  149. package/dist/styles/components/table.css +439 -0
  150. package/dist/styles/components/table.tokens.css +41 -0
  151. package/dist/styles/components/tabs.css +234 -0
  152. package/dist/styles/components/tabs.tokens.css +30 -0
  153. package/dist/styles/components/tag.css +200 -0
  154. package/dist/styles/components/tag.tokens.css +30 -0
  155. package/dist/styles/components/toast.css +150 -0
  156. package/dist/styles/components/toast.tokens.css +26 -0
  157. package/dist/styles/components/tooltip.css +89 -0
  158. package/dist/styles/components/tooltip.tokens.css +25 -0
  159. package/dist/styles/components/tree.css +139 -0
  160. package/dist/styles/components/tree.tokens.css +20 -0
  161. package/dist/styles/components/upload.css +150 -0
  162. package/dist/styles/components/upload.tokens.css +27 -0
  163. package/dist/styles/index.css +149 -0
  164. package/dist/styles/operations/collapse.css +84 -0
  165. package/dist/styles/operations/popup.css +189 -0
  166. package/dist/styles/operations/tabset.css +57 -0
  167. package/dist/utils/state-illustration.d.ts +31 -0
  168. package/dist/utils/state-illustration.js +156 -0
  169. package/package.json +62 -0
@@ -0,0 +1,401 @@
1
+ import { type PropType, type SlotsType, type VNodeChild } from 'vue';
2
+ import { type Padding } from '../part-padding';
3
+ /**
4
+ * 区域容器(页面内分区)—— 与 `Page` 的分工:
5
+ *
6
+ * - `Page`:**页面级**(唯一)。管页头规格、Footer 固定、页面级滚动归属(`Body.mode`)。
7
+ * - `Panel`:**区域级**(可多个)。只管区域内的三件(Header / Body / Footer)与区域内滚动
8
+ * (Header 与 Footer 固定、只有 Body 滚),**不参与页面高度分配**,也不决定页面级滚动归属。
9
+ *
10
+ * ## 三件结构(与 `Page` 同款复合写法)
11
+ *
12
+ * ```
13
+ * <Panel>
14
+ * <Panel.Header title="值映射列表" toolbar={…} actions={…} />
15
+ * <Panel.Body>…内容(表格 / 树 / 表单)…</Panel.Body>
16
+ * <Panel.Footer><分页器 … /></Panel.Footer>
17
+ * </Panel>
18
+ * ```
19
+ *
20
+ * 简写仍可用(等价于「内建 Header + 包一层的 Body」):`<Panel title=… toolbar=… actions=…>内容</Panel>`;
21
+ * 两种写法可混用 —— 显式的 `Panel.Header/ Body/ Footer` 会被提到对应位置,其余子节点自动进 Body。
22
+ *
23
+ * ## 分页归属(**跟承载表格的容器走**)
24
+ *
25
+ * 分页条不按「页面」决定位置,而按**表格所在容器**:
26
+ * - 表格在 `Panel` 里(区域级列表)→ 放 `Panel.Footer`(面板内表 + 分页是一个整体,面板体滚动、分页常驻);
27
+ * - 表格直接挂在 页面主体 下(页面级列表)→ 放 页面页脚。
28
+ * 把区域列表的分页提到 页面页脚(或把页面级分页塞进面板)都属于错位。
29
+ *
30
+ * ## 无框契约
31
+ *
32
+ * `Panel` 自身**不加描边、不加圆角、不加阴影、不设独立底色、不加单侧边框** ——
33
+ * 分区感只由 Header 下方的 1px 分隔线提供(与 `.mh-page__header` 同一手法);
34
+ * 两栏之间的竖直分隔线由 `Page` 提供。
35
+ * 需要卡片外观时由**内容件**承载(表格用 `表格.framed`),业务侧不得给面板补描边/圆角/阴影。
36
+ *
37
+ * ## 内距(`padding`)
38
+ *
39
+ * 面板与它的三件吃**同一套** `padding`(px 数字 / `{ y, x }`),缺省都不吃(贴各自的边):
40
+ *
41
+ * - 根件 = 整块面板的内距:页面里的区域通常不吃(内外距由 `Page` 的各部件给);
42
+ * 弹窗内的区域没有别的东西可给内距,用它自带(`padding={{ y: 12, x: 20 }}`)——
43
+ * 这样就不必再给面板挂一个「只写 padding」的应用侧类(那类规则曾经每个弹窗各写一份)。
44
+ * - `Panel.Body` = 内容区的内距,**弹窗里最常用的一条**:如向导内容区
45
+ * `padding={{ y: 24, x: 100 }}` —— `y` 是上下留白,`x` 开大即充当**限宽**
46
+ * (宽弹窗里不让表单行一路拉到右边缘);这条以前是应用侧的「只写 padding」类。
47
+ * - `Panel.Footer` = 常驻控件(分页条等)与内容的距离,如 `padding={{ y: 10 }}`。
48
+ * - `Panel.Header` = 内建头那一行的内距;走 `header` 插槽时(整行替换)会把自定义头**包一层**
49
+ * 只带内距的 div(自定义头内部的几何仍归消费方)。
50
+ *
51
+ * ## 两位分工(不可互换)
52
+ *
53
+ * - `toolbar`:**本区域的筛选/搜索位**(≤3 个字段,过滤本区域数据)
54
+ * - `actions`:**本区域的操作位**(该区域的新建 / 刷新等)
55
+ *
56
+ * 筛选归属判据:**先问「过滤谁的数据」决定放哪个区域的 toolbar,再问「几个字段」** ——
57
+ * 字段数 > 3 时上提为页面级 页面级筛选区。把筛选塞进 `actions`、或把操作塞进 `toolbar` 均属违规。
58
+ *
59
+ * 完全自定义的面板头请走 `Panel.Header`(不传 `title`)或 `header` 插槽(需在接入方登记为白名单)。
60
+ * **只给 `toolbar` / `actions`、不给 `title` 也是合法形态**:那一行照渲染(标题在容器外层时用,如弹窗内的区域
61
+ * —— 弹窗标题栏已写了区域名,面板头只剩一行「搜索 + 操作」);三样都不给才不渲染头。
62
+ *
63
+ * @example 区域级列表(表格 + 分页都在本区域内)
64
+ * <Panel>
65
+ * <Panel.Header title="值映射列表" toolbar={<搜索框 … />} actions={<Button>新建</Button>} />
66
+ * <Panel.Body><表格 framed rows={rows} columns={columns} rowKey="id" /></Panel.Body>
67
+ * <Panel.Footer><分页器 page={page} pageSize={size} total={total} onPageChange={…} /></Panel.Footer>
68
+ * </Panel>
69
+ */
70
+ export interface PanelProps {
71
+ /** 面板标题;缺省时若提供了 `header` 插槽则走完全自定义面板头 */
72
+ title?: string;
73
+ /** 本区域的筛选/搜索位(≤3 字段),与 `actions` 分工不可互换 */
74
+ toolbar?: unknown;
75
+ /** 本区域的操作位(新建 / 刷新等) */
76
+ actions?: unknown;
77
+ /**
78
+ * 面板内距(**px 数字**,与 `Form.labelWidth` / `表格.rowHeight` 同口径:几何值是设计基准,不跟根字号):
79
+ * - `number` → 四边同值(`padding={16}`);
80
+ * - `{ y, x }` → 上下 / 左右分别给(`{ y: 12, x: 20 }`,弹窗内的区域常用 —— 与 `Page` 的页面左右内距同档)。
81
+ *
82
+ * **缺省 0**:面板贴容器边,内距由所在容器给(页面里是 `Page` 的各部件,弹窗里没有别的东西可给)。
83
+ * 无框契约不变:这里只是内距,描边 / 圆角 / 底色仍一概不加。
84
+ *
85
+ * 三件(`Header` / `Body` / `Footer`)有**同名同口径**的 `padding`,管各自那块的内距。
86
+ */
87
+ padding?: PanelPadding;
88
+ }
89
+ /** 面板(及其三件)的内距:与 `Form` / `Panel` 共用一套口径(`number` = 四边同值;`{ y, x }` 分别给) */
90
+ export type PanelPadding = Padding;
91
+ /** 面板标题行(区域级):标题 + 本区域筛选位(toolbar) + 本区域操作位(actions) */
92
+ export declare const PanelHeader: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
93
+ /**
94
+ * 面板标题;缺省时**不渲染标题节点**,但仍会渲染 `toolbar` / `actions` 那一行
95
+ * (无标题的区域头,见组件头注释);要给完全自定义的头走 `header` 插槽。
96
+ */
97
+ title: {
98
+ type: StringConstructor;
99
+ default: undefined;
100
+ };
101
+ /** 本区域的筛选/搜索位(≤3 字段);节点或返回节点的函数 */
102
+ toolbar: {
103
+ type: PropType<any>;
104
+ default: undefined;
105
+ };
106
+ /** 本区域的操作位(新建 / 刷新等);节点或返回节点的函数 */
107
+ actions: {
108
+ type: PropType<any>;
109
+ default: undefined;
110
+ };
111
+ /** 头这一行的内距(与根件同一口径);内建头自带 `0 8px` 的内距,本项按需覆盖 */
112
+ padding: {
113
+ type: PropType<PanelPadding>;
114
+ default: undefined;
115
+ };
116
+ }>, () => VNodeChild, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
117
+ /**
118
+ * 面板标题;缺省时**不渲染标题节点**,但仍会渲染 `toolbar` / `actions` 那一行
119
+ * (无标题的区域头,见组件头注释);要给完全自定义的头走 `header` 插槽。
120
+ */
121
+ title: {
122
+ type: StringConstructor;
123
+ default: undefined;
124
+ };
125
+ /** 本区域的筛选/搜索位(≤3 字段);节点或返回节点的函数 */
126
+ toolbar: {
127
+ type: PropType<any>;
128
+ default: undefined;
129
+ };
130
+ /** 本区域的操作位(新建 / 刷新等);节点或返回节点的函数 */
131
+ actions: {
132
+ type: PropType<any>;
133
+ default: undefined;
134
+ };
135
+ /** 头这一行的内距(与根件同一口径);内建头自带 `0 8px` 的内距,本项按需覆盖 */
136
+ padding: {
137
+ type: PropType<PanelPadding>;
138
+ default: undefined;
139
+ };
140
+ }>> & Readonly<{}>, {
141
+ padding: Padding;
142
+ toolbar: any;
143
+ title: string;
144
+ actions: any;
145
+ }, SlotsType<{
146
+ header?: () => VNodeChild;
147
+ /** 自定义标题节点(替代 `title` 属性;标题里要放图标 / 计数 / 状态点时用它) */
148
+ title?: () => VNodeChild;
149
+ toolbar?: () => VNodeChild;
150
+ actions?: () => VNodeChild;
151
+ }>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
152
+ /**
153
+ * 面板内容区:**区域内的滚动唯一归属**(Header / Footer 固定,只有它滚)。
154
+ *
155
+ * 表格场景天然不双滚:`.mh-table { height: 100% }` 让表格恰好填满 Body、由底层网格内部滚。
156
+ * 反例:别在 Body 里给 表格族 外套一层 `height:auto` 的 div,否则 Body 整块滚、表头跟着走。
157
+ *
158
+ * `padding` 是**内容的内距**(不改变滚动归属):弹窗里的内容区最常用它
159
+ * (`padding={{ y: 24, x: 100 }}` —— `x` 开大即充当限宽),从此不必再给 Body 挂一个「只写 padding」的应用侧类。
160
+ */
161
+ export declare const PanelBody: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
162
+ /** 内容区内距(与根件同一口径);缺省 0 = 内容贴面板边(页面里的区域通常如此) */
163
+ padding: {
164
+ type: PropType<PanelPadding>;
165
+ default: undefined;
166
+ };
167
+ }>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
168
+ /** 内容区内距(与根件同一口径);缺省 0 = 内容贴面板边(页面里的区域通常如此) */
169
+ padding: {
170
+ type: PropType<PanelPadding>;
171
+ default: undefined;
172
+ };
173
+ }>> & Readonly<{}>, {
174
+ padding: Padding;
175
+ }, SlotsType<{
176
+ default?: () => VNodeChild;
177
+ }>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
178
+ /**
179
+ * 面板页脚:区域内**常驻**控件(本区域表格的分页条等),不随内容滚动。
180
+ *
181
+ * `padding` 用来把常驻控件与上面的内容拉开(如 `padding={{ y: 10 }}`)——
182
+ * 页脚自己没有内距,以前这条距离各弹窗各写一个 `padding-top` 的应用侧类。
183
+ */
184
+ export declare const PanelFooter: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
185
+ /** 页脚内距(与根件同一口径);缺省 0 = 贴面板边 */
186
+ padding: {
187
+ type: PropType<PanelPadding>;
188
+ default: undefined;
189
+ };
190
+ }>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
191
+ /** 页脚内距(与根件同一口径);缺省 0 = 贴面板边 */
192
+ padding: {
193
+ type: PropType<PanelPadding>;
194
+ default: undefined;
195
+ };
196
+ }>> & Readonly<{}>, {
197
+ padding: Padding;
198
+ }, SlotsType<{
199
+ default?: () => VNodeChild;
200
+ }>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
201
+ /**
202
+ * 复合件入口:`Panel` + `Panel.Header` / `Panel.Body` / `Panel.Footer`
203
+ * (与 `Page` 同款 Object.assign 复合写法)
204
+ */
205
+ export declare const Panel: {
206
+ new (...args: any[]): import("vue").CreateComponentPublicInstanceWithMixins<Readonly<import("vue").ExtractPropTypes<{
207
+ /** 简写标题:等价于内建 `Panel.Header` */
208
+ title: {
209
+ type: StringConstructor;
210
+ default: undefined;
211
+ };
212
+ /** 简写筛选位:等价于内建 `Panel.Header` 的 toolbar */
213
+ toolbar: {
214
+ type: PropType<any>;
215
+ default: undefined;
216
+ };
217
+ /** 简写操作位:等价于内建 `Panel.Header` 的 actions */
218
+ actions: {
219
+ type: PropType<any>;
220
+ default: undefined;
221
+ };
222
+ /** 面板内距(px 数字,或 `{ y, x }`);缺省 0 = 贴容器边 */
223
+ padding: {
224
+ type: PropType<PanelPadding>;
225
+ default: undefined;
226
+ };
227
+ }>> & Readonly<{}>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, import("vue").PublicProps, {
228
+ padding: Padding;
229
+ toolbar: any;
230
+ title: string;
231
+ actions: any;
232
+ }, true, {}, SlotsType<{
233
+ default?: () => VNodeChild;
234
+ header?: () => VNodeChild;
235
+ toolbar?: () => VNodeChild;
236
+ actions?: () => VNodeChild;
237
+ }>, import("vue").GlobalComponents, import("vue").GlobalDirectives, string, {}, any, import("vue").ComponentProvideOptions, {
238
+ P: {};
239
+ B: {};
240
+ D: {};
241
+ C: {};
242
+ M: {};
243
+ Defaults: {};
244
+ }, Readonly<import("vue").ExtractPropTypes<{
245
+ /** 简写标题:等价于内建 `Panel.Header` */
246
+ title: {
247
+ type: StringConstructor;
248
+ default: undefined;
249
+ };
250
+ /** 简写筛选位:等价于内建 `Panel.Header` 的 toolbar */
251
+ toolbar: {
252
+ type: PropType<any>;
253
+ default: undefined;
254
+ };
255
+ /** 简写操作位:等价于内建 `Panel.Header` 的 actions */
256
+ actions: {
257
+ type: PropType<any>;
258
+ default: undefined;
259
+ };
260
+ /** 面板内距(px 数字,或 `{ y, x }`);缺省 0 = 贴容器边 */
261
+ padding: {
262
+ type: PropType<PanelPadding>;
263
+ default: undefined;
264
+ };
265
+ }>> & Readonly<{}>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, {
266
+ padding: Padding;
267
+ toolbar: any;
268
+ title: string;
269
+ actions: any;
270
+ }>;
271
+ __isFragment?: never;
272
+ __isTeleport?: never;
273
+ __isSuspense?: never;
274
+ } & import("vue").ComponentOptionsBase<Readonly<import("vue").ExtractPropTypes<{
275
+ /** 简写标题:等价于内建 `Panel.Header` */
276
+ title: {
277
+ type: StringConstructor;
278
+ default: undefined;
279
+ };
280
+ /** 简写筛选位:等价于内建 `Panel.Header` 的 toolbar */
281
+ toolbar: {
282
+ type: PropType<any>;
283
+ default: undefined;
284
+ };
285
+ /** 简写操作位:等价于内建 `Panel.Header` 的 actions */
286
+ actions: {
287
+ type: PropType<any>;
288
+ default: undefined;
289
+ };
290
+ /** 面板内距(px 数字,或 `{ y, x }`);缺省 0 = 贴容器边 */
291
+ padding: {
292
+ type: PropType<PanelPadding>;
293
+ default: undefined;
294
+ };
295
+ }>> & Readonly<{}>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, {
296
+ padding: Padding;
297
+ toolbar: any;
298
+ title: string;
299
+ actions: any;
300
+ }, {}, string, SlotsType<{
301
+ default?: () => VNodeChild;
302
+ header?: () => VNodeChild;
303
+ toolbar?: () => VNodeChild;
304
+ actions?: () => VNodeChild;
305
+ }>, import("vue").GlobalComponents, import("vue").GlobalDirectives, string, import("vue").ComponentProvideOptions> & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps & {
306
+ Header: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
307
+ /**
308
+ * 面板标题;缺省时**不渲染标题节点**,但仍会渲染 `toolbar` / `actions` 那一行
309
+ * (无标题的区域头,见组件头注释);要给完全自定义的头走 `header` 插槽。
310
+ */
311
+ title: {
312
+ type: StringConstructor;
313
+ default: undefined;
314
+ };
315
+ /** 本区域的筛选/搜索位(≤3 字段);节点或返回节点的函数 */
316
+ toolbar: {
317
+ type: PropType<any>;
318
+ default: undefined;
319
+ };
320
+ /** 本区域的操作位(新建 / 刷新等);节点或返回节点的函数 */
321
+ actions: {
322
+ type: PropType<any>;
323
+ default: undefined;
324
+ };
325
+ /** 头这一行的内距(与根件同一口径);内建头自带 `0 8px` 的内距,本项按需覆盖 */
326
+ padding: {
327
+ type: PropType<PanelPadding>;
328
+ default: undefined;
329
+ };
330
+ }>, () => VNodeChild, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
331
+ /**
332
+ * 面板标题;缺省时**不渲染标题节点**,但仍会渲染 `toolbar` / `actions` 那一行
333
+ * (无标题的区域头,见组件头注释);要给完全自定义的头走 `header` 插槽。
334
+ */
335
+ title: {
336
+ type: StringConstructor;
337
+ default: undefined;
338
+ };
339
+ /** 本区域的筛选/搜索位(≤3 字段);节点或返回节点的函数 */
340
+ toolbar: {
341
+ type: PropType<any>;
342
+ default: undefined;
343
+ };
344
+ /** 本区域的操作位(新建 / 刷新等);节点或返回节点的函数 */
345
+ actions: {
346
+ type: PropType<any>;
347
+ default: undefined;
348
+ };
349
+ /** 头这一行的内距(与根件同一口径);内建头自带 `0 8px` 的内距,本项按需覆盖 */
350
+ padding: {
351
+ type: PropType<PanelPadding>;
352
+ default: undefined;
353
+ };
354
+ }>> & Readonly<{}>, {
355
+ padding: Padding;
356
+ toolbar: any;
357
+ title: string;
358
+ actions: any;
359
+ }, SlotsType<{
360
+ header?: () => VNodeChild;
361
+ /** 自定义标题节点(替代 `title` 属性;标题里要放图标 / 计数 / 状态点时用它) */
362
+ title?: () => VNodeChild;
363
+ toolbar?: () => VNodeChild;
364
+ actions?: () => VNodeChild;
365
+ }>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
366
+ Body: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
367
+ /** 内容区内距(与根件同一口径);缺省 0 = 内容贴面板边(页面里的区域通常如此) */
368
+ padding: {
369
+ type: PropType<PanelPadding>;
370
+ default: undefined;
371
+ };
372
+ }>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
373
+ /** 内容区内距(与根件同一口径);缺省 0 = 内容贴面板边(页面里的区域通常如此) */
374
+ padding: {
375
+ type: PropType<PanelPadding>;
376
+ default: undefined;
377
+ };
378
+ }>> & Readonly<{}>, {
379
+ padding: Padding;
380
+ }, SlotsType<{
381
+ default?: () => VNodeChild;
382
+ }>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
383
+ Footer: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
384
+ /** 页脚内距(与根件同一口径);缺省 0 = 贴面板边 */
385
+ padding: {
386
+ type: PropType<PanelPadding>;
387
+ default: undefined;
388
+ };
389
+ }>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
390
+ /** 页脚内距(与根件同一口径);缺省 0 = 贴面板边 */
391
+ padding: {
392
+ type: PropType<PanelPadding>;
393
+ default: undefined;
394
+ };
395
+ }>> & Readonly<{}>, {
396
+ padding: Padding;
397
+ }, SlotsType<{
398
+ default?: () => VNodeChild;
399
+ }>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
400
+ };
401
+ export type PanelCompound = typeof Panel;
@@ -0,0 +1,193 @@
1
+ import { defineComponent, createVNode, h } from "vue";
2
+ import { mergePartStyle, partPaddingStyle } from "../part-padding.js";
3
+ const PanelHeader = /* @__PURE__ */ defineComponent({
4
+ name: "PanelHeader",
5
+ inheritAttrs: false,
6
+ props: {
7
+ /**
8
+ * 面板标题;缺省时**不渲染标题节点**,但仍会渲染 `toolbar` / `actions` 那一行
9
+ * (无标题的区域头,见组件头注释);要给完全自定义的头走 `header` 插槽。
10
+ */
11
+ title: {
12
+ type: String,
13
+ default: void 0
14
+ },
15
+ /** 本区域的筛选/搜索位(≤3 字段);节点或返回节点的函数 */
16
+ toolbar: {
17
+ type: [Function, Object, Array, String],
18
+ default: void 0
19
+ },
20
+ /** 本区域的操作位(新建 / 刷新等);节点或返回节点的函数 */
21
+ actions: {
22
+ type: [Function, Object, Array, String],
23
+ default: void 0
24
+ },
25
+ /** 头这一行的内距(与根件同一口径);内建头自带 `0 8px` 的内距,本项按需覆盖 */
26
+ padding: {
27
+ type: [Number, Object],
28
+ default: void 0
29
+ }
30
+ },
31
+ slots: Object,
32
+ setup(props, {
33
+ slots,
34
+ attrs
35
+ }) {
36
+ const renderSlotValue = (slotFn, propValue) => {
37
+ if (slotFn) return slotFn();
38
+ if (typeof propValue === "function") return propValue();
39
+ return propValue;
40
+ };
41
+ return () => {
42
+ const toolbar = renderSlotValue(slots.toolbar, props.toolbar);
43
+ const actions = renderSlotValue(slots.actions, props.actions);
44
+ if (slots.header) {
45
+ const custom = slots.header();
46
+ const paddingStyle = partPaddingStyle(props.padding);
47
+ return paddingStyle === void 0 ? custom : createVNode("div", {
48
+ "style": paddingStyle
49
+ }, [custom]);
50
+ }
51
+ if (!props.title && !slots.title && !toolbar && !actions) return null;
52
+ return createVNode("div", {
53
+ "class": ["mh-panel__header", attrs.class].filter(Boolean).join(" "),
54
+ "style": mergePartStyle(attrs.style, props.padding)
55
+ }, [slots.title || props.title ? createVNode("span", {
56
+ "class": "mh-panel__header-title"
57
+ }, [slots.title ? slots.title() : props.title]) : null, createVNode("div", {
58
+ "class": "mh-panel__header-right"
59
+ }, [toolbar ? createVNode("div", {
60
+ "class": "mh-panel__header-toolbar"
61
+ }, [toolbar]) : null, actions ? createVNode("div", {
62
+ "class": "mh-panel__header-actions"
63
+ }, [actions]) : null])]);
64
+ };
65
+ }
66
+ });
67
+ const PanelBody = /* @__PURE__ */ defineComponent({
68
+ name: "PanelBody",
69
+ inheritAttrs: false,
70
+ props: {
71
+ /** 内容区内距(与根件同一口径);缺省 0 = 内容贴面板边(页面里的区域通常如此) */
72
+ padding: {
73
+ type: [Number, Object],
74
+ default: void 0
75
+ }
76
+ },
77
+ slots: Object,
78
+ setup(props, {
79
+ slots,
80
+ attrs
81
+ }) {
82
+ return () => createVNode("div", {
83
+ "class": ["mh-panel__body", attrs.class].filter(Boolean).join(" "),
84
+ "style": mergePartStyle(attrs.style, props.padding)
85
+ }, [slots.default?.()]);
86
+ }
87
+ });
88
+ const PanelFooter = /* @__PURE__ */ defineComponent({
89
+ name: "PanelFooter",
90
+ inheritAttrs: false,
91
+ props: {
92
+ /** 页脚内距(与根件同一口径);缺省 0 = 贴面板边 */
93
+ padding: {
94
+ type: [Number, Object],
95
+ default: void 0
96
+ }
97
+ },
98
+ slots: Object,
99
+ setup(props, {
100
+ slots,
101
+ attrs
102
+ }) {
103
+ return () => createVNode("div", {
104
+ "class": ["mh-panel__footer", attrs.class].filter(Boolean).join(" "),
105
+ "style": mergePartStyle(attrs.style, props.padding)
106
+ }, [slots.default?.()]);
107
+ }
108
+ });
109
+ function splitParts(children) {
110
+ const header = [];
111
+ const body = [];
112
+ const footer = [];
113
+ const rest = [];
114
+ for (const child of children) {
115
+ if (child.type === PanelHeader) header.push(child);
116
+ else if (child.type === PanelBody) body.push(child);
117
+ else if (child.type === PanelFooter) footer.push(child);
118
+ else rest.push(child);
119
+ }
120
+ return {
121
+ header,
122
+ body,
123
+ footer,
124
+ rest
125
+ };
126
+ }
127
+ const PanelRoot = /* @__PURE__ */ defineComponent({
128
+ name: "Panel",
129
+ inheritAttrs: false,
130
+ props: {
131
+ /** 简写标题:等价于内建 `Panel.Header` */
132
+ title: {
133
+ type: String,
134
+ default: void 0
135
+ },
136
+ /** 简写筛选位:等价于内建 `Panel.Header` 的 toolbar */
137
+ toolbar: {
138
+ type: [Function, Object, Array, String],
139
+ default: void 0
140
+ },
141
+ /** 简写操作位:等价于内建 `Panel.Header` 的 actions */
142
+ actions: {
143
+ type: [Function, Object, Array, String],
144
+ default: void 0
145
+ },
146
+ /** 面板内距(px 数字,或 `{ y, x }`);缺省 0 = 贴容器边 */
147
+ padding: {
148
+ type: [Number, Object],
149
+ default: void 0
150
+ }
151
+ },
152
+ slots: Object,
153
+ setup(props, {
154
+ slots,
155
+ attrs
156
+ }) {
157
+ return () => {
158
+ const raw = slots.default?.();
159
+ const children = (Array.isArray(raw) ? raw : raw == null ? [] : [raw]).filter((child) => !!child && typeof child === "object");
160
+ const {
161
+ header,
162
+ body,
163
+ footer,
164
+ rest
165
+ } = splitParts(children);
166
+ const hasBuiltinHeader = !!props.title || !slots.header && (props.toolbar !== void 0 || props.actions !== void 0);
167
+ const headerNode = header.length > 0 ? header : hasBuiltinHeader ? createVNode(PanelHeader, {
168
+ "title": props.title,
169
+ "toolbar": props.toolbar,
170
+ "actions": props.actions
171
+ }, null) : slots.header?.() ?? null;
172
+ const bodyNode = body.length > 0 ? body : rest.length > 0 ? h(PanelBody, null, {
173
+ default: () => rest
174
+ }) : null;
175
+ const panelStyle = mergePartStyle(attrs.style, props.padding);
176
+ return createVNode("section", {
177
+ "class": ["mh-panel", attrs.class].filter(Boolean).join(" "),
178
+ "style": panelStyle
179
+ }, [headerNode, bodyNode, footer]);
180
+ };
181
+ }
182
+ });
183
+ const Panel = Object.assign(PanelRoot, {
184
+ Header: PanelHeader,
185
+ Body: PanelBody,
186
+ Footer: PanelFooter
187
+ });
188
+ export {
189
+ Panel,
190
+ PanelBody,
191
+ PanelFooter,
192
+ PanelHeader
193
+ };
@@ -0,0 +1,27 @@
1
+ import type { StyleValue } from 'vue';
2
+ /**
3
+ * 骨架件的**内距**口径(`Panel` 及其三件、`Form` 共用同一套)。
4
+ *
5
+ * - `number` → 四边同值(`padding={16}`);
6
+ * - `{ y, x }` → 上下 / 左右分别给(`{ y: 12, x: 20 }`,弹窗里的容器常用 —— 与 `Page` 的页面左右内距同档),
7
+ * **缺哪边就不落哪边的声明**(只给 `y` 时不覆盖消费方在 `style` 里写的左右内距)。
8
+ *
9
+ * 为什么是 px 数字而不是 CSS 字符串:几何值在本仓是**设计基准**,不跟根字号
10
+ * (与 `Form.labelWidth` / `表格.rowHeight` 同口径);要写自适应内距的场合请走 `class`。
11
+ */
12
+ export type Padding = number | {
13
+ y?: number;
14
+ x?: number;
15
+ };
16
+ /**
17
+ * 内距 → 行内样式。缺省(`undefined`)时返回 `undefined`:**不额外产生 style 属性**,
18
+ * DOM 与「没有这个维度」时完全一致。
19
+ */
20
+ export declare function partPaddingStyle(padding: Padding | undefined): StyleValue | undefined;
21
+ /**
22
+ * 合并「消费方给的 `style`」与「内距行内样式」:两者都可能有,内距排在后面
23
+ * —— 同一属性以组件的 `padding` 为准(消费方要覆盖就用 `class` 里更具体的规则)。
24
+ *
25
+ * 不给 `padding` 时**原样返回消费方的 style**(含 `undefined`)。
26
+ */
27
+ export declare function mergePartStyle(attrsStyle: unknown, padding: Padding | undefined): StyleValue | undefined;
@@ -0,0 +1,23 @@
1
+ function partPaddingStyle(padding) {
2
+ if (padding === void 0) return void 0;
3
+ if (typeof padding === "number") return { padding: `${padding}px` };
4
+ const style = {};
5
+ if (padding.y !== void 0) {
6
+ style.paddingTop = `${padding.y}px`;
7
+ style.paddingBottom = `${padding.y}px`;
8
+ }
9
+ if (padding.x !== void 0) {
10
+ style.paddingLeft = `${padding.x}px`;
11
+ style.paddingRight = `${padding.x}px`;
12
+ }
13
+ return style;
14
+ }
15
+ function mergePartStyle(attrsStyle, padding) {
16
+ const paddingStyle = partPaddingStyle(padding);
17
+ if (paddingStyle === void 0) return attrsStyle;
18
+ return [attrsStyle, paddingStyle];
19
+ }
20
+ export {
21
+ mergePartStyle,
22
+ partPaddingStyle
23
+ };