@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.
Files changed (69) hide show
  1. package/README.md +12 -4
  2. package/dist/components/button/index.d.ts +8 -8
  3. package/dist/components/capsule/index.d.ts +13 -9
  4. package/dist/components/capsule/index.js +1 -1
  5. package/dist/components/card/index.js +7 -4
  6. package/dist/components/checkbox/index.js +1 -0
  7. package/dist/components/dialog/index.d.ts +58 -6
  8. package/dist/components/dialog/index.js +45 -8
  9. package/dist/components/drawer/index.d.ts +18 -6
  10. package/dist/components/drawer/index.js +11 -5
  11. package/dist/components/form/index.d.ts +115 -17
  12. package/dist/components/form/index.js +39 -9
  13. package/dist/components/input/index.d.ts +4 -4
  14. package/dist/components/input/index.js +1 -1
  15. package/dist/components/layout/index.d.ts +43 -1
  16. package/dist/components/layout/index.js +22 -2
  17. package/dist/components/notice/index.d.ts +24 -11
  18. package/dist/components/notice/index.js +11 -5
  19. package/dist/components/notification/index.d.ts +2 -2
  20. package/dist/components/page/index.js +4 -4
  21. package/dist/components/panel/index.js +4 -4
  22. package/dist/components/part-padding.d.ts +9 -6
  23. package/dist/components/part-padding.js +2 -1
  24. package/dist/components/radio/index.d.ts +1 -1
  25. package/dist/components/radio/index.js +1 -0
  26. package/dist/components/search/index.d.ts +26 -6
  27. package/dist/components/search/index.js +22 -4
  28. package/dist/components/steps/index.d.ts +232 -6
  29. package/dist/components/steps/index.js +84 -26
  30. package/dist/components/switch/index.d.ts +29 -5
  31. package/dist/components/switch/index.js +8 -2
  32. package/dist/components/tabbar/index.d.ts +184 -0
  33. package/dist/components/tabbar/index.js +161 -0
  34. package/dist/components/table/index.d.ts +74 -8
  35. package/dist/components/table/index.js +69 -16
  36. package/dist/components/tabs/index.d.ts +145 -125
  37. package/dist/components/tabs/index.js +93 -117
  38. package/dist/components/tag/index.d.ts +2 -2
  39. package/dist/components/text/index.d.ts +120 -0
  40. package/dist/components/text/index.js +55 -0
  41. package/dist/components/toast/index.d.ts +8 -8
  42. package/dist/components/toast/index.js +11 -2
  43. package/dist/components/upload/index.d.ts +30 -0
  44. package/dist/components/upload/index.js +7 -1
  45. package/dist/index.d.ts +6 -5
  46. package/dist/index.js +6 -3
  47. package/dist/services/dialog.d.ts +20 -5
  48. package/dist/services/dialog.js +8 -1
  49. package/dist/styles/components/capsule.css +4 -4
  50. package/dist/styles/components/dialog.css +40 -1
  51. package/dist/styles/components/form.css +206 -26
  52. package/dist/styles/components/input.css +29 -2
  53. package/dist/styles/components/layout.css +2 -0
  54. package/dist/styles/components/select.css +11 -0
  55. package/dist/styles/components/steps.css +48 -0
  56. package/dist/styles/components/{tabs.css → tabbar.css} +66 -65
  57. package/dist/styles/components/tabbar.tokens.css +30 -0
  58. package/dist/styles/components/table.css +50 -1
  59. package/dist/styles/components/table.tokens.css +3 -0
  60. package/dist/styles/components/text.css +101 -0
  61. package/dist/styles/components/toast.css +12 -6
  62. package/dist/styles/index.css +8 -4
  63. package/dist/styles/operations/tabs.css +73 -0
  64. package/dist/styles/reset.css +205 -0
  65. package/package.json +2 -2
  66. package/dist/components/tabset/index.d.ts +0 -105
  67. package/dist/components/tabset/index.js +0 -68
  68. package/dist/styles/components/tabs.tokens.css +0 -30
  69. 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`(胶囊选择器;胶囊 / 方形两档外形,与 `Tabset` 组合即页签) |
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`(总数 / 每页条数 / 页码窗口 / 简单档 / 外框档)、`Tabs`(下划线页签 + 「更多」收纳) |
65
+ | 数据展示(**自绘**) | `Table`(列 × 数据 + 选择列 + 排序事件 + 固定表头 / 固定列 + 批量栏 / 合计行;排序与列宽拖拽算法归调用方)、`Pagination`(总数 / 每页条数 / 页码窗口 / 简单档 / 外框档)、`TabBar`(下划线页签 + 「更多」收纳) |
58
66
  | 内容与文件 | `Code`(行内 chip / 代码块 + 语言角标 + 图标复制位,**只读展示**)、`CodeEditor`(等宽多行可编辑代码区:按行自适应 / 限高内滚 / 只读、禁用)、`Upload`(+ `.Thumbs`;拖拽 / 点击上传区 + 已传文件列表) |
59
67
  | 浮层(**自绘**) | `Dialog`(原生 `<dialog>` + 模态皮肤;关闭受控)、`Tooltip`(**零 JS**:显隐与定位全走操作层 hover 档) |
60
- | 操作层(零 JS 原语) | `Collapse`(+ `.Stack`)、`Tabset`;浮层只提供样式层(`styles/operations/popup.css`,零 JS 可直接用),Vue 浮层仍用 farris 适配件 |
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: "filter" | "copy" | "help" | "table" | "menu" | "search" | "link" | "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" | "wrench" | "plus" | "bell" | "settings" | "logout" | "home" | "workbench" | "grid-dots" | "heart" | "heart-filled" | "edit" | "refresh" | "upload" | "save" | "more" | "eye" | "external-link" | "minus" | "plus-circle" | "close-circle" | "list" | "calendar" | "clock" | "lock" | "unlock" | "users" | "archive" | "package" | "plug" | "branch" | "tag" | "sparkles" | "shield-check" | "shield-alert" | "history";
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: "filter" | "copy" | "help" | "table" | "menu" | "search" | "link" | "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" | "wrench" | "plus" | "bell" | "settings" | "logout" | "home" | "workbench" | "grid-dots" | "heart" | "heart-filled" | "edit" | "refresh" | "upload" | "save" | "more" | "eye" | "external-link" | "minus" | "plus-circle" | "close-circle" | "list" | "calendar" | "clock" | "lock" | "unlock" | "users" | "archive" | "package" | "plug" | "branch" | "tag" | "sparkles" | "shield-check" | "shield-alert" | "history";
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: "filter" | "copy" | "help" | "table" | "menu" | "search" | "link" | "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" | "wrench" | "plus" | "bell" | "settings" | "logout" | "home" | "workbench" | "grid-dots" | "heart" | "heart-filled" | "edit" | "refresh" | "upload" | "save" | "more" | "eye" | "external-link" | "minus" | "plus-circle" | "close-circle" | "list" | "calendar" | "clock" | "lock" | "unlock" | "users" | "archive" | "package" | "plug" | "branch" | "tag" | "sparkles" | "shield-check" | "shield-alert" | "history";
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: "filter" | "copy" | "help" | "table" | "menu" | "search" | "link" | "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" | "wrench" | "plus" | "bell" | "settings" | "logout" | "home" | "workbench" | "grid-dots" | "heart" | "heart-filled" | "edit" | "refresh" | "upload" | "save" | "more" | "eye" | "external-link" | "minus" | "plus-circle" | "close-circle" | "list" | "calendar" | "clock" | "lock" | "unlock" | "users" | "archive" | "package" | "plug" | "branch" | "tag" | "sparkles" | "shield-check" | "shield-alert" | "history";
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: "filter" | "copy" | "help" | "table" | "menu" | "search" | "link" | "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" | "wrench" | "plus" | "bell" | "settings" | "logout" | "home" | "workbench" | "grid-dots" | "heart" | "heart-filled" | "edit" | "refresh" | "upload" | "save" | "more" | "eye" | "external-link" | "minus" | "plus-circle" | "close-circle" | "list" | "calendar" | "clock" | "lock" | "unlock" | "users" | "archive" | "package" | "plug" | "branch" | "tag" | "sparkles" | "shield-check" | "shield-alert" | "history";
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: "filter" | "copy" | "help" | "table" | "menu" | "search" | "link" | "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" | "wrench" | "plus" | "bell" | "settings" | "logout" | "home" | "workbench" | "grid-dots" | "heart" | "heart-filled" | "edit" | "refresh" | "upload" | "save" | "more" | "eye" | "external-link" | "minus" | "plus-circle" | "close-circle" | "list" | "calendar" | "clock" | "lock" | "unlock" | "users" | "archive" | "package" | "plug" | "branch" | "tag" | "sparkles" | "shield-check" | "shield-alert" | "history";
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: "filter" | "copy" | "help" | "table" | "menu" | "search" | "link" | "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" | "wrench" | "plus" | "bell" | "settings" | "logout" | "home" | "workbench" | "grid-dots" | "heart" | "heart-filled" | "edit" | "refresh" | "upload" | "save" | "more" | "eye" | "external-link" | "minus" | "plus-circle" | "close-circle" | "list" | "calendar" | "clock" | "lock" | "unlock" | "users" | "archive" | "package" | "plug" | "branch" | "tag" | "sparkles" | "shield-check" | "shield-alert" | "history";
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: "filter" | "copy" | "help" | "table" | "menu" | "search" | "link" | "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" | "wrench" | "plus" | "bell" | "settings" | "logout" | "home" | "workbench" | "grid-dots" | "heart" | "heart-filled" | "edit" | "refresh" | "upload" | "save" | "more" | "eye" | "external-link" | "minus" | "plus-circle" | "close-circle" | "list" | "calendar" | "clock" | "lock" | "unlock" | "users" | "archive" | "package" | "plug" | "branch" | "tag" | "sparkles" | "shield-check" | "shield-alert" | "history";
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
- * 外面套 `styles/operations/tabset.css` 的 `.mh-tabset`:**同一组 `name` 的 radio** 既是本件的选项、
29
- * 也是操作层的档位开关(第 n 项 ↔ 第 n 块面板)。本件不认识 tabset,tabset 也不认识本件(两层零互指)。
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` / `Tabset` 同一条口径。
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
- * <div class="mh-tabset">
46
- * <Capsule name="t1" :options="tabs" v-model="v" />
47
- * <div class="mh-tabset-panels">…第 n 块面板…</div>
48
- * </div>
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
- /** 原生分组名(与 tabset 组合时**必须**给,操作层靠它认组;缺省自动生成) */
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
- /** 原生分组名(与 tabset 组合时**必须**给,操作层靠它认组;缺省自动生成) */
118
+ /** 原生分组名(同名才互斥;不传即按实例自动生成) */
115
119
  name: {
116
120
  type: StringConstructor;
117
121
  default: undefined;
@@ -18,7 +18,7 @@ const Capsule = /* @__PURE__ */ defineComponent({
18
18
  type: [String, Number],
19
19
  default: void 0
20
20
  },
21
- /** 原生分组名(与 tabset 组合时**必须**给,操作层靠它认组;缺省自动生成) */
21
+ /** 原生分组名(同名才互斥;不传即按实例自动生成) */
22
22
  name: {
23
23
  type: String,
24
24
  default: void 0
@@ -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: false
53
+ default: true
32
54
  },
33
- /** `closeOnBackdrop` 的别名(主流库的通行叫法,两者取或) */
55
+ /** `closeOnBackdrop` 的别名(主流库的通行叫法,两者取或;默认同 `true`) */
34
56
  maskClosable: {
35
57
  type: Boolean,
36
- default: false
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("span", {
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: false
42
+ default: true
37
43
  },
38
- /** `closeOnBackdrop` 的别名(主流库的通行叫法,两者取或) */
44
+ /** `closeOnBackdrop` 的别名(主流库的通行叫法,两者取或;默认同 `true`) */
39
45
  maskClosable: {
40
46
  type: Boolean,
41
- default: false
47
+ default: true
42
48
  },
43
- /** Esc 是否关闭(缺省开;表单类抽屉常关掉它,防手滑丢内容) */
49
+ /** Esc 是否关闭(缺省开,与 `closeOnBackdrop` 一致) */
44
50
  keyboard: {
45
51
  type: Boolean,
46
52
  default: true