@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,40 @@
1
+ import React, { useState } from "react";
2
+ import Drawer from "../index";
3
+ import { Button } from "../../button";
4
+
5
+ const SizeDrawer = () => {
6
+ const [visible, setVisible] = useState(false);
7
+ const [size, setSize] = useState("small");
8
+
9
+ const openDrawer = (s: string) => {
10
+ setSize(s);
11
+ setVisible(true);
12
+ };
13
+
14
+ return (
15
+ <>
16
+ <div style={{ display: "flex", gap: "12px", flexWrap: "wrap" }}>
17
+ <Button theme="primary" onClick={() => openDrawer("small")}>
18
+ 小尺寸
19
+ </Button>
20
+ <Button theme="primary" onClick={() => openDrawer("medium")}>
21
+ 中尺寸
22
+ </Button>
23
+ <Button theme="primary" onClick={() => openDrawer("large")}>
24
+ 大尺寸
25
+ </Button>
26
+ <Button theme="primary" onClick={() => openDrawer("60%")}>
27
+ 60% 宽度
28
+ </Button>
29
+ <Button theme="primary" onClick={() => openDrawer("500px")}>
30
+ 500px 宽度
31
+ </Button>
32
+ </div>
33
+ <Drawer header={`尺寸: ${size}`} size={size} visible={visible} onClose={() => setVisible(false)}>
34
+ <p>当前抽屉尺寸: {size}</p>
35
+ </Drawer>
36
+ </>
37
+ );
38
+ };
39
+
40
+ export default SizeDrawer;
@@ -13,7 +13,7 @@ export const drawerDefaultProps: TdDrawerProps = {
13
13
  preventScrollThrough: true,
14
14
  showInAttachedElement: false,
15
15
  showOverlay: true,
16
- size: undefined,
16
+ size: "medium",
17
17
  sizeDraggable: false,
18
18
  visible: false
19
19
  };
@@ -1,12 +1,4 @@
1
- import React, {
2
- CSSProperties,
3
- forwardRef,
4
- useCallback,
5
- useEffect,
6
- useMemo,
7
- useRef,
8
- useState
9
- } from "react";
1
+ import React, { CSSProperties, forwardRef, useCallback, useEffect, useMemo, useRef, useState } from "react";
10
2
  import classNames from "classnames";
11
3
 
12
4
  import useConfig from "../hooks/useConfig";
@@ -135,4 +127,3 @@ const Fireworks = forwardRef<HTMLDivElement, FireworksProps>((props, ref) => {
135
127
  Fireworks.displayName = "Fireworks";
136
128
 
137
129
  export default Fireworks;
138
-
@@ -7,4 +7,3 @@ export * from "./type";
7
7
 
8
8
  export const Fireworks = _Fireworks;
9
9
  export default Fireworks;
10
-
package/fireworks/type.ts CHANGED
@@ -69,4 +69,3 @@ export interface TdFireworksProps {
69
69
  */
70
70
  onLaunch?: (context: FireworksLaunchContext) => void;
71
71
  }
72
-
@@ -0,0 +1,76 @@
1
+ import React from "react";
2
+ import { Form, Input, Switch, Checkbox, Button, Select, Radio, FormItem } from "@tendaui/react";
3
+ import { NotificationProvider, useNotification } from "@tendaui/react/notification";
4
+
5
+ const { useForm } = Form;
6
+ const {} = Form;
7
+ const ComplexFormExample = () => {
8
+ const [form] = useForm();
9
+ const { success } = useNotification();
10
+
11
+ const onSubmit = (e: any) => {
12
+ if (e.validateResult === true) {
13
+ success({ title: "成功", message: "表单提交成功" });
14
+ console.log("表单数据:", e.fields);
15
+ }
16
+ };
17
+
18
+ return (
19
+ <div style={{ width: 500 }}>
20
+ <Form form={form} onSubmit={onSubmit} labelWidth={100}>
21
+ <FormItem label="姓名" name="name" requiredMark rules={[{ required: true, message: "请输入姓名" }]}>
22
+ <Input placeholder="请输入姓名" />
23
+ </FormItem>
24
+
25
+ <FormItem label="性别" name="gender">
26
+ <Radio.Group>
27
+ <Radio value="male">男</Radio>
28
+ <Radio value="female">女</Radio>
29
+ </Radio.Group>
30
+ </FormItem>
31
+
32
+ <FormItem label="城市" name="city">
33
+ <Select
34
+ placeholder="请选择城市"
35
+ options={[
36
+ { label: "北京", value: "beijing" },
37
+ { label: "上海", value: "shanghai" },
38
+ { label: "广州", value: "guangzhou" },
39
+ { label: "深圳", value: "shenzhen" }
40
+ ]}
41
+ />
42
+ </FormItem>
43
+
44
+ <FormItem label="爱好" name="hobbies">
45
+ <Checkbox.Group>
46
+ <Checkbox value="reading">阅读</Checkbox>
47
+ <Checkbox value="music">音乐</Checkbox>
48
+ <Checkbox value="sports">运动</Checkbox>
49
+ <Checkbox value="travel">旅游</Checkbox>
50
+ </Checkbox.Group>
51
+ </FormItem>
52
+
53
+ <FormItem label="订阅通知" name="subscribe">
54
+ <Switch />
55
+ </FormItem>
56
+
57
+ <FormItem style={{ marginInlineStart: 100 }}>
58
+ <div style={{ display: "flex", gap: "8px" }}>
59
+ <Button type="submit" theme="primary">
60
+ 提交
61
+ </Button>
62
+ <Button type="reset">重置</Button>
63
+ </div>
64
+ </FormItem>
65
+ </Form>
66
+ </div>
67
+ );
68
+ };
69
+
70
+ const FormExample = () => (
71
+ <NotificationProvider>
72
+ <ComplexFormExample />
73
+ </NotificationProvider>
74
+ );
75
+
76
+ export default FormExample;
@@ -0,0 +1,58 @@
1
+ import React from "react";
2
+ import { Form, Input, Switch, InputNumber, Button, FormItem } from "@tendaui/react";
3
+ import { NotificationProvider, useNotification } from "@tendaui/react/notification";
4
+
5
+ const BaseForm = () => {
6
+ const [form] = Form.useForm();
7
+ const { success } = useNotification();
8
+
9
+ const onSubmit = (e: any) => {
10
+ if (e.validateResult === true) {
11
+ success({ title: "成功提示", message: "提交成功" });
12
+ console.log("表单数据:", e.fields);
13
+ }
14
+ };
15
+
16
+ const onReset = () => {
17
+ success({ title: "成功提示", message: "重置成功" });
18
+ };
19
+
20
+ return (
21
+ <div style={{ width: 500 }}>
22
+ <Form form={form} onSubmit={onSubmit} onReset={onReset} colon labelWidth={100}>
23
+ <FormItem label="姓名" name="name" requiredMark rules={[{ required: true, message: "请输入姓名" }]}>
24
+ <Input placeholder="请输入姓名" />
25
+ </FormItem>
26
+
27
+ <FormItem label="邮箱" name="email" rules={[{ email: true, message: "请输入正确的邮箱" }]}>
28
+ <Input placeholder="请输入邮箱" />
29
+ </FormItem>
30
+
31
+ <FormItem label="年龄" name="age">
32
+ <InputNumber placeholder="请输入年龄" min={1} max={120} />
33
+ </FormItem>
34
+
35
+ <FormItem label="是否启用" name="enabled">
36
+ <Switch />
37
+ </FormItem>
38
+
39
+ <FormItem style={{ marginInlineStart: 100 }}>
40
+ <div style={{ display: "flex", gap: "8px" }}>
41
+ <Button type="submit" theme="primary">
42
+ 提交
43
+ </Button>
44
+ <Button type="reset">重置</Button>
45
+ </div>
46
+ </FormItem>
47
+ </Form>
48
+ </div>
49
+ );
50
+ };
51
+
52
+ const FormExample = () => (
53
+ <NotificationProvider>
54
+ <BaseForm />
55
+ </NotificationProvider>
56
+ );
57
+
58
+ export default FormExample;
@@ -0,0 +1,26 @@
1
+ import React from "react";
2
+ import { Form, Input, Switch, Select, FormItem } from "@tendaui/react";
3
+
4
+ const DisabledForm = () => (
5
+ <div style={{ width: 500 }}>
6
+ <Form disabled labelWidth={100} colon>
7
+ <FormItem label="用户名" name="username">
8
+ <Input placeholder="请输入用户名" defaultValue="admin" />
9
+ </FormItem>
10
+ <FormItem label="角色" name="role">
11
+ <Select
12
+ defaultValue="admin"
13
+ options={[
14
+ { label: "管理员", value: "admin" },
15
+ { label: "用户", value: "user" }
16
+ ]}
17
+ />
18
+ </FormItem>
19
+ <FormItem label="启用" name="enabled">
20
+ <Switch defaultValue={true} />
21
+ </FormItem>
22
+ </Form>
23
+ </div>
24
+ );
25
+
26
+ export default DisabledForm;
@@ -0,0 +1,74 @@
1
+ import React from "react";
2
+ import { Form, Input, Button, Select, FormItem, FormList } from "@tendaui/react";
3
+
4
+ const FormListExample = () => {
5
+ const [form] = Form.useForm();
6
+
7
+ const onSubmit = () => {
8
+ const allFields = form.getFieldsValue(true);
9
+ console.log("表单数据:", allFields);
10
+ };
11
+
12
+ const cityOptions = [
13
+ { label: "北京", value: "bj" },
14
+ { label: "上海", value: "sh" },
15
+ { label: "广州", value: "gz" },
16
+ { label: "深圳", value: "sz" }
17
+ ];
18
+
19
+ return (
20
+ <Form
21
+ form={form}
22
+ colon
23
+ onSubmit={onSubmit}
24
+ labelWidth={100}
25
+ initialData={{
26
+ address: [
27
+ { city: "bj", area: "海淀" },
28
+ { city: "sh", area: "浦东" }
29
+ ]
30
+ }}
31
+ >
32
+ <FormList name="address">
33
+ {(fields, { add, remove }) => (
34
+ <>
35
+ {fields.map(({ key, name, ...restField }, index) => (
36
+ <FormItem key={key} label={`地址 ${index + 1}`}>
37
+ <div style={{ display: "flex", gap: "8px", alignItems: "center" }}>
38
+ <FormItem
39
+ name={[name, "city"]}
40
+ rules={[{ required: true, message: "请选择城市" }]}
41
+ {...restField}
42
+ style={{ marginBottom: 0 }}
43
+ >
44
+ <Select options={cityOptions} placeholder="选择城市" style={{ width: "120px" }} />
45
+ </FormItem>
46
+ <FormItem name={[name, "area"]} {...restField} style={{ marginBottom: 0 }}>
47
+ <Input placeholder="详细地址" style={{ width: "200px" }} />
48
+ </FormItem>
49
+ {fields.length > 1 && (
50
+ <Button variant="text" theme="danger" onClick={() => remove(index)}>
51
+ 删除
52
+ </Button>
53
+ )}
54
+ </div>
55
+ </FormItem>
56
+ ))}
57
+ <FormItem style={{ marginLeft: 100 }}>
58
+ <Button variant="dashed" onClick={() => add({ city: "", area: "" })}>
59
+ + 添加地址
60
+ </Button>
61
+ </FormItem>
62
+ </>
63
+ )}
64
+ </FormList>
65
+ <FormItem style={{ marginLeft: 100 }}>
66
+ <Button type="submit" theme="primary">
67
+ 提交
68
+ </Button>
69
+ </FormItem>
70
+ </Form>
71
+ );
72
+ };
73
+
74
+ export default FormListExample;
@@ -0,0 +1,20 @@
1
+ import React from "react";
2
+ import { Form, Input, Button, FormItem } from "@tendaui/react";
3
+
4
+ const InlineLayoutForm = () => (
5
+ <Form layout="inline" labelWidth={60}>
6
+ <FormItem label="用户名" name="username">
7
+ <Input placeholder="用户名" style={{ width: "150px" }} />
8
+ </FormItem>
9
+ <FormItem label="密码" name="password">
10
+ <Input type="password" placeholder="密码" style={{ width: "150px" }} />
11
+ </FormItem>
12
+ <FormItem>
13
+ <Button theme="primary" type="submit">
14
+ 登录
15
+ </Button>
16
+ </FormItem>
17
+ </Form>
18
+ );
19
+
20
+ export default InlineLayoutForm;
@@ -0,0 +1,46 @@
1
+ import React from "react";
2
+ import { Form, Input } from "@tendaui/react";
3
+
4
+ const { FormItem } = Form;
5
+
6
+ const LabelAlignForm = () => (
7
+ <div style={{ display: "flex", flexDirection: "column", gap: "32px", width: 500 }}>
8
+ <div>
9
+ <h4 style={{ marginBottom: "12px", color: "#666" }}>左对齐</h4>
10
+ <Form labelAlign="left" labelWidth={100}>
11
+ <FormItem label="用户名" name="username1">
12
+ <Input placeholder="请输入用户名" />
13
+ </FormItem>
14
+ <FormItem label="密码" name="password1">
15
+ <Input type="password" placeholder="请输入密码" />
16
+ </FormItem>
17
+ </Form>
18
+ </div>
19
+
20
+ <div>
21
+ <h4 style={{ marginBottom: "12px", color: "#666" }}>右对齐</h4>
22
+ <Form labelAlign="right" labelWidth={100}>
23
+ <FormItem label="用户名" name="username2">
24
+ <Input placeholder="请输入用户名" />
25
+ </FormItem>
26
+ <FormItem label="密码" name="password2">
27
+ <Input type="password" placeholder="请输入密码" />
28
+ </FormItem>
29
+ </Form>
30
+ </div>
31
+
32
+ <div>
33
+ <h4 style={{ marginBottom: "12px", color: "#666" }}>顶部对齐</h4>
34
+ <Form labelAlign="top">
35
+ <FormItem label="用户名" name="username3">
36
+ <Input placeholder="请输入用户名" />
37
+ </FormItem>
38
+ <FormItem label="密码" name="password3">
39
+ <Input type="password" placeholder="请输入密码" />
40
+ </FormItem>
41
+ </Form>
42
+ </div>
43
+ </div>
44
+ );
45
+
46
+ export default LabelAlignForm;
@@ -0,0 +1,66 @@
1
+ import React from "react";
2
+ import { Form, Input, Button, FormItem } from "@tendaui/react";
3
+ import { NotificationProvider, useNotification } from "@tendaui/react/notification";
4
+
5
+ const FormMethodsExample = () => {
6
+ const [form] = Form.useForm();
7
+ const { success } = useNotification();
8
+
9
+ const handleValidate = async () => {
10
+ const result = await form.validate();
11
+ console.log("验证结果:", result);
12
+ if (result === true) {
13
+ success({ title: "验证通过", message: "表单验证成功" });
14
+ }
15
+ };
16
+
17
+ const handleSetFields = () => {
18
+ form.setFieldsValue({
19
+ username: "testuser",
20
+ email: "test@example.com"
21
+ });
22
+ success({ title: "设置成功", message: "已填充表单数据" });
23
+ };
24
+
25
+ const handleGetFields = () => {
26
+ const values = form.getFieldsValue(true);
27
+ console.log("当前表单值:", values);
28
+ success({ title: "获取成功", message: JSON.stringify(values) });
29
+ };
30
+
31
+ const handleReset = () => {
32
+ form.reset();
33
+ success({ title: "重置成功", message: "表单已重置" });
34
+ };
35
+
36
+ return (
37
+ <div style={{ width: 500 }}>
38
+ <Form form={form} labelWidth={100} colon>
39
+ <FormItem label="用户名" name="username" rules={[{ required: true, message: "请输入用户名" }]}>
40
+ <Input placeholder="请输入用户名" />
41
+ </FormItem>
42
+ <FormItem label="邮箱" name="email" rules={[{ email: true, message: "请输入正确的邮箱" }]}>
43
+ <Input placeholder="请输入邮箱" />
44
+ </FormItem>
45
+ <FormItem style={{ marginInlineStart: 100 }}>
46
+ <div style={{ display: "flex", gap: "8px", flexWrap: "wrap" }}>
47
+ <Button theme="primary" onClick={handleValidate}>
48
+ 验证表单
49
+ </Button>
50
+ <Button onClick={handleSetFields}>填充数据</Button>
51
+ <Button onClick={handleGetFields}>获取数据</Button>
52
+ <Button onClick={handleReset}>重置表单</Button>
53
+ </div>
54
+ </FormItem>
55
+ </Form>
56
+ </div>
57
+ );
58
+ };
59
+
60
+ const FormExample = () => (
61
+ <NotificationProvider>
62
+ <FormMethodsExample />
63
+ </NotificationProvider>
64
+ );
65
+
66
+ export default FormExample;
@@ -0,0 +1,71 @@
1
+ import React from "react";
2
+ import { Form, Input, Button } from "@tendaui/react";
3
+ import { NotificationProvider, useNotification } from "@tendaui/react/notification";
4
+
5
+ const { FormItem } = Form;
6
+
7
+ const ValidationForm = () => {
8
+ const [form] = Form.useForm();
9
+ const { success, error } = useNotification();
10
+
11
+ const onSubmit = (e: any) => {
12
+ if (e.validateResult === true) {
13
+ success({ title: "验证通过", message: "表单提交成功" });
14
+ } else {
15
+ error({ title: "验证失败", message: "请检查表单输入" });
16
+ }
17
+ };
18
+
19
+ return (
20
+ <div style={{ width: 500 }}>
21
+ <Form form={form} onSubmit={onSubmit} colon labelWidth={100}>
22
+ <FormItem
23
+ label="用户名"
24
+ name="username"
25
+ requiredMark
26
+ rules={[
27
+ { required: true, message: "请输入用户名" },
28
+ { min: 3, message: "用户名至少3个字符" },
29
+ { max: 20, message: "用户名最多20个字符" }
30
+ ]}
31
+ >
32
+ <Input placeholder="请输入用户名" />
33
+ </FormItem>
34
+
35
+ <FormItem
36
+ label="邮箱"
37
+ name="email"
38
+ requiredMark
39
+ rules={[
40
+ { required: true, message: "请输入邮箱" },
41
+ { email: true, message: "请输入正确的邮箱格式" }
42
+ ]}
43
+ >
44
+ <Input placeholder="请输入邮箱" />
45
+ </FormItem>
46
+
47
+ <FormItem label="手机号" name="phone" rules={[{ telnumber: true, message: "请输入正确的手机号" }]}>
48
+ <Input placeholder="请输入手机号" />
49
+ </FormItem>
50
+
51
+ <FormItem label="网址" name="url" rules={[{ url: true, message: "请输入正确的网址" }]}>
52
+ <Input placeholder="请输入网址" />
53
+ </FormItem>
54
+
55
+ <FormItem style={{ marginInlineStart: 100 }}>
56
+ <Button type="submit" theme="primary">
57
+ 提交
58
+ </Button>
59
+ </FormItem>
60
+ </Form>
61
+ </div>
62
+ );
63
+ };
64
+
65
+ const FormExample = () => (
66
+ <NotificationProvider>
67
+ <ValidationForm />
68
+ </NotificationProvider>
69
+ );
70
+
71
+ export default FormExample;
@@ -5,7 +5,7 @@ import parseTNode from "../../utils/parseTNode";
5
5
  import { ValidateStatus } from "../const";
6
6
 
7
7
  export default function useFormItemStyle(props) {
8
- const { classPrefix } = useConfig();
8
+ const { classPrefix, direction } = useConfig();
9
9
 
10
10
  const {
11
11
  className,
@@ -70,13 +70,22 @@ export default function useFormItemStyle(props) {
70
70
  [`${classPrefix}-form__item-with-help`]: helpNode,
71
71
  [`${classPrefix}-form__item-with-extra`]: extraNode
72
72
  });
73
+ // todo form item label 也需要 RTL 处理
74
+ const isRtl = direction === "rtl";
75
+ const resolvedLabelAlign = isRtl
76
+ ? labelAlign === "left"
77
+ ? "right"
78
+ : labelAlign === "right"
79
+ ? "left"
80
+ : labelAlign
81
+ : labelAlign;
73
82
 
74
83
  const formItemLabelClass = classNames(`${classPrefix}-form__label`, {
75
84
  [`${classPrefix}-form__label--required`]: needRequiredMark,
76
85
  [`${classPrefix}-form__label--required-right`]: needRequiredMark && requiredMarkPosition === "right",
77
- [`${classPrefix}-form__label--top`]: labelAlign === "top" || !labelWidth,
78
- [`${classPrefix}-form__label--left`]: labelAlign === "left" && labelWidth,
79
- [`${classPrefix}-form__label--right`]: labelAlign === "right" && labelWidth
86
+ [`${classPrefix}-form__label--top`]: resolvedLabelAlign === "top" || !labelWidth,
87
+ [`${classPrefix}-form__label--left`]: resolvedLabelAlign === "left" && labelWidth,
88
+ [`${classPrefix}-form__label--right`]: resolvedLabelAlign === "right" && labelWidth
80
89
  });
81
90
 
82
91
  const contentClass = () => {
@@ -100,15 +109,18 @@ export default function useFormItemStyle(props) {
100
109
 
101
110
  let labelStyle = {};
102
111
  let contentStyle = {};
103
- if (label && labelWidth && labelAlign !== "top") {
112
+ if (label && labelWidth && resolvedLabelAlign !== "top") {
104
113
  if (typeof labelWidth === "number") {
105
114
  labelStyle = { width: `${labelWidth}px` };
106
- contentStyle = { marginLeft: layout !== "inline" ? `${labelWidth}px` : "" };
115
+ contentStyle = { marginInlineStart: layout !== "inline" ? `${labelWidth}px` : "" };
107
116
  } else {
108
117
  labelStyle = { width: labelWidth };
109
- contentStyle = { marginLeft: layout !== "inline" ? labelWidth : "" };
118
+ contentStyle = { marginInlineStart: layout !== "inline" ? labelWidth : "" };
110
119
  }
111
120
  }
121
+ if (isRtl && label && labelWidth && resolvedLabelAlign !== "top") {
122
+ labelStyle = { ...labelStyle, float: "right" };
123
+ }
112
124
 
113
125
  return {
114
126
  formItemClass,
package/form/index.ts CHANGED
@@ -1,11 +1,29 @@
1
1
  import _Form from "./Form";
2
-
2
+ import FormList from "./FormList";
3
+ import useForm from "./hooks/useForm";
4
+ import useWatch from "./hooks/useWatch";
5
+ import FormItem from "./FormItem";
3
6
  import "./style/index.js";
4
7
 
5
8
  export type { FormProps } from "./Form";
6
9
  export type { FormItemProps } from "./FormItem";
7
10
  export * from "./type";
8
11
  export * from "./hooks/interface";
12
+ export { FormItem, FormList, useForm, useWatch };
13
+
14
+ // 扩展 Form 组件类型,添加静态方法
15
+ interface FormStatic {
16
+ useForm: typeof useForm;
17
+ useWatch: typeof useWatch;
18
+ FormItem: typeof FormItem;
19
+ FormList: typeof FormList;
20
+ }
21
+
22
+ // 确保 Form 组件包含所有必要的静态属性
23
+ export const Form = _Form as typeof _Form & FormStatic;
24
+ Form.useForm = useForm;
25
+ Form.useWatch = useWatch;
26
+ Form.FormItem = FormItem;
27
+ Form.FormList = FormList;
9
28
 
10
- export const Form = _Form;
11
29
  export default Form;