@tendaui/components 1.2.4 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (309) hide show
  1. package/_util/scroll.ts +9 -0
  2. package/alert/_example/base.tsx +13 -0
  3. package/alert/_example/collapse.tsx +15 -0
  4. package/badge/_example/base.tsx +10 -0
  5. package/badge/_example/count.tsx +29 -0
  6. package/badge/_example/custom-color.tsx +32 -0
  7. package/badge/_example/dot.tsx +26 -0
  8. package/badge/_example/max-count.tsx +26 -0
  9. package/badge/_example/offset.tsx +29 -0
  10. package/badge/_example/shape.tsx +32 -0
  11. package/badge/_example/show-zero.tsx +23 -0
  12. package/badge/_example/size.tsx +35 -0
  13. package/badge/_example/standalone.tsx +14 -0
  14. package/badge/_example/text-count.tsx +26 -0
  15. package/badge/_example/with-button.tsx +23 -0
  16. package/button/_example/block.tsx +18 -0
  17. package/button/_example/disabled.tsx +22 -0
  18. package/button/_example/ghost.tsx +21 -0
  19. package/button/_example/link.tsx +15 -0
  20. package/button/_example/loading.tsx +19 -0
  21. package/button/_example/shape.tsx +18 -0
  22. package/button/_example/size.tsx +18 -0
  23. package/button/_example/suffix.tsx +16 -0
  24. package/button/_example/theme.tsx +14 -0
  25. package/button/_example/variant-base.tsx +24 -0
  26. package/button/_example/variant-dashed.tsx +24 -0
  27. package/button/_example/variant-outline.tsx +24 -0
  28. package/button/_example/variant-text.tsx +24 -0
  29. package/checkbox/_example/base.tsx +8 -0
  30. package/checkbox/_example/controlled.tsx +11 -0
  31. package/checkbox/_example/group-disabled.tsx +13 -0
  32. package/checkbox/_example/group-with-check-all.tsx +22 -0
  33. package/checkbox/_example/group-with-max.tsx +17 -0
  34. package/checkbox/_example/group-with-options.tsx +18 -0
  35. package/checkbox/_example/group.tsx +17 -0
  36. package/checkbox/_example/states.tsx +19 -0
  37. package/color-picker/ColorPicker.tsx +16 -2
  38. package/color-picker/_example/base.tsx +12 -0
  39. package/color-picker/_example/borderless.tsx +17 -0
  40. package/color-picker/_example/clearable.tsx +12 -0
  41. package/color-picker/_example/disabled.tsx +17 -0
  42. package/color-picker/_example/formats.tsx +30 -0
  43. package/color-picker/_example/manual-input.tsx +39 -0
  44. package/color-picker/_example/recent-colors.tsx +19 -0
  45. package/color-picker/_example/swatch-colors.tsx +28 -0
  46. package/color-picker/_example/with-alpha.tsx +21 -0
  47. package/color-picker/components/panel/format/inputs.tsx +1 -1
  48. package/color-picker/components/panel/index.tsx +13 -0
  49. package/color-picker/components/trigger.tsx +64 -13
  50. package/color-picker/defaultProps.ts +4 -1
  51. package/color-picker/utils/color-picker/cmyk.ts +5 -5
  52. package/color-picker/utils/color-picker/draggable.ts +14 -15
  53. package/color-picker/utils/color-picker/format.ts +21 -26
  54. package/color-picker/utils/color-picker/gradient.ts +35 -41
  55. package/color-picker/utils/color-picker/types.ts +4 -4
  56. package/config-provider/ConfigContext.tsx +1 -0
  57. package/config-provider/ConfigProvider.tsx +18 -1
  58. package/config-provider/type.ts +5 -0
  59. package/dialog/_example/base.tsx +27 -0
  60. package/dialog/_example/confirm-loading.tsx +32 -0
  61. package/dialog/_example/custom-buttons.tsx +24 -0
  62. package/dialog/_example/full-screen.tsx +26 -0
  63. package/dialog/_example/hide-buttons.tsx +39 -0
  64. package/dialog/_example/modeless.tsx +25 -0
  65. package/dialog/_example/placement.tsx +40 -0
  66. package/dialog/_example/plugin-example.tsx +69 -0
  67. package/dialog/_example/themes.tsx +41 -0
  68. package/drawer/Drawer.tsx +17 -9
  69. package/drawer/_example/custom-header-footer.tsx +29 -0
  70. package/drawer/_example/default.tsx +20 -0
  71. package/drawer/_example/events.tsx +53 -0
  72. package/drawer/_example/no-footer.tsx +20 -0
  73. package/drawer/_example/no-overlay.tsx +20 -0
  74. package/drawer/_example/placement.tsx +43 -0
  75. package/drawer/_example/size-draggable.tsx +26 -0
  76. package/drawer/_example/size.tsx +40 -0
  77. package/drawer/defaultProps.ts +1 -1
  78. package/fireworks/Fireworks.tsx +1 -10
  79. package/fireworks/index.ts +0 -1
  80. package/fireworks/type.ts +0 -1
  81. package/form/_example/complex.tsx +76 -0
  82. package/form/_example/default.tsx +58 -0
  83. package/form/_example/disabled.tsx +26 -0
  84. package/form/_example/form-list.tsx +74 -0
  85. package/form/_example/inline-layout.tsx +20 -0
  86. package/form/_example/label-align.tsx +46 -0
  87. package/form/_example/methods.tsx +66 -0
  88. package/form/_example/validation.tsx +71 -0
  89. package/form/hooks/useFormItemStyle.tsx +19 -7
  90. package/form/index.ts +20 -2
  91. package/global-config/default-config.ts +28 -28
  92. package/global-config/locale/ar_KW.ts +176 -187
  93. package/global-config/locale/en_US.ts +180 -195
  94. package/global-config/locale/it_IT.ts +174 -197
  95. package/global-config/locale/ja_JP.ts +178 -193
  96. package/global-config/locale/ko_KR.ts +178 -193
  97. package/global-config/locale/ru_RU.ts +189 -200
  98. package/global-config/locale/zh_CN.ts +179 -193
  99. package/global-config/locale/zh_TW.ts +178 -192
  100. package/global-config/mobile/default-config.ts +3 -3
  101. package/global-config/mobile/locale/ar_KW.ts +76 -77
  102. package/global-config/mobile/locale/en_US.ts +76 -77
  103. package/global-config/mobile/locale/it_IT.ts +76 -77
  104. package/global-config/mobile/locale/ja_JP.ts +64 -65
  105. package/global-config/mobile/locale/ko_KR.ts +64 -65
  106. package/global-config/mobile/locale/ru_RU.ts +76 -77
  107. package/global-config/mobile/locale/zh_CN.ts +64 -65
  108. package/global-config/mobile/locale/zh_TW.ts +64 -65
  109. package/global-config/t.ts +12 -12
  110. package/hooks/useDebounce.ts +27 -0
  111. package/hooks/useLastest.ts +6 -2
  112. package/hooks/useResizeObserve.ts +0 -1
  113. package/index.ts +1 -1
  114. package/input/Input.tsx +53 -10
  115. package/input/_example/auto-width.tsx +14 -0
  116. package/input/_example/borderless.tsx +17 -0
  117. package/input/_example/clearable.tsx +14 -0
  118. package/input/_example/default.tsx +10 -0
  119. package/input/_example/disabled-readonly.tsx +12 -0
  120. package/input/_example/events.tsx +42 -0
  121. package/input/_example/group.tsx +14 -0
  122. package/input/_example/label-suffix.tsx +12 -0
  123. package/input/_example/max-length.tsx +11 -0
  124. package/input/_example/password.tsx +14 -0
  125. package/input/_example/sizes.tsx +12 -0
  126. package/input/_example/status.tsx +13 -0
  127. package/input/_example/text-align.tsx +12 -0
  128. package/input/_example/with-icon.tsx +13 -0
  129. package/input/type.ts +3 -0
  130. package/input/useLengthLimit.ts +122 -0
  131. package/input-number/_example/align.tsx +23 -0
  132. package/input-number/_example/auto-width.tsx +8 -0
  133. package/input-number/_example/default.tsx +8 -0
  134. package/input-number/_example/events.tsx +45 -0
  135. package/input-number/_example/format.tsx +27 -0
  136. package/input-number/_example/large-number.tsx +17 -0
  137. package/input-number/_example/min-max.tsx +14 -0
  138. package/input-number/_example/sizes.tsx +35 -0
  139. package/input-number/_example/status.tsx +65 -0
  140. package/input-number/_example/step-and-decimal.tsx +14 -0
  141. package/input-number/_example/themes.tsx +21 -0
  142. package/input-number/_example/with-suffix.tsx +12 -0
  143. package/ip-input/_example/controlled.tsx +26 -0
  144. package/ip-input/_example/default.tsx +12 -0
  145. package/ip-input/_example/full-featured.tsx +32 -0
  146. package/ip-input/_example/ipv6.tsx +23 -0
  147. package/ip-input/_example/keyboard-navigation.tsx +19 -0
  148. package/ip-input/_example/paste-demo.tsx +23 -0
  149. package/ip-input/_example/states.tsx +21 -0
  150. package/ip-input/_example/with-cidr.tsx +23 -0
  151. package/layout/_example/combine-left.tsx +54 -0
  152. package/layout/_example/combine-right.tsx +54 -0
  153. package/layout/_example/custom-aside-width.tsx +56 -0
  154. package/layout/_example/custom-height.tsx +45 -0
  155. package/layout/_example/double-sidebar.tsx +57 -0
  156. package/layout/_example/side-navigation-right.tsx +51 -0
  157. package/layout/_example/side-navigation.tsx +51 -0
  158. package/layout/_example/top-navigation.tsx +41 -0
  159. package/list/_example/async-loading.tsx +46 -0
  160. package/list/_example/default.tsx +23 -0
  161. package/list/_example/header-footer.tsx +40 -0
  162. package/list/_example/multiline.tsx +24 -0
  163. package/list/_example/scroll-loading.tsx +69 -0
  164. package/list/_example/sizes.tsx +45 -0
  165. package/list/_example/split.tsx +36 -0
  166. package/list/_example/stripe.tsx +24 -0
  167. package/list/_example/virtual-scroll.tsx +51 -0
  168. package/list/_example/with-image.tsx +26 -0
  169. package/loading/_example/default.tsx +6 -0
  170. package/loading/_example/delay.tsx +53 -0
  171. package/loading/_example/fullscreen.tsx +29 -0
  172. package/loading/_example/inherit-color.tsx +24 -0
  173. package/loading/_example/no-overlay.tsx +15 -0
  174. package/loading/_example/sizes.tsx +25 -0
  175. package/loading/_example/with-text.tsx +12 -0
  176. package/loading/_example/wrapper.tsx +30 -0
  177. package/notification/_example/default.tsx +31 -0
  178. package/notification/_example/long-content.tsx +37 -0
  179. package/notification/_example/stacking.tsx +40 -0
  180. package/notification/_example/types.tsx +78 -0
  181. package/notification/_example/usage-example.tsx +62 -0
  182. package/package.json +4 -3
  183. package/popup/Popup.tsx +17 -5
  184. package/popup/_example/controlled.tsx +32 -0
  185. package/popup/_example/custom-content.tsx +64 -0
  186. package/popup/_example/default.tsx +19 -0
  187. package/popup/_example/delay.tsx +35 -0
  188. package/popup/_example/disabled.tsx +17 -0
  189. package/popup/_example/no-arrow.tsx +17 -0
  190. package/popup/_example/placements.tsx +61 -0
  191. package/popup/_example/triggers.tsx +26 -0
  192. package/radio/_example/allow-uncheck.tsx +19 -0
  193. package/radio/_example/button-style.tsx +40 -0
  194. package/radio/_example/controlled.tsx +13 -0
  195. package/radio/_example/default.tsx +13 -0
  196. package/radio/_example/group-disabled.tsx +22 -0
  197. package/radio/_example/group-with-options.tsx +20 -0
  198. package/radio/_example/group.tsx +19 -0
  199. package/radio/_example/sizes.tsx +37 -0
  200. package/radio/_example/states.tsx +20 -0
  201. package/select/_example/collapsed.tsx +30 -0
  202. package/select/_example/creatable.tsx +36 -0
  203. package/select/_example/custom-content.tsx +26 -0
  204. package/select/_example/default.tsx +29 -0
  205. package/select/_example/disabled.tsx +20 -0
  206. package/select/_example/filterable.tsx +27 -0
  207. package/select/_example/group-options.tsx +44 -0
  208. package/select/_example/label-suffix.tsx +24 -0
  209. package/select/_example/loading.tsx +19 -0
  210. package/select/_example/multiple.tsx +31 -0
  211. package/select/_example/sizes.tsx +20 -0
  212. package/select/_example/status.tsx +27 -0
  213. package/slider/Slider.tsx +13 -5
  214. package/slider/_example/custom-label.tsx +19 -0
  215. package/slider/_example/default.tsx +14 -0
  216. package/slider/_example/disabled.tsx +17 -0
  217. package/slider/_example/marks.tsx +31 -0
  218. package/slider/_example/range.tsx +16 -0
  219. package/slider/_example/step.tsx +14 -0
  220. package/slider/_example/vertical.tsx +26 -0
  221. package/slider/_example/with-input-number.tsx +21 -0
  222. package/slider/type.ts +1 -1
  223. package/styles/_vars.scss +16 -0
  224. package/styles/components/button/_index.scss +3 -3
  225. package/styles/components/dialog/_index.scss +18 -20
  226. package/styles/components/drawer/_index.scss +4 -3
  227. package/styles/components/drawer/_var.scss +1 -1
  228. package/styles/components/form/_index.scss +7 -6
  229. package/styles/components/input/_mixins.scss +7 -5
  230. package/styles/components/input-number/_index.scss +13 -12
  231. package/styles/components/list/_index.scss +5 -5
  232. package/styles/components/notification/_index.scss +4 -4
  233. package/styles/components/slider/_index.scss +8 -8
  234. package/styles/components/switch/_index.scss +98 -15
  235. package/styles/components/table/_index.scss +37 -29
  236. package/styles/components/tabs/_index.scss +8 -9
  237. package/styles/components/tooltip/_index.scss +104 -0
  238. package/styles/components/tooltip/_vars.scss +23 -0
  239. package/switch/_example/async-change.tsx +25 -0
  240. package/switch/_example/before-change.tsx +22 -0
  241. package/switch/_example/controlled.tsx +14 -0
  242. package/switch/_example/custom-value.tsx +21 -0
  243. package/switch/_example/default.tsx +6 -0
  244. package/switch/_example/disabled.tsx +25 -0
  245. package/switch/_example/loading.tsx +17 -0
  246. package/switch/_example/sizes.tsx +21 -0
  247. package/switch/_example/with-label.tsx +21 -0
  248. package/tab/TabPanel.tsx +9 -6
  249. package/tab/_example/addable.tsx +45 -0
  250. package/tab/_example/card-theme.tsx +22 -0
  251. package/tab/_example/default.tsx +22 -0
  252. package/tab/_example/disabled.tsx +38 -0
  253. package/tab/_example/lazy.tsx +25 -0
  254. package/tab/_example/placement.tsx +36 -0
  255. package/tab/_example/removable.tsx +31 -0
  256. package/tab/_example/sizes.tsx +31 -0
  257. package/tab/_example/with-action.tsx +26 -0
  258. package/table/Cell.tsx +3 -6
  259. package/table/Ellipsis.tsx +73 -0
  260. package/table/_example/alignment.tsx +46 -0
  261. package/table/_example/auto-width.tsx +47 -0
  262. package/table/_example/bordered-stripe-hover.tsx +42 -0
  263. package/table/_example/bordered.tsx +42 -0
  264. package/table/_example/cell-click.tsx +52 -0
  265. package/table/_example/complex.tsx +82 -0
  266. package/table/_example/custom-cell.tsx +68 -0
  267. package/table/_example/custom-empty.tsx +37 -0
  268. package/table/_example/custom-row-class-name.tsx +57 -0
  269. package/table/_example/default.tsx +42 -0
  270. package/table/_example/ellipsis.tsx +56 -0
  271. package/table/_example/empty.tsx +28 -0
  272. package/table/_example/fixed-width.tsx +48 -0
  273. package/table/_example/hover.tsx +42 -0
  274. package/table/_example/row-click.tsx +52 -0
  275. package/table/_example/sizes.tsx +57 -0
  276. package/table/_example/stripe.tsx +42 -0
  277. package/table/_example/vertical-align.tsx +110 -0
  278. package/table/hooks/useTableClassName.ts +3 -3
  279. package/table/index.ts +2 -0
  280. package/table/type.ts +1 -0
  281. package/tag/Tag.tsx +1 -1
  282. package/tag/_example/closable.tsx +44 -0
  283. package/tag/_example/default.tsx +17 -0
  284. package/tag/_example/disabled.tsx +19 -0
  285. package/tag/_example/sizes.tsx +18 -0
  286. package/tag/_example/variants.tsx +37 -0
  287. package/tag-input/_example/collapsed.tsx +27 -0
  288. package/tag-input/_example/controlled-uncontrolled.tsx +26 -0
  289. package/tag-input/_example/default.tsx +15 -0
  290. package/tag-input/_example/disabled-readonly.tsx +21 -0
  291. package/tag-input/_example/events.tsx +64 -0
  292. package/tag-input/_example/excess-display.tsx +27 -0
  293. package/tag-input/_example/max-tags.tsx +22 -0
  294. package/tag-input/_example/sizes.tsx +21 -0
  295. package/tag-input/_example/status.tsx +37 -0
  296. package/tag-input/_example/with-label.tsx +23 -0
  297. package/tag-input/hooks/useTagList.tsx +1 -1
  298. package/tooltip/Tooltip.tsx +76 -0
  299. package/tooltip/_example/base.tsx +26 -0
  300. package/tooltip/_example/custom-content.tsx +47 -0
  301. package/tooltip/_example/placement.tsx +33 -0
  302. package/tooltip/_example/theme.tsx +34 -0
  303. package/tooltip/defaultProps.ts +14 -0
  304. package/tooltip/index.ts +7 -0
  305. package/tooltip/style/index.js +1 -0
  306. package/tooltip/type.ts +99 -0
  307. package/utils/log/index.ts +1 -1
  308. package/utils/log/log.ts +2 -3
  309. package/utils/log/types.ts +1 -4
@@ -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;
@@ -1,39 +1,39 @@
1
- export type AnimationType = 'ripple' | 'expand' | 'fade';
1
+ export type AnimationType = "ripple" | "expand" | "fade";
2
2
 
3
3
  export default {
4
- classPrefix: 't',
4
+ classPrefix: "t",
5
5
  animation: {
6
- include: ['ripple', 'expand', 'fade'],
7
- exclude: [],
8
- } as Record<'include' | 'exclude', Array<AnimationType>>,
6
+ include: ["ripple", "expand", "fade"],
7
+ exclude: []
8
+ } as Record<"include" | "exclude", Array<AnimationType>>,
9
9
  attach: null,
10
10
  calendar: {
11
11
  firstDayOfWeek: 1,
12
12
  fillWithZero: true,
13
- controllerConfig: undefined,
13
+ controllerConfig: undefined
14
14
  },
15
15
  icon: {},
16
16
  input: {
17
- autocomplete: '',
17
+ autocomplete: ""
18
18
  },
19
19
  dialog: {
20
20
  closeOnEscKeydown: true,
21
21
  closeOnOverlayClick: true,
22
22
  confirmBtnTheme: {
23
- default: 'primary',
24
- info: 'primary',
25
- warning: 'primary',
26
- danger: 'primary',
27
- success: 'primary',
28
- },
23
+ default: "primary",
24
+ info: "primary",
25
+ warning: "primary",
26
+ danger: "primary",
27
+ success: "primary"
28
+ }
29
29
  },
30
30
  message: {},
31
31
  popconfirm: {
32
32
  confirmBtnTheme: {
33
- default: 'primary',
34
- warning: 'primary',
35
- danger: 'primary',
36
- },
33
+ default: "primary",
34
+ warning: "primary",
35
+ danger: "primary"
36
+ }
37
37
  },
38
38
  table: {
39
39
  // 展开和收起图标(使用收起图标)
@@ -47,34 +47,34 @@ export default {
47
47
  // 是否隐藏排序图标的文本提示
48
48
  hideSortTips: false,
49
49
  // 全局表格尺寸配置
50
- size: 'medium',
50
+ size: "medium"
51
51
  },
52
52
  select: {
53
53
  // 清除按钮
54
54
  clearIcon: undefined,
55
- filterable: false,
55
+ filterable: false
56
56
  },
57
57
  drawer: {
58
58
  closeOnEscKeydown: true,
59
59
  closeOnOverlayClick: true,
60
- size: 'small',
60
+ size: "small"
61
61
  },
62
62
  tree: {
63
63
  // 目录层级图标
64
- folderIcon: undefined,
64
+ folderIcon: undefined
65
65
  },
66
66
  datePicker: {
67
- firstDayOfWeek: 1,
67
+ firstDayOfWeek: 1
68
68
  },
69
69
  steps: {
70
70
  checkIcon: undefined,
71
- errorIcon: undefined,
71
+ errorIcon: undefined
72
72
  },
73
73
  tag: {
74
- closeIcon: undefined,
74
+ closeIcon: undefined
75
75
  },
76
76
  form: {
77
- requiredMark: undefined,
77
+ requiredMark: undefined
78
78
  },
79
79
  empty: {
80
80
  titleText: {
@@ -82,14 +82,14 @@ export default {
82
82
  success: undefined,
83
83
  fail: undefined,
84
84
  empty: undefined,
85
- networkError: undefined,
85
+ networkError: undefined
86
86
  },
87
87
  image: {
88
88
  maintenance: undefined,
89
89
  success: undefined,
90
90
  fail: undefined,
91
91
  empty: undefined,
92
- networkError: undefined,
92
+ networkError: undefined
93
93
  }
94
- },
94
+ }
95
95
  } as const;