@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,36 @@
1
+ import React, { useState } from "react";
2
+ import { Select } from "@tendaui/react";
3
+
4
+ const CreatableExample = () => {
5
+ const [value, setValue] = useState<string[]>([]);
6
+ const [options, setOptions] = useState([
7
+ { label: "React", value: "react" },
8
+ { label: "Vue", value: "vue" },
9
+ { label: "Angular", value: "angular" }
10
+ ]);
11
+
12
+ const handleCreate = (val: string | number) => {
13
+ const newOption = { label: String(val), value: String(val) };
14
+ setOptions([...options, newOption]);
15
+ };
16
+
17
+ return (
18
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
19
+ <Select
20
+ value={value}
21
+ onChange={(val) => setValue(val as string[])}
22
+ options={options}
23
+ placeholder="输入并回车创建新选项"
24
+ multiple
25
+ filterable
26
+ creatable
27
+ clearable
28
+ onCreate={handleCreate}
29
+ style={{ width: "400px" }}
30
+ />
31
+ <div style={{ color: "#666", fontSize: "12px" }}>提示:输入新内容后按回车可创建新选项</div>
32
+ </div>
33
+ );
34
+ };
35
+
36
+ export default CreatableExample;
@@ -0,0 +1,26 @@
1
+ import { Select } from "@tendaui/react";
2
+ import React from "react";
3
+
4
+ const customOptions = [
5
+ { label: "架构云", value: "1", content: <span style={{ color: "var(--td-brand-color)" }}>架构云(推荐)</span> },
6
+ {
7
+ label: "大数据",
8
+ value: "2",
9
+ content: (
10
+ <span>
11
+ 大数据 <span style={{ color: "#999", fontSize: "12px" }}>- 企业版</span>
12
+ </span>
13
+ )
14
+ },
15
+ {
16
+ label: "人工智能",
17
+ value: "3",
18
+ content: <span style={{ color: "var(--td-success-color)" }}>人工智能(新)</span>
19
+ }
20
+ ];
21
+
22
+ const CustomContentExample = () => (
23
+ <Select options={customOptions} placeholder="选项支持自定义内容" style={{ width: "300px" }} />
24
+ );
25
+
26
+ export default CustomContentExample;
@@ -0,0 +1,29 @@
1
+ import React, { useState } from "react";
2
+ import { Select } from "@tendaui/react";
3
+
4
+ const basicOptions = [
5
+ { label: "架构云", value: "1", title: "架构云选项" },
6
+ { label: "大数据", value: "2" },
7
+ { label: "区块链", value: "3" },
8
+ { label: "物联网", value: "4", disabled: true },
9
+ { label: "人工智能", value: "5" }
10
+ ];
11
+
12
+ const DefaultExample = () => {
13
+ const [value, setValue] = useState("");
14
+ return (
15
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
16
+ <Select
17
+ value={value}
18
+ onChange={(val) => setValue(val as string)}
19
+ options={basicOptions}
20
+ placeholder="请选择"
21
+ clearable
22
+ style={{ width: "300px" }}
23
+ />
24
+ <div style={{ color: "#666", fontSize: "12px" }}>选中值:{value || "(空)"}</div>
25
+ </div>
26
+ );
27
+ };
28
+
29
+ export default DefaultExample;
@@ -0,0 +1,20 @@
1
+ import React from "react";
2
+ import { Select } from "@tendaui/react";
3
+
4
+ const basicOptions = [
5
+ { label: "架构云", value: "1", title: "架构云选项" },
6
+ { label: "大数据", value: "2" },
7
+ { label: "区块链", value: "3" },
8
+ { label: "物联网", value: "4", disabled: true },
9
+ { label: "人工智能", value: "5" }
10
+ ];
11
+
12
+ const DisabledExample = () => (
13
+ <div style={{ display: "flex", gap: "16px" }}>
14
+ <Select options={basicOptions} placeholder="正常状态" style={{ width: "200px" }} />
15
+ <Select options={basicOptions} placeholder="禁用状态" disabled defaultValue="1" style={{ width: "200px" }} />
16
+ <Select options={basicOptions} placeholder="只读状态" readonly defaultValue="2" style={{ width: "200px" }} />
17
+ </div>
18
+ );
19
+
20
+ export default DisabledExample;
@@ -0,0 +1,27 @@
1
+ import React, { useState } from "react";
2
+ import { Select } from "@tendaui/react";
3
+
4
+ const basicOptions = [
5
+ { label: "架构云", value: "1", title: "架构云选项" },
6
+ { label: "大数据", value: "2" },
7
+ { label: "区块链", value: "3" },
8
+ { label: "物联网", value: "4", disabled: true },
9
+ { label: "人工智能", value: "5" }
10
+ ];
11
+
12
+ const FilterableExample = () => {
13
+ const [value, setValue] = useState("");
14
+ return (
15
+ <Select
16
+ value={value}
17
+ onChange={(val) => setValue(val as string)}
18
+ options={basicOptions}
19
+ placeholder="请输入关键词搜索"
20
+ filterable
21
+ clearable
22
+ style={{ width: "300px" }}
23
+ />
24
+ );
25
+ };
26
+
27
+ export default FilterableExample;
@@ -0,0 +1,44 @@
1
+ import React, { useState } from "react";
2
+ import { Select } from "@tendaui/react";
3
+
4
+ const groupOptions = [
5
+ {
6
+ group: "华北",
7
+ children: [
8
+ { label: "北京", value: "beijing" },
9
+ { label: "天津", value: "tianjin" }
10
+ ]
11
+ },
12
+ {
13
+ group: "华东",
14
+ children: [
15
+ { label: "上海", value: "shanghai" },
16
+ { label: "南京", value: "nanjing" },
17
+ { label: "杭州", value: "hangzhou" }
18
+ ]
19
+ },
20
+ {
21
+ group: "华南",
22
+ children: [
23
+ { label: "广州", value: "guangzhou" },
24
+ { label: "深圳", value: "shenzhen" }
25
+ ]
26
+ }
27
+ ];
28
+
29
+ const GroupExample = () => {
30
+ const [value, setValue] = useState("");
31
+ return (
32
+ <Select
33
+ value={value}
34
+ onChange={(val) => setValue(val as string)}
35
+ options={groupOptions}
36
+ placeholder="请选择城市"
37
+ filterable
38
+ clearable
39
+ style={{ width: "300px" }}
40
+ />
41
+ );
42
+ };
43
+
44
+ export default GroupExample;
@@ -0,0 +1,24 @@
1
+ import React from "react";
2
+ import { Select } from "@tendaui/react";
3
+
4
+ const basicOptions = [
5
+ { label: "架构云", value: "1", title: "架构云选项" },
6
+ { label: "大数据", value: "2" },
7
+ { label: "区块链", value: "3" },
8
+ { label: "物联网", value: "4", disabled: true },
9
+ { label: "人工智能", value: "5" }
10
+ ];
11
+
12
+ const LabelSuffixExample = () => (
13
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
14
+ <Select label="城市:" options={basicOptions} placeholder="请选择" style={{ width: "350px" }} />
15
+ <Select
16
+ suffix={<span style={{ color: "#999" }}>个</span>}
17
+ options={basicOptions}
18
+ placeholder="请选择"
19
+ style={{ width: "350px" }}
20
+ />
21
+ </div>
22
+ );
23
+
24
+ export default LabelSuffixExample;
@@ -0,0 +1,19 @@
1
+ import React from "react";
2
+ import { Select } from "@tendaui/react";
3
+
4
+ const basicOptions = [
5
+ { label: "架构云", value: "1", title: "架构云选项" },
6
+ { label: "大数据", value: "2" },
7
+ { label: "区块链", value: "3" },
8
+ { label: "物联网", value: "4", disabled: true },
9
+ { label: "人工智能", value: "5" }
10
+ ];
11
+
12
+ const LoadingExample = () => (
13
+ <div style={{ display: "flex", gap: "16px" }}>
14
+ <Select options={basicOptions} placeholder="正常" style={{ width: "200px" }} />
15
+ <Select options={[]} placeholder="加载中..." loading style={{ width: "200px" }} />
16
+ </div>
17
+ );
18
+
19
+ export default LoadingExample;
@@ -0,0 +1,31 @@
1
+ import React, { useState } from "react";
2
+ import { Select } from "@tendaui/react";
3
+
4
+ const MultipleExample = () => {
5
+ const [value, setValue] = useState<string[]>(["1", "3"]);
6
+ const options = [
7
+ { label: "全选", checkAll: true },
8
+ { label: "架构云", value: "1" },
9
+ { label: "大数据", value: "2" },
10
+ { label: "区块链", value: "3" },
11
+ { label: "物联网", value: "4", disabled: true },
12
+ { label: "人工智能", value: "5" }
13
+ ];
14
+ return (
15
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
16
+ <Select
17
+ value={value}
18
+ onChange={(val) => setValue(val as string[])}
19
+ options={options}
20
+ placeholder="请选择多个选项"
21
+ multiple
22
+ filterable
23
+ clearable
24
+ style={{ width: "400px" }}
25
+ />
26
+ <div style={{ color: "#666", fontSize: "12px" }}>选中值:{JSON.stringify(value)}</div>
27
+ </div>
28
+ );
29
+ };
30
+
31
+ export default MultipleExample;
@@ -0,0 +1,20 @@
1
+ import React from "react";
2
+ import { Select } from "@tendaui/react";
3
+
4
+ const basicOptions = [
5
+ { label: "架构云", value: "1", title: "架构云选项" },
6
+ { label: "大数据", value: "2" },
7
+ { label: "区块链", value: "3" },
8
+ { label: "物联网", value: "4", disabled: true },
9
+ { label: "人工智能", value: "5" }
10
+ ];
11
+
12
+ const SizesExample = () => (
13
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
14
+ <Select size="small" options={basicOptions} placeholder="小尺寸" style={{ width: "300px" }} />
15
+ <Select size="medium" options={basicOptions} placeholder="中尺寸(默认)" style={{ width: "300px" }} />
16
+ <Select size="large" options={basicOptions} placeholder="大尺寸" style={{ width: "300px" }} />
17
+ </div>
18
+ );
19
+
20
+ export default SizesExample;
@@ -0,0 +1,27 @@
1
+ import React from "react";
2
+ import { Select } from "@tendaui/react";
3
+
4
+ const basicOptions = [
5
+ { label: "架构云", value: "1", title: "架构云选项" },
6
+ { label: "大数据", value: "2" },
7
+ { label: "区块链", value: "3" },
8
+ { label: "物联网", value: "4", disabled: true },
9
+ { label: "人工智能", value: "5" }
10
+ ];
11
+
12
+ const StatusExample = () => (
13
+ <div style={{ display: "flex", flexDirection: "column", gap: "24px", margin: "8px 0" }}>
14
+ <Select
15
+ status="default"
16
+ options={basicOptions}
17
+ placeholder="默认状态"
18
+ tips="这是一条提示"
19
+ style={{ width: "300px" }}
20
+ />
21
+ <Select status="success" options={basicOptions} placeholder="成功状态" tips="校验通过" style={{ width: "300px" }} />
22
+ <Select status="warning" options={basicOptions} placeholder="警告状态" tips="请注意" style={{ width: "300px" }} />
23
+ <Select status="error" options={basicOptions} placeholder="错误状态" tips="输入有误" style={{ width: "300px" }} />
24
+ </div>
25
+ );
26
+
27
+ export default StatusExample;
package/slider/Slider.tsx CHANGED
@@ -22,7 +22,7 @@ const RIGHT_NODE = 1;
22
22
  type SliderHandleNode = typeof LEFT_NODE | typeof RIGHT_NODE;
23
23
 
24
24
  const Slider = React.forwardRef<HTMLDivElement, SliderProps>((originalProps, ref) => {
25
- const { classPrefix } = useConfig();
25
+ const { classPrefix, direction } = useConfig();
26
26
  const props = useDefaultProps(originalProps, sliderDefaultProps);
27
27
  const {
28
28
  disabled,
@@ -43,6 +43,7 @@ const Slider = React.forwardRef<HTMLDivElement, SliderProps>((originalProps, ref
43
43
  const sliderRef = useRef<HTMLDivElement>(null);
44
44
  const [value, internalOnChange] = useControlled(props, "value", onChange);
45
45
  const isVertical = layout === "vertical";
46
+ const isRtl = direction === "rtl";
46
47
 
47
48
  const renderValue = Array.isArray(value) ? value : [min, Math.min(max, value)];
48
49
  const start = (renderValue[LEFT_NODE] - min) / (max - min);
@@ -95,8 +96,8 @@ const Slider = React.forwardRef<HTMLDivElement, SliderProps>((originalProps, ref
95
96
  return result;
96
97
  }, [max, min, step]);
97
98
 
98
- const startDirection = isVertical ? "bottom" : "left";
99
- const stepDirection = isVertical ? "top" : "left";
99
+ const startDirection = isVertical ? "bottom" : isRtl ? "right" : "left";
100
+ const stepDirection = isVertical ? "top" : isRtl ? "right" : "left";
100
101
  const sizeKey = isVertical ? "height" : "width";
101
102
  const renderDots = isVertical ? dots.map((item) => ({ ...item, position: 1 - item.position })) : dots;
102
103
 
@@ -168,8 +169,15 @@ const Slider = React.forwardRef<HTMLDivElement, SliderProps>((originalProps, ref
168
169
 
169
170
  const clientKey = isVertical ? "clientY" : "clientX";
170
171
  const sliderPositionInfo = sliderRef.current.getBoundingClientRect();
171
- const sliderOffset = sliderPositionInfo[startDirection];
172
- const position = ((event[clientKey] - sliderOffset) / sliderPositionInfo[sizeKey]) * (isVertical ? -1 : 1);
172
+ let position = 0;
173
+ if (isVertical) {
174
+ const sliderOffset = sliderPositionInfo[startDirection];
175
+ position = ((event[clientKey] - sliderOffset) / sliderPositionInfo[sizeKey]) * -1;
176
+ } else if (isRtl) {
177
+ position = (sliderPositionInfo.right - event[clientKey]) / sliderPositionInfo.width;
178
+ } else {
179
+ position = (event[clientKey] - sliderPositionInfo.left) / sliderPositionInfo.width;
180
+ }
173
181
  setPosition(position, nodeIndex);
174
182
  };
175
183
 
@@ -0,0 +1,19 @@
1
+ import React, { useState } from "react";
2
+ import { Slider } from "@tendaui/react";
3
+
4
+ const CustomLabelExample = () => {
5
+ const [value, setValue] = useState<number>(50);
6
+ return (
7
+ <div style={{ width: "400px", padding: "20px 0" }}>
8
+ <Slider
9
+ value={value}
10
+ onChange={(val) => setValue(val as number)}
11
+ label={({ value, position }) => (
12
+ <span style={{ color: position === "start" ? "blue" : "green" }}>{value}%</span>
13
+ )}
14
+ />
15
+ </div>
16
+ );
17
+ };
18
+
19
+ export default CustomLabelExample;
@@ -0,0 +1,14 @@
1
+ import React, { useState } from "react";
2
+ import { Slider } from "@tendaui/react";
3
+
4
+ const BasicExample = () => {
5
+ const [value, setValue] = useState<number>(30);
6
+ return (
7
+ <div style={{ width: "400px", padding: "20px 0" }}>
8
+ <Slider value={value} onChange={(val) => setValue(val as number)} label={({ value }) => `${value}%`} />
9
+ <div style={{ marginTop: "16px", color: "#666" }}>当前值:{value}</div>
10
+ </div>
11
+ );
12
+ };
13
+
14
+ export default BasicExample;
@@ -0,0 +1,17 @@
1
+ import React from "react";
2
+ import { Slider } from "@tendaui/react";
3
+
4
+ const DisabledExample = () => (
5
+ <div style={{ display: "flex", flexDirection: "column", gap: "40px" }}>
6
+ <div style={{ width: "400px" }}>
7
+ <div style={{ marginBottom: "8px", color: "#666" }}>正常</div>
8
+ <Slider defaultValue={50} />
9
+ </div>
10
+ <div style={{ width: "400px" }}>
11
+ <div style={{ marginBottom: "8px", color: "#666" }}>禁用</div>
12
+ <Slider defaultValue={50} disabled />
13
+ </div>
14
+ </div>
15
+ );
16
+
17
+ export default DisabledExample;
@@ -0,0 +1,31 @@
1
+ import React, { useState } from "react";
2
+ import { Slider } from "@tendaui/react";
3
+
4
+ const MarksExample = () => {
5
+ const [value1, setValue1] = useState<number>(30);
6
+ const [value2, setValue2] = useState<number>(50);
7
+ return (
8
+ <div style={{ display: "flex", flexDirection: "column", gap: "60px", margin: "8px 0 16px 0" }}>
9
+ <div style={{ width: "400px" }}>
10
+ <div style={{ marginBottom: "8px", color: "#666" }}>数组形式刻度</div>
11
+ <Slider value={value1} onChange={(val) => setValue1(val as number)} marks={[0, 25, 50, 75, 100]} />
12
+ </div>
13
+ <div style={{ width: "400px" }}>
14
+ <div style={{ marginBottom: "8px", color: "#666" }}>对象形式刻度(自定义文案)</div>
15
+ <Slider
16
+ value={value2}
17
+ onChange={(val) => setValue2(val as number)}
18
+ marks={{
19
+ 0: "低",
20
+ 25: "中低",
21
+ 50: "中",
22
+ 75: "中高",
23
+ 100: "高"
24
+ }}
25
+ />
26
+ </div>
27
+ </div>
28
+ );
29
+ };
30
+
31
+ export default MarksExample;
@@ -0,0 +1,16 @@
1
+ import React, { useState } from "react";
2
+ import { Slider } from "@tendaui/react";
3
+
4
+ const RangeExample = () => {
5
+ const [value, setValue] = useState<number[]>([20, 70]);
6
+ return (
7
+ <div style={{ width: "400px", padding: "20px 0" }}>
8
+ <Slider value={value} onChange={(val) => setValue(val as number[])} range />
9
+ <div style={{ marginTop: "16px", color: "#666" }}>
10
+ 当前范围:{value[0]} - {value[1]}
11
+ </div>
12
+ </div>
13
+ );
14
+ };
15
+
16
+ export default RangeExample;
@@ -0,0 +1,14 @@
1
+ import React, { useState } from "react";
2
+ import { Slider } from "@tendaui/react";
3
+
4
+ const StepExample = () => {
5
+ const [value, setValue] = useState<number>(30);
6
+ return (
7
+ <div style={{ width: "400px", padding: "20px 0" }}>
8
+ <Slider value={value} onChange={(val) => setValue(val as number)} step={10} label />
9
+ <div style={{ marginTop: "16px", color: "#666" }}>步长为 10,当前值:{value}</div>
10
+ </div>
11
+ );
12
+ };
13
+
14
+ export default StepExample;
@@ -0,0 +1,26 @@
1
+ import React, { useState } from "react";
2
+ import { Slider, SliderValue } from "@tendaui/react";
3
+
4
+ const VerticalExample = () => {
5
+ const [value, setValue] = useState<SliderValue>(40);
6
+ const [rangeValue, setRangeValue] = useState<SliderValue>([20, 70]);
7
+
8
+ return (
9
+ <div style={{ display: "flex", gap: "80px", padding: "20px" }}>
10
+ <div style={{ height: "250px" }}>
11
+ <div style={{ marginBottom: "8px", color: "#666" }}>单滑块</div>
12
+ <Slider value={value} onChange={setValue} layout="vertical" />
13
+ </div>
14
+ <div style={{ height: "250px" }}>
15
+ <div style={{ marginBottom: "8px", color: "#666" }}>范围滑块</div>
16
+ <Slider value={rangeValue} onChange={setRangeValue} layout="vertical" range />
17
+ </div>
18
+ <div style={{ height: "250px" }}>
19
+ <div style={{ marginBottom: "8px", color: "#666" }}>带输入框</div>
20
+ <Slider value={value} onChange={setValue} layout="vertical" inputNumberProps={{ theme: "row" }} />
21
+ </div>
22
+ </div>
23
+ );
24
+ };
25
+
26
+ export default VerticalExample;
@@ -0,0 +1,21 @@
1
+ import React, { useState } from "react";
2
+ import { Slider } from "@tendaui/react";
3
+
4
+ const WithInputExample = () => {
5
+ const [value1, setValue1] = useState<number>(50);
6
+ const [value2, setValue2] = useState<number[]>([20, 80]);
7
+ return (
8
+ <div style={{ display: "flex", flexDirection: "column", gap: "40px" }}>
9
+ <div style={{ width: "500px" }}>
10
+ <div style={{ marginBottom: "8px", color: "#666" }}>单滑块 + 数字输入框</div>
11
+ <Slider value={value1} onChange={(val) => setValue1(val as number)} inputNumberProps={true} />
12
+ </div>
13
+ <div style={{ width: "500px" }}>
14
+ <div style={{ marginBottom: "8px", color: "#666" }}>范围滑块 + 数字输入框</div>
15
+ <Slider value={value2} onChange={(val) => setValue2(val as number[])} range inputNumberProps={true} />
16
+ </div>
17
+ </div>
18
+ );
19
+ };
20
+
21
+ export default WithInputExample;
package/slider/type.ts CHANGED
@@ -2,7 +2,7 @@ import { InputNumberProps } from "../input-number";
2
2
  import { TNode } from "../common";
3
3
  import React from "react";
4
4
 
5
- export interface TooltipProps {
5
+ interface TooltipProps {
6
6
  content?: string | React.ReactNode;
7
7
  [key: string]: any;
8
8
  }
package/styles/_vars.scss CHANGED
@@ -356,3 +356,19 @@ $z-index-Tooltip: 5600;
356
356
  $z-index-Notification: 6000;
357
357
  $z-index-dragging: 6500;
358
358
  $z-index-guide: 999999;
359
+
360
+ // Tooltip 相关变量
361
+ $tooltip-padding: 8px 12px;
362
+ $tooltip-font-size: $font-size-s;
363
+ $tooltip-line-height: $text-line-height-s;
364
+ $tooltip-text-color: $text-color-anti;
365
+ $tooltip-bg-color: $gray-color-9;
366
+ $tooltip-border-radius: $border-radius-small;
367
+ $tooltip-shadow: $shadow-2;
368
+
369
+ // Tooltip 主题变量
370
+ $tooltip-bg-color-dark: $gray-color-9;
371
+ $tooltip-text-color-dark: $text-color-anti;
372
+ $tooltip-bg-color-light: $bg-color-container;
373
+ $tooltip-text-color-light: $text-color-primary;
374
+ $tooltip-shadow-light: $shadow-2;
@@ -69,16 +69,16 @@
69
69
  }
70
70
 
71
71
  .t-icon + .#{$prefix}-button__text:not(:empty) {
72
- margin-left: $btn-icon-text-margin-left;
72
+ margin-inline-start: $btn-icon-text-margin-left;
73
73
  }
74
74
 
75
75
  .#{$prefix}-loading + .#{$prefix}-button__text:not(:empty) {
76
- margin-left: $btn-icon-text-margin-left;
76
+ margin-inline-start: $btn-icon-text-margin-left;
77
77
  }
78
78
 
79
79
  .#{$prefix}-button__suffix:not(:empty) {
80
80
  display: inline-flex;
81
- margin-left: $btn-icon-text-margin-left;
81
+ margin-inline-start: $btn-icon-text-margin-left;
82
82
  }
83
83
 
84
84
  // 主要按钮