@tendaui/components 1.2.4 → 1.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 (406) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +176 -176
  3. package/_util/scroll.ts +9 -0
  4. package/alert/_example/base.tsx +13 -0
  5. package/alert/_example/collapse.tsx +15 -0
  6. package/badge/_example/base.tsx +10 -0
  7. package/badge/_example/count.tsx +29 -0
  8. package/badge/_example/custom-color.tsx +32 -0
  9. package/badge/_example/dot.tsx +26 -0
  10. package/badge/_example/max-count.tsx +26 -0
  11. package/badge/_example/offset.tsx +29 -0
  12. package/badge/_example/shape.tsx +32 -0
  13. package/badge/_example/show-zero.tsx +23 -0
  14. package/badge/_example/size.tsx +35 -0
  15. package/badge/_example/standalone.tsx +14 -0
  16. package/badge/_example/text-count.tsx +26 -0
  17. package/badge/_example/with-button.tsx +23 -0
  18. package/button/_example/block.tsx +18 -0
  19. package/button/_example/disabled.tsx +22 -0
  20. package/button/_example/ghost.tsx +24 -0
  21. package/button/_example/link.tsx +15 -0
  22. package/button/_example/loading.tsx +19 -0
  23. package/button/_example/shape.tsx +18 -0
  24. package/button/_example/size.tsx +18 -0
  25. package/button/_example/suffix.tsx +16 -0
  26. package/button/_example/theme.tsx +14 -0
  27. package/button/_example/variant-base.tsx +24 -0
  28. package/button/_example/variant-dashed.tsx +24 -0
  29. package/button/_example/variant-outline.tsx +24 -0
  30. package/button/_example/variant-text.tsx +24 -0
  31. package/checkbox/_example/base.tsx +8 -0
  32. package/checkbox/_example/controlled.tsx +11 -0
  33. package/checkbox/_example/group-disabled.tsx +13 -0
  34. package/checkbox/_example/group-with-check-all.tsx +22 -0
  35. package/checkbox/_example/group-with-max.tsx +17 -0
  36. package/checkbox/_example/group-with-options.tsx +18 -0
  37. package/checkbox/_example/group.tsx +17 -0
  38. package/checkbox/_example/states.tsx +19 -0
  39. package/color-picker/ColorPicker.tsx +16 -2
  40. package/color-picker/_example/base.tsx +12 -0
  41. package/color-picker/_example/borderless.tsx +17 -0
  42. package/color-picker/_example/clearable.tsx +12 -0
  43. package/color-picker/_example/disabled.tsx +17 -0
  44. package/color-picker/_example/formats.tsx +30 -0
  45. package/color-picker/_example/manual-input.tsx +39 -0
  46. package/color-picker/_example/recent-colors.tsx +19 -0
  47. package/color-picker/_example/swatch-colors.tsx +28 -0
  48. package/color-picker/_example/with-alpha.tsx +21 -0
  49. package/color-picker/components/panel/format/inputs.tsx +1 -1
  50. package/color-picker/components/panel/index.tsx +13 -0
  51. package/color-picker/components/trigger.tsx +64 -13
  52. package/color-picker/defaultProps.ts +4 -1
  53. package/color-picker/utils/color-picker/cmyk.ts +89 -89
  54. package/color-picker/utils/color-picker/color.ts +467 -467
  55. package/color-picker/utils/color-picker/constants.ts +187 -187
  56. package/color-picker/utils/color-picker/draggable.ts +99 -100
  57. package/color-picker/utils/color-picker/format.ts +90 -95
  58. package/color-picker/utils/color-picker/gradient.ts +237 -243
  59. package/color-picker/utils/color-picker/index.ts +7 -7
  60. package/color-picker/utils/color-picker/types.ts +33 -33
  61. package/config-provider/ConfigContext.tsx +1 -0
  62. package/config-provider/ConfigProvider.tsx +18 -1
  63. package/config-provider/type.ts +5 -0
  64. package/dialog/_example/base.tsx +27 -0
  65. package/dialog/_example/confirm-loading.tsx +32 -0
  66. package/dialog/_example/custom-buttons.tsx +24 -0
  67. package/dialog/_example/full-screen.tsx +26 -0
  68. package/dialog/_example/hide-buttons.tsx +39 -0
  69. package/dialog/_example/modeless.tsx +25 -0
  70. package/dialog/_example/placement.tsx +40 -0
  71. package/dialog/_example/plugin-example.tsx +69 -0
  72. package/dialog/_example/themes.tsx +41 -0
  73. package/dialog/hooks/useDialogPosition.ts +35 -35
  74. package/drawer/Drawer.tsx +17 -9
  75. package/drawer/_example/custom-header-footer.tsx +29 -0
  76. package/drawer/_example/default.tsx +20 -0
  77. package/drawer/_example/events.tsx +53 -0
  78. package/drawer/_example/no-footer.tsx +20 -0
  79. package/drawer/_example/no-overlay.tsx +20 -0
  80. package/drawer/_example/placement.tsx +43 -0
  81. package/drawer/_example/size-draggable.tsx +26 -0
  82. package/drawer/_example/size.tsx +40 -0
  83. package/drawer/defaultProps.ts +1 -1
  84. package/fireworks/Fireworks.tsx +1 -10
  85. package/fireworks/index.ts +0 -1
  86. package/fireworks/type.ts +0 -1
  87. package/form/_example/complex.tsx +76 -0
  88. package/form/_example/default.tsx +58 -0
  89. package/form/_example/disabled.tsx +26 -0
  90. package/form/_example/form-list.tsx +74 -0
  91. package/form/_example/inline-layout.tsx +20 -0
  92. package/form/_example/label-align.tsx +46 -0
  93. package/form/_example/methods.tsx +66 -0
  94. package/form/_example/validation.tsx +71 -0
  95. package/form/hooks/useFormItemStyle.tsx +19 -7
  96. package/form/index.ts +20 -2
  97. package/form/type.ts +519 -519
  98. package/global-config/default-config.ts +95 -95
  99. package/global-config/locale/ar_KW.ts +259 -270
  100. package/global-config/locale/en_US.ts +265 -280
  101. package/global-config/locale/it_IT.ts +264 -287
  102. package/global-config/locale/ja_JP.ts +264 -279
  103. package/global-config/locale/ko_KR.ts +264 -279
  104. package/global-config/locale/ru_RU.ts +277 -288
  105. package/global-config/locale/zh_CN.ts +265 -279
  106. package/global-config/locale/zh_TW.ts +265 -279
  107. package/global-config/mobile/default-config.ts +6 -6
  108. package/global-config/mobile/locale/ar_KW.ts +112 -113
  109. package/global-config/mobile/locale/en_US.ts +113 -114
  110. package/global-config/mobile/locale/it_IT.ts +113 -114
  111. package/global-config/mobile/locale/ja_JP.ts +100 -101
  112. package/global-config/mobile/locale/ko_KR.ts +100 -101
  113. package/global-config/mobile/locale/ru_RU.ts +112 -113
  114. package/global-config/mobile/locale/zh_CN.ts +100 -101
  115. package/global-config/mobile/locale/zh_TW.ts +100 -101
  116. package/global-config/t.ts +111 -111
  117. package/hooks/useDebounce.ts +27 -0
  118. package/hooks/useLastest.ts +6 -2
  119. package/hooks/useResizeObserve.ts +0 -1
  120. package/index.ts +1 -1
  121. package/input/Input.tsx +53 -10
  122. package/input/_example/auto-width.tsx +14 -0
  123. package/input/_example/borderless.tsx +17 -0
  124. package/input/_example/clearable.tsx +14 -0
  125. package/input/_example/default.tsx +10 -0
  126. package/input/_example/disabled-readonly.tsx +12 -0
  127. package/input/_example/events.tsx +42 -0
  128. package/input/_example/group.tsx +14 -0
  129. package/input/_example/label-suffix.tsx +12 -0
  130. package/input/_example/max-length.tsx +11 -0
  131. package/input/_example/password.tsx +14 -0
  132. package/input/_example/sizes.tsx +12 -0
  133. package/input/_example/status.tsx +13 -0
  134. package/input/_example/text-align.tsx +12 -0
  135. package/input/_example/with-icon.tsx +13 -0
  136. package/input/type.ts +3 -0
  137. package/input/useLengthLimit.ts +122 -0
  138. package/input-number/InputNumber.tsx +124 -124
  139. package/input-number/_example/align.tsx +23 -0
  140. package/input-number/_example/auto-width.tsx +8 -0
  141. package/input-number/_example/default.tsx +8 -0
  142. package/input-number/_example/events.tsx +45 -0
  143. package/input-number/_example/format.tsx +27 -0
  144. package/input-number/_example/large-number.tsx +17 -0
  145. package/input-number/_example/min-max.tsx +14 -0
  146. package/input-number/_example/sizes.tsx +35 -0
  147. package/input-number/_example/status.tsx +65 -0
  148. package/input-number/_example/step-and-decimal.tsx +14 -0
  149. package/input-number/_example/themes.tsx +21 -0
  150. package/input-number/_example/with-suffix.tsx +12 -0
  151. package/input-number/defaultProps.ts +17 -17
  152. package/input-number/index.ts +9 -9
  153. package/input-number/style/css.js +1 -1
  154. package/input-number/style/index.js +1 -1
  155. package/input-number/useInputNumber.tsx +270 -270
  156. package/ip-input/_example/controlled.tsx +26 -0
  157. package/ip-input/_example/default.tsx +12 -0
  158. package/ip-input/_example/full-featured.tsx +32 -0
  159. package/ip-input/_example/ipv6.tsx +23 -0
  160. package/ip-input/_example/keyboard-navigation.tsx +19 -0
  161. package/ip-input/_example/paste-demo.tsx +23 -0
  162. package/ip-input/_example/states.tsx +21 -0
  163. package/ip-input/_example/with-cidr.tsx +23 -0
  164. package/layout/_example/combine-left.tsx +54 -0
  165. package/layout/_example/combine-right.tsx +54 -0
  166. package/layout/_example/custom-aside-width.tsx +56 -0
  167. package/layout/_example/custom-height.tsx +45 -0
  168. package/layout/_example/double-sidebar.tsx +57 -0
  169. package/layout/_example/side-navigation-right.tsx +51 -0
  170. package/layout/_example/side-navigation.tsx +51 -0
  171. package/layout/_example/top-navigation.tsx +41 -0
  172. package/list/ListItem.tsx +36 -36
  173. package/list/ListItemMeta.tsx +40 -40
  174. package/list/_example/async-loading.tsx +46 -0
  175. package/list/_example/default.tsx +23 -0
  176. package/list/_example/header-footer.tsx +40 -0
  177. package/list/_example/multiline.tsx +24 -0
  178. package/list/_example/scroll-loading.tsx +69 -0
  179. package/list/_example/sizes.tsx +45 -0
  180. package/list/_example/split.tsx +36 -0
  181. package/list/_example/stripe.tsx +24 -0
  182. package/list/_example/virtual-scroll.tsx +51 -0
  183. package/list/_example/with-image.tsx +26 -0
  184. package/list/defaultProps.ts +11 -11
  185. package/list/hooks/useListVirtualScroll.ts +82 -82
  186. package/list/style/css.js +1 -1
  187. package/list/style/index.js +1 -1
  188. package/loading/_example/default.tsx +6 -0
  189. package/loading/_example/delay.tsx +53 -0
  190. package/loading/_example/fullscreen.tsx +29 -0
  191. package/loading/_example/inherit-color.tsx +24 -0
  192. package/loading/_example/no-overlay.tsx +15 -0
  193. package/loading/_example/sizes.tsx +25 -0
  194. package/loading/_example/with-text.tsx +12 -0
  195. package/loading/_example/wrapper.tsx +30 -0
  196. package/locale/LocalReceiver.ts +55 -55
  197. package/locale/ar_KW.ts +7 -7
  198. package/locale/en_US.ts +7 -7
  199. package/locale/it_IT.ts +6 -6
  200. package/locale/ja_JP.ts +6 -6
  201. package/locale/ko_KR.ts +6 -6
  202. package/locale/ru_RU.ts +6 -6
  203. package/locale/zh_CN.ts +5 -5
  204. package/locale/zh_TW.ts +7 -7
  205. package/notification/_example/default.tsx +31 -0
  206. package/notification/_example/long-content.tsx +37 -0
  207. package/notification/_example/stacking.tsx +40 -0
  208. package/notification/_example/types.tsx +78 -0
  209. package/notification/_example/usage-example.tsx +62 -0
  210. package/package.json +4 -3
  211. package/popup/Popup.tsx +17 -5
  212. package/popup/_example/controlled.tsx +32 -0
  213. package/popup/_example/custom-content.tsx +64 -0
  214. package/popup/_example/default.tsx +19 -0
  215. package/popup/_example/delay.tsx +35 -0
  216. package/popup/_example/disabled.tsx +17 -0
  217. package/popup/_example/no-arrow.tsx +17 -0
  218. package/popup/_example/placements.tsx +61 -0
  219. package/popup/_example/triggers.tsx +26 -0
  220. package/radio/_example/allow-uncheck.tsx +19 -0
  221. package/radio/_example/button-style.tsx +40 -0
  222. package/radio/_example/controlled.tsx +13 -0
  223. package/radio/_example/default.tsx +13 -0
  224. package/radio/_example/group-disabled.tsx +22 -0
  225. package/radio/_example/group-with-options.tsx +20 -0
  226. package/radio/_example/group.tsx +19 -0
  227. package/radio/_example/sizes.tsx +37 -0
  228. package/radio/_example/states.tsx +20 -0
  229. package/select/_example/collapsed.tsx +30 -0
  230. package/select/_example/creatable.tsx +36 -0
  231. package/select/_example/custom-content.tsx +26 -0
  232. package/select/_example/default.tsx +29 -0
  233. package/select/_example/disabled.tsx +20 -0
  234. package/select/_example/filterable.tsx +27 -0
  235. package/select/_example/group-options.tsx +44 -0
  236. package/select/_example/label-suffix.tsx +24 -0
  237. package/select/_example/loading.tsx +19 -0
  238. package/select/_example/multiple.tsx +31 -0
  239. package/select/_example/sizes.tsx +20 -0
  240. package/select/_example/status.tsx +27 -0
  241. package/select/type.ts +382 -382
  242. package/select-input/type.ts +280 -280
  243. package/slider/Slider.tsx +13 -5
  244. package/slider/SliderHandleButton.tsx +50 -50
  245. package/slider/_example/custom-label.tsx +19 -0
  246. package/slider/_example/default.tsx +14 -0
  247. package/slider/_example/disabled.tsx +17 -0
  248. package/slider/_example/marks.tsx +31 -0
  249. package/slider/_example/range.tsx +16 -0
  250. package/slider/_example/step.tsx +14 -0
  251. package/slider/_example/vertical.tsx +26 -0
  252. package/slider/_example/with-input-number.tsx +21 -0
  253. package/slider/defaultProps.ts +15 -15
  254. package/slider/style/css.js +1 -1
  255. package/slider/style/index.js +1 -1
  256. package/slider/type.ts +1 -1
  257. package/styles/_global.scss +40 -40
  258. package/styles/_vars.scss +374 -358
  259. package/styles/components/alert/_index.scss +175 -175
  260. package/styles/components/alert/_vars.scss +41 -41
  261. package/styles/components/badge/_index.scss +71 -71
  262. package/styles/components/badge/_vars.scss +26 -26
  263. package/styles/components/button/_index.scss +499 -499
  264. package/styles/components/button/_mixins.scss +40 -40
  265. package/styles/components/button/_vars.scss +121 -121
  266. package/styles/components/checkbox/_index.scss +158 -158
  267. package/styles/components/checkbox/_var.scss +59 -59
  268. package/styles/components/color-picker/_index.scss +586 -586
  269. package/styles/components/color-picker/_vars.scss +79 -79
  270. package/styles/components/dialog/_animate.scss +133 -133
  271. package/styles/components/dialog/_index.scss +310 -312
  272. package/styles/components/dialog/_vars.scss +60 -60
  273. package/styles/components/drawer/_index.scss +206 -205
  274. package/styles/components/drawer/_var.scss +55 -55
  275. package/styles/components/fireworks/_index.scss +86 -86
  276. package/styles/components/fireworks/_vars.scss +5 -5
  277. package/styles/components/form/_index.scss +175 -174
  278. package/styles/components/form/_mixins.scss +74 -74
  279. package/styles/components/form/_vars.scss +101 -101
  280. package/styles/components/input/_index.scss +350 -350
  281. package/styles/components/input/_mixins.scss +120 -118
  282. package/styles/components/input/_vars.scss +130 -130
  283. package/styles/components/input-number/_index.scss +340 -339
  284. package/styles/components/input-number/_vars.scss +56 -56
  285. package/styles/components/ip-input/_index.scss +277 -277
  286. package/styles/components/layout/_index.scss +47 -47
  287. package/styles/components/layout/_vars.scss +19 -19
  288. package/styles/components/layout/doc.scss +74 -74
  289. package/styles/components/list/_index.scss +172 -172
  290. package/styles/components/list/_vars.scss +42 -42
  291. package/styles/components/loading/_index.scss +113 -113
  292. package/styles/components/loading/_vars.scss +40 -40
  293. package/styles/components/notification/_index.scss +144 -144
  294. package/styles/components/notification/_mixins.scss +13 -13
  295. package/styles/components/notification/_vars.scss +60 -60
  296. package/styles/components/popup/_index.scss +78 -78
  297. package/styles/components/popup/_mixin.scss +149 -149
  298. package/styles/components/popup/_vars.scss +33 -33
  299. package/styles/components/radio/_index.scss +376 -376
  300. package/styles/components/radio/_vars.scss +89 -89
  301. package/styles/components/select/_index.scss +291 -291
  302. package/styles/components/select/_var.scss +64 -64
  303. package/styles/components/select-input/_index.scss +5 -5
  304. package/styles/components/select-input/_var.scss +4 -4
  305. package/styles/components/slider/_index.scss +241 -241
  306. package/styles/components/slider/_vars.scss +51 -51
  307. package/styles/components/switch/_index.scss +248 -165
  308. package/styles/components/switch/_vars.scss +63 -63
  309. package/styles/components/table/_index.scss +194 -186
  310. package/styles/components/table/_var.scss +52 -52
  311. package/styles/components/tabs/_index.scss +165 -166
  312. package/styles/components/tabs/_mixins.scss +11 -11
  313. package/styles/components/tabs/_vars.scss +72 -72
  314. package/styles/components/tag/_index.scss +317 -317
  315. package/styles/components/tag/_var.scss +86 -86
  316. package/styles/components/tag-input/_index.scss +164 -164
  317. package/styles/components/tag-input/_vars.scss +17 -17
  318. package/styles/components/tooltip/_index.scss +104 -0
  319. package/styles/components/tooltip/_vars.scss +23 -0
  320. package/styles/mixins/_focus.scss +8 -8
  321. package/styles/mixins/_layout.scss +32 -32
  322. package/styles/mixins/_reset.scss +11 -11
  323. package/styles/mixins/_scrollbar.scss +32 -32
  324. package/styles/mixins/_text.scss +50 -50
  325. package/styles/themes/_dark.scss +169 -169
  326. package/styles/themes/_font.scss +69 -69
  327. package/styles/themes/_index.scss +5 -5
  328. package/styles/themes/_light.scss +170 -170
  329. package/styles/themes/_radius.scss +9 -9
  330. package/styles/themes/_size.scss +68 -68
  331. package/styles/utilities/_animation.scss +58 -58
  332. package/styles/utilities/_tips.scss +10 -10
  333. package/switch/_example/async-change.tsx +25 -0
  334. package/switch/_example/before-change.tsx +22 -0
  335. package/switch/_example/controlled.tsx +14 -0
  336. package/switch/_example/custom-value.tsx +21 -0
  337. package/switch/_example/default.tsx +6 -0
  338. package/switch/_example/disabled.tsx +25 -0
  339. package/switch/_example/loading.tsx +17 -0
  340. package/switch/_example/sizes.tsx +21 -0
  341. package/switch/_example/with-label.tsx +21 -0
  342. package/tab/TabPanel.tsx +9 -6
  343. package/tab/_example/addable.tsx +45 -0
  344. package/tab/_example/card-theme.tsx +22 -0
  345. package/tab/_example/default.tsx +22 -0
  346. package/tab/_example/disabled.tsx +38 -0
  347. package/tab/_example/lazy.tsx +25 -0
  348. package/tab/_example/placement.tsx +36 -0
  349. package/tab/_example/removable.tsx +31 -0
  350. package/tab/_example/sizes.tsx +31 -0
  351. package/tab/_example/with-action.tsx +26 -0
  352. package/table/Cell.tsx +3 -6
  353. package/table/Ellipsis.tsx +73 -0
  354. package/table/_example/alignment.tsx +46 -0
  355. package/table/_example/auto-width.tsx +47 -0
  356. package/table/_example/bordered-stripe-hover.tsx +42 -0
  357. package/table/_example/bordered.tsx +42 -0
  358. package/table/_example/cell-click.tsx +52 -0
  359. package/table/_example/complex.tsx +82 -0
  360. package/table/_example/custom-cell.tsx +68 -0
  361. package/table/_example/custom-empty.tsx +37 -0
  362. package/table/_example/custom-row-class-name.tsx +57 -0
  363. package/table/_example/default.tsx +42 -0
  364. package/table/_example/ellipsis.tsx +56 -0
  365. package/table/_example/empty.tsx +28 -0
  366. package/table/_example/fixed-width.tsx +48 -0
  367. package/table/_example/hover.tsx +42 -0
  368. package/table/_example/row-click.tsx +52 -0
  369. package/table/_example/sizes.tsx +57 -0
  370. package/table/_example/stripe.tsx +42 -0
  371. package/table/_example/vertical-align.tsx +110 -0
  372. package/table/hooks/useTableClassName.ts +3 -3
  373. package/table/index.ts +2 -0
  374. package/table/type.ts +1 -0
  375. package/tag/Tag.tsx +1 -1
  376. package/tag/_example/closable.tsx +44 -0
  377. package/tag/_example/default.tsx +17 -0
  378. package/tag/_example/disabled.tsx +19 -0
  379. package/tag/_example/sizes.tsx +18 -0
  380. package/tag/_example/variants.tsx +37 -0
  381. package/tag-input/_example/collapsed.tsx +27 -0
  382. package/tag-input/_example/controlled-uncontrolled.tsx +26 -0
  383. package/tag-input/_example/default.tsx +15 -0
  384. package/tag-input/_example/disabled-readonly.tsx +21 -0
  385. package/tag-input/_example/events.tsx +64 -0
  386. package/tag-input/_example/excess-display.tsx +27 -0
  387. package/tag-input/_example/max-tags.tsx +22 -0
  388. package/tag-input/_example/sizes.tsx +21 -0
  389. package/tag-input/_example/status.tsx +37 -0
  390. package/tag-input/_example/with-label.tsx +23 -0
  391. package/tag-input/hooks/useTagList.tsx +1 -1
  392. package/tooltip/Tooltip.tsx +76 -0
  393. package/tooltip/_example/base.tsx +26 -0
  394. package/tooltip/_example/custom-content.tsx +47 -0
  395. package/tooltip/_example/placement.tsx +33 -0
  396. package/tooltip/_example/theme.tsx +34 -0
  397. package/tooltip/defaultProps.ts +14 -0
  398. package/tooltip/index.ts +7 -0
  399. package/tooltip/style/index.js +1 -0
  400. package/tooltip/type.ts +99 -0
  401. package/utils/input-number/large-number.ts +423 -423
  402. package/utils/input-number/number.ts +257 -257
  403. package/utils/log/index.ts +3 -3
  404. package/utils/log/log.ts +29 -30
  405. package/utils/log/types.ts +9 -12
  406. package/utils/style.ts +58 -58
@@ -0,0 +1,32 @@
1
+ import React, { useState } from "react";
2
+ import { Button, Dialog } from "@tendaui/react";
3
+
4
+ export default function ConfirmLoading() {
5
+ const [visible, setVisible] = useState(false);
6
+ const [loading, setLoading] = useState(false);
7
+
8
+ const handleConfirm = () => {
9
+ setLoading(true);
10
+ setTimeout(() => {
11
+ setLoading(false);
12
+ setVisible(false);
13
+ }, 2000);
14
+ };
15
+
16
+ return (
17
+ <>
18
+ <Button theme="primary" onClick={() => setVisible(true)}>
19
+ 异步确认
20
+ </Button>
21
+ <Dialog
22
+ header="异步确认"
23
+ visible={visible}
24
+ confirmLoading={loading}
25
+ onClose={() => setVisible(false)}
26
+ onConfirm={handleConfirm}
27
+ >
28
+ <p>点击确认按钮后会显示加载状态,2秒后自动关闭。</p>
29
+ </Dialog>
30
+ </>
31
+ );
32
+ }
@@ -0,0 +1,24 @@
1
+ import React, { useState } from "react";
2
+ import { Button, Dialog } from "@tendaui/react";
3
+
4
+ export default function CustomButtons() {
5
+ const [visible, setVisible] = useState(false);
6
+
7
+ return (
8
+ <>
9
+ <Button theme="primary" onClick={() => setVisible(true)}>
10
+ 自定义按钮
11
+ </Button>
12
+ <Dialog
13
+ header="自定义按钮"
14
+ visible={visible}
15
+ confirmBtn={{ content: "我知道了", theme: "primary" }}
16
+ cancelBtn={{ content: "稍后再说", variant: "outline" }}
17
+ onClose={() => setVisible(false)}
18
+ onConfirm={() => setVisible(false)}
19
+ >
20
+ <p>这是一个带自定义按钮文字的对话框。</p>
21
+ </Dialog>
22
+ </>
23
+ );
24
+ }
@@ -0,0 +1,26 @@
1
+ import React, { useState } from "react";
2
+ import { Button, Dialog } from "@tendaui/react";
3
+
4
+ export default function FullScreen() {
5
+ const [visible, setVisible] = useState(false);
6
+
7
+ return (
8
+ <>
9
+ <Button theme="primary" onClick={() => setVisible(true)}>
10
+ 全屏对话框
11
+ </Button>
12
+ <Dialog
13
+ header="全屏对话框"
14
+ mode="full-screen"
15
+ visible={visible}
16
+ onClose={() => setVisible(false)}
17
+ onConfirm={() => setVisible(false)}
18
+ >
19
+ <div style={{ padding: "20px" }}>
20
+ <p>这是一个全屏对话框,适合展示大量内容。</p>
21
+ <p>可以在这里放置复杂的表单、数据展示等。</p>
22
+ </div>
23
+ </Dialog>
24
+ </>
25
+ );
26
+ }
@@ -0,0 +1,39 @@
1
+ import React, { useState } from "react";
2
+ import { Button, Dialog } from "@tendaui/react";
3
+
4
+ export default function HideButtons() {
5
+ const [noCancelVisible, setNoCancelVisible] = useState(false);
6
+ const [noFooterVisible, setNoFooterVisible] = useState(false);
7
+
8
+ return (
9
+ <>
10
+ <div style={{ display: "flex", gap: "12px" }}>
11
+ <Button theme="primary" onClick={() => setNoCancelVisible(true)}>
12
+ 无取消按钮
13
+ </Button>
14
+ <Button theme="primary" onClick={() => setNoFooterVisible(true)}>
15
+ 无底部操作栏
16
+ </Button>
17
+ </div>
18
+
19
+ <Dialog
20
+ header="无取消按钮"
21
+ visible={noCancelVisible}
22
+ cancelBtn={null}
23
+ onClose={() => setNoCancelVisible(false)}
24
+ onConfirm={() => setNoCancelVisible(false)}
25
+ >
26
+ <p>这是一个只有确认按钮的对话框。</p>
27
+ </Dialog>
28
+
29
+ <Dialog
30
+ header="无底部操作栏"
31
+ visible={noFooterVisible}
32
+ footer={false}
33
+ onClose={() => setNoFooterVisible(false)}
34
+ >
35
+ <p>这是一个没有底部操作栏的对话框,点击右上角关闭按钮关闭。</p>
36
+ </Dialog>
37
+ </>
38
+ );
39
+ }
@@ -0,0 +1,25 @@
1
+ import React, { useState } from "react";
2
+ import { Button, Dialog } from "@tendaui/react";
3
+
4
+ export default function Modeless() {
5
+ const [visible, setVisible] = useState(false);
6
+
7
+ return (
8
+ <>
9
+ <Button theme="primary" onClick={() => setVisible(true)}>
10
+ 非模态对话框
11
+ </Button>
12
+ <Dialog
13
+ header="非模态对话框"
14
+ mode="modeless"
15
+ draggable
16
+ visible={visible}
17
+ onClose={() => setVisible(false)}
18
+ onConfirm={() => setVisible(false)}
19
+ >
20
+ <p>这是一个非模态对话框,可以拖拽移动。</p>
21
+ <p>可以同时操作页面上的其他内容。</p>
22
+ </Dialog>
23
+ </>
24
+ );
25
+ }
@@ -0,0 +1,40 @@
1
+ import React, { useState } from "react";
2
+ import { Button, Dialog } from "@tendaui/react";
3
+
4
+ export default function Placement() {
5
+ const [topVisible, setTopVisible] = useState(false);
6
+ const [centerVisible, setCenterVisible] = useState(false);
7
+
8
+ return (
9
+ <>
10
+ <div style={{ display: "flex", gap: "12px" }}>
11
+ <Button theme="primary" onClick={() => setTopVisible(true)}>
12
+ 顶部对话框
13
+ </Button>
14
+ <Button theme="primary" onClick={() => setCenterVisible(true)}>
15
+ 居中对话框
16
+ </Button>
17
+ </div>
18
+
19
+ <Dialog
20
+ header="顶部对话框"
21
+ placement="top"
22
+ visible={topVisible}
23
+ onClose={() => setTopVisible(false)}
24
+ onConfirm={() => setTopVisible(false)}
25
+ >
26
+ <p>这是一个显示在顶部的对话框。</p>
27
+ </Dialog>
28
+
29
+ <Dialog
30
+ header="居中对话框"
31
+ placement="center"
32
+ visible={centerVisible}
33
+ onClose={() => setCenterVisible(false)}
34
+ onConfirm={() => setCenterVisible(false)}
35
+ >
36
+ <p>这是一个垂直居中的对话框。</p>
37
+ </Dialog>
38
+ </>
39
+ );
40
+ }
@@ -0,0 +1,69 @@
1
+ import React from "react";
2
+ import { Button, DialogPlugin } from "@tendaui/react";
3
+
4
+ export default function PluginExample() {
5
+ const buttonStyle = { marginRight: 16 };
6
+
7
+ const showDialog = () => {
8
+ const myDialog = DialogPlugin({
9
+ header: "DialogPlugin 调用",
10
+ body: "这是通过 DialogPlugin 函数调用的对话框",
11
+ onConfirm: ({ e }) => {
12
+ console.log("confirm clicked", e);
13
+ myDialog.hide();
14
+ },
15
+ onClose: ({ trigger }) => {
16
+ console.log("trigger:", trigger);
17
+ myDialog.hide();
18
+ }
19
+ });
20
+ };
21
+
22
+ const showConfirm = () => {
23
+ const confirmDialog = DialogPlugin.confirm({
24
+ header: "确认操作",
25
+ body: "确定要执行此操作吗?",
26
+ confirmBtn: "确定",
27
+ cancelBtn: "取消",
28
+ onConfirm: () => {
29
+ confirmDialog.hide();
30
+ },
31
+ onClose: () => {
32
+ confirmDialog.hide();
33
+ }
34
+ });
35
+ };
36
+
37
+ const showAlert = () => {
38
+ const alertDialog = DialogPlugin.alert({
39
+ header: "提示",
40
+ body: "这是一条重要提示信息。",
41
+ confirmBtn: { content: "我知道了", theme: "primary" },
42
+ onConfirm: () => {
43
+ alertDialog.hide();
44
+ },
45
+ onClose: () => {
46
+ alertDialog.hide();
47
+ }
48
+ });
49
+ };
50
+
51
+ return (
52
+ <div>
53
+ <p style={{ marginBottom: "16px", color: "#666" }}>
54
+ 函数调用方式:DialogPlugin(options) / DialogPlugin.confirm(options) / DialogPlugin.alert(options)
55
+ </p>
56
+ <div style={{ display: "flex", flexWrap: "wrap", gap: "12px" }}>
57
+ <Button theme="primary" onClick={showDialog} style={buttonStyle}>
58
+ DialogPlugin
59
+ </Button>
60
+ <Button theme="primary" onClick={showConfirm} style={buttonStyle}>
61
+ DialogPlugin.confirm
62
+ </Button>
63
+ <Button theme="primary" onClick={showAlert} style={buttonStyle}>
64
+ DialogPlugin.alert
65
+ </Button>
66
+ </div>
67
+ </div>
68
+ );
69
+ }
@@ -0,0 +1,41 @@
1
+ import React, { useState } from "react";
2
+ import { Button, Dialog } from "@tendaui/react";
3
+
4
+ export default function Themes() {
5
+ const [visible, setVisible] = useState(false);
6
+ const [theme, setTheme] = useState("default");
7
+
8
+ const openDialog = (t) => {
9
+ setTheme(t);
10
+ setVisible(true);
11
+ };
12
+
13
+ return (
14
+ <>
15
+ <div style={{ display: "flex", gap: "12px", flexWrap: "wrap" }}>
16
+ <Button onClick={() => openDialog("default")}>默认</Button>
17
+ <Button theme="primary" onClick={() => openDialog("info")}>
18
+ 信息
19
+ </Button>
20
+ <Button theme="success" onClick={() => openDialog("success")}>
21
+ 成功
22
+ </Button>
23
+ <Button theme="warning" onClick={() => openDialog("warning")}>
24
+ 警告
25
+ </Button>
26
+ <Button theme="danger" onClick={() => openDialog("danger")}>
27
+ 危险
28
+ </Button>
29
+ </div>
30
+ <Dialog
31
+ header={`${theme} 主题对话框`}
32
+ theme={theme}
33
+ visible={visible}
34
+ onClose={() => setVisible(false)}
35
+ onConfirm={() => setVisible(false)}
36
+ >
37
+ <p>这是 {theme} 主题的对话框。</p>
38
+ </Dialog>
39
+ </>
40
+ );
41
+ }
@@ -1,35 +1,35 @@
1
- import { RefObject, useEffect, useRef } from "react";
2
- import useIsomorphicLayoutEffect from "../../hooks/useLayoutEffect";
3
- type Position = { x: number; y: number };
4
- export default function useDialogPosition(visible: boolean | undefined, dialogCardRef: RefObject<HTMLElement | null>) {
5
- const mousePosRef = useRef<Position>(null);
6
-
7
- const getClickPosition = (e: MouseEvent) => {
8
- if (mousePosRef) {
9
- mousePosRef.current = {
10
- x: e.clientX,
11
- y: e.clientY
12
- };
13
- setTimeout(() => {
14
- mousePosRef.current = null;
15
- }, 100);
16
- }
17
- };
18
-
19
- useIsomorphicLayoutEffect(() => {
20
- document.addEventListener("click", getClickPosition, true);
21
- return () => {
22
- document.removeEventListener("click", getClickPosition, true);
23
- };
24
- }, []);
25
-
26
- useEffect(() => {
27
- if (!visible) return;
28
- // 动画渲染初始位置
29
- if (mousePosRef.current && dialogCardRef.current) {
30
- dialogCardRef.current.style.transformOrigin = `${mousePosRef.current.x - dialogCardRef.current.offsetLeft}px ${
31
- mousePosRef.current.y - dialogCardRef.current.offsetTop
32
- }px`;
33
- }
34
- }, [visible, dialogCardRef]);
35
- }
1
+ import { RefObject, useEffect, useRef } from "react";
2
+ import useIsomorphicLayoutEffect from "../../hooks/useLayoutEffect";
3
+ type Position = { x: number; y: number };
4
+ export default function useDialogPosition(visible: boolean | undefined, dialogCardRef: RefObject<HTMLElement | null>) {
5
+ const mousePosRef = useRef<Position>(null);
6
+
7
+ const getClickPosition = (e: MouseEvent) => {
8
+ if (mousePosRef) {
9
+ mousePosRef.current = {
10
+ x: e.clientX,
11
+ y: e.clientY
12
+ };
13
+ setTimeout(() => {
14
+ mousePosRef.current = null;
15
+ }, 100);
16
+ }
17
+ };
18
+
19
+ useIsomorphicLayoutEffect(() => {
20
+ document.addEventListener("click", getClickPosition, true);
21
+ return () => {
22
+ document.removeEventListener("click", getClickPosition, true);
23
+ };
24
+ }, []);
25
+
26
+ useEffect(() => {
27
+ if (!visible) return;
28
+ // 动画渲染初始位置
29
+ if (mousePosRef.current && dialogCardRef.current) {
30
+ dialogCardRef.current.style.transformOrigin = `${mousePosRef.current.x - dialogCardRef.current.offsetLeft}px ${
31
+ mousePosRef.current.y - dialogCardRef.current.offsetTop
32
+ }px`;
33
+ }
34
+ }, [visible, dialogCardRef]);
35
+ }
package/drawer/Drawer.tsx CHANGED
@@ -73,7 +73,7 @@ const Drawer = forwardRef<DrawerInstance, DrawerProps>((originalProps, ref) => {
73
73
  } = state;
74
74
 
75
75
  const size = propsSize;
76
- const { classPrefix } = useConfig();
76
+ const { classPrefix, direction } = useConfig();
77
77
  const drawerAttach = useAttach("drawer", attach);
78
78
  const maskRef = useRef<HTMLDivElement>(null);
79
79
  const containerRef = useRef<HTMLDivElement>(null);
@@ -81,8 +81,16 @@ const Drawer = forwardRef<DrawerInstance, DrawerProps>((originalProps, ref) => {
81
81
  const prefixCls = `${classPrefix}-drawer`;
82
82
 
83
83
  const closeIcon = isValidElement(closeBtn) ? closeBtn : <CloseIcon />;
84
+ const isRtl = direction === "rtl";
85
+ const actualPlacement = useMemo(() => {
86
+ if (!isRtl) return placement;
87
+ if (placement === "left") return "right";
88
+ if (placement === "right") return "left";
89
+ return placement;
90
+ }, [isRtl, placement]);
91
+
84
92
  const { dragSizeValue, enableDrag, draggableLineStyles, draggingStyles } = useDrag(
85
- placement,
93
+ actualPlacement,
86
94
  sizeDraggable,
87
95
  onSizeDragEnd
88
96
  );
@@ -147,10 +155,10 @@ const Drawer = forwardRef<DrawerInstance, DrawerProps>((originalProps, ref) => {
147
155
  const contentWrapperStyle = useMemo(
148
156
  () => ({
149
157
  transform: visible && animationStart ? "translateX(0)" : undefined,
150
- width: ["left", "right"].includes(placement) ? sizeValue : "",
151
- height: ["top", "bottom"].includes(placement) ? sizeValue : ""
158
+ width: ["left", "right"].includes(actualPlacement) ? sizeValue : "",
159
+ height: ["top", "bottom"].includes(actualPlacement) ? sizeValue : ""
152
160
  }),
153
- [visible, placement, sizeValue, animationStart]
161
+ [visible, actualPlacement, sizeValue, animationStart]
154
162
  );
155
163
 
156
164
  const renderDrawerButton = (btn: DrawerProps["cancelBtn"], defaultProps: ButtonProps) => {
@@ -184,12 +192,12 @@ const Drawer = forwardRef<DrawerInstance, DrawerProps>((originalProps, ref) => {
184
192
 
185
193
  const footerStyle = {
186
194
  display: "flex",
187
- justifyContent: placement === "right" ? "flex-start" : "flex-end"
195
+ justifyContent: actualPlacement === "right" ? "flex-start" : "flex-end"
188
196
  };
189
197
 
190
198
  return (
191
199
  <div style={footerStyle}>
192
- {placement === "right" ? (
200
+ {actualPlacement === "right" ? (
193
201
  <>
194
202
  {renderConfirmBtn} {renderCancelBtn}
195
203
  </>
@@ -233,7 +241,7 @@ const Drawer = forwardRef<DrawerInstance, DrawerProps>((originalProps, ref) => {
233
241
  <Portal attach={drawerAttach} ref={drawerWrapperRef}>
234
242
  <div
235
243
  ref={containerRef}
236
- className={classnames(prefixCls, className, `${prefixCls}--${placement}`, {
244
+ className={classnames(prefixCls, className, `${prefixCls}--${actualPlacement}`, {
237
245
  [`${prefixCls}--open`]: visible,
238
246
  [`${prefixCls}--attach`]: showInAttachedElement,
239
247
  [`${prefixCls}--without-mask`]: !showOverlay
@@ -244,7 +252,7 @@ const Drawer = forwardRef<DrawerInstance, DrawerProps>((originalProps, ref) => {
244
252
  >
245
253
  {renderOverlay}
246
254
  <div
247
- className={classnames(`${prefixCls}__content-wrapper`, `${prefixCls}__content-wrapper--${placement}`)}
255
+ className={classnames(`${prefixCls}__content-wrapper`, `${prefixCls}__content-wrapper--${actualPlacement}`)}
248
256
  style={{ ...contentWrapperStyle, ...draggingStyles }}
249
257
  >
250
258
  {renderCloseBtn}
@@ -0,0 +1,29 @@
1
+ import React, { useState } from "react";
2
+ import Drawer from "../index";
3
+ import { Button } from "../../button";
4
+
5
+ const CustomDrawer = () => {
6
+ const [visible, setVisible] = useState(false);
7
+ return (
8
+ <>
9
+ <Button theme="primary" onClick={() => setVisible(true)}>
10
+ 自定义头部和底部
11
+ </Button>
12
+ <Drawer
13
+ header={<h3 style={{ color: "var(--td-brand-color)", margin: 0 }}>自定义标题</h3>}
14
+ visible={visible}
15
+ onClose={() => setVisible(false)}
16
+ confirmBtn={{ content: "保存", theme: "primary" }}
17
+ cancelBtn={{ content: "取消", variant: "outline" }}
18
+ onConfirm={() => {
19
+ console.log("保存");
20
+ setVisible(false);
21
+ }}
22
+ >
23
+ <p>抽屉内容区域</p>
24
+ </Drawer>
25
+ </>
26
+ );
27
+ };
28
+
29
+ export default CustomDrawer;
@@ -0,0 +1,20 @@
1
+ import React, { useState } from "react";
2
+ import Drawer from "../index";
3
+ import { Button } from "../../button";
4
+
5
+ const BaseDrawer = () => {
6
+ const [visible, setVisible] = useState(false);
7
+ return (
8
+ <>
9
+ <Button theme="primary" onClick={() => setVisible(true)}>
10
+ 打开抽屉
11
+ </Button>
12
+ <Drawer header="基础抽屉" visible={visible} onClose={() => setVisible(false)}>
13
+ <p>这是抽屉内容。</p>
14
+ <p>点击遮罩层或右上角关闭按钮可关闭抽屉。</p>
15
+ </Drawer>
16
+ </>
17
+ );
18
+ };
19
+
20
+ export default BaseDrawer;
@@ -0,0 +1,53 @@
1
+ import React, { useState } from "react";
2
+ import Drawer from "../index";
3
+ import { Button } from "../../button";
4
+ import type { TdDrawerProps } from "../type";
5
+
6
+ const EventsDrawer = () => {
7
+ const [visible, setVisible] = useState(false);
8
+
9
+ const handleBeforeOpen = () => {
10
+ console.log("抽屉打开前");
11
+ };
12
+
13
+ const handleBeforeClose = () => {
14
+ console.log("抽屉关闭前");
15
+ };
16
+
17
+ const handleClose: TdDrawerProps["onClose"] = (context) => {
18
+ console.log("抽屉关闭,触发来源:", context.trigger);
19
+ setVisible(false);
20
+ };
21
+
22
+ const handleConfirm = () => {
23
+ console.log("点击确认按钮");
24
+ setVisible(false);
25
+ };
26
+
27
+ const handleCancel = () => {
28
+ console.log("点击取消按钮");
29
+ setVisible(false);
30
+ };
31
+
32
+ return (
33
+ <>
34
+ <Button theme="primary" onClick={() => setVisible(true)}>
35
+ 打开抽屉(查看控制台)
36
+ </Button>
37
+ <Drawer
38
+ header="事件回调"
39
+ visible={visible}
40
+ onBeforeOpen={handleBeforeOpen}
41
+ onBeforeClose={handleBeforeClose}
42
+ onClose={handleClose}
43
+ onConfirm={handleConfirm}
44
+ onCancel={handleCancel}
45
+ >
46
+ <p>打开控制台查看各种事件的回调日志。</p>
47
+ <p>支持的事件:onBeforeOpen、onBeforeClose、onClose、onConfirm、onCancel 等</p>
48
+ </Drawer>
49
+ </>
50
+ );
51
+ };
52
+
53
+ export default EventsDrawer;
@@ -0,0 +1,20 @@
1
+ import React, { useState } from "react";
2
+ import Drawer from "../index";
3
+ import { Button } from "../../button";
4
+
5
+ const NoFooterDrawer = () => {
6
+ const [visible, setVisible] = useState(false);
7
+ return (
8
+ <>
9
+ <Button theme="primary" onClick={() => setVisible(true)}>
10
+ 无底部操作栏
11
+ </Button>
12
+ <Drawer header="无底部操作栏" footer={false} visible={visible} onClose={() => setVisible(false)}>
13
+ <p>这是一个没有底部操作栏的抽屉。</p>
14
+ <p>适合只展示内容的场景。</p>
15
+ </Drawer>
16
+ </>
17
+ );
18
+ };
19
+
20
+ export default NoFooterDrawer;
@@ -0,0 +1,20 @@
1
+ import React, { useState } from "react";
2
+ import Drawer from "../index";
3
+ import { Button } from "../../button";
4
+
5
+ const NoOverlayDrawer = () => {
6
+ const [visible, setVisible] = useState(false);
7
+ return (
8
+ <>
9
+ <Button theme="primary" onClick={() => setVisible(true)}>
10
+ 无遮罩层抽屉
11
+ </Button>
12
+ <Drawer header="无遮罩层" showOverlay={false} visible={visible} onClose={() => setVisible(false)}>
13
+ <p>这是一个没有遮罩层的抽屉。</p>
14
+ <p>可以与页面其他内容进行交互。</p>
15
+ </Drawer>
16
+ </>
17
+ );
18
+ };
19
+
20
+ export default NoOverlayDrawer;
@@ -0,0 +1,43 @@
1
+ import React, { useState } from "react";
2
+ import Drawer from "../index";
3
+ import { Button } from "../../button";
4
+ import type { TdDrawerProps } from "../type";
5
+
6
+ const PlacementDrawer = () => {
7
+ const [visible, setVisible] = useState(false);
8
+ const [placement, setPlacement] = useState<TdDrawerProps["placement"]>("right");
9
+
10
+ const openDrawer = (p: TdDrawerProps["placement"]) => {
11
+ setPlacement(p);
12
+ setVisible(true);
13
+ };
14
+
15
+ return (
16
+ <>
17
+ <div style={{ display: "flex", gap: "12px", flexWrap: "wrap" }}>
18
+ <Button theme="primary" onClick={() => openDrawer("left")}>
19
+ 从左侧打开
20
+ </Button>
21
+ <Button theme="primary" onClick={() => openDrawer("right")}>
22
+ 从右侧打开
23
+ </Button>
24
+ <Button theme="primary" onClick={() => openDrawer("top")}>
25
+ 从顶部打开
26
+ </Button>
27
+ <Button theme="primary" onClick={() => openDrawer("bottom")}>
28
+ 从底部打开
29
+ </Button>
30
+ </div>
31
+ <Drawer
32
+ header={`${placement} 方向抽屉`}
33
+ placement={placement}
34
+ visible={visible}
35
+ onClose={() => setVisible(false)}
36
+ >
37
+ <p>这是从 {placement} 方向滑出的抽屉。</p>
38
+ </Drawer>
39
+ </>
40
+ );
41
+ };
42
+
43
+ export default PlacementDrawer;
@@ -0,0 +1,26 @@
1
+ import React, { useState } from "react";
2
+ import Drawer from "../index";
3
+ import { Button } from "../../button";
4
+
5
+ const DraggableDrawer = () => {
6
+ const [visible, setVisible] = useState(false);
7
+ return (
8
+ <>
9
+ <Button theme="primary" onClick={() => setVisible(true)}>
10
+ 可拖拽大小的抽屉
11
+ </Button>
12
+ <Drawer
13
+ header="可拖拽调整大小"
14
+ visible={visible}
15
+ sizeDraggable={{ min: 200, max: 800 }}
16
+ onClose={() => setVisible(false)}
17
+ >
18
+ <p>拖动抽屉边缘可以调整宽度。</p>
19
+ <p>最小宽度: 200px</p>
20
+ <p>最大宽度: 800px</p>
21
+ </Drawer>
22
+ </>
23
+ );
24
+ };
25
+
26
+ export default DraggableDrawer;