@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.
Files changed (295) hide show
  1. package/README.md +184 -184
  2. package/manifest.json +680 -492
  3. package/package.json +20 -10
  4. package/src/components/accordion/accordion.meta.md +5 -4
  5. package/src/components/accordion/accordion.stories.tsx +14 -9
  6. package/src/components/accordion/accordion.tsx +104 -8
  7. package/src/components/affix/affix.meta.md +20 -2
  8. package/src/components/affix/affix.stories.tsx +102 -25
  9. package/src/components/affix/affix.tsx +79 -9
  10. package/src/components/alert/alert.meta.md +44 -13
  11. package/src/components/alert/alert.stories.tsx +66 -21
  12. package/src/components/alert/alert.tsx +81 -34
  13. package/src/components/alert-dialog/alert-dialog.meta.md +61 -16
  14. package/src/components/alert-dialog/alert-dialog.stories.tsx +145 -3
  15. package/src/components/alert-dialog/alert-dialog.tsx +60 -13
  16. package/src/components/anchor/anchor.meta.md +8 -3
  17. package/src/components/anchor/anchor.stories.tsx +3 -3
  18. package/src/components/anchor/anchor.tsx +2 -2
  19. package/src/components/app/app.meta.md +9 -4
  20. package/src/components/app/app.stories.tsx +9 -7
  21. package/src/components/aspect-ratio/aspect-ratio.meta.md +4 -3
  22. package/src/components/aspect-ratio/aspect-ratio.stories.tsx +3 -3
  23. package/src/components/auto-complete/auto-complete.meta.md +14 -6
  24. package/src/components/auto-complete/auto-complete.stories.tsx +47 -4
  25. package/src/components/auto-complete/auto-complete.tsx +119 -71
  26. package/src/components/avatar/avatar.meta.md +6 -7
  27. package/src/components/avatar/avatar.stories.tsx +21 -3
  28. package/src/components/avatar/avatar.tsx +24 -23
  29. package/src/components/badge/badge.meta.md +10 -9
  30. package/src/components/badge/badge.stories.tsx +2 -2
  31. package/src/components/badge/badge.tsx +9 -15
  32. package/src/components/breadcrumb/breadcrumb.meta.md +27 -7
  33. package/src/components/breadcrumb/breadcrumb.stories.tsx +127 -4
  34. package/src/components/breadcrumb/breadcrumb.tsx +22 -8
  35. package/src/components/button/button.meta.md +258 -21
  36. package/src/components/button/button.stories.tsx +549 -41
  37. package/src/components/button/button.tsx +335 -33
  38. package/src/components/button/demo/as-child.tsx +24 -0
  39. package/src/components/button/demo/basic.tsx +8 -0
  40. package/src/components/button/demo/block.tsx +16 -0
  41. package/src/components/button/demo/loading.tsx +19 -0
  42. package/src/components/button/demo/shapes.tsx +18 -0
  43. package/src/components/button/demo/sizes.tsx +19 -0
  44. package/src/components/button/demo/variants.tsx +19 -0
  45. package/src/components/button/demo/with-icon.tsx +20 -0
  46. package/src/components/calendar/calendar.meta.md +13 -3
  47. package/src/components/calendar/calendar.stories.tsx +6 -6
  48. package/src/components/calendar/calendar.tsx +73 -8
  49. package/src/components/card/card.meta.md +27 -5
  50. package/src/components/card/card.stories.tsx +42 -3
  51. package/src/components/card/card.tsx +146 -63
  52. package/src/components/carousel/carousel.meta.md +4 -3
  53. package/src/components/carousel/carousel.stories.tsx +11 -6
  54. package/src/components/cascader/cascader.meta.md +47 -17
  55. package/src/components/cascader/cascader.stories.tsx +22 -10
  56. package/src/components/cascader/cascader.tsx +428 -85
  57. package/src/components/checkbox/checkbox.meta.md +75 -7
  58. package/src/components/checkbox/checkbox.stories.tsx +161 -3
  59. package/src/components/checkbox/checkbox.tsx +77 -9
  60. package/src/components/collapsible/collapsible.meta.md +14 -6
  61. package/src/components/collapsible/collapsible.stories.tsx +10 -2
  62. package/src/components/collapsible/collapsible.tsx +93 -6
  63. package/src/components/color-picker/color-picker.meta.md +12 -7
  64. package/src/components/color-picker/color-picker.stories.tsx +86 -7
  65. package/src/components/color-picker/color-picker.tsx +20 -9
  66. package/src/components/command/command.meta.md +29 -13
  67. package/src/components/command/command.stories.tsx +4 -4
  68. package/src/components/command/command.tsx +19 -8
  69. package/src/components/context-menu/context-menu.meta.md +11 -8
  70. package/src/components/context-menu/context-menu.stories.tsx +11 -3
  71. package/src/components/context-menu/context-menu.tsx +21 -8
  72. package/src/components/data-table/data-table.meta.md +6 -5
  73. package/src/components/data-table/data-table.stories.tsx +13 -6
  74. package/src/components/data-table/data-table.tsx +2 -2
  75. package/src/components/date-picker/date-picker.meta.md +88 -19
  76. package/src/components/date-picker/date-picker.stories.tsx +55 -5
  77. package/src/components/date-picker/date-picker.tsx +1489 -91
  78. package/src/components/descriptions/descriptions.meta.md +10 -5
  79. package/src/components/descriptions/descriptions.stories.tsx +3 -3
  80. package/src/components/descriptions/descriptions.tsx +22 -14
  81. package/src/components/dialog/dialog.meta.md +76 -13
  82. package/src/components/dialog/dialog.stories.tsx +182 -20
  83. package/src/components/dialog/dialog.tsx +67 -15
  84. package/src/components/dialog/imperative.tsx +252 -0
  85. package/src/components/drawer/drawer.meta.md +33 -34
  86. package/src/components/drawer/drawer.stories.tsx +29 -12
  87. package/src/components/drawer/drawer.tsx +22 -113
  88. package/src/components/dropdown-menu/dropdown-menu.meta.md +78 -10
  89. package/src/components/dropdown-menu/dropdown-menu.stories.tsx +88 -2
  90. package/src/components/dropdown-menu/dropdown-menu.tsx +24 -10
  91. package/src/components/ellipsis/ellipsis.meta.md +87 -0
  92. package/src/components/ellipsis/ellipsis.stories.tsx +72 -0
  93. package/src/components/ellipsis/ellipsis.tsx +153 -0
  94. package/src/components/empty/empty.meta.md +9 -4
  95. package/src/components/empty/empty.stories.tsx +4 -4
  96. package/src/components/empty/empty.tsx +10 -3
  97. package/src/components/field/field.meta.md +47 -9
  98. package/src/components/field/field.stories.tsx +385 -5
  99. package/src/components/field/field.tsx +263 -35
  100. package/src/components/filter-bar/filter-bar.meta.md +92 -0
  101. package/src/components/filter-bar/filter-bar.stories.tsx +1083 -0
  102. package/src/components/filter-bar/filter-bar.tsx +568 -0
  103. package/src/components/flex/flex.meta.md +54 -6
  104. package/src/components/flex/flex.stories.tsx +107 -20
  105. package/src/components/flex/flex.tsx +27 -4
  106. package/src/components/float-button/float-button.meta.md +8 -3
  107. package/src/components/float-button/float-button.stories.tsx +9 -7
  108. package/src/components/float-button/float-button.tsx +1 -1
  109. package/src/components/form/form.meta.md +39 -17
  110. package/src/components/form/form.stories.tsx +350 -3
  111. package/src/components/form/form.tsx +101 -35
  112. package/src/components/grid/grid.meta.md +7 -2
  113. package/src/components/grid/grid.stories.tsx +6 -4
  114. package/src/components/hover-card/hover-card.meta.md +20 -9
  115. package/src/components/hover-card/hover-card.stories.tsx +34 -5
  116. package/src/components/hover-card/hover-card.tsx +51 -13
  117. package/src/components/icon/DEVELOPMENT.md +809 -0
  118. package/src/components/icon/icon.meta.md +170 -0
  119. package/src/components/icon/icon.stories.tsx +344 -0
  120. package/src/components/icon/icon.tsx +248 -0
  121. package/src/components/image/image.meta.md +9 -4
  122. package/src/components/image/image.stories.tsx +3 -3
  123. package/src/components/image/image.tsx +6 -4
  124. package/src/components/input/demo/basic.tsx +12 -0
  125. package/src/components/input/demo/clearable.tsx +21 -0
  126. package/src/components/input/demo/show-count.tsx +18 -0
  127. package/src/components/input/demo/sizes.tsx +15 -0
  128. package/src/components/input/input.meta.md +39 -33
  129. package/src/components/input/input.stories.tsx +62 -35
  130. package/src/components/input/input.tsx +97 -98
  131. package/src/components/input-group/input-group.meta.md +54 -22
  132. package/src/components/input-group/input-group.stories.tsx +49 -16
  133. package/src/components/input-group/input-group.tsx +44 -8
  134. package/src/components/input-number/input-number.meta.md +64 -7
  135. package/src/components/input-number/input-number.stories.tsx +46 -8
  136. package/src/components/input-number/input-number.tsx +99 -26
  137. package/src/components/input-otp/input-otp.meta.md +4 -3
  138. package/src/components/input-otp/input-otp.stories.tsx +3 -3
  139. package/src/components/input-otp/input-otp.tsx +1 -1
  140. package/src/components/item/item.meta.md +8 -3
  141. package/src/components/item/item.stories.tsx +8 -5
  142. package/src/components/item/item.tsx +7 -6
  143. package/src/components/kbd/kbd.meta.md +13 -4
  144. package/src/components/kbd/kbd.stories.tsx +4 -4
  145. package/src/components/kbd/kbd.tsx +10 -5
  146. package/src/components/label/label.meta.md +18 -10
  147. package/src/components/label/label.stories.tsx +64 -6
  148. package/src/components/label/label.tsx +91 -19
  149. package/src/components/masonry/masonry.meta.md +8 -3
  150. package/src/components/masonry/masonry.stories.tsx +7 -5
  151. package/src/components/masonry/masonry.tsx +1 -0
  152. package/src/components/mentions/mentions.meta.md +36 -6
  153. package/src/components/mentions/mentions.stories.tsx +120 -6
  154. package/src/components/mentions/mentions.tsx +11 -5
  155. package/src/components/menubar/menubar.meta.md +30 -12
  156. package/src/components/menubar/menubar.stories.tsx +62 -2
  157. package/src/components/menubar/menubar.tsx +9 -9
  158. package/src/components/native-select/native-select.meta.md +8 -3
  159. package/src/components/native-select/native-select.stories.tsx +8 -5
  160. package/src/components/native-select/native-select.tsx +1 -1
  161. package/src/components/navigation-menu/navigation-menu.meta.md +19 -9
  162. package/src/components/navigation-menu/navigation-menu.stories.tsx +112 -9
  163. package/src/components/navigation-menu/navigation-menu.tsx +8 -4
  164. package/src/components/notification/notification.meta.md +52 -10
  165. package/src/components/notification/notification.stories.tsx +11 -9
  166. package/src/components/notification/notification.tsx +36 -21
  167. package/src/components/page-header/DEVELOPMENT.md +842 -0
  168. package/src/components/page-header/page-header.meta.md +208 -0
  169. package/src/components/page-header/page-header.stories.tsx +421 -0
  170. package/src/components/page-header/page-header.tsx +281 -0
  171. package/src/components/pagination/pagination.meta.md +140 -37
  172. package/src/components/pagination/pagination.stories.tsx +232 -10
  173. package/src/components/pagination/pagination.tsx +355 -63
  174. package/src/components/popconfirm/popconfirm.meta.md +9 -4
  175. package/src/components/popconfirm/popconfirm.stories.tsx +3 -4
  176. package/src/components/popconfirm/popconfirm.tsx +2 -2
  177. package/src/components/popover/popover.meta.md +62 -5
  178. package/src/components/popover/popover.stories.tsx +83 -7
  179. package/src/components/popover/popover.tsx +77 -28
  180. package/src/components/progress/progress.meta.md +38 -6
  181. package/src/components/progress/progress.stories.tsx +3 -3
  182. package/src/components/progress/progress.tsx +24 -16
  183. package/src/components/radio-group/radio-group.meta.md +79 -7
  184. package/src/components/radio-group/radio-group.stories.tsx +39 -3
  185. package/src/components/radio-group/radio-group.tsx +149 -18
  186. package/src/components/rate/rate.meta.md +35 -4
  187. package/src/components/rate/rate.stories.tsx +13 -5
  188. package/src/components/rate/rate.tsx +37 -10
  189. package/src/components/resizable/resizable.meta.md +7 -4
  190. package/src/components/resizable/resizable.stories.tsx +6 -6
  191. package/src/components/resizable/resizable.tsx +1 -1
  192. package/src/components/result/result.meta.md +7 -2
  193. package/src/components/result/result.stories.tsx +4 -8
  194. package/src/components/result/result.tsx +24 -15
  195. package/src/components/scroll-area/scroll-area.meta.md +4 -3
  196. package/src/components/scroll-area/scroll-area.stories.tsx +12 -4
  197. package/src/components/scroll-area/scroll-area.tsx +3 -3
  198. package/src/components/segmented/segmented.meta.md +7 -4
  199. package/src/components/segmented/segmented.stories.tsx +37 -8
  200. package/src/components/segmented/segmented.tsx +15 -7
  201. package/src/components/select/select.meta.md +197 -52
  202. package/src/components/select/select.stories.tsx +238 -63
  203. package/src/components/select/select.tsx +718 -171
  204. package/src/components/separator/separator.meta.md +4 -3
  205. package/src/components/separator/separator.stories.tsx +3 -3
  206. package/src/components/separator/separator.tsx +3 -7
  207. package/src/components/sheet/sheet.meta.md +32 -16
  208. package/src/components/sheet/sheet.stories.tsx +116 -10
  209. package/src/components/sheet/sheet.tsx +116 -29
  210. package/src/components/sidebar/sidebar.meta.md +37 -18
  211. package/src/components/sidebar/sidebar.stories.tsx +701 -29
  212. package/src/components/sidebar/sidebar.tsx +615 -142
  213. package/src/components/skeleton/skeleton.meta.md +4 -5
  214. package/src/components/skeleton/skeleton.stories.tsx +4 -4
  215. package/src/components/skeleton/skeleton.tsx +7 -7
  216. package/src/components/slider/slider.meta.md +57 -5
  217. package/src/components/slider/slider.stories.tsx +58 -6
  218. package/src/components/slider/slider.tsx +154 -13
  219. package/src/components/sonner/sonner.meta.md +58 -7
  220. package/src/components/sonner/sonner.stories.tsx +78 -5
  221. package/src/components/sonner/sonner.tsx +137 -8
  222. package/src/components/spinner/spinner.meta.md +62 -13
  223. package/src/components/spinner/spinner.stories.tsx +66 -14
  224. package/src/components/spinner/spinner.tsx +111 -9
  225. package/src/components/statistic/statistic.meta.md +7 -2
  226. package/src/components/statistic/statistic.stories.tsx +3 -7
  227. package/src/components/statistic/statistic.tsx +5 -6
  228. package/src/components/steps/steps.meta.md +18 -4
  229. package/src/components/steps/steps.stories.tsx +43 -3
  230. package/src/components/steps/steps.tsx +15 -12
  231. package/src/components/switch/switch.meta.md +51 -5
  232. package/src/components/switch/switch.stories.tsx +6 -6
  233. package/src/components/switch/switch.tsx +109 -41
  234. package/src/components/table/table.meta.md +17 -6
  235. package/src/components/table/table.stories.tsx +10 -5
  236. package/src/components/table/table.tsx +4 -4
  237. package/src/components/tabs/tabs.meta.md +38 -25
  238. package/src/components/tabs/tabs.stories.tsx +111 -25
  239. package/src/components/tabs/tabs.tsx +125 -54
  240. package/src/components/tag/tag.meta.md +105 -40
  241. package/src/components/tag/tag.stories.tsx +189 -16
  242. package/src/components/tag/tag.tsx +222 -21
  243. package/src/components/textarea/textarea.meta.md +35 -19
  244. package/src/components/textarea/textarea.stories.tsx +32 -6
  245. package/src/components/textarea/textarea.tsx +33 -9
  246. package/src/components/time-picker/time-picker.meta.md +124 -32
  247. package/src/components/time-picker/time-picker.stories.tsx +85 -15
  248. package/src/components/time-picker/time-picker.tsx +913 -61
  249. package/src/components/timeline/timeline.meta.md +14 -6
  250. package/src/components/timeline/timeline.stories.tsx +37 -7
  251. package/src/components/timeline/timeline.tsx +35 -14
  252. package/src/components/toggle/toggle.meta.md +5 -4
  253. package/src/components/toggle/toggle.stories.tsx +4 -4
  254. package/src/components/toggle/toggle.tsx +4 -3
  255. package/src/components/toggle-group/toggle-group.meta.md +5 -4
  256. package/src/components/toggle-group/toggle-group.stories.tsx +3 -3
  257. package/src/components/toggle-group/toggle-group.tsx +2 -2
  258. package/src/components/tooltip/tooltip.meta.md +55 -5
  259. package/src/components/tooltip/tooltip.stories.tsx +42 -5
  260. package/src/components/tooltip/tooltip.tsx +81 -21
  261. package/src/components/tour/tour.meta.md +9 -4
  262. package/src/components/tour/tour.stories.tsx +3 -3
  263. package/src/components/tour/tour.tsx +4 -4
  264. package/src/components/transfer/transfer.meta.md +11 -6
  265. package/src/components/transfer/transfer.stories.tsx +4 -8
  266. package/src/components/transfer/transfer.tsx +28 -21
  267. package/src/components/tree/tree.meta.md +63 -5
  268. package/src/components/tree/tree.stories.tsx +31 -12
  269. package/src/components/tree/tree.tsx +9 -8
  270. package/src/components/tree-select/tree-select.meta.md +59 -8
  271. package/src/components/tree-select/tree-select.stories.tsx +3 -3
  272. package/src/components/tree-select/tree-select.tsx +42 -7
  273. package/src/components/typography/typography.meta.md +61 -14
  274. package/src/components/typography/typography.stories.tsx +12 -11
  275. package/src/components/typography/typography.tsx +43 -28
  276. package/src/components/upload/upload.meta.md +49 -4
  277. package/src/components/upload/upload.stories.tsx +72 -12
  278. package/src/components/upload/upload.tsx +170 -37
  279. package/src/components/watermark/watermark.meta.md +7 -2
  280. package/src/components/watermark/watermark.stories.tsx +101 -9
  281. package/src/components/watermark/watermark.tsx +1 -0
  282. package/src/hooks/use-breakpoint.ts +117 -0
  283. package/src/hooks/use-debounce-callback.ts +52 -0
  284. package/src/hooks/use-mobile.ts +23 -0
  285. package/src/stories/theme-tokens.stories.tsx +747 -0
  286. package/src/utils/trigger-input.ts +53 -0
  287. package/src/components/button-group/button-group.meta.md +0 -92
  288. package/src/components/button-group/button-group.stories.tsx +0 -90
  289. package/src/components/button-group/button-group.tsx +0 -75
  290. package/src/components/combobox/combobox.meta.md +0 -93
  291. package/src/components/combobox/combobox.stories.tsx +0 -55
  292. package/src/components/combobox/combobox.tsx +0 -130
  293. package/src/components/space/space.meta.md +0 -94
  294. package/src/components/space/space.stories.tsx +0 -94
  295. package/src/components/space/space.tsx +0 -106
@@ -1,16 +1,17 @@
1
1
  ---
2
2
  id: alert
3
3
  name: Alert
4
+ displayName: 警告提示
4
5
  type: component
5
6
  category: feedback
6
7
  since: 0.1.0
7
- package: "@teamix-evo/ui"
8
+ package: '@teamix-evo/ui'
8
9
  ---
9
10
 
10
- # Alert
11
+ # Alert 警告提示
11
12
 
12
- 静态提示条 — shadcn 简约视觉 + antd 的 `type / showIcon / closable / banner` 并集。
13
- **inline 形态**,与对话框 / Toast 不同,常驻在页面上方或表单上方。
13
+ 静态提示条 — shadcn 简约视觉 + antd 的 `showIcon / closable / banner` 并集。在 [ADR 0021](../../../../docs/adr/0021-semantic-color-api-unification.md) 六档语义色基础上,为内联信息提示专门補上 `neutral`(中性灰,纯文本提示),合计六档 `color`:`primary | info | success | warning | destructive | neutral`。
14
+ **inline 形态**,与对话框 / Toast 不同,常驻在页面上方或表单上方。视觉走 OpenTrek tokens —— **无边框、靠 `*-subtle` 浅底块与卡片底色对比分界、面性(filled) 状态图标**。
14
15
 
15
16
  ## When to use
16
17
 
@@ -31,7 +32,7 @@ package: "@teamix-evo/ui"
31
32
  <!-- auto:props:begin -->
32
33
  | 名称 | 类型 | 默认值 | 必填 | 说明 |
33
34
  | --- | --- | --- | --- | --- |
34
- | `type` | `'info' \| 'success' \| 'warning' \| 'error'` | `"info"` | – | 类型(antd `type` 并集) 控制语义色与默认图标。 |
35
+ | `color` | `'primary' \| 'info' \| 'success' \| 'warning' \| 'destructive' \| 'neutral'` | `"primary"` | – | 语义色 — 控制配色与默认图标。 - `primary` 主色(默认,中性提示) - `info` 信息蓝(强调"知会"语义) - `success` 成功 - `warning` 警告 - `destructive` 错误(对齐 ADR 0021,禁用 `error` / `danger` 别名) - `neutral` 中性灰(纯文本提示,不带语义压力) |
35
36
  | `showIcon` | `boolean` | `true` | – | 是否显示图标(antd `showIcon` 并集)。 |
36
37
  | `closable` | `boolean` | `false` | – | 是否可关闭,显示右侧 X 按钮(antd `closable` 并集)。 |
37
38
  | `onClose` | `() => void` | – | – | 关闭按钮点击回调。 |
@@ -64,11 +65,14 @@ pnpm add class-variance-authority@^0.7.0 lucide-react@^0.460.0
64
65
 
65
66
  ## AI 生成纪律
66
67
 
67
- - **`type` 反映业务语义**:`error` 仅用于真正错误,**不要**滥用红色制造紧张感
68
- - **`title` + `description` 一对**:无 title 直接 description 是反模式;一个 Alert 至少要有 title 让用户判断重要性
68
+ - **`color` 反映业务语义**:`destructive` 仅用于真正错误,**不要**滥用红色制造紧张感;一般提示用 `primary` / `info`,纯文本提示用 `neutral`(不带语义压力)
69
+ - **`info` vs `primary`**:`info` 强调"知会"(蓝色信息脚本),`primary` 强调"引导"(主色/品牌色);遵循 OpenTrek tokens 语义,不要随意互换
70
+ - **`title` + `description` 一对**:无 title 直接 description 是反模式(仅 `description` 可用于表单内提示);一个 Alert 至少要有 title 让用户判断重要性
69
71
  - **`closable` 配 `onClose` 持久化**:用户关闭后下次刷新别再出现 — 用 localStorage 记忆
70
72
  - **`banner` 模式只放页面顶部**:不要在卡片内 banner
71
73
  - **不嵌套 button 链接**:Alert 内放交互链接用 `<a className="underline">`,不要塞 Button — 视觉过重
74
+ - **不要手动加边框**:`border-0` 是刚性规范,透过 `className` 加 `border` 会与克制美学冲突;需要分隔请换用 `Card` 或依赖页面间距
75
+ - **面性图标不可覆盖**:组件已统一处理 lucide `CircleCheck` / `TriangleAlert` / `CircleX` / `Info` 的 `fill-* + text-*-foreground` 组合,顺着语义色自动切换;不要在 `children` 里手写 svg 覆盖
72
76
 
73
77
  ## Examples
74
78
 
@@ -76,26 +80,53 @@ pnpm add class-variance-authority@^0.7.0 lucide-react@^0.460.0
76
80
  import { Alert } from '@/components/ui/alert';
77
81
 
78
82
  // 基本
79
- <Alert type="info" title="提示" description="数据将在 10 分钟后刷新。" />
83
+ <Alert color="primary" title="提示" description="数据将在 10 分钟后刷新。" />
84
+
85
+ // 信息蓝(新 —— 强调知会语义)
86
+ <Alert color="info" title="新功能上线" description="试试新版本的智能搜索。" />
80
87
 
81
88
  // 成功
82
- <Alert type="success" title="保存成功" />
89
+ <Alert color="success" title="保存成功" />
83
90
 
84
91
  // 警告 + 可关闭
85
- <Alert type="warning" title="账号即将过期" description="请在 7 天内续费。" closable />
92
+ <Alert color="warning" title="账号即将过期" description="请在 7 天内续费。" closable />
86
93
 
87
94
  // 错误
88
- <Alert type="error" title="提交失败" description="请检查网络连接后重试。" />
95
+ <Alert color="destructive" title="提交失败" description="请检查网络连接后重试。" />
96
+
97
+ // 中性(新 —— 纯文本提示,不带语义压力)
98
+ <Alert color="neutral" title="说明" description="该功能仅对管理员开放。" />
99
+
100
+ // 仅描述(无标题)
101
+ <Alert color="info" description="操作完成后请刷新页面。" />
89
102
 
90
103
  // 无图标
91
- <Alert type="info" showIcon={false} description="纯文本提示" />
104
+ <Alert color="primary" showIcon={false} description="纯文本提示" />
92
105
 
93
106
  // Banner 全局公告
94
107
  <Alert
95
- type="warning"
108
+ color="warning"
96
109
  banner
97
110
  title="系统维护"
98
111
  description="本站将于 02:00 起暂停服务 30 分钟。"
99
112
  closable
100
113
  />
101
114
  ```
115
+
116
+ ---
117
+
118
+ ## Alert 形态 — 旧库 Message(inline) → 新映射
119
+
120
+ > 旧库 `Message shape='inline'` → 新库 `Alert`(独立组件)。
121
+ > 旧库命令式 toast 部分请看 `sonner` 组件的形态映射。
122
+
123
+ ### 命名映射
124
+
125
+ | 旧库 | 新库 | 说明 |
126
+ | --------------------------------------- | ------------------------------- | ------------------- |
127
+ | `Message shape='inline' type='success'` | `<Alert color="success" />` | type → color |
128
+ | `Message shape='inline' type='error'` | `<Alert color="destructive" />` | error → destructive |
129
+ | `Message shape='inline' type='warning'` | `<Alert color="warning" />` | 直接映射 |
130
+ | `Message shape='inline' type='notice'` | `<Alert color="info" />` | notice → info |
131
+ | `closeable` | `closable` | 拼写修正 |
132
+ | `title + children` | `title + description` | prop 更名 |
@@ -1,22 +1,29 @@
1
- import type { Meta, StoryObj } from '@storybook/react';
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
2
  import { Alert } from './alert';
3
3
 
4
4
  const meta: Meta<typeof Alert> = {
5
- title: '反馈与浮层 · Feedback/Alert',
5
+ title: '反馈 · Feedback/Alert',
6
6
  component: Alert,
7
7
  tags: ['autodocs'],
8
8
  parameters: {
9
9
  docs: {
10
10
  description: {
11
11
  component:
12
- '警告提示 在不打断用户操作的前提下展示重要信息。四种语义状态(`info` / `success` / `warning` / `error`)对齐 design 语义色;支持 `showIcon` 状态图标、`closable` 一键关闭、`banner` 顶部业务通告梨式。能力对齐 antd Alert,视觉走 OpenTrek semantic tokens,所有样式来自 `@teamix-evo/design`,无 mock。',
12
+ '警告提示 —— 在不打断用户操作的前提下,inline 形态展示重要信息(提示 / 公告 / 错误)。能力对齐 antd `Alert` 并集(`showIcon` / `closable` / `banner`),六档语义色 `primary | info | success | warning | destructive | neutral` 对齐 ADR 0021 OpenTrek tokens,**无边框**,依靠 `*-subtle` 浅底块与卡片底色对比,搭配面性(filled)状态图标。视觉走 OpenTrek semantic tokens,所有样式来自 `@teamix-evo/tokens`,无 mock。',
13
13
  },
14
14
  },
15
15
  },
16
16
  argTypes: {
17
- type: {
17
+ color: {
18
18
  control: 'select',
19
- options: ['info', 'success', 'warning', 'error'],
19
+ options: [
20
+ 'primary',
21
+ 'info',
22
+ 'success',
23
+ 'warning',
24
+ 'destructive',
25
+ 'neutral',
26
+ ],
20
27
  },
21
28
  showIcon: { control: 'boolean' },
22
29
  closable: { control: 'boolean' },
@@ -25,7 +32,7 @@ const meta: Meta<typeof Alert> = {
25
32
  description: { control: 'text' },
26
33
  },
27
34
  args: {
28
- type: 'info',
35
+ color: 'primary',
29
36
  showIcon: true,
30
37
  closable: false,
31
38
  banner: false,
@@ -46,37 +53,82 @@ type Story = StoryObj<typeof Alert>;
46
53
 
47
54
  export const Playground: Story = {};
48
55
 
49
- export const Types: Story = {
56
+ /**
57
+ * 六档语义色 —— 对齐 ADR 0021 + Alert 专有 `neutral`(纯文本提示)。
58
+ * 全部使用面性图标,卡片无边框、靠浅底块分界。
59
+ */
60
+ export const Colors: Story = {
50
61
  parameters: { controls: { disable: true } },
51
62
  decorators: [(Story) => <div className="w-96">{Story()}</div>],
52
63
  render: () => (
53
64
  <div className="flex flex-col gap-3">
54
- <Alert type="info" title="信息" description="一般性提示。" />
55
- <Alert type="success" title="成功" description="操作已完成。" />
56
- <Alert type="warning" title="警告" description="请注意可能的影响。" />
57
- <Alert type="error" title="错误" description="操作失败,请重试。" />
65
+ <Alert color="primary" title="主色提示" description="数据将在 10 分钟后刷新。" />
66
+ <Alert color="info" title="信息" description="新功能已上线,试试看。" />
67
+ <Alert color="success" title="成功" description="所有更改已生效。" />
68
+ <Alert color="warning" title="警告" description="账号 7 天后过期。" />
69
+ <Alert
70
+ color="destructive"
71
+ title="错误"
72
+ description="提交失败,请检查网络后重试。"
73
+ />
74
+ <Alert color="neutral" title="说明" description="该功能仅对管理员开放。" />
58
75
  </div>
59
76
  ),
60
77
  };
61
78
 
79
+ /**
80
+ * 仅描述(无标题) —— 极简形态,常用于表单内提示。
81
+ */
82
+ export const DescriptionOnly: Story = {
83
+ parameters: { controls: { disable: true } },
84
+ decorators: [(Story) => <div className="w-96">{Story()}</div>],
85
+ render: () => (
86
+ <div className="flex flex-col gap-3">
87
+ <Alert color="info" description="操作完成后请刷新页面以查看最新结果。" />
88
+ <Alert color="neutral" description="提示:Cmd+S 可以快速保存。" />
89
+ </div>
90
+ ),
91
+ };
92
+
93
+ /**
94
+ * 无图标 —— 纯文本提示形态。
95
+ */
96
+ export const NoIcon: Story = {
97
+ parameters: { controls: { disable: true } },
98
+ render: () => (
99
+ <Alert
100
+ color="primary"
101
+ showIcon={false}
102
+ title="纯文本提示"
103
+ description="不显示状态图标,文字密度更高。"
104
+ />
105
+ ),
106
+ };
107
+
108
+ /**
109
+ * 可关闭 —— 右上角 X 按钮,关闭时触发 `onClose`。
110
+ */
62
111
  export const Closable: Story = {
63
112
  parameters: { controls: { disable: true } },
64
113
  render: () => (
65
114
  <Alert
66
- type="warning"
115
+ color="warning"
67
116
  title="账号即将过期"
68
- description="请在 7 天内续费。"
117
+ description="请在 7 天内续费,以免影响服务。"
69
118
  closable
70
119
  />
71
120
  ),
72
121
  };
73
122
 
123
+ /**
124
+ * Banner 模式 —— 横向铺满、无圆角,常用于页面顶部全局公告。
125
+ */
74
126
  export const Banner: Story = {
75
127
  parameters: { controls: { disable: true } },
76
128
  decorators: [(Story) => <div className="w-[600px]">{Story()}</div>],
77
129
  render: () => (
78
130
  <Alert
79
- type="warning"
131
+ color="warning"
80
132
  banner
81
133
  title="系统维护"
82
134
  description="本站将于 02:00 起暂停服务 30 分钟。"
@@ -84,10 +136,3 @@ export const Banner: Story = {
84
136
  />
85
137
  ),
86
138
  };
87
-
88
- export const NoIcon: Story = {
89
- parameters: { controls: { disable: true } },
90
- render: () => (
91
- <Alert type="info" showIcon={false} description="纯文本提示,无图标。" />
92
- ),
93
- };
@@ -1,52 +1,91 @@
1
1
  import * as React from 'react';
2
2
  import { cva, type VariantProps } from 'class-variance-authority';
3
- import {
4
- AlertCircle,
5
- AlertTriangle,
6
- CheckCircle2,
7
- Info,
8
- X,
9
- } from 'lucide-react';
3
+ import { CircleCheck, CircleX, Info, TriangleAlert, X } from 'lucide-react';
10
4
 
11
5
  import { cn } from '@/utils/cn';
12
6
 
7
+ /**
8
+ * Alert 卡片 —— 无边框、纯色块底分界。
9
+ *
10
+ * 视觉决策:
11
+ * - **去边框**(`border-0`):依靠 `*-subtle` 浅色背景与卡片底色对比,减少线条切割
12
+ * - **`p-4`** 内间距:对齐 OpenTrek 间距档(4px 倍数),比旧版 `px-4 py-3` 上下更对称
13
+ * - **面性 icon**:`fill-* + text-*-foreground`,实心圆/三角,与 Sonner 同源
14
+ */
13
15
  const alertVariants = cva(
14
- 'relative w-full rounded-lg border px-4 py-3 text-sm [&>svg]:size-4 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg~*]:pl-7',
16
+ 'relative w-full rounded-md border-0 p-4 text-xs [&>svg]:size-5 [&>svg+div]:translate-y-[-2px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg~*]:pl-8',
15
17
  {
16
18
  variants: {
17
- type: {
18
- info: 'border-blue-200 bg-blue-50 text-blue-900 [&>svg]:text-blue-500 dark:border-blue-900/30 dark:bg-blue-950/40 dark:text-blue-100',
19
- success:
20
- 'border-emerald-200 bg-emerald-50 text-emerald-900 [&>svg]:text-emerald-500 dark:border-emerald-900/30 dark:bg-emerald-950/40 dark:text-emerald-100',
21
- warning:
22
- 'border-amber-200 bg-amber-50 text-amber-900 [&>svg]:text-amber-500 dark:border-amber-900/30 dark:bg-amber-950/40 dark:text-amber-100',
23
- error:
24
- 'border-destructive/30 bg-destructive/10 text-destructive [&>svg]:text-destructive',
19
+ color: {
20
+ primary: 'bg-primary/10 text-primary',
21
+ info: 'bg-info-subtle text-info',
22
+ success: 'bg-success-subtle text-success',
23
+ warning: 'bg-warning-subtle text-warning',
24
+ destructive: 'bg-destructive/10 text-destructive',
25
+ neutral: 'bg-muted text-foreground',
25
26
  },
26
27
  banner: {
27
- true: 'rounded-none border-x-0',
28
+ true: 'rounded-none',
28
29
  false: '',
29
30
  },
30
31
  },
31
- defaultVariants: { type: 'info', banner: false },
32
+ defaultVariants: { color: 'primary', banner: false },
32
33
  },
33
34
  );
34
35
 
35
- const typeIcon = {
36
- info: Info,
37
- success: CheckCircle2,
38
- warning: AlertTriangle,
39
- error: AlertCircle,
40
- } as const;
36
+ type AlertColor =
37
+ | 'primary'
38
+ | 'info'
39
+ | 'success'
40
+ | 'warning'
41
+ | 'destructive'
42
+ | 'neutral';
43
+
44
+ /**
45
+ * 面性图标映射 —— 通过 `fill-*` 填充语义色, `text-*-foreground` 设置 currentColor 作为
46
+ * 描边对比色, 形成 "色块底 + 高对比记号" 的实心视觉。`neutral` / `primary` 用线性
47
+ * Info(中性提示不需要强烈的色块感)。
48
+ */
49
+ const colorIcon: Record<AlertColor, { Icon: typeof Info; className: string }> =
50
+ {
51
+ primary: { Icon: Info, className: 'text-primary' },
52
+ info: { Icon: Info, className: 'fill-info text-info-foreground' },
53
+ success: {
54
+ Icon: CircleCheck,
55
+ className: 'fill-success text-success-foreground',
56
+ },
57
+ warning: {
58
+ Icon: TriangleAlert,
59
+ className: 'fill-warning text-warning-foreground',
60
+ },
61
+ destructive: {
62
+ Icon: CircleX,
63
+ className: 'fill-destructive text-destructive-foreground',
64
+ },
65
+ neutral: { Icon: Info, className: 'text-muted-foreground' },
66
+ };
41
67
 
42
68
  export interface AlertProps
43
- extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'>,
69
+ extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title' | 'color'>,
44
70
  VariantProps<typeof alertVariants> {
45
71
  /**
46
- * 类型(antd `type` 并集)控制语义色与默认图标。
47
- * @default "info"
72
+ * 语义色控制配色与默认图标。
73
+ *
74
+ * - `primary` 主色(默认,中性提示)
75
+ * - `info` 信息蓝(强调"知会"语义)
76
+ * - `success` 成功
77
+ * - `warning` 警告
78
+ * - `destructive` 错误(对齐 ADR 0021,禁用 `error` / `danger` 别名)
79
+ * - `neutral` 中性灰(纯文本提示,不带语义压力)
80
+ * @default "primary"
48
81
  */
49
- type?: 'info' | 'success' | 'warning' | 'error';
82
+ color?:
83
+ | 'primary'
84
+ | 'info'
85
+ | 'success'
86
+ | 'warning'
87
+ | 'destructive'
88
+ | 'neutral';
50
89
  /**
51
90
  * 是否显示图标(antd `showIcon` 并集)。
52
91
  * @default true
@@ -76,7 +115,7 @@ const Alert = React.forwardRef<HTMLDivElement, AlertProps>(
76
115
  (
77
116
  {
78
117
  className,
79
- type = 'info',
118
+ color = 'primary',
80
119
  showIcon = true,
81
120
  closable = false,
82
121
  onClose,
@@ -90,15 +129,21 @@ const Alert = React.forwardRef<HTMLDivElement, AlertProps>(
90
129
  ) => {
91
130
  const [open, setOpen] = React.useState(true);
92
131
  if (!open) return null;
93
- const Icon = typeIcon[type];
132
+ const { Icon, className: iconClassName } = colorIcon[color];
94
133
  return (
95
134
  <div
96
135
  ref={ref}
97
136
  role="alert"
98
- className={cn(alertVariants({ type, banner }), className)}
137
+ className={cn(
138
+ alertVariants({ color, banner }),
139
+ closable ? 'pr-10' : '',
140
+ className,
141
+ )}
99
142
  {...props}
100
143
  >
101
- {showIcon ? <Icon aria-hidden="true" /> : null}
144
+ {showIcon ? (
145
+ <Icon aria-hidden="true" className={iconClassName} />
146
+ ) : null}
102
147
  <div className={cn(showIcon ? '' : 'pl-0')}>
103
148
  {title ? (
104
149
  <h5 className="mb-1 font-medium leading-none tracking-tight">
@@ -106,7 +151,9 @@ const Alert = React.forwardRef<HTMLDivElement, AlertProps>(
106
151
  </h5>
107
152
  ) : null}
108
153
  {description ? (
109
- <div className="text-sm [&_p]:leading-relaxed">{description}</div>
154
+ <div className="text-xs opacity-90 [&_p]:leading-relaxed">
155
+ {description}
156
+ </div>
110
157
  ) : null}
111
158
  {children}
112
159
  </div>
@@ -118,7 +165,7 @@ const Alert = React.forwardRef<HTMLDivElement, AlertProps>(
118
165
  onClose?.();
119
166
  }}
120
167
  aria-label="Close"
121
- className="absolute right-3 top-3 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
168
+ className="absolute right-3 top-3 cursor-pointer rounded-sm opacity-70 transition-opacity hover:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
122
169
  >
123
170
  <X className="size-4" />
124
171
  </button>
@@ -1,40 +1,58 @@
1
1
  ---
2
2
  id: alert-dialog
3
3
  name: AlertDialog
4
+ displayName: 确认对话框
4
5
  type: component
5
6
  category: feedback
6
7
  since: 0.1.0
7
- package: "@teamix-evo/ui"
8
+ package: '@teamix-evo/ui'
8
9
  ---
9
10
 
10
- # AlertDialog
11
+ # AlertDialog 确认对话框
12
+
13
+ 阻断式确认对话框 — Radix AlertDialog + antd `Modal.confirm` 并集。视觉上与 [Dialog](../dialog/dialog.meta.md) **同源**(圆角 `--radius-dialog`、无 border、纯白 + shadow 分界),`size` 四档同样绑定 `--layout-dialog-{sm|md|lg|xl}`,仅默认尺寸为 `sm`(确认场景文案短、信息少)。
11
14
 
12
- 阻断式确认对话框 — Radix AlertDialog + antd `Modal.confirm` 并集。
13
15
  **与 Dialog 关键差异**:
16
+
14
17
  - 不可点击外部 / ESC 关闭(强制选择 Action / Cancel)
15
18
  - 自带 Action / Cancel 子组件,默认走 Button 视觉
16
- - 无右上角关闭按钮(避免误关)
19
+ - 无右上角 X 关闭按钮(避免误关 → P4 Safety)
20
+ - 默认 `size="sm"`(Dialog 默认 `md`)
17
21
 
18
- 设计依据:design `principles.md` P4 Safety + `ai-rules/checklist.md` §8 安全 — 危险操作必须二次确认。
22
+ 设计依据:`teamix-evo-design-opentrek` skill `philosophy.md` P4 Safety + `checklist.md` §8 安全 — 危险操作必须二次确认。
19
23
 
20
24
  ## When to use
21
25
 
22
26
  - 删除 / 释放 / 强制重启等**不可逆**操作
23
27
  - 离开未保存表单的拦截
24
28
  - 高危 SaaS 操作(关闭账号、清空数据)
29
+ - 替代 antd `Modal.confirm` / `Modal.alert` 等命令式 API 的声明式确认场景
25
30
 
26
31
  ## When NOT to use
27
32
 
28
- - 普通编辑确认 → `Dialog`(可关闭、可取消)
33
+ - 普通编辑确认 → `Dialog`(可关闭、可取消、size 默认更大)
29
34
  - 一次性提示 → `Sonner`
30
35
  - 非阻断的状态提示 → `Alert`
31
36
 
37
+ ## Size 档位(token 绑定)
38
+
39
+ | size | token | OpenTrek 基准 | 典型场景 |
40
+ | ---- | ------------------ | ------------- | ------------------------------------ |
41
+ | `sm` | `--layout-dialog-sm` | 400px | **默认**,确认 / 警告 / 简短提示 |
42
+ | `md` | `--layout-dialog-md` | 600px | 含影响范围列表 / 多段描述的确认 |
43
+ | `lg` | `--layout-dialog-lg` | 800px | 需展示资源清单 / 影响图谱的高危确认 |
44
+ | `xl` | `--layout-dialog-xl` | 1200px | 罕见;大表预览 + 批量确认 |
45
+
46
+ > 确认对话框定位是"短、快、清",不要无脑放大 — 高危场景反而需要用户聚焦关键信息。
47
+
32
48
  ## Props
33
49
 
34
50
  > 以下表格由 `pnpm --filter @teamix-evo/ui gen:meta` 自动生成。下表是 `AlertDialogContent` 的 props;`AlertDialog`(Root)透传 Radix `open / defaultOpen / onOpenChange`。
35
51
 
36
52
  <!-- auto:props:begin -->
37
- _(no props)_
53
+ | 名称 | 类型 | 默认值 | 必填 | 说明 |
54
+ | --- | --- | --- | --- | --- |
55
+ | `size` | `AlertDialogSize` | `"sm"` | – | 确认对话框尺寸 — 绑定 design tokens `--layout-dialog-{sm\|md\|lg\|xl}`。 OpenTrek 基准:sm=400 / md=600 / lg=800 / xl=1200。 确认场景文案短、信息少,默认 `sm`。 |
38
56
  <!-- auto:props:end -->
39
57
 
40
58
  ## 依赖
@@ -49,14 +67,14 @@ _(no props)_
49
67
  | Entry | 类型 | 描述 |
50
68
  | --- | --- | --- |
51
69
  | `cn` | util | Tailwind className 合并工具(clsx + tailwind-merge) |
52
- | `button` | component | 通用按钮 — shadcn 实现 + antd 功能扩展(loading / icon / shape / block / dashed variant) |
70
+ | `button` | component | 通用按钮 — shadcn 实现 + cloud-design 能力并集(loading / icon / shape / block / dashed variant / color 语义双 prop / disabledTooltip)。同文件合一导出 ButtonGroup + ButtonGroupText(等价 antd Space.Compact + cd SplitButton)。 |
53
71
 
54
72
  ### npm 依赖
55
73
 
56
74
  > 业务侧需要先 `pnpm add` / `npm install` 这些包。CLI 在 `ui add` 完成后会列出此提示。
57
75
 
58
76
  ```bash
59
- pnpm add @radix-ui/react-alert-dialog@^1.1.0
77
+ pnpm add @radix-ui/react-alert-dialog@^1.1.0 class-variance-authority@^0.7.0
60
78
  ```
61
79
  <!-- auto:deps:end -->
62
80
 
@@ -69,18 +87,27 @@ pnpm add @radix-ui/react-alert-dialog@^1.1.0
69
87
  - **高危操作要求输入名称校验**(超出 AlertDialog 单次使用范围,但提醒在 Description 引导用户)
70
88
  - **Cancel 永远在左,Action 永远在右**:遵循 design P3 Predictability;**不要**为了"突出取消"反置
71
89
  - **Title ≤ 1 行**:简短指令式("确认删除?"),Description 才放细节
90
+ - **`size` 沿用默认 `sm` 优先**:确认场景信息少、需聚焦,不要为了"显得正式"放大到 `md`/`lg`;只有需要列出资源清单或影响图谱时再升档
91
+ - **不要硬编码圆角 / 宽度**:与 Dialog 同源,`--radius-dialog` 与 `--layout-dialog-*` 已绑定,禁止在 `className` 覆盖
92
+ - **不要补 X 关闭按钮**:`AlertDialog` 故意不给 X(P4 Safety,避免误关),如果你觉得"应该能直接关",请改用 [Dialog](../dialog/dialog.meta.md)
72
93
 
73
94
  ## Examples
74
95
 
75
96
  ```tsx
76
97
  import {
77
- AlertDialog, AlertDialogTrigger, AlertDialogContent,
78
- AlertDialogHeader, AlertDialogTitle, AlertDialogDescription,
79
- AlertDialogFooter, AlertDialogAction, AlertDialogCancel,
98
+ AlertDialog,
99
+ AlertDialogTrigger,
100
+ AlertDialogContent,
101
+ AlertDialogHeader,
102
+ AlertDialogTitle,
103
+ AlertDialogDescription,
104
+ AlertDialogFooter,
105
+ AlertDialogAction,
106
+ AlertDialogCancel,
80
107
  } from '@/components/ui/alert-dialog';
81
- import { Button } from '@/components/ui/button';
82
- import { buttonVariants } from '@/components/ui/button';
108
+ import { Button, buttonVariants } from '@/components/ui/button';
83
109
 
110
+ // 高危删除(destructive action)
84
111
  <AlertDialog>
85
112
  <AlertDialogTrigger asChild>
86
113
  <Button variant="destructive">删除项目</Button>
@@ -89,7 +116,8 @@ import { buttonVariants } from '@/components/ui/button';
89
116
  <AlertDialogHeader>
90
117
  <AlertDialogTitle>确认删除项目?</AlertDialogTitle>
91
118
  <AlertDialogDescription>
92
- 将永久删除 <b>"运营后台"</b> 项目及其下 142 个资源。<br />
119
+ 将永久删除 <b>"运营后台"</b> 项目及其下 142 个资源。
120
+ <br />
93
121
  此操作不可撤销。
94
122
  </AlertDialogDescription>
95
123
  </AlertDialogHeader>
@@ -103,5 +131,22 @@ import { buttonVariants } from '@/components/ui/button';
103
131
  </AlertDialogAction>
104
132
  </AlertDialogFooter>
105
133
  </AlertDialogContent>
106
- </AlertDialog>
134
+ </AlertDialog>;
135
+
136
+ // 含影响清单的大尺寸确认
137
+ <AlertDialogContent size="md">
138
+ {/* ... 列出资源标识 / 关联依赖 / 备份提醒 ... */}
139
+ </AlertDialogContent>;
140
+
141
+ // 普通业务确认(Action 用默认 primary)
142
+ <AlertDialogContent>
143
+ <AlertDialogHeader>
144
+ <AlertDialogTitle>确认提交?</AlertDialogTitle>
145
+ <AlertDialogDescription>提交后 5 分钟内可取消。</AlertDialogDescription>
146
+ </AlertDialogHeader>
147
+ <AlertDialogFooter>
148
+ <AlertDialogCancel>取消</AlertDialogCancel>
149
+ <AlertDialogAction>确认</AlertDialogAction>
150
+ </AlertDialogFooter>
151
+ </AlertDialogContent>;
107
152
  ```