@manohub/ui 0.6.1 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -4
- package/dist/components/button/index.d.ts +8 -8
- package/dist/components/capsule/index.d.ts +13 -9
- package/dist/components/capsule/index.js +1 -1
- package/dist/components/card/index.js +7 -4
- package/dist/components/checkbox/index.js +1 -0
- package/dist/components/dialog/index.d.ts +58 -6
- package/dist/components/dialog/index.js +45 -8
- package/dist/components/drawer/index.d.ts +18 -6
- package/dist/components/drawer/index.js +11 -5
- package/dist/components/form/index.d.ts +115 -17
- package/dist/components/form/index.js +39 -9
- package/dist/components/input/index.d.ts +4 -4
- package/dist/components/input/index.js +1 -1
- package/dist/components/layout/index.d.ts +43 -1
- package/dist/components/layout/index.js +22 -2
- package/dist/components/notice/index.d.ts +24 -11
- package/dist/components/notice/index.js +11 -5
- package/dist/components/notification/index.d.ts +2 -2
- package/dist/components/page/index.js +4 -4
- package/dist/components/panel/index.js +4 -4
- package/dist/components/part-padding.d.ts +9 -6
- package/dist/components/part-padding.js +2 -1
- package/dist/components/radio/index.d.ts +1 -1
- package/dist/components/radio/index.js +1 -0
- package/dist/components/search/index.d.ts +26 -6
- package/dist/components/search/index.js +22 -4
- package/dist/components/steps/index.d.ts +232 -6
- package/dist/components/steps/index.js +84 -26
- package/dist/components/switch/index.d.ts +29 -5
- package/dist/components/switch/index.js +8 -2
- package/dist/components/tabbar/index.d.ts +184 -0
- package/dist/components/tabbar/index.js +161 -0
- package/dist/components/table/index.d.ts +74 -8
- package/dist/components/table/index.js +69 -16
- package/dist/components/tabs/index.d.ts +145 -125
- package/dist/components/tabs/index.js +93 -117
- package/dist/components/tag/index.d.ts +2 -2
- package/dist/components/text/index.d.ts +120 -0
- package/dist/components/text/index.js +55 -0
- package/dist/components/toast/index.d.ts +8 -8
- package/dist/components/toast/index.js +11 -2
- package/dist/components/upload/index.d.ts +30 -0
- package/dist/components/upload/index.js +7 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.js +6 -3
- package/dist/services/dialog.d.ts +20 -5
- package/dist/services/dialog.js +8 -1
- package/dist/styles/components/capsule.css +4 -4
- package/dist/styles/components/dialog.css +40 -1
- package/dist/styles/components/form.css +206 -26
- package/dist/styles/components/input.css +29 -2
- package/dist/styles/components/layout.css +2 -0
- package/dist/styles/components/select.css +11 -0
- package/dist/styles/components/steps.css +48 -0
- package/dist/styles/components/{tabs.css → tabbar.css} +66 -65
- package/dist/styles/components/tabbar.tokens.css +30 -0
- package/dist/styles/components/table.css +50 -1
- package/dist/styles/components/table.tokens.css +3 -0
- package/dist/styles/components/text.css +101 -0
- package/dist/styles/components/toast.css +12 -6
- package/dist/styles/index.css +8 -4
- package/dist/styles/operations/tabs.css +73 -0
- package/dist/styles/reset.css +205 -0
- package/package.json +2 -2
- package/dist/components/tabset/index.d.ts +0 -105
- package/dist/components/tabset/index.js +0 -68
- package/dist/styles/components/tabs.tokens.css +0 -30
- package/dist/styles/operations/tabset.css +0 -57
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ AIHub **自绘组件层**:不依赖 farris 的手写 Vue TSX 组件 + 自带
|
|
|
7
7
|
| 层 | 入口 | 内容 |
|
|
8
8
|
|---|---|---|
|
|
9
9
|
| ① 主题 | `@manohub/theme/default.css`(兜底)/ `@manohub/theme/farris.css`(Farris 规范) | **全局**令牌(值)—— 随主题包独立发布,换主题只换这一行 |
|
|
10
|
-
| ② 组件面 | `@manohub/ui/styles.css` | 类与状态协议 + 组件令牌基础值,**无需 JS** 即可使用 |
|
|
10
|
+
| ② 组件面 | `@manohub/ui/styles.css` | **元素级 reset**(盒模型 / 按钮外观 / 列表序号 / 链接下划线 / 标题字阶归零)+ 类与状态协议 + 组件令牌基础值,**无需 JS** 即可使用 |
|
|
11
11
|
| ③ Vue 层 | `@manohub/ui` | Vue 组件:渲染 ② 的类 + 行为增强 |
|
|
12
12
|
| ④ 服务层 | `@manohub/ui` | 命令式反馈:`toast()` / `confirm()` / `alert()` / `showLoading()`(宿主 + 队列 + 生命周期,共用 ③ 的组件) |
|
|
13
13
|
|
|
@@ -37,6 +37,14 @@ pnpm add @manohub/ui @manohub/theme
|
|
|
37
37
|
|
|
38
38
|
只写静态页(不装 Vue)时引这两行即可 —— 类名与 `data-*` 状态协议直接可用。
|
|
39
39
|
|
|
40
|
+
**② 的第一条 import 就是元素级 reset**(随包内置,不需要第三行):盒模型、按钮外观、
|
|
41
|
+
`ul` / `ol` 的序号与缩进、`a` 的下划线、标题的默认字阶一并归零。作用域锚 `[data-manohub-ui]`
|
|
42
|
+
且特异性为 0 —— 应用侧写任何元素选择器都能盖过它,所以**不必再自己写一份全局 reset**。
|
|
43
|
+
|
|
44
|
+
唯一需要留意的是**富文本**:reset 之后 `ul` / `li` 没有圆点、`a` 没有下划线也没有链接色,
|
|
45
|
+
需要富文本排版的页面请给自己的富文本容器类补回 `list-style` 与链接样式
|
|
46
|
+
(富文本排版暂无合规归属,见 `@manohub/kit/CONTRACT.md` §10)。
|
|
47
|
+
|
|
40
48
|
本包**可独立发布**:组件与类型一律从 `@manohub/ui` 直接引;下游(如 `@manohub/kit`)若转出口,是下游自己的选择。
|
|
41
49
|
|
|
42
50
|
```tsx
|
|
@@ -51,13 +59,13 @@ import { Card, Form, Tree, Checkbox } from '@manohub/ui'
|
|
|
51
59
|
| 数据展示 | `Tree`、`ListView`(+ `.CardItem`)、`Badge`、`Tag`(常规 / 状态 / 可选 / 新增 / 筛选片) |
|
|
52
60
|
| 展示 | `Avatar`(+ `.Group`)、`Skeleton`(行 / 列表 / 块状) |
|
|
53
61
|
| 表单基础(**自绘**) | `Button`(+ `.Group` / `.Divider`;五型 / 小号 / 加载 / 菜单按钮 / 连体切换)、`Input`(+ `.Group` / `.Chip` / `.Display` / `.Textarea`;清除 / 可见性切换 / 校验)、`Search`(搜索框:值 / 搜索 / 清空三条回调)、`Select`(单选 / 多选 / 搜索 / 加载;面板用原生 popover)、`Switch`(表格档 / 表单档) |
|
|
54
|
-
| 表单与选择 | `Form`(+ `.Header` / `.Item`;标签体系、成员归位、`v-model` 值收集与命令式 `clear()`)、`Filter`(+ `.Item`;`Form` 的壳:条件字段写成子件、控件自放、查询/重置与快照归一)、`Checkbox`、`Radio`(+ `.Group` / `.Card`;卡片式单选)、`Capsule`(胶囊选择器;胶囊 / 方形两档外形,与 `
|
|
62
|
+
| 表单与选择 | `Form`(+ `.Header` / `.Item`;标签体系、成员归位、`v-model` 值收集与命令式 `clear()`)、`Filter`(+ `.Item`;`Form` 的壳:条件字段写成子件、控件自放、查询/重置与快照归一)、`Checkbox`、`Radio`(+ `.Group` / `.Card`;卡片式单选)、`Capsule`(胶囊选择器;胶囊 / 方形两档外形,与 `Tabs` 组合即页签) |
|
|
55
63
|
| 反馈与三态 | `Notice`(条状提示)、`Notification`(通知卡:标题 + 头像 / 标签 / 操作 / 关闭位)、`QueryState`(三态容器;内建空 / 错误插画取自设计交付的四张 SVG,原样内联在 `src/utils/state-illustration.ts`)、`Loading`(转圈 + 遮罩:行内 / 区域 / 全屏三形态) |
|
|
56
64
|
| 反馈与引导(**自绘**) | `Toast`(消息提示:语义四档 / loading + 可选动作 + 自动消失计时 + `.Stack` 堆叠)、`Steps`(步骤条:节点式 / 燕尾段式 / `.Progress` 进度条) |
|
|
57
|
-
| 数据展示(**自绘**) | `Table`(列 × 数据 + 选择列 + 排序事件 + 固定表头 / 固定列 + 批量栏 / 合计行;排序与列宽拖拽算法归调用方)、`Pagination`(总数 / 每页条数 / 页码窗口 / 简单档 / 外框档)、`
|
|
65
|
+
| 数据展示(**自绘**) | `Table`(列 × 数据 + 选择列 + 排序事件 + 固定表头 / 固定列 + 批量栏 / 合计行;排序与列宽拖拽算法归调用方)、`Pagination`(总数 / 每页条数 / 页码窗口 / 简单档 / 外框档)、`TabBar`(下划线页签 + 「更多」收纳) |
|
|
58
66
|
| 内容与文件 | `Code`(行内 chip / 代码块 + 语言角标 + 图标复制位,**只读展示**)、`CodeEditor`(等宽多行可编辑代码区:按行自适应 / 限高内滚 / 只读、禁用)、`Upload`(+ `.Thumbs`;拖拽 / 点击上传区 + 已传文件列表) |
|
|
59
67
|
| 浮层(**自绘**) | `Dialog`(原生 `<dialog>` + 模态皮肤;关闭受控)、`Tooltip`(**零 JS**:显隐与定位全走操作层 hover 档) |
|
|
60
|
-
|
|
|
68
|
+
| 操作层(跨件原语) | `Collapse`(+ `.Stack`)、`Tabs`(+ `TabPanel`,面板切换骨架 —— 显隐归组件层,非零 JS 原语);浮层只提供样式层(`styles/operations/popup.css`,零 JS 可直接用),Vue 浮层仍用 farris 适配件 |
|
|
61
69
|
|
|
62
70
|
## 三态的操作按钮
|
|
63
71
|
|
|
@@ -212,7 +212,7 @@ export declare const Button: import("vue").DefineComponent<import("vue").Extract
|
|
|
212
212
|
}>> & Readonly<{}>, {
|
|
213
213
|
block: boolean;
|
|
214
214
|
size: ControlSize;
|
|
215
|
-
icon: "
|
|
215
|
+
icon: "search" | "link" | "filter" | "copy" | "help" | "table" | "menu" | "delete" | "image" | "close" | "key" | "page-title" | "loading" | "info" | "alert" | "chevron-left" | "chevron-right" | "chevron-down" | "chevron-up" | "check" | "user" | "download" | "back" | "folder" | "folder-open" | "file" | "file-code" | "file-json" | "file-text" | "terminal" | "shield" | "tool" | "plus" | "notification" | "settings" | "logout" | "home" | "workbench" | "apps" | "favorite" | "favorite-filled" | "drag-handle" | "edit" | "refresh" | "upload" | "save" | "more" | "preview" | "external-link" | "minus" | "plus-circle" | "close-circle" | "list" | "calendar" | "clock" | "lock" | "unlock" | "users" | "archive" | "package" | "plug" | "branch" | "tag" | "ai" | "shield-check" | "shield-alert" | "history";
|
|
216
216
|
menu: boolean;
|
|
217
217
|
caret: boolean;
|
|
218
218
|
disabled: boolean;
|
|
@@ -223,7 +223,7 @@ export declare const Button: import("vue").DefineComponent<import("vue").Extract
|
|
|
223
223
|
variant: ButtonVariant;
|
|
224
224
|
danger: boolean;
|
|
225
225
|
shape: ButtonShape;
|
|
226
|
-
trailingIcon: "
|
|
226
|
+
trailingIcon: "search" | "link" | "filter" | "copy" | "help" | "table" | "menu" | "delete" | "image" | "close" | "key" | "page-title" | "loading" | "info" | "alert" | "chevron-left" | "chevron-right" | "chevron-down" | "chevron-up" | "check" | "user" | "download" | "back" | "folder" | "folder-open" | "file" | "file-code" | "file-json" | "file-text" | "terminal" | "shield" | "tool" | "plus" | "notification" | "settings" | "logout" | "home" | "workbench" | "apps" | "favorite" | "favorite-filled" | "drag-handle" | "edit" | "refresh" | "upload" | "save" | "more" | "preview" | "external-link" | "minus" | "plus-circle" | "close-circle" | "list" | "calendar" | "clock" | "lock" | "unlock" | "users" | "archive" | "package" | "plug" | "branch" | "tag" | "ai" | "shield-check" | "shield-alert" | "history";
|
|
227
227
|
href: string;
|
|
228
228
|
target: string;
|
|
229
229
|
popoverTarget: string;
|
|
@@ -319,7 +319,7 @@ export declare const ButtonCompound: {
|
|
|
319
319
|
}>> & Readonly<{}>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, import("vue").PublicProps, {
|
|
320
320
|
block: boolean;
|
|
321
321
|
size: ControlSize;
|
|
322
|
-
icon: "
|
|
322
|
+
icon: "search" | "link" | "filter" | "copy" | "help" | "table" | "menu" | "delete" | "image" | "close" | "key" | "page-title" | "loading" | "info" | "alert" | "chevron-left" | "chevron-right" | "chevron-down" | "chevron-up" | "check" | "user" | "download" | "back" | "folder" | "folder-open" | "file" | "file-code" | "file-json" | "file-text" | "terminal" | "shield" | "tool" | "plus" | "notification" | "settings" | "logout" | "home" | "workbench" | "apps" | "favorite" | "favorite-filled" | "drag-handle" | "edit" | "refresh" | "upload" | "save" | "more" | "preview" | "external-link" | "minus" | "plus-circle" | "close-circle" | "list" | "calendar" | "clock" | "lock" | "unlock" | "users" | "archive" | "package" | "plug" | "branch" | "tag" | "ai" | "shield-check" | "shield-alert" | "history";
|
|
323
323
|
menu: boolean;
|
|
324
324
|
caret: boolean;
|
|
325
325
|
disabled: boolean;
|
|
@@ -330,7 +330,7 @@ export declare const ButtonCompound: {
|
|
|
330
330
|
variant: ButtonVariant;
|
|
331
331
|
danger: boolean;
|
|
332
332
|
shape: ButtonShape;
|
|
333
|
-
trailingIcon: "
|
|
333
|
+
trailingIcon: "search" | "link" | "filter" | "copy" | "help" | "table" | "menu" | "delete" | "image" | "close" | "key" | "page-title" | "loading" | "info" | "alert" | "chevron-left" | "chevron-right" | "chevron-down" | "chevron-up" | "check" | "user" | "download" | "back" | "folder" | "folder-open" | "file" | "file-code" | "file-json" | "file-text" | "terminal" | "shield" | "tool" | "plus" | "notification" | "settings" | "logout" | "home" | "workbench" | "apps" | "favorite" | "favorite-filled" | "drag-handle" | "edit" | "refresh" | "upload" | "save" | "more" | "preview" | "external-link" | "minus" | "plus-circle" | "close-circle" | "list" | "calendar" | "clock" | "lock" | "unlock" | "users" | "archive" | "package" | "plug" | "branch" | "tag" | "ai" | "shield-check" | "shield-alert" | "history";
|
|
334
334
|
href: string;
|
|
335
335
|
target: string;
|
|
336
336
|
popoverTarget: string;
|
|
@@ -431,7 +431,7 @@ export declare const ButtonCompound: {
|
|
|
431
431
|
}>> & Readonly<{}>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, {
|
|
432
432
|
block: boolean;
|
|
433
433
|
size: ControlSize;
|
|
434
|
-
icon: "
|
|
434
|
+
icon: "search" | "link" | "filter" | "copy" | "help" | "table" | "menu" | "delete" | "image" | "close" | "key" | "page-title" | "loading" | "info" | "alert" | "chevron-left" | "chevron-right" | "chevron-down" | "chevron-up" | "check" | "user" | "download" | "back" | "folder" | "folder-open" | "file" | "file-code" | "file-json" | "file-text" | "terminal" | "shield" | "tool" | "plus" | "notification" | "settings" | "logout" | "home" | "workbench" | "apps" | "favorite" | "favorite-filled" | "drag-handle" | "edit" | "refresh" | "upload" | "save" | "more" | "preview" | "external-link" | "minus" | "plus-circle" | "close-circle" | "list" | "calendar" | "clock" | "lock" | "unlock" | "users" | "archive" | "package" | "plug" | "branch" | "tag" | "ai" | "shield-check" | "shield-alert" | "history";
|
|
435
435
|
menu: boolean;
|
|
436
436
|
caret: boolean;
|
|
437
437
|
disabled: boolean;
|
|
@@ -442,7 +442,7 @@ export declare const ButtonCompound: {
|
|
|
442
442
|
variant: ButtonVariant;
|
|
443
443
|
danger: boolean;
|
|
444
444
|
shape: ButtonShape;
|
|
445
|
-
trailingIcon: "
|
|
445
|
+
trailingIcon: "search" | "link" | "filter" | "copy" | "help" | "table" | "menu" | "delete" | "image" | "close" | "key" | "page-title" | "loading" | "info" | "alert" | "chevron-left" | "chevron-right" | "chevron-down" | "chevron-up" | "check" | "user" | "download" | "back" | "folder" | "folder-open" | "file" | "file-code" | "file-json" | "file-text" | "terminal" | "shield" | "tool" | "plus" | "notification" | "settings" | "logout" | "home" | "workbench" | "apps" | "favorite" | "favorite-filled" | "drag-handle" | "edit" | "refresh" | "upload" | "save" | "more" | "preview" | "external-link" | "minus" | "plus-circle" | "close-circle" | "list" | "calendar" | "clock" | "lock" | "unlock" | "users" | "archive" | "package" | "plug" | "branch" | "tag" | "ai" | "shield-check" | "shield-alert" | "history";
|
|
446
446
|
href: string;
|
|
447
447
|
target: string;
|
|
448
448
|
popoverTarget: string;
|
|
@@ -537,7 +537,7 @@ export declare const ButtonCompound: {
|
|
|
537
537
|
}>> & Readonly<{}>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, {
|
|
538
538
|
block: boolean;
|
|
539
539
|
size: ControlSize;
|
|
540
|
-
icon: "
|
|
540
|
+
icon: "search" | "link" | "filter" | "copy" | "help" | "table" | "menu" | "delete" | "image" | "close" | "key" | "page-title" | "loading" | "info" | "alert" | "chevron-left" | "chevron-right" | "chevron-down" | "chevron-up" | "check" | "user" | "download" | "back" | "folder" | "folder-open" | "file" | "file-code" | "file-json" | "file-text" | "terminal" | "shield" | "tool" | "plus" | "notification" | "settings" | "logout" | "home" | "workbench" | "apps" | "favorite" | "favorite-filled" | "drag-handle" | "edit" | "refresh" | "upload" | "save" | "more" | "preview" | "external-link" | "minus" | "plus-circle" | "close-circle" | "list" | "calendar" | "clock" | "lock" | "unlock" | "users" | "archive" | "package" | "plug" | "branch" | "tag" | "ai" | "shield-check" | "shield-alert" | "history";
|
|
541
541
|
menu: boolean;
|
|
542
542
|
caret: boolean;
|
|
543
543
|
disabled: boolean;
|
|
@@ -548,7 +548,7 @@ export declare const ButtonCompound: {
|
|
|
548
548
|
variant: ButtonVariant;
|
|
549
549
|
danger: boolean;
|
|
550
550
|
shape: ButtonShape;
|
|
551
|
-
trailingIcon: "
|
|
551
|
+
trailingIcon: "search" | "link" | "filter" | "copy" | "help" | "table" | "menu" | "delete" | "image" | "close" | "key" | "page-title" | "loading" | "info" | "alert" | "chevron-left" | "chevron-right" | "chevron-down" | "chevron-up" | "check" | "user" | "download" | "back" | "folder" | "folder-open" | "file" | "file-code" | "file-json" | "file-text" | "terminal" | "shield" | "tool" | "plus" | "notification" | "settings" | "logout" | "home" | "workbench" | "apps" | "favorite" | "favorite-filled" | "drag-handle" | "edit" | "refresh" | "upload" | "save" | "more" | "preview" | "external-link" | "minus" | "plus-circle" | "close-circle" | "list" | "calendar" | "clock" | "lock" | "unlock" | "users" | "archive" | "package" | "plug" | "branch" | "tag" | "ai" | "shield-check" | "shield-alert" | "history";
|
|
552
552
|
href: string;
|
|
553
553
|
target: string;
|
|
554
554
|
popoverTarget: string;
|
|
@@ -25,15 +25,16 @@ export type CapsuleShape = 'pill' | 'square';
|
|
|
25
25
|
*
|
|
26
26
|
* ## 与面板组合(页签用法)
|
|
27
27
|
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
28
|
+
* 塞进 `Tabs` 的 `selector` 插槽即可:本件的 `onChange` 把选中值递给 `Tabs` 的 `select`,
|
|
29
|
+
* 面板显隐由 `Tabs` 按受控值下发 `hidden`。本件不认识 tabs,tabs 也不认识本件(两层零互指)。
|
|
30
|
+
* 故**不必**为了组合而给它 `name`(组名不传即按实例自动生成)。
|
|
30
31
|
*
|
|
31
32
|
* 状态三源等价:原生 `input:checked` / 组件下发 `[data-state='active'|'inactive']` / 静态档 `.is-selected`。
|
|
32
33
|
*
|
|
33
34
|
* ## 必须有值
|
|
34
35
|
*
|
|
35
36
|
* 单选语义就是必选其一:受控传 `modelValue`,非受控由 `defaultValue` 起,**两者都没给时缺省选中第一个
|
|
36
|
-
* 可选项**(跳过禁用项;没有可选项才是空值)—— 与 `Radio.Group` / `Radio.Card` / `
|
|
37
|
+
* 可选项**(跳过禁用项;没有可选项才是空值)—— 与 `Radio.Group` / `Radio.Card` / `Tabs` 同一条口径。
|
|
37
38
|
*
|
|
38
39
|
* @example 选项表
|
|
39
40
|
* <Capsule :options="[{label:'全部',value:'all'}]" v-model="v" />
|
|
@@ -42,10 +43,13 @@ export type CapsuleShape = 'pill' | 'square';
|
|
|
42
43
|
* <Capsule shape="square" :options="[{label:'全部',value:'all'}]" v-model="v" />
|
|
43
44
|
*
|
|
44
45
|
* @example 与面板组合(页签)
|
|
45
|
-
* <
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
46
|
+
* <Tabs v-model:value="v">
|
|
47
|
+
* {{
|
|
48
|
+
* selector: ({ value, options, select }) =>
|
|
49
|
+
* <Capsule :options="options" modelValue={value} onChange={select} />,
|
|
50
|
+
* default: () => [<TabPanel name="全部">…</TabPanel>, <TabPanel name="进行中">…</TabPanel>],
|
|
51
|
+
* }}
|
|
52
|
+
* </Tabs>
|
|
49
53
|
*/
|
|
50
54
|
export declare const Capsule: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
51
55
|
/** 选项表(也可用默认插槽自排) */
|
|
@@ -63,7 +67,7 @@ export declare const Capsule: import("vue").DefineComponent<import("vue").Extrac
|
|
|
63
67
|
type: PropType<string | number | undefined>;
|
|
64
68
|
default: undefined;
|
|
65
69
|
};
|
|
66
|
-
/**
|
|
70
|
+
/** 原生分组名(同名才互斥;不传即按实例自动生成) */
|
|
67
71
|
name: {
|
|
68
72
|
type: StringConstructor;
|
|
69
73
|
default: undefined;
|
|
@@ -111,7 +115,7 @@ export declare const Capsule: import("vue").DefineComponent<import("vue").Extrac
|
|
|
111
115
|
type: PropType<string | number | undefined>;
|
|
112
116
|
default: undefined;
|
|
113
117
|
};
|
|
114
|
-
/**
|
|
118
|
+
/** 原生分组名(同名才互斥;不传即按实例自动生成) */
|
|
115
119
|
name: {
|
|
116
120
|
type: StringConstructor;
|
|
117
121
|
default: undefined;
|
|
@@ -36,7 +36,10 @@ function renderHeaderParts(parts) {
|
|
|
36
36
|
}, [parts.extra])];
|
|
37
37
|
}
|
|
38
38
|
const mergeSegmentStyle = (attrsStyle, padding) => {
|
|
39
|
-
if (padding === void 0) return attrsStyle;
|
|
39
|
+
if (padding === void 0 || padding === "") return attrsStyle;
|
|
40
|
+
if (typeof padding === "string") return [attrsStyle, {
|
|
41
|
+
padding
|
|
42
|
+
}];
|
|
40
43
|
const y = typeof padding === "number" ? padding : padding.y;
|
|
41
44
|
const x = typeof padding === "number" ? padding : padding.x;
|
|
42
45
|
const style = {};
|
|
@@ -54,7 +57,7 @@ const CardHeader = /* @__PURE__ */ defineComponent({
|
|
|
54
57
|
props: {
|
|
55
58
|
/** 这一段的内距(横向 + 段间距):缺省吃组件令牌 `--mh-card-padding`(20px);下边由卡片末段统一补 */
|
|
56
59
|
padding: {
|
|
57
|
-
type: [Number, Object],
|
|
60
|
+
type: [Number, Object, String],
|
|
58
61
|
default: void 0
|
|
59
62
|
},
|
|
60
63
|
/** 图标:图片地址或返回节点的函数(图标一律来自 `@manohub/icon`) */
|
|
@@ -96,7 +99,7 @@ const CardBody = /* @__PURE__ */ defineComponent({
|
|
|
96
99
|
props: {
|
|
97
100
|
/** 这一段的内距(横向 + 段间距):缺省吃组件令牌 `--mh-card-padding`(20px);下边由卡片末段统一补 */
|
|
98
101
|
padding: {
|
|
99
|
-
type: [Number, Object],
|
|
102
|
+
type: [Number, Object, String],
|
|
100
103
|
default: void 0
|
|
101
104
|
}
|
|
102
105
|
},
|
|
@@ -117,7 +120,7 @@ const CardFooter = /* @__PURE__ */ defineComponent({
|
|
|
117
120
|
props: {
|
|
118
121
|
/** 这一段的内距(横向 + 段间距):缺省吃组件令牌 `--mh-card-padding`(20px);下边由卡片末段统一补 */
|
|
119
122
|
padding: {
|
|
120
|
-
type: [Number, Object],
|
|
123
|
+
type: [Number, Object, String],
|
|
121
124
|
default: void 0
|
|
122
125
|
}
|
|
123
126
|
},
|
|
@@ -63,6 +63,7 @@ const Checkbox = /* @__PURE__ */ defineComponent({
|
|
|
63
63
|
const state = props.indeterminate ? "indeterminate" : props.modelValue ? "checked" : "unchecked";
|
|
64
64
|
return createVNode("label", {
|
|
65
65
|
"class": ["mh-checkbox", props.size === "md" ? "" : `mh-checkbox--${props.size}`, props.disabled ? "is-disabled" : "", attrs.class].filter(Boolean).join(" "),
|
|
66
|
+
"data-inline-control": "true",
|
|
66
67
|
"style": attrs.style
|
|
67
68
|
}, [createVNode("input", mergeProps(inputAttrs.value, {
|
|
68
69
|
"ref": inputRef,
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { type PropType, type SlotsType, type VNodeChild } from 'vue';
|
|
2
2
|
export type DialogWidth = 'md' | 'lg';
|
|
3
|
+
/** 语义档:决定标题左侧裸符号的图形与颜色(缺省不渲染图标) */
|
|
4
|
+
export type DialogTone = 'info' | 'success' | 'warning' | 'error';
|
|
3
5
|
/**
|
|
4
6
|
* 对话框(**自绘**;模态语义与遮罩全由原生 `<dialog>` 给)。
|
|
5
7
|
*
|
|
@@ -45,6 +47,15 @@ export declare const Dialog: import("vue").DefineComponent<import("vue").Extract
|
|
|
45
47
|
type: StringConstructor;
|
|
46
48
|
default: undefined;
|
|
47
49
|
};
|
|
50
|
+
/**
|
|
51
|
+
* 语义档(缺省不渲染图标):`warning` / `error` 用于「这一步有风险」的确认 ——
|
|
52
|
+
* 服务层的 `confirm()` / `alert()` 就是靠它把「删除确认」与「保存成功」区分开的。
|
|
53
|
+
* 它**只加一个裸符号与配色**,不改标题文案、不动底栏按钮的语义(危险色仍由 `okDanger` 定)。
|
|
54
|
+
*/
|
|
55
|
+
tone: {
|
|
56
|
+
type: PropType<DialogTone>;
|
|
57
|
+
default: undefined;
|
|
58
|
+
};
|
|
48
59
|
/** 宽度:尺寸档 `md` 520 / `lg` 760,或直接给像素数 */
|
|
49
60
|
width: {
|
|
50
61
|
type: PropType<DialogWidth | number>;
|
|
@@ -55,17 +66,24 @@ export declare const Dialog: import("vue").DefineComponent<import("vue").Extract
|
|
|
55
66
|
type: BooleanConstructor;
|
|
56
67
|
default: boolean;
|
|
57
68
|
};
|
|
58
|
-
/**
|
|
69
|
+
/**
|
|
70
|
+
* 点遮罩是否关闭(**默认开**,与主流组件形态一致)。
|
|
71
|
+
*
|
|
72
|
+
* 组件是「受控弹窗」,用户点遮罩想退出是最常见的心智;「防误关」只对**命令式确认框**成立
|
|
73
|
+
* (那里一条误点就丢一次决策),故服务层的 `confirm()` / `alert()` 会**显式**传 `false` 把它关掉 ——
|
|
74
|
+
* 与 Ant Design 的分工相同(`<Modal maskClosable>` 默认 `true`,`Modal.confirm` 默认 `false`)。
|
|
75
|
+
* 表单类弹窗若怕手滑丢内容,自己显式传 `:close-on-backdrop="false"`。
|
|
76
|
+
*/
|
|
59
77
|
closeOnBackdrop: {
|
|
60
78
|
type: BooleanConstructor;
|
|
61
79
|
default: boolean;
|
|
62
80
|
};
|
|
63
|
-
/** `closeOnBackdrop`
|
|
81
|
+
/** `closeOnBackdrop` 的别名(主流库的通行叫法,两者取或;默认同 `true`) */
|
|
64
82
|
maskClosable: {
|
|
65
83
|
type: BooleanConstructor;
|
|
66
84
|
default: boolean;
|
|
67
85
|
};
|
|
68
|
-
/** Esc
|
|
86
|
+
/** Esc 是否关闭(缺省开,与 `closeOnBackdrop` 一致 —— 两者面对同一个「误关」风险,口径不得相反) */
|
|
69
87
|
keyboard: {
|
|
70
88
|
type: BooleanConstructor;
|
|
71
89
|
default: boolean;
|
|
@@ -75,6 +93,14 @@ export declare const Dialog: import("vue").DefineComponent<import("vue").Extract
|
|
|
75
93
|
type: StringConstructor;
|
|
76
94
|
default: undefined;
|
|
77
95
|
};
|
|
96
|
+
/**
|
|
97
|
+
* 固定高度(如 `480px` / `min(560px, 80vh)`)—— 与 `panelWidth` 对称。
|
|
98
|
+
* 给了之后内容区吃满剩余高度并自行滚动,页头与底栏始终可见(`styles/components/dialog.css` 的三段布局)。
|
|
99
|
+
*/
|
|
100
|
+
panelHeight: {
|
|
101
|
+
type: StringConstructor;
|
|
102
|
+
default: undefined;
|
|
103
|
+
};
|
|
78
104
|
/** 内建底栏:确定按钮文案 */
|
|
79
105
|
okText: {
|
|
80
106
|
type: StringConstructor;
|
|
@@ -128,6 +154,15 @@ export declare const Dialog: import("vue").DefineComponent<import("vue").Extract
|
|
|
128
154
|
type: StringConstructor;
|
|
129
155
|
default: undefined;
|
|
130
156
|
};
|
|
157
|
+
/**
|
|
158
|
+
* 语义档(缺省不渲染图标):`warning` / `error` 用于「这一步有风险」的确认 ——
|
|
159
|
+
* 服务层的 `confirm()` / `alert()` 就是靠它把「删除确认」与「保存成功」区分开的。
|
|
160
|
+
* 它**只加一个裸符号与配色**,不改标题文案、不动底栏按钮的语义(危险色仍由 `okDanger` 定)。
|
|
161
|
+
*/
|
|
162
|
+
tone: {
|
|
163
|
+
type: PropType<DialogTone>;
|
|
164
|
+
default: undefined;
|
|
165
|
+
};
|
|
131
166
|
/** 宽度:尺寸档 `md` 520 / `lg` 760,或直接给像素数 */
|
|
132
167
|
width: {
|
|
133
168
|
type: PropType<DialogWidth | number>;
|
|
@@ -138,17 +173,24 @@ export declare const Dialog: import("vue").DefineComponent<import("vue").Extract
|
|
|
138
173
|
type: BooleanConstructor;
|
|
139
174
|
default: boolean;
|
|
140
175
|
};
|
|
141
|
-
/**
|
|
176
|
+
/**
|
|
177
|
+
* 点遮罩是否关闭(**默认开**,与主流组件形态一致)。
|
|
178
|
+
*
|
|
179
|
+
* 组件是「受控弹窗」,用户点遮罩想退出是最常见的心智;「防误关」只对**命令式确认框**成立
|
|
180
|
+
* (那里一条误点就丢一次决策),故服务层的 `confirm()` / `alert()` 会**显式**传 `false` 把它关掉 ——
|
|
181
|
+
* 与 Ant Design 的分工相同(`<Modal maskClosable>` 默认 `true`,`Modal.confirm` 默认 `false`)。
|
|
182
|
+
* 表单类弹窗若怕手滑丢内容,自己显式传 `:close-on-backdrop="false"`。
|
|
183
|
+
*/
|
|
142
184
|
closeOnBackdrop: {
|
|
143
185
|
type: BooleanConstructor;
|
|
144
186
|
default: boolean;
|
|
145
187
|
};
|
|
146
|
-
/** `closeOnBackdrop`
|
|
188
|
+
/** `closeOnBackdrop` 的别名(主流库的通行叫法,两者取或;默认同 `true`) */
|
|
147
189
|
maskClosable: {
|
|
148
190
|
type: BooleanConstructor;
|
|
149
191
|
default: boolean;
|
|
150
192
|
};
|
|
151
|
-
/** Esc
|
|
193
|
+
/** Esc 是否关闭(缺省开,与 `closeOnBackdrop` 一致 —— 两者面对同一个「误关」风险,口径不得相反) */
|
|
152
194
|
keyboard: {
|
|
153
195
|
type: BooleanConstructor;
|
|
154
196
|
default: boolean;
|
|
@@ -158,6 +200,14 @@ export declare const Dialog: import("vue").DefineComponent<import("vue").Extract
|
|
|
158
200
|
type: StringConstructor;
|
|
159
201
|
default: undefined;
|
|
160
202
|
};
|
|
203
|
+
/**
|
|
204
|
+
* 固定高度(如 `480px` / `min(560px, 80vh)`)—— 与 `panelWidth` 对称。
|
|
205
|
+
* 给了之后内容区吃满剩余高度并自行滚动,页头与底栏始终可见(`styles/components/dialog.css` 的三段布局)。
|
|
206
|
+
*/
|
|
207
|
+
panelHeight: {
|
|
208
|
+
type: StringConstructor;
|
|
209
|
+
default: undefined;
|
|
210
|
+
};
|
|
161
211
|
/** 内建底栏:确定按钮文案 */
|
|
162
212
|
okText: {
|
|
163
213
|
type: StringConstructor;
|
|
@@ -207,10 +257,12 @@ export declare const Dialog: import("vue").DefineComponent<import("vue").Extract
|
|
|
207
257
|
onClose: () => void;
|
|
208
258
|
width: number | DialogWidth;
|
|
209
259
|
closable: boolean;
|
|
260
|
+
tone: DialogTone;
|
|
210
261
|
closeOnBackdrop: boolean;
|
|
211
262
|
maskClosable: boolean;
|
|
212
263
|
keyboard: boolean;
|
|
213
264
|
panelWidth: string;
|
|
265
|
+
panelHeight: string;
|
|
214
266
|
okText: string;
|
|
215
267
|
cancelText: string;
|
|
216
268
|
okDanger: boolean;
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { defineComponent, ref, watch, onMounted, onBeforeUnmount, computed, createVNode } from "vue";
|
|
2
2
|
import { Icon } from "@manohub/icon";
|
|
3
3
|
import { Button } from "../button/index.js";
|
|
4
|
+
const TONE_ICON = {
|
|
5
|
+
info: "info",
|
|
6
|
+
success: "check",
|
|
7
|
+
warning: "alert",
|
|
8
|
+
error: "close"
|
|
9
|
+
};
|
|
4
10
|
const Dialog = /* @__PURE__ */ defineComponent({
|
|
5
11
|
name: "Dialog",
|
|
6
12
|
inheritAttrs: false,
|
|
@@ -15,6 +21,15 @@ const Dialog = /* @__PURE__ */ defineComponent({
|
|
|
15
21
|
type: String,
|
|
16
22
|
default: void 0
|
|
17
23
|
},
|
|
24
|
+
/**
|
|
25
|
+
* 语义档(缺省不渲染图标):`warning` / `error` 用于「这一步有风险」的确认 ——
|
|
26
|
+
* 服务层的 `confirm()` / `alert()` 就是靠它把「删除确认」与「保存成功」区分开的。
|
|
27
|
+
* 它**只加一个裸符号与配色**,不改标题文案、不动底栏按钮的语义(危险色仍由 `okDanger` 定)。
|
|
28
|
+
*/
|
|
29
|
+
tone: {
|
|
30
|
+
type: String,
|
|
31
|
+
default: void 0
|
|
32
|
+
},
|
|
18
33
|
/** 宽度:尺寸档 `md` 520 / `lg` 760,或直接给像素数 */
|
|
19
34
|
width: {
|
|
20
35
|
type: [String, Number],
|
|
@@ -25,17 +40,24 @@ const Dialog = /* @__PURE__ */ defineComponent({
|
|
|
25
40
|
type: Boolean,
|
|
26
41
|
default: true
|
|
27
42
|
},
|
|
28
|
-
/**
|
|
43
|
+
/**
|
|
44
|
+
* 点遮罩是否关闭(**默认开**,与主流组件形态一致)。
|
|
45
|
+
*
|
|
46
|
+
* 组件是「受控弹窗」,用户点遮罩想退出是最常见的心智;「防误关」只对**命令式确认框**成立
|
|
47
|
+
* (那里一条误点就丢一次决策),故服务层的 `confirm()` / `alert()` 会**显式**传 `false` 把它关掉 ——
|
|
48
|
+
* 与 Ant Design 的分工相同(`<Modal maskClosable>` 默认 `true`,`Modal.confirm` 默认 `false`)。
|
|
49
|
+
* 表单类弹窗若怕手滑丢内容,自己显式传 `:close-on-backdrop="false"`。
|
|
50
|
+
*/
|
|
29
51
|
closeOnBackdrop: {
|
|
30
52
|
type: Boolean,
|
|
31
|
-
default:
|
|
53
|
+
default: true
|
|
32
54
|
},
|
|
33
|
-
/** `closeOnBackdrop`
|
|
55
|
+
/** `closeOnBackdrop` 的别名(主流库的通行叫法,两者取或;默认同 `true`) */
|
|
34
56
|
maskClosable: {
|
|
35
57
|
type: Boolean,
|
|
36
|
-
default:
|
|
58
|
+
default: true
|
|
37
59
|
},
|
|
38
|
-
/** Esc
|
|
60
|
+
/** Esc 是否关闭(缺省开,与 `closeOnBackdrop` 一致 —— 两者面对同一个「误关」风险,口径不得相反) */
|
|
39
61
|
keyboard: {
|
|
40
62
|
type: Boolean,
|
|
41
63
|
default: true
|
|
@@ -45,6 +67,14 @@ const Dialog = /* @__PURE__ */ defineComponent({
|
|
|
45
67
|
type: String,
|
|
46
68
|
default: void 0
|
|
47
69
|
},
|
|
70
|
+
/**
|
|
71
|
+
* 固定高度(如 `480px` / `min(560px, 80vh)`)—— 与 `panelWidth` 对称。
|
|
72
|
+
* 给了之后内容区吃满剩余高度并自行滚动,页头与底栏始终可见(`styles/components/dialog.css` 的三段布局)。
|
|
73
|
+
*/
|
|
74
|
+
panelHeight: {
|
|
75
|
+
type: String,
|
|
76
|
+
default: void 0
|
|
77
|
+
},
|
|
48
78
|
/** 内建底栏:确定按钮文案 */
|
|
49
79
|
okText: {
|
|
50
80
|
type: String,
|
|
@@ -139,11 +169,15 @@ const Dialog = /* @__PURE__ */ defineComponent({
|
|
|
139
169
|
};
|
|
140
170
|
return void 0;
|
|
141
171
|
});
|
|
172
|
+
const heightStyle = computed(() => props.panelHeight ? {
|
|
173
|
+
height: props.panelHeight
|
|
174
|
+
} : void 0);
|
|
142
175
|
return () => createVNode("dialog", {
|
|
143
176
|
"ref": dialogRef,
|
|
144
|
-
"class": ["mh-popup", "mh-dialog", props.width === "lg" ? "mh-dialog--lg" : "", attrs.class].filter(Boolean).join(" "),
|
|
177
|
+
"class": ["mh-popup", "mh-dialog", props.width === "lg" ? "mh-dialog--lg" : "", props.tone ? `mh-dialog--${props.tone}` : "", attrs.class].filter(Boolean).join(" "),
|
|
145
178
|
"style": {
|
|
146
179
|
...widthStyle.value,
|
|
180
|
+
...heightStyle.value,
|
|
147
181
|
...attrs.style
|
|
148
182
|
},
|
|
149
183
|
"onCancel": (event) => {
|
|
@@ -156,9 +190,12 @@ const Dialog = /* @__PURE__ */ defineComponent({
|
|
|
156
190
|
requestClose("close");
|
|
157
191
|
}
|
|
158
192
|
}
|
|
159
|
-
}, [props.title || slots.title || props.closable ? createVNode("div", {
|
|
193
|
+
}, [props.title || slots.title || props.closable || props.tone ? createVNode("div", {
|
|
160
194
|
"class": "mh-dialog__header"
|
|
161
|
-
}, [createVNode(
|
|
195
|
+
}, [props.tone ? createVNode(Icon, {
|
|
196
|
+
"name": TONE_ICON[props.tone],
|
|
197
|
+
"class": "mh-dialog__tone-icon"
|
|
198
|
+
}, null) : null, createVNode("span", {
|
|
162
199
|
"class": "mh-dialog__title"
|
|
163
200
|
}, [slots.title ? slots.title() : props.title]), props.closable ? createVNode("button", {
|
|
164
201
|
"type": "button",
|
|
@@ -62,17 +62,23 @@ export declare const Drawer: import("vue").DefineComponent<import("vue").Extract
|
|
|
62
62
|
type: BooleanConstructor;
|
|
63
63
|
default: boolean;
|
|
64
64
|
};
|
|
65
|
-
/**
|
|
65
|
+
/**
|
|
66
|
+
* 点遮罩是否关闭(**默认开**,与主流组件形态一致)。
|
|
67
|
+
*
|
|
68
|
+
* 与 `Dialog` 同一口径:组件形态默认开,「防误关」只对**命令式**形态成立
|
|
69
|
+
* (服务层的 `confirm()` / `alert()` 显式传 `false`)。
|
|
70
|
+
* 表单类抽屉若怕手滑丢内容,自己显式传 `:close-on-backdrop="false"`。
|
|
71
|
+
*/
|
|
66
72
|
closeOnBackdrop: {
|
|
67
73
|
type: BooleanConstructor;
|
|
68
74
|
default: boolean;
|
|
69
75
|
};
|
|
70
|
-
/** `closeOnBackdrop`
|
|
76
|
+
/** `closeOnBackdrop` 的别名(主流库的通行叫法,两者取或;默认同 `true`) */
|
|
71
77
|
maskClosable: {
|
|
72
78
|
type: BooleanConstructor;
|
|
73
79
|
default: boolean;
|
|
74
80
|
};
|
|
75
|
-
/** Esc
|
|
81
|
+
/** Esc 是否关闭(缺省开,与 `closeOnBackdrop` 一致) */
|
|
76
82
|
keyboard: {
|
|
77
83
|
type: BooleanConstructor;
|
|
78
84
|
default: boolean;
|
|
@@ -145,17 +151,23 @@ export declare const Drawer: import("vue").DefineComponent<import("vue").Extract
|
|
|
145
151
|
type: BooleanConstructor;
|
|
146
152
|
default: boolean;
|
|
147
153
|
};
|
|
148
|
-
/**
|
|
154
|
+
/**
|
|
155
|
+
* 点遮罩是否关闭(**默认开**,与主流组件形态一致)。
|
|
156
|
+
*
|
|
157
|
+
* 与 `Dialog` 同一口径:组件形态默认开,「防误关」只对**命令式**形态成立
|
|
158
|
+
* (服务层的 `confirm()` / `alert()` 显式传 `false`)。
|
|
159
|
+
* 表单类抽屉若怕手滑丢内容,自己显式传 `:close-on-backdrop="false"`。
|
|
160
|
+
*/
|
|
149
161
|
closeOnBackdrop: {
|
|
150
162
|
type: BooleanConstructor;
|
|
151
163
|
default: boolean;
|
|
152
164
|
};
|
|
153
|
-
/** `closeOnBackdrop`
|
|
165
|
+
/** `closeOnBackdrop` 的别名(主流库的通行叫法,两者取或;默认同 `true`) */
|
|
154
166
|
maskClosable: {
|
|
155
167
|
type: BooleanConstructor;
|
|
156
168
|
default: boolean;
|
|
157
169
|
};
|
|
158
|
-
/** Esc
|
|
170
|
+
/** Esc 是否关闭(缺省开,与 `closeOnBackdrop` 一致) */
|
|
159
171
|
keyboard: {
|
|
160
172
|
type: BooleanConstructor;
|
|
161
173
|
default: boolean;
|
|
@@ -30,17 +30,23 @@ const Drawer = /* @__PURE__ */ defineComponent({
|
|
|
30
30
|
type: Boolean,
|
|
31
31
|
default: true
|
|
32
32
|
},
|
|
33
|
-
/**
|
|
33
|
+
/**
|
|
34
|
+
* 点遮罩是否关闭(**默认开**,与主流组件形态一致)。
|
|
35
|
+
*
|
|
36
|
+
* 与 `Dialog` 同一口径:组件形态默认开,「防误关」只对**命令式**形态成立
|
|
37
|
+
* (服务层的 `confirm()` / `alert()` 显式传 `false`)。
|
|
38
|
+
* 表单类抽屉若怕手滑丢内容,自己显式传 `:close-on-backdrop="false"`。
|
|
39
|
+
*/
|
|
34
40
|
closeOnBackdrop: {
|
|
35
41
|
type: Boolean,
|
|
36
|
-
default:
|
|
42
|
+
default: true
|
|
37
43
|
},
|
|
38
|
-
/** `closeOnBackdrop`
|
|
44
|
+
/** `closeOnBackdrop` 的别名(主流库的通行叫法,两者取或;默认同 `true`) */
|
|
39
45
|
maskClosable: {
|
|
40
46
|
type: Boolean,
|
|
41
|
-
default:
|
|
47
|
+
default: true
|
|
42
48
|
},
|
|
43
|
-
/** Esc
|
|
49
|
+
/** Esc 是否关闭(缺省开,与 `closeOnBackdrop` 一致) */
|
|
44
50
|
keyboard: {
|
|
45
51
|
type: Boolean,
|
|
46
52
|
default: true
|