@teamix-evo/ui 0.1.1 → 0.3.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.
- package/README.md +184 -184
- package/manifest.json +680 -492
- package/package.json +20 -10
- package/src/components/accordion/accordion.meta.md +5 -4
- package/src/components/accordion/accordion.stories.tsx +14 -9
- package/src/components/accordion/accordion.tsx +104 -8
- package/src/components/affix/affix.meta.md +20 -2
- package/src/components/affix/affix.stories.tsx +102 -25
- package/src/components/affix/affix.tsx +79 -9
- package/src/components/alert/alert.meta.md +44 -13
- package/src/components/alert/alert.stories.tsx +66 -21
- package/src/components/alert/alert.tsx +81 -34
- package/src/components/alert-dialog/alert-dialog.meta.md +61 -16
- package/src/components/alert-dialog/alert-dialog.stories.tsx +145 -3
- package/src/components/alert-dialog/alert-dialog.tsx +60 -13
- package/src/components/anchor/anchor.meta.md +8 -3
- package/src/components/anchor/anchor.stories.tsx +3 -3
- package/src/components/anchor/anchor.tsx +2 -2
- package/src/components/app/app.meta.md +9 -4
- package/src/components/app/app.stories.tsx +9 -7
- package/src/components/aspect-ratio/aspect-ratio.meta.md +4 -3
- package/src/components/aspect-ratio/aspect-ratio.stories.tsx +3 -3
- package/src/components/auto-complete/auto-complete.meta.md +14 -6
- package/src/components/auto-complete/auto-complete.stories.tsx +47 -4
- package/src/components/auto-complete/auto-complete.tsx +119 -71
- package/src/components/avatar/avatar.meta.md +6 -7
- package/src/components/avatar/avatar.stories.tsx +21 -3
- package/src/components/avatar/avatar.tsx +24 -23
- package/src/components/badge/badge.meta.md +10 -9
- package/src/components/badge/badge.stories.tsx +2 -2
- package/src/components/badge/badge.tsx +9 -15
- package/src/components/breadcrumb/breadcrumb.meta.md +27 -7
- package/src/components/breadcrumb/breadcrumb.stories.tsx +127 -4
- package/src/components/breadcrumb/breadcrumb.tsx +22 -8
- package/src/components/button/button.meta.md +258 -21
- package/src/components/button/button.stories.tsx +549 -41
- package/src/components/button/button.tsx +335 -33
- package/src/components/button/demo/as-child.tsx +24 -0
- package/src/components/button/demo/basic.tsx +8 -0
- package/src/components/button/demo/block.tsx +16 -0
- package/src/components/button/demo/loading.tsx +19 -0
- package/src/components/button/demo/shapes.tsx +18 -0
- package/src/components/button/demo/sizes.tsx +19 -0
- package/src/components/button/demo/variants.tsx +19 -0
- package/src/components/button/demo/with-icon.tsx +20 -0
- package/src/components/calendar/calendar.meta.md +13 -3
- package/src/components/calendar/calendar.stories.tsx +6 -6
- package/src/components/calendar/calendar.tsx +73 -8
- package/src/components/card/card.meta.md +27 -5
- package/src/components/card/card.stories.tsx +42 -3
- package/src/components/card/card.tsx +146 -63
- package/src/components/carousel/carousel.meta.md +4 -3
- package/src/components/carousel/carousel.stories.tsx +11 -6
- package/src/components/cascader/cascader.meta.md +47 -17
- package/src/components/cascader/cascader.stories.tsx +22 -10
- package/src/components/cascader/cascader.tsx +428 -85
- package/src/components/checkbox/checkbox.meta.md +75 -7
- package/src/components/checkbox/checkbox.stories.tsx +161 -3
- package/src/components/checkbox/checkbox.tsx +77 -9
- package/src/components/collapsible/collapsible.meta.md +14 -6
- package/src/components/collapsible/collapsible.stories.tsx +10 -2
- package/src/components/collapsible/collapsible.tsx +93 -6
- package/src/components/color-picker/color-picker.meta.md +12 -7
- package/src/components/color-picker/color-picker.stories.tsx +86 -7
- package/src/components/color-picker/color-picker.tsx +20 -9
- package/src/components/command/command.meta.md +29 -13
- package/src/components/command/command.stories.tsx +4 -4
- package/src/components/command/command.tsx +19 -8
- package/src/components/context-menu/context-menu.meta.md +11 -8
- package/src/components/context-menu/context-menu.stories.tsx +11 -3
- package/src/components/context-menu/context-menu.tsx +21 -8
- package/src/components/data-table/data-table.meta.md +6 -5
- package/src/components/data-table/data-table.stories.tsx +13 -6
- package/src/components/data-table/data-table.tsx +2 -2
- package/src/components/date-picker/date-picker.meta.md +88 -19
- package/src/components/date-picker/date-picker.stories.tsx +55 -5
- package/src/components/date-picker/date-picker.tsx +1489 -91
- package/src/components/descriptions/descriptions.meta.md +10 -5
- package/src/components/descriptions/descriptions.stories.tsx +3 -3
- package/src/components/descriptions/descriptions.tsx +22 -14
- package/src/components/dialog/dialog.meta.md +76 -13
- package/src/components/dialog/dialog.stories.tsx +182 -20
- package/src/components/dialog/dialog.tsx +67 -15
- package/src/components/dialog/imperative.tsx +252 -0
- package/src/components/drawer/drawer.meta.md +33 -34
- package/src/components/drawer/drawer.stories.tsx +29 -12
- package/src/components/drawer/drawer.tsx +22 -113
- package/src/components/dropdown-menu/dropdown-menu.meta.md +78 -10
- package/src/components/dropdown-menu/dropdown-menu.stories.tsx +88 -2
- package/src/components/dropdown-menu/dropdown-menu.tsx +24 -10
- package/src/components/ellipsis/ellipsis.meta.md +87 -0
- package/src/components/ellipsis/ellipsis.stories.tsx +72 -0
- package/src/components/ellipsis/ellipsis.tsx +153 -0
- package/src/components/empty/empty.meta.md +9 -4
- package/src/components/empty/empty.stories.tsx +4 -4
- package/src/components/empty/empty.tsx +10 -3
- package/src/components/field/field.meta.md +47 -9
- package/src/components/field/field.stories.tsx +385 -5
- package/src/components/field/field.tsx +263 -35
- package/src/components/filter-bar/filter-bar.meta.md +92 -0
- package/src/components/filter-bar/filter-bar.stories.tsx +1083 -0
- package/src/components/filter-bar/filter-bar.tsx +568 -0
- package/src/components/flex/flex.meta.md +54 -6
- package/src/components/flex/flex.stories.tsx +107 -20
- package/src/components/flex/flex.tsx +27 -4
- package/src/components/float-button/float-button.meta.md +8 -3
- package/src/components/float-button/float-button.stories.tsx +9 -7
- package/src/components/float-button/float-button.tsx +1 -1
- package/src/components/form/form.meta.md +39 -17
- package/src/components/form/form.stories.tsx +350 -3
- package/src/components/form/form.tsx +101 -35
- package/src/components/grid/grid.meta.md +7 -2
- package/src/components/grid/grid.stories.tsx +6 -4
- package/src/components/hover-card/hover-card.meta.md +20 -9
- package/src/components/hover-card/hover-card.stories.tsx +34 -5
- package/src/components/hover-card/hover-card.tsx +51 -13
- package/src/components/icon/DEVELOPMENT.md +809 -0
- package/src/components/icon/icon.meta.md +170 -0
- package/src/components/icon/icon.stories.tsx +344 -0
- package/src/components/icon/icon.tsx +248 -0
- package/src/components/image/image.meta.md +9 -4
- package/src/components/image/image.stories.tsx +3 -3
- package/src/components/image/image.tsx +6 -4
- package/src/components/input/demo/basic.tsx +12 -0
- package/src/components/input/demo/clearable.tsx +21 -0
- package/src/components/input/demo/show-count.tsx +18 -0
- package/src/components/input/demo/sizes.tsx +15 -0
- package/src/components/input/input.meta.md +39 -33
- package/src/components/input/input.stories.tsx +62 -35
- package/src/components/input/input.tsx +97 -98
- package/src/components/input-group/input-group.meta.md +54 -22
- package/src/components/input-group/input-group.stories.tsx +49 -16
- package/src/components/input-group/input-group.tsx +44 -8
- package/src/components/input-number/input-number.meta.md +64 -7
- package/src/components/input-number/input-number.stories.tsx +46 -8
- package/src/components/input-number/input-number.tsx +99 -26
- package/src/components/input-otp/input-otp.meta.md +4 -3
- package/src/components/input-otp/input-otp.stories.tsx +3 -3
- package/src/components/input-otp/input-otp.tsx +1 -1
- package/src/components/item/item.meta.md +8 -3
- package/src/components/item/item.stories.tsx +8 -5
- package/src/components/item/item.tsx +7 -6
- package/src/components/kbd/kbd.meta.md +13 -4
- package/src/components/kbd/kbd.stories.tsx +4 -4
- package/src/components/kbd/kbd.tsx +10 -5
- package/src/components/label/label.meta.md +18 -10
- package/src/components/label/label.stories.tsx +64 -6
- package/src/components/label/label.tsx +91 -19
- package/src/components/masonry/masonry.meta.md +8 -3
- package/src/components/masonry/masonry.stories.tsx +7 -5
- package/src/components/masonry/masonry.tsx +1 -0
- package/src/components/mentions/mentions.meta.md +36 -6
- package/src/components/mentions/mentions.stories.tsx +120 -6
- package/src/components/mentions/mentions.tsx +11 -5
- package/src/components/menubar/menubar.meta.md +30 -12
- package/src/components/menubar/menubar.stories.tsx +62 -2
- package/src/components/menubar/menubar.tsx +9 -9
- package/src/components/native-select/native-select.meta.md +8 -3
- package/src/components/native-select/native-select.stories.tsx +8 -5
- package/src/components/native-select/native-select.tsx +1 -1
- package/src/components/navigation-menu/navigation-menu.meta.md +19 -9
- package/src/components/navigation-menu/navigation-menu.stories.tsx +112 -9
- package/src/components/navigation-menu/navigation-menu.tsx +8 -4
- package/src/components/notification/notification.meta.md +52 -10
- package/src/components/notification/notification.stories.tsx +11 -9
- package/src/components/notification/notification.tsx +36 -21
- package/src/components/page-header/DEVELOPMENT.md +842 -0
- package/src/components/page-header/page-header.meta.md +208 -0
- package/src/components/page-header/page-header.stories.tsx +421 -0
- package/src/components/page-header/page-header.tsx +281 -0
- package/src/components/pagination/pagination.meta.md +140 -37
- package/src/components/pagination/pagination.stories.tsx +232 -10
- package/src/components/pagination/pagination.tsx +355 -63
- package/src/components/popconfirm/popconfirm.meta.md +9 -4
- package/src/components/popconfirm/popconfirm.stories.tsx +3 -4
- package/src/components/popconfirm/popconfirm.tsx +2 -2
- package/src/components/popover/popover.meta.md +62 -5
- package/src/components/popover/popover.stories.tsx +83 -7
- package/src/components/popover/popover.tsx +77 -28
- package/src/components/progress/progress.meta.md +38 -6
- package/src/components/progress/progress.stories.tsx +3 -3
- package/src/components/progress/progress.tsx +24 -16
- package/src/components/radio-group/radio-group.meta.md +79 -7
- package/src/components/radio-group/radio-group.stories.tsx +39 -3
- package/src/components/radio-group/radio-group.tsx +149 -18
- package/src/components/rate/rate.meta.md +35 -4
- package/src/components/rate/rate.stories.tsx +13 -5
- package/src/components/rate/rate.tsx +37 -10
- package/src/components/resizable/resizable.meta.md +7 -4
- package/src/components/resizable/resizable.stories.tsx +6 -6
- package/src/components/resizable/resizable.tsx +1 -1
- package/src/components/result/result.meta.md +7 -2
- package/src/components/result/result.stories.tsx +4 -8
- package/src/components/result/result.tsx +24 -15
- package/src/components/scroll-area/scroll-area.meta.md +4 -3
- package/src/components/scroll-area/scroll-area.stories.tsx +12 -4
- package/src/components/scroll-area/scroll-area.tsx +3 -3
- package/src/components/segmented/segmented.meta.md +7 -4
- package/src/components/segmented/segmented.stories.tsx +37 -8
- package/src/components/segmented/segmented.tsx +15 -7
- package/src/components/select/select.meta.md +197 -52
- package/src/components/select/select.stories.tsx +238 -63
- package/src/components/select/select.tsx +718 -171
- package/src/components/separator/separator.meta.md +4 -3
- package/src/components/separator/separator.stories.tsx +3 -3
- package/src/components/separator/separator.tsx +3 -7
- package/src/components/sheet/sheet.meta.md +32 -16
- package/src/components/sheet/sheet.stories.tsx +116 -10
- package/src/components/sheet/sheet.tsx +116 -29
- package/src/components/sidebar/sidebar.meta.md +37 -18
- package/src/components/sidebar/sidebar.stories.tsx +701 -29
- package/src/components/sidebar/sidebar.tsx +615 -142
- package/src/components/skeleton/skeleton.meta.md +4 -5
- package/src/components/skeleton/skeleton.stories.tsx +4 -4
- package/src/components/skeleton/skeleton.tsx +7 -7
- package/src/components/slider/slider.meta.md +57 -5
- package/src/components/slider/slider.stories.tsx +58 -6
- package/src/components/slider/slider.tsx +154 -13
- package/src/components/sonner/sonner.meta.md +58 -7
- package/src/components/sonner/sonner.stories.tsx +78 -5
- package/src/components/sonner/sonner.tsx +137 -8
- package/src/components/spinner/spinner.meta.md +62 -13
- package/src/components/spinner/spinner.stories.tsx +66 -14
- package/src/components/spinner/spinner.tsx +111 -9
- package/src/components/statistic/statistic.meta.md +7 -2
- package/src/components/statistic/statistic.stories.tsx +3 -7
- package/src/components/statistic/statistic.tsx +5 -6
- package/src/components/steps/steps.meta.md +18 -4
- package/src/components/steps/steps.stories.tsx +43 -3
- package/src/components/steps/steps.tsx +15 -12
- package/src/components/switch/switch.meta.md +51 -5
- package/src/components/switch/switch.stories.tsx +6 -6
- package/src/components/switch/switch.tsx +109 -41
- package/src/components/table/table.meta.md +17 -6
- package/src/components/table/table.stories.tsx +10 -5
- package/src/components/table/table.tsx +4 -4
- package/src/components/tabs/tabs.meta.md +38 -25
- package/src/components/tabs/tabs.stories.tsx +111 -25
- package/src/components/tabs/tabs.tsx +125 -54
- package/src/components/tag/tag.meta.md +105 -40
- package/src/components/tag/tag.stories.tsx +189 -16
- package/src/components/tag/tag.tsx +222 -21
- package/src/components/textarea/textarea.meta.md +35 -19
- package/src/components/textarea/textarea.stories.tsx +32 -6
- package/src/components/textarea/textarea.tsx +33 -9
- package/src/components/time-picker/time-picker.meta.md +124 -32
- package/src/components/time-picker/time-picker.stories.tsx +85 -15
- package/src/components/time-picker/time-picker.tsx +913 -61
- package/src/components/timeline/timeline.meta.md +14 -6
- package/src/components/timeline/timeline.stories.tsx +37 -7
- package/src/components/timeline/timeline.tsx +35 -14
- package/src/components/toggle/toggle.meta.md +5 -4
- package/src/components/toggle/toggle.stories.tsx +4 -4
- package/src/components/toggle/toggle.tsx +4 -3
- package/src/components/toggle-group/toggle-group.meta.md +5 -4
- package/src/components/toggle-group/toggle-group.stories.tsx +3 -3
- package/src/components/toggle-group/toggle-group.tsx +2 -2
- package/src/components/tooltip/tooltip.meta.md +55 -5
- package/src/components/tooltip/tooltip.stories.tsx +42 -5
- package/src/components/tooltip/tooltip.tsx +81 -21
- package/src/components/tour/tour.meta.md +9 -4
- package/src/components/tour/tour.stories.tsx +3 -3
- package/src/components/tour/tour.tsx +4 -4
- package/src/components/transfer/transfer.meta.md +11 -6
- package/src/components/transfer/transfer.stories.tsx +4 -8
- package/src/components/transfer/transfer.tsx +28 -21
- package/src/components/tree/tree.meta.md +63 -5
- package/src/components/tree/tree.stories.tsx +31 -12
- package/src/components/tree/tree.tsx +9 -8
- package/src/components/tree-select/tree-select.meta.md +59 -8
- package/src/components/tree-select/tree-select.stories.tsx +3 -3
- package/src/components/tree-select/tree-select.tsx +42 -7
- package/src/components/typography/typography.meta.md +61 -14
- package/src/components/typography/typography.stories.tsx +12 -11
- package/src/components/typography/typography.tsx +43 -28
- package/src/components/upload/upload.meta.md +49 -4
- package/src/components/upload/upload.stories.tsx +72 -12
- package/src/components/upload/upload.tsx +170 -37
- package/src/components/watermark/watermark.meta.md +7 -2
- package/src/components/watermark/watermark.stories.tsx +101 -9
- package/src/components/watermark/watermark.tsx +1 -0
- package/src/hooks/use-breakpoint.ts +117 -0
- package/src/hooks/use-debounce-callback.ts +52 -0
- package/src/hooks/use-mobile.ts +23 -0
- package/src/stories/theme-tokens.stories.tsx +747 -0
- package/src/utils/trigger-input.ts +53 -0
- package/src/components/button-group/button-group.meta.md +0 -92
- package/src/components/button-group/button-group.stories.tsx +0 -90
- package/src/components/button-group/button-group.tsx +0 -75
- package/src/components/combobox/combobox.meta.md +0 -93
- package/src/components/combobox/combobox.stories.tsx +0 -55
- package/src/components/combobox/combobox.tsx +0 -130
- package/src/components/space/space.meta.md +0 -94
- package/src/components/space/space.stories.tsx +0 -94
- package/src/components/space/space.tsx +0 -106
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
id: upload
|
|
3
3
|
name: Upload
|
|
4
|
+
displayName: 上传
|
|
4
5
|
type: component
|
|
5
|
-
category:
|
|
6
|
+
category: data-entry
|
|
6
7
|
since: 0.1.0
|
|
7
|
-
package:
|
|
8
|
+
package: '@teamix-evo/ui'
|
|
8
9
|
---
|
|
9
10
|
|
|
10
|
-
# Upload
|
|
11
|
+
# Upload 上传
|
|
11
12
|
|
|
12
13
|
文件上传 — antd 独有补足。支持**点击 + 拖拽**双模式(`dragger`)、多文件、accept 过滤、`maxCount` / `maxSize` 校验、内置文件列表(显示文件名 / 进度 / 移除按钮)。**只负责前端选择与列表呈现 — 实际上传请求由消费方在 `onChange` 中发起**(组件不内置 XHR)。
|
|
13
14
|
|
|
@@ -22,6 +23,8 @@ package: "@teamix-evo/ui"
|
|
|
22
23
|
- 仅需读取本地图片用于客户端预览 → 直接用 `<input type="file">`
|
|
23
24
|
- 服务端推送式同步 → 不在本组件职责内
|
|
24
25
|
|
|
26
|
+
## Props
|
|
27
|
+
|
|
25
28
|
<!-- auto:props:begin -->
|
|
26
29
|
| 名称 | 类型 | 默认值 | 必填 | 说明 |
|
|
27
30
|
| --- | --- | --- | --- | --- |
|
|
@@ -30,9 +33,11 @@ package: "@teamix-evo/ui"
|
|
|
30
33
|
| `multiple` | `boolean` | `false` | – | 是否支持多文件选择(antd `multiple` 并集)。 |
|
|
31
34
|
| `maxCount` | `number` | – | – | 最大文件数(超出则忽略,触发 `onExceed`)。 |
|
|
32
35
|
| `maxSize` | `number` | – | – | 单文件最大字节数(超出则忽略,触发 `onExceed`)。 |
|
|
36
|
+
| `beforeUpload` | `( file: File, fileList: File[], ) => boolean \| File \| void \| Promise<boolean \| File \| void>` | – | – | 文件添加前的校验钩子(antd `beforeUpload` 并集)。 - 返回 `false` 拒绝当前文件 - 返回 `true` / `undefined` 允许 - 返回 新 `File` 对象可替换原文件(重命名 / 压缩等) - 支持异步 `Promise` 注意: 此钩子在 `maxCount` / `maxSize` 校验**之后**调用。 |
|
|
33
37
|
| `dragger` | `boolean` | `false` | – | 启用拖拽上传(antd `Dragger` 并集) — 显示大块虚线区,可点击亦可拖拽。 |
|
|
34
38
|
| `disabled` | `boolean` | – | – | 禁用上传(已选文件不可删除)。 |
|
|
35
39
|
| `showFileList` | `boolean` | `true` | – | 是否显示文件列表(antd `showUploadList` 并集)。 |
|
|
40
|
+
| `listType` | `'text' \| 'image' \| 'card'` | `"text"` | – | 文件列表的展示形态(antd `listType` 并集) — - `text`(默认):文件名 + 进度条,适用文档上传 - `image`:小缩略图 + 文件名,适用头像 / 附件预览 - `card`:网格大缩略图卡,适用多图上传 / 产品图库 |
|
|
36
41
|
| `onChange` | `(next: UploadFileItem[]) => void` | – | – | 文件被添加(用户选择 / 拖入)时的回调 — 返回更新后的列表。 |
|
|
37
42
|
| `onRemove` | `(file: UploadFileItem) => void` | – | – | 文件被移除时的回调。 |
|
|
38
43
|
| `onExceed` | `(rejected: File[], reason: 'count' \| 'size') => void` | – | – | 超出 maxCount / maxSize 时的回调。 |
|
|
@@ -40,6 +45,8 @@ package: "@teamix-evo/ui"
|
|
|
40
45
|
| `className` | `string` | – | – | – |
|
|
41
46
|
<!-- auto:props:end -->
|
|
42
47
|
|
|
48
|
+
## 依赖
|
|
49
|
+
|
|
43
50
|
<!-- auto:deps:begin -->
|
|
44
51
|
### 同库依赖
|
|
45
52
|
|
|
@@ -48,7 +55,7 @@ package: "@teamix-evo/ui"
|
|
|
48
55
|
| Entry | 类型 | 描述 |
|
|
49
56
|
| --- | --- | --- |
|
|
50
57
|
| `cn` | util | Tailwind className 合并工具(clsx + tailwind-merge) |
|
|
51
|
-
| `button` | component | 通用按钮 — shadcn 实现 +
|
|
58
|
+
| `button` | component | 通用按钮 — shadcn 实现 + cloud-design 能力并集(loading / icon / shape / block / dashed variant / color 语义双 prop / disabledTooltip)。同文件合一导出 ButtonGroup + ButtonGroupText(等价 antd Space.Compact + cd SplitButton)。 |
|
|
52
59
|
| `progress` | component | 进度条 — Radix 线性 + antd 的 status / showInfo / size 并集 + 配套 ProgressCircle 环形 |
|
|
53
60
|
|
|
54
61
|
### npm 依赖
|
|
@@ -109,3 +116,41 @@ const [files, setFiles] = React.useState<UploadFileItem[]>([]);
|
|
|
109
116
|
}}
|
|
110
117
|
/>
|
|
111
118
|
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Upload 形态 — 旧库 API → 新映射
|
|
123
|
+
|
|
124
|
+
> 旧库 `Upload`(hybridcloud,含 Upload.Card / Upload.Dragger 子组件) → 新库 `Upload`(单组件 prop 切换)。
|
|
125
|
+
> 新库**不内置网络层**(XHR/fetch),由消费方在 `onChange` 中自行上传。
|
|
126
|
+
|
|
127
|
+
### 命名 & 结构映射
|
|
128
|
+
|
|
129
|
+
| 旧库 | 新库 | 说明 |
|
|
130
|
+
| ---------------------------------- | -------------------------------- | -------------------------------- |
|
|
131
|
+
| `Upload` | `Upload` | 组件名相同 |
|
|
132
|
+
| `Upload.Card` | `<Upload listType="card" />` | 子组件变 prop |
|
|
133
|
+
| `Upload.Dragger` | `<Upload dragger />` | 子组件变 prop |
|
|
134
|
+
| `value / defaultValue` | `fileList` | 文件列表(受控) |
|
|
135
|
+
| `limit` | `maxCount` | 最大文件数 |
|
|
136
|
+
| `dragable` | `dragger` | 拖拽上传 prop |
|
|
137
|
+
| `action / headers / method` | 无(消费方自行请求) | 架构差异:无内置 XHR |
|
|
138
|
+
| `onSuccess / onError / onProgress` | 无(通过 fileList.status/percent) | 状态驱动而非回调 |
|
|
139
|
+
| `beforeUpload` | _(未来 P1)_ | MVP 用 accept + maxSize 前置过滤 |
|
|
140
|
+
| `autoUpload` | _(未来 P1)_ | MVP 仅选件,上传由消费方控制 |
|
|
141
|
+
| `itemRender` | _(未来 P2)_ | MVP 使用内置渲染 |
|
|
142
|
+
| `shape='card'` | `listType='card'` + dragger | 组合代替 |
|
|
143
|
+
| `useDataURL` | 不复刻 | 消费方 FileReader |
|
|
144
|
+
| `progressProps` | 不复刻 | 内置简化 Progress |
|
|
145
|
+
| `isPreview / renderPreview` | 不复刻 | 无预览态 |
|
|
146
|
+
| `fileKeyName` | 不复刻 | 固定用 uid |
|
|
147
|
+
|
|
148
|
+
### 迁移 FAQ
|
|
149
|
+
|
|
150
|
+
| 问题 | 回答 |
|
|
151
|
+
| ------------------- | ------------------------------------------------------------------------------------ |
|
|
152
|
+
| 无 action 怎么上传? | 在 `onChange` 中拿到 `file` 对象,自行 fetch/XHR;通过 `setFiles` 更新 status/percent |
|
|
153
|
+
| 怎么实现拖拽? | `<Upload dragger />` 即可;虚线区域点击/拖放均可触发 |
|
|
154
|
+
| 怎么限制文件类型? | `accept="image/*"` 或 `accept=".pdf,.docx"` |
|
|
155
|
+
| 怎么显示上传进度? | fileList item 设 `status:'uploading'` + `percent:50` |
|
|
156
|
+
| Card 模式怎么用? | `<Upload listType="card" dragger />` — 网格缩略图 + 拖拽区 |
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
3
3
|
import { Upload, type UploadFileItem } from './upload';
|
|
4
4
|
|
|
5
5
|
const meta: Meta<typeof Upload> = {
|
|
6
|
-
title: '
|
|
6
|
+
title: '数据录入 · Data Entry/Upload',
|
|
7
7
|
component: Upload,
|
|
8
8
|
tags: ['autodocs'],
|
|
9
9
|
parameters: {
|
|
10
10
|
docs: {
|
|
11
11
|
description: {
|
|
12
12
|
component:
|
|
13
|
-
'文件上传 — 支持点击 +
|
|
13
|
+
'文件上传 — 支持点击 + 拖拽双模式(Dragger),内置 maxCount / maxSize 校验、文件列表、进度条。组件只负责前端选择与列表呈现,真实上传请求由消费方在 onChange 中发起。等价 antd `Upload` + `Upload.Dragger`。',
|
|
14
14
|
},
|
|
15
15
|
},
|
|
16
16
|
},
|
|
@@ -19,8 +19,12 @@ const meta: Meta<typeof Upload> = {
|
|
|
19
19
|
dragger: { control: 'boolean' },
|
|
20
20
|
disabled: { control: 'boolean' },
|
|
21
21
|
accept: { control: 'text' },
|
|
22
|
+
listType: {
|
|
23
|
+
control: 'inline-radio',
|
|
24
|
+
options: ['text', 'image', 'card'],
|
|
25
|
+
},
|
|
22
26
|
},
|
|
23
|
-
args: { multiple: false, dragger: false, disabled: false },
|
|
27
|
+
args: { multiple: false, dragger: false, disabled: false, listType: 'text' },
|
|
24
28
|
};
|
|
25
29
|
|
|
26
30
|
export default meta;
|
|
@@ -30,9 +34,7 @@ export const Playground: Story = {};
|
|
|
30
34
|
|
|
31
35
|
export const Dragger: Story = {
|
|
32
36
|
parameters: { controls: { disable: true } },
|
|
33
|
-
render: () =>
|
|
34
|
-
<Upload dragger multiple accept=".csv,.xlsx,.json" />
|
|
35
|
-
),
|
|
37
|
+
render: () => <Upload dragger multiple accept=".csv,.xlsx,.json" />,
|
|
36
38
|
};
|
|
37
39
|
|
|
38
40
|
export const WithLimits: Story = {
|
|
@@ -43,8 +45,11 @@ export const WithLimits: Story = {
|
|
|
43
45
|
maxCount={3}
|
|
44
46
|
maxSize={2 * 1024 * 1024}
|
|
45
47
|
onExceed={(rej, reason) =>
|
|
46
|
-
|
|
47
|
-
|
|
48
|
+
alert(
|
|
49
|
+
`${reason === 'count' ? '超出最大文件数' : '超出最大文件大小'}: ${rej
|
|
50
|
+
.map((f) => f.name)
|
|
51
|
+
.join(', ')}`,
|
|
52
|
+
)
|
|
48
53
|
}
|
|
49
54
|
/>
|
|
50
55
|
),
|
|
@@ -58,9 +63,42 @@ export const ControlledProgress: Story = {
|
|
|
58
63
|
{ uid: 'demo-2', name: 'cover.png', status: 'done' },
|
|
59
64
|
{ uid: 'demo-3', name: 'broken.zip', status: 'error' },
|
|
60
65
|
]);
|
|
66
|
+
return <Upload dragger multiple fileList={files} onChange={setFiles} />;
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export const Disabled: Story = {
|
|
71
|
+
parameters: { controls: { disable: true } },
|
|
72
|
+
render: () => <Upload dragger disabled />,
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// ─── listType · 三种列表形态 ────────────────────────────────────
|
|
76
|
+
|
|
77
|
+
const imageDemoFiles: UploadFileItem[] = [
|
|
78
|
+
{
|
|
79
|
+
uid: 'img-1',
|
|
80
|
+
name: 'avatar.png',
|
|
81
|
+
status: 'done',
|
|
82
|
+
thumbUrl: 'https://github.com/shadcn.png',
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
uid: 'img-2',
|
|
86
|
+
name: 'cover.jpg',
|
|
87
|
+
status: 'done',
|
|
88
|
+
thumbUrl: 'https://placehold.co/200x200/e5e7eb/6b7280?text=Cover',
|
|
89
|
+
},
|
|
90
|
+
{ uid: 'img-3', name: 'broken.png', status: 'error' },
|
|
91
|
+
];
|
|
92
|
+
|
|
93
|
+
export const ListTypeImage: Story = {
|
|
94
|
+
name: 'listType="image" · 缩略图列表',
|
|
95
|
+
parameters: { controls: { disable: true } },
|
|
96
|
+
render: () => {
|
|
97
|
+
const [files, setFiles] = React.useState<UploadFileItem[]>(imageDemoFiles);
|
|
61
98
|
return (
|
|
62
99
|
<Upload
|
|
63
|
-
|
|
100
|
+
listType="image"
|
|
101
|
+
accept="image/*"
|
|
64
102
|
multiple
|
|
65
103
|
fileList={files}
|
|
66
104
|
onChange={setFiles}
|
|
@@ -69,7 +107,29 @@ export const ControlledProgress: Story = {
|
|
|
69
107
|
},
|
|
70
108
|
};
|
|
71
109
|
|
|
72
|
-
export const
|
|
110
|
+
export const ListTypeCard: Story = {
|
|
111
|
+
name: 'listType="card" · 网格卡',
|
|
73
112
|
parameters: { controls: { disable: true } },
|
|
74
|
-
render: () =>
|
|
113
|
+
render: () => {
|
|
114
|
+
const [files, setFiles] = React.useState<UploadFileItem[]>([
|
|
115
|
+
...imageDemoFiles,
|
|
116
|
+
{
|
|
117
|
+
uid: 'img-4',
|
|
118
|
+
name: 'uploading.png',
|
|
119
|
+
status: 'uploading',
|
|
120
|
+
percent: 65,
|
|
121
|
+
thumbUrl: 'https://placehold.co/200x200/dbeafe/1d4ed8?text=65%25',
|
|
122
|
+
},
|
|
123
|
+
]);
|
|
124
|
+
return (
|
|
125
|
+
<Upload
|
|
126
|
+
dragger
|
|
127
|
+
listType="card"
|
|
128
|
+
accept="image/*"
|
|
129
|
+
multiple
|
|
130
|
+
fileList={files}
|
|
131
|
+
onChange={setFiles}
|
|
132
|
+
/>
|
|
133
|
+
);
|
|
134
|
+
},
|
|
75
135
|
};
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
File,
|
|
4
|
+
Image as ImageIcon,
|
|
5
|
+
Upload as UploadIcon,
|
|
6
|
+
X,
|
|
7
|
+
} from 'lucide-react';
|
|
3
8
|
|
|
4
9
|
import { cn } from '@/utils/cn';
|
|
5
10
|
import { Button } from '@/components/button/button';
|
|
@@ -20,6 +25,11 @@ export interface UploadFileItem {
|
|
|
20
25
|
percent?: number;
|
|
21
26
|
/** 上传完成后的远程 URL(可选)。 */
|
|
22
27
|
url?: string;
|
|
28
|
+
/**
|
|
29
|
+
* 缩略图 URL(可选) — `listType="image"|"card"` 时以此为展示源;
|
|
30
|
+
* 未传时回退为 `url` 或默认文件图标。
|
|
31
|
+
*/
|
|
32
|
+
thumbUrl?: string;
|
|
23
33
|
}
|
|
24
34
|
|
|
25
35
|
export interface UploadProps {
|
|
@@ -44,6 +54,19 @@ export interface UploadProps {
|
|
|
44
54
|
* 单文件最大字节数(超出则忽略,触发 `onExceed`)。
|
|
45
55
|
*/
|
|
46
56
|
maxSize?: number;
|
|
57
|
+
/**
|
|
58
|
+
* 文件添加前的校验钩子(antd `beforeUpload` 并集)。
|
|
59
|
+
* - 返回 `false` 拒绝当前文件
|
|
60
|
+
* - 返回 `true` / `undefined` 允许
|
|
61
|
+
* - 返回 新 `File` 对象可替换原文件(重命名 / 压缩等)
|
|
62
|
+
* - 支持异步 `Promise`
|
|
63
|
+
*
|
|
64
|
+
* 注意: 此钩子在 `maxCount` / `maxSize` 校验**之后**调用。
|
|
65
|
+
*/
|
|
66
|
+
beforeUpload?: (
|
|
67
|
+
file: File,
|
|
68
|
+
fileList: File[],
|
|
69
|
+
) => boolean | File | void | Promise<boolean | File | void>;
|
|
47
70
|
/**
|
|
48
71
|
* 启用拖拽上传(antd `Dragger` 并集) — 显示大块虚线区,可点击亦可拖拽。
|
|
49
72
|
* @default false
|
|
@@ -56,6 +79,14 @@ export interface UploadProps {
|
|
|
56
79
|
* @default true
|
|
57
80
|
*/
|
|
58
81
|
showFileList?: boolean;
|
|
82
|
+
/**
|
|
83
|
+
* 文件列表的展示形态(antd `listType` 并集) —
|
|
84
|
+
* - `text`(默认):文件名 + 进度条,适用文档上传
|
|
85
|
+
* - `image`:小缩略图 + 文件名,适用头像 / 附件预览
|
|
86
|
+
* - `card`:网格大缩略图卡,适用多图上传 / 产品图库
|
|
87
|
+
* @default "text"
|
|
88
|
+
*/
|
|
89
|
+
listType?: 'text' | 'image' | 'card';
|
|
59
90
|
/** 文件被添加(用户选择 / 拖入)时的回调 — 返回更新后的列表。 */
|
|
60
91
|
onChange?: (next: UploadFileItem[]) => void;
|
|
61
92
|
/** 文件被移除时的回调。 */
|
|
@@ -82,9 +113,11 @@ const Upload = React.forwardRef<HTMLDivElement, UploadProps>(
|
|
|
82
113
|
dragger = false,
|
|
83
114
|
disabled = false,
|
|
84
115
|
showFileList = true,
|
|
116
|
+
listType = 'text',
|
|
85
117
|
onChange,
|
|
86
118
|
onRemove,
|
|
87
119
|
onExceed,
|
|
120
|
+
beforeUpload,
|
|
88
121
|
children,
|
|
89
122
|
className,
|
|
90
123
|
},
|
|
@@ -102,7 +135,7 @@ const Upload = React.forwardRef<HTMLDivElement, UploadProps>(
|
|
|
102
135
|
onChange?.(next);
|
|
103
136
|
};
|
|
104
137
|
|
|
105
|
-
const addFiles = (files: File[]) => {
|
|
138
|
+
const addFiles = async (files: File[]) => {
|
|
106
139
|
if (disabled || files.length === 0) return;
|
|
107
140
|
let candidate = files;
|
|
108
141
|
|
|
@@ -121,6 +154,28 @@ const Upload = React.forwardRef<HTMLDivElement, UploadProps>(
|
|
|
121
154
|
candidate = candidate.slice(0, remaining);
|
|
122
155
|
}
|
|
123
156
|
|
|
157
|
+
// beforeUpload 钩子 — 逐文件校验
|
|
158
|
+
if (beforeUpload) {
|
|
159
|
+
const accepted: File[] = [];
|
|
160
|
+
for (const f of candidate) {
|
|
161
|
+
try {
|
|
162
|
+
const result = await beforeUpload(f, candidate);
|
|
163
|
+
if (result === false) continue; // 拒绝
|
|
164
|
+
if (result instanceof globalThis.File) {
|
|
165
|
+
accepted.push(result); // 替换文件
|
|
166
|
+
} else {
|
|
167
|
+
accepted.push(f); // 允许原文件
|
|
168
|
+
}
|
|
169
|
+
} catch {
|
|
170
|
+
// Promise reject = 拒绝
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
candidate = accepted;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (candidate.length === 0) return;
|
|
178
|
+
|
|
124
179
|
const items: UploadFileItem[] = candidate.map((f) => ({
|
|
125
180
|
uid: makeUid(),
|
|
126
181
|
name: f.name,
|
|
@@ -175,7 +230,7 @@ const Upload = React.forwardRef<HTMLDivElement, UploadProps>(
|
|
|
175
230
|
onDragLeave={() => setDragOver(false)}
|
|
176
231
|
onDrop={onDrop}
|
|
177
232
|
className={cn(
|
|
178
|
-
'flex cursor-pointer flex-col items-center justify-center gap-2 rounded-md border border-dashed bg-muted/30 px-6 py-10 text-center text-
|
|
233
|
+
'flex cursor-pointer flex-col items-center justify-center gap-2 rounded-md border border-border border-dashed bg-muted/30 px-6 py-10 text-center text-xs text-muted-foreground transition-colors',
|
|
179
234
|
'hover:border-primary/50 hover:bg-muted/50',
|
|
180
235
|
'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',
|
|
181
236
|
dragOver && 'border-primary bg-primary/5',
|
|
@@ -185,7 +240,9 @@ const Upload = React.forwardRef<HTMLDivElement, UploadProps>(
|
|
|
185
240
|
{children ?? (
|
|
186
241
|
<>
|
|
187
242
|
<UploadIcon className="size-8 text-primary/70" />
|
|
188
|
-
<div className="font-medium text-foreground"
|
|
243
|
+
<div className="font-medium text-foreground">
|
|
244
|
+
点击或拖拽文件到此处上传
|
|
245
|
+
</div>
|
|
189
246
|
<div className="text-xs">
|
|
190
247
|
{multiple ? '可选择多个文件' : '仅支持单个文件'}
|
|
191
248
|
{accept ? ` · 限 ${accept}` : null}
|
|
@@ -218,43 +275,119 @@ const Upload = React.forwardRef<HTMLDivElement, UploadProps>(
|
|
|
218
275
|
/>
|
|
219
276
|
{trigger}
|
|
220
277
|
{showFileList && current.length > 0 ? (
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
<div className="flex min-w-0 flex-1 flex-col gap-1">
|
|
232
|
-
<span
|
|
278
|
+
listType === 'card' ? (
|
|
279
|
+
<ul
|
|
280
|
+
className="grid grid-cols-[repeat(auto-fill,minmax(7rem,1fr))] gap-3"
|
|
281
|
+
role="list"
|
|
282
|
+
>
|
|
283
|
+
{current.map((f) => {
|
|
284
|
+
const thumb = f.thumbUrl ?? f.url;
|
|
285
|
+
return (
|
|
286
|
+
<li
|
|
287
|
+
key={f.uid}
|
|
233
288
|
className={cn(
|
|
234
|
-
'
|
|
235
|
-
f.status === 'error' && '
|
|
289
|
+
'group/uc relative flex aspect-square flex-col items-center justify-center overflow-hidden rounded-md border border-border bg-card text-center text-xs',
|
|
290
|
+
f.status === 'error' && 'border-destructive/40',
|
|
236
291
|
)}
|
|
237
|
-
title={f.name}
|
|
238
292
|
>
|
|
239
|
-
{
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
293
|
+
{thumb ? (
|
|
294
|
+
<img
|
|
295
|
+
src={thumb}
|
|
296
|
+
alt={f.name}
|
|
297
|
+
className="size-full object-cover"
|
|
298
|
+
/>
|
|
299
|
+
) : (
|
|
300
|
+
<div className="flex flex-col items-center gap-1 px-2 text-muted-foreground">
|
|
301
|
+
<ImageIcon className="size-6" />
|
|
302
|
+
<span
|
|
303
|
+
className={cn(
|
|
304
|
+
'line-clamp-2 break-all',
|
|
305
|
+
f.status === 'error' && 'text-destructive',
|
|
306
|
+
)}
|
|
307
|
+
title={f.name}
|
|
308
|
+
>
|
|
309
|
+
{f.name}
|
|
310
|
+
</span>
|
|
311
|
+
</div>
|
|
312
|
+
)}
|
|
313
|
+
{f.status === 'uploading' ? (
|
|
314
|
+
<div className="absolute inset-x-0 bottom-0 bg-background/85 px-2 py-1">
|
|
315
|
+
<Progress value={f.percent ?? 0} size="sm" />
|
|
316
|
+
</div>
|
|
317
|
+
) : null}
|
|
318
|
+
{!disabled ? (
|
|
319
|
+
<button
|
|
320
|
+
type="button"
|
|
321
|
+
aria-label={`移除 ${f.name}`}
|
|
322
|
+
onClick={() => remove(f.uid)}
|
|
323
|
+
className="absolute right-1 top-1 cursor-pointer rounded-sm bg-background/80 p-1 text-muted-foreground opacity-0 transition-opacity hover:text-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring group-hover/uc:opacity-100"
|
|
324
|
+
>
|
|
325
|
+
<X className="size-3.5" />
|
|
326
|
+
</button>
|
|
327
|
+
) : null}
|
|
328
|
+
</li>
|
|
329
|
+
);
|
|
330
|
+
})}
|
|
331
|
+
</ul>
|
|
332
|
+
) : (
|
|
333
|
+
<ul className="flex flex-col gap-2">
|
|
334
|
+
{current.map((f) => {
|
|
335
|
+
const isImage = listType === 'image';
|
|
336
|
+
const thumb = f.thumbUrl ?? f.url;
|
|
337
|
+
return (
|
|
338
|
+
<li
|
|
339
|
+
key={f.uid}
|
|
340
|
+
className={cn(
|
|
341
|
+
'flex items-center gap-3 rounded-md border border-border bg-card px-3 py-2 text-xs',
|
|
342
|
+
f.status === 'error' && 'border-destructive/40',
|
|
343
|
+
)}
|
|
251
344
|
>
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
345
|
+
{isImage ? (
|
|
346
|
+
<div className="size-10 shrink-0 overflow-hidden rounded-sm border border-border bg-muted">
|
|
347
|
+
{thumb ? (
|
|
348
|
+
<img
|
|
349
|
+
src={thumb}
|
|
350
|
+
alt={f.name}
|
|
351
|
+
className="size-full object-cover"
|
|
352
|
+
/>
|
|
353
|
+
) : (
|
|
354
|
+
<div className="flex size-full items-center justify-center text-muted-foreground">
|
|
355
|
+
<ImageIcon className="size-4" />
|
|
356
|
+
</div>
|
|
357
|
+
)}
|
|
358
|
+
</div>
|
|
359
|
+
) : (
|
|
360
|
+
<File className="size-4 shrink-0 text-muted-foreground" />
|
|
361
|
+
)}
|
|
362
|
+
<div className="flex min-w-0 flex-1 flex-col gap-1">
|
|
363
|
+
<span
|
|
364
|
+
className={cn(
|
|
365
|
+
'truncate',
|
|
366
|
+
f.status === 'error' && 'text-destructive',
|
|
367
|
+
)}
|
|
368
|
+
title={f.name}
|
|
369
|
+
>
|
|
370
|
+
{f.name}
|
|
371
|
+
</span>
|
|
372
|
+
{f.status === 'uploading' ? (
|
|
373
|
+
<Progress value={f.percent ?? 0} size="sm" />
|
|
374
|
+
) : null}
|
|
375
|
+
</div>
|
|
376
|
+
{!disabled ? (
|
|
377
|
+
<button
|
|
378
|
+
type="button"
|
|
379
|
+
aria-label={`移除 ${f.name}`}
|
|
380
|
+
onClick={() => remove(f.uid)}
|
|
381
|
+
className="cursor-pointer rounded-sm p-1 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
|
|
382
|
+
>
|
|
383
|
+
<X className="size-4" />
|
|
384
|
+
</button>
|
|
385
|
+
) : null}
|
|
386
|
+
</li>
|
|
387
|
+
);
|
|
388
|
+
})}
|
|
389
|
+
</ul>
|
|
390
|
+
)
|
|
258
391
|
) : null}
|
|
259
392
|
</div>
|
|
260
393
|
);
|
|
@@ -4,10 +4,11 @@ name: Watermark
|
|
|
4
4
|
type: component
|
|
5
5
|
category: feedback
|
|
6
6
|
since: 0.1.0
|
|
7
|
-
package:
|
|
7
|
+
package: '@teamix-evo/ui'
|
|
8
|
+
displayName: 水印
|
|
8
9
|
---
|
|
9
10
|
|
|
10
|
-
# Watermark
|
|
11
|
+
# Watermark 水印
|
|
11
12
|
|
|
12
13
|
水印 — antd 独有补足。**等价 antd `Watermark`**(v5.1+)。在容器内部生成重复平铺的 SVG 水印(文字 / 图片),用于敏感页面 / 内部文档 / 演示场景。
|
|
13
14
|
|
|
@@ -24,6 +25,8 @@ package: "@teamix-evo/ui"
|
|
|
24
25
|
- 通知 / 提示语 → `Alert` / `Tag`(语义不一样)
|
|
25
26
|
- 装饰背景图 → CSS `background-image`
|
|
26
27
|
|
|
28
|
+
## Props
|
|
29
|
+
|
|
27
30
|
<!-- auto:props:begin -->
|
|
28
31
|
| 名称 | 类型 | 默认值 | 必填 | 说明 |
|
|
29
32
|
| --- | --- | --- | --- | --- |
|
|
@@ -39,6 +42,8 @@ package: "@teamix-evo/ui"
|
|
|
39
42
|
| `gapY` | `number` | `80` | – | 水印块之间的垂直间距(px)。 |
|
|
40
43
|
<!-- auto:props:end -->
|
|
41
44
|
|
|
45
|
+
## 依赖
|
|
46
|
+
|
|
42
47
|
<!-- auto:deps:begin -->
|
|
43
48
|
### 同库依赖
|
|
44
49
|
|