@tendaui/components 1.2.3 → 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 -39
  258. package/styles/_vars.scss +374 -358
  259. package/styles/components/alert/_index.scss +175 -175
  260. package/styles/components/alert/_vars.scss +41 -39
  261. package/styles/components/badge/_index.scss +71 -70
  262. package/styles/components/badge/_vars.scss +26 -25
  263. package/styles/components/button/_index.scss +499 -499
  264. package/styles/components/button/_mixins.scss +40 -39
  265. package/styles/components/button/_vars.scss +121 -120
  266. package/styles/components/checkbox/_index.scss +158 -158
  267. package/styles/components/checkbox/_var.scss +59 -60
  268. package/styles/components/color-picker/_index.scss +586 -586
  269. package/styles/components/color-picker/_vars.scss +79 -84
  270. package/styles/components/dialog/_animate.scss +133 -135
  271. package/styles/components/dialog/_index.scss +310 -311
  272. package/styles/components/dialog/_vars.scss +60 -59
  273. package/styles/components/drawer/_index.scss +206 -205
  274. package/styles/components/drawer/_var.scss +55 -53
  275. package/styles/components/fireworks/_index.scss +86 -86
  276. package/styles/components/fireworks/_vars.scss +5 -4
  277. package/styles/components/form/_index.scss +175 -173
  278. package/styles/components/form/_mixins.scss +74 -76
  279. package/styles/components/form/_vars.scss +101 -100
  280. package/styles/components/input/_index.scss +350 -349
  281. package/styles/components/input/_mixins.scss +120 -116
  282. package/styles/components/input/_vars.scss +130 -134
  283. package/styles/components/input-number/_index.scss +342 -343
  284. package/styles/components/input-number/_vars.scss +56 -65
  285. package/styles/components/ip-input/_index.scss +277 -280
  286. package/styles/components/layout/_index.scss +47 -47
  287. package/styles/components/layout/_vars.scss +19 -18
  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 -41
  291. package/styles/components/loading/_index.scss +113 -112
  292. package/styles/components/loading/_vars.scss +40 -39
  293. package/styles/components/notification/_index.scss +144 -143
  294. package/styles/components/notification/_mixins.scss +13 -12
  295. package/styles/components/notification/_vars.scss +60 -59
  296. package/styles/components/popup/_index.scss +78 -82
  297. package/styles/components/popup/_mixin.scss +149 -149
  298. package/styles/components/popup/{_var.scss → _vars.scss} +33 -31
  299. package/styles/components/radio/_index.scss +376 -376
  300. package/styles/components/radio/{_var.scss → _vars.scss} +89 -92
  301. package/styles/components/select/_index.scss +291 -290
  302. package/styles/components/select/_var.scss +64 -65
  303. package/styles/components/select-input/_index.scss +5 -5
  304. package/styles/components/select-input/_var.scss +4 -3
  305. package/styles/components/slider/_index.scss +241 -241
  306. package/styles/components/slider/_vars.scss +51 -50
  307. package/styles/components/switch/_index.scss +248 -164
  308. package/styles/components/switch/_vars.scss +63 -61
  309. package/styles/components/table/_index.scss +194 -193
  310. package/styles/components/table/_var.scss +52 -52
  311. package/styles/components/tabs/_index.scss +165 -165
  312. package/styles/components/tabs/_mixins.scss +11 -11
  313. package/styles/components/tabs/_vars.scss +72 -71
  314. package/styles/components/tag/_index.scss +317 -316
  315. package/styles/components/tag/_var.scss +86 -85
  316. package/styles/components/tag-input/_index.scss +164 -163
  317. package/styles/components/tag-input/_vars.scss +17 -16
  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 -7
  321. package/styles/mixins/_layout.scss +32 -32
  322. package/styles/mixins/_reset.scss +11 -10
  323. package/styles/mixins/_scrollbar.scss +32 -31
  324. package/styles/mixins/_text.scss +50 -48
  325. package/styles/themes/_dark.scss +169 -191
  326. package/styles/themes/_font.scss +69 -69
  327. package/styles/themes/_index.scss +5 -5
  328. package/styles/themes/_light.scss +170 -190
  329. package/styles/themes/_radius.scss +9 -9
  330. package/styles/themes/_size.scss +68 -68
  331. package/styles/utilities/_animation.scss +58 -57
  332. package/styles/utilities/_tips.scss +10 -9
  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,18 @@
1
+ import React from "react";
2
+ import { Tag } from "@tendaui/react";
3
+
4
+ const SizeExample = () => (
5
+ <div style={{ display: "flex", gap: "8px", alignItems: "center" }}>
6
+ <Tag size="small" theme="primary">
7
+ 小标签
8
+ </Tag>
9
+ <Tag size="medium" theme="primary">
10
+ 中标签
11
+ </Tag>
12
+ <Tag size="large" theme="primary">
13
+ 大标签
14
+ </Tag>
15
+ </div>
16
+ );
17
+
18
+ export default SizeExample;
@@ -0,0 +1,37 @@
1
+ import React from "react";
2
+ import { Tag } from "@tendaui/react";
3
+
4
+ const VariantExample = () => (
5
+ <div style={{ display: "flex", flexDirection: "column", gap: "12px" }}>
6
+ <div style={{ display: "flex", gap: "8px" }}>
7
+ <Tag theme="primary" variant="light">
8
+ 浅色标签
9
+ </Tag>
10
+ <Tag theme="warning" variant="light">
11
+ 浅色标签
12
+ </Tag>
13
+ <Tag theme="danger" variant="light">
14
+ 浅色标签
15
+ </Tag>
16
+ <Tag theme="success" variant="light">
17
+ 浅色标签
18
+ </Tag>
19
+ </div>
20
+ <div style={{ display: "flex", gap: "8px" }}>
21
+ <Tag theme="primary" variant="dark">
22
+ 深色标签
23
+ </Tag>
24
+ <Tag theme="warning" variant="dark">
25
+ 深色标签
26
+ </Tag>
27
+ <Tag theme="danger" variant="dark">
28
+ 深色标签
29
+ </Tag>
30
+ <Tag theme="success" variant="dark">
31
+ 深色标签
32
+ </Tag>
33
+ </div>
34
+ </div>
35
+ );
36
+
37
+ export default VariantExample;
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+ import { TagInput } from "@tendaui/react";
3
+
4
+ const CollapsedExample = () => (
5
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
6
+ <div>
7
+ <div style={{ marginBottom: "8px", color: "#666" }}>超过 2 个折叠</div>
8
+ <TagInput
9
+ defaultValue={["标签一", "标签二", "标签三", "标签四", "标签五"]}
10
+ minCollapsedNum={2}
11
+ placeholder="请输入"
12
+ style={{ width: "400px" }}
13
+ />
14
+ </div>
15
+ <div>
16
+ <div style={{ marginBottom: "8px", color: "#666" }}>超过 3 个折叠</div>
17
+ <TagInput
18
+ defaultValue={["标签一", "标签二", "标签三", "标签四", "标签五"]}
19
+ minCollapsedNum={3}
20
+ placeholder="请输入"
21
+ style={{ width: "400px" }}
22
+ />
23
+ </div>
24
+ </div>
25
+ );
26
+
27
+ export default CollapsedExample;
@@ -0,0 +1,26 @@
1
+ import React, { useState } from "react";
2
+ import { TagInput, TagInputValue } from "@tendaui/react";
3
+
4
+ const Example = () => {
5
+ const [controlledTags, setControlledTags] = useState<TagInputValue>(["Vue", "React"]);
6
+ return (
7
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
8
+ <div>
9
+ <div style={{ marginBottom: "8px", color: "#666" }}>受控模式</div>
10
+ <TagInput
11
+ value={controlledTags}
12
+ onChange={(val) => setControlledTags(val)}
13
+ placeholder="请输入"
14
+ clearable
15
+ style={{ width: "400px" }}
16
+ />
17
+ </div>
18
+ <div>
19
+ <div style={{ marginBottom: "8px", color: "#666" }}>非受控模式</div>
20
+ <TagInput defaultValue={["Svelte", "Solid"]} placeholder="请输入" clearable style={{ width: "400px" }} />
21
+ </div>
22
+ </div>
23
+ );
24
+ };
25
+
26
+ export default Example;
@@ -0,0 +1,15 @@
1
+ import React, { useState } from "react";
2
+ import { TagInput, TagInputValue } from "@tendaui/react";
3
+
4
+ const DefaultExample = () => {
5
+ const [tags, setTags] = useState<TagInputValue>(["Vue", "React", "Angular"]);
6
+
7
+ return (
8
+ <div style={{ width: "400px" }}>
9
+ <TagInput value={tags} onChange={(val) => setTags(val)} clearable placeholder="请输入标签,按回车添加" />
10
+ <div style={{ marginTop: "8px", color: "#666", fontSize: "12px" }}>当前标签:{tags.join(", ")}</div>
11
+ </div>
12
+ );
13
+ };
14
+
15
+ export default DefaultExample;
@@ -0,0 +1,21 @@
1
+ import React from "react";
2
+ import { TagInput } from "@tendaui/react";
3
+
4
+ const DisabledReadonlyExample = () => (
5
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
6
+ <div>
7
+ <div style={{ marginBottom: "8px", color: "#666" }}>正常</div>
8
+ <TagInput defaultValue={["Vue", "React"]} placeholder="正常" style={{ width: "400px" }} />
9
+ </div>
10
+ <div>
11
+ <div style={{ marginBottom: "8px", color: "#666" }}>禁用</div>
12
+ <TagInput defaultValue={["Vue", "React"]} disabled placeholder="禁用" style={{ width: "400px" }} />
13
+ </div>
14
+ <div>
15
+ <div style={{ marginBottom: "8px", color: "#666" }}>只读</div>
16
+ <TagInput defaultValue={["Vue", "React"]} readonly placeholder="只读" style={{ width: "400px" }} />
17
+ </div>
18
+ </div>
19
+ );
20
+
21
+ export default DisabledReadonlyExample;
@@ -0,0 +1,64 @@
1
+ import React, { useState } from "react";
2
+ import { TagInput, TagInputValue } from "@tendaui/react";
3
+
4
+ const EventsExample = () => {
5
+ const [tags, setTags] = useState<TagInputValue>(["Vue"]);
6
+ const [logs, setLogs] = useState<string[]>([]);
7
+
8
+ const addLog = (msg: string) => {
9
+ setLogs((prev) => [...prev.slice(-4), msg]);
10
+ };
11
+
12
+ return (
13
+ <div style={{ display: "flex", gap: "24px", flexDirection: "column" }}>
14
+ <div style={{ flex: 1 }}>
15
+ <TagInput
16
+ value={tags}
17
+ onChange={(val, context) => {
18
+ setTags(val);
19
+ addLog(`onChange: ${JSON.stringify(val)}, trigger: ${context.trigger}`);
20
+ }}
21
+ onEnter={(val, context) => {
22
+ addLog(`onEnter: inputValue=${context.inputValue}`);
23
+ }}
24
+ onRemove={(context) => {
25
+ addLog(`onRemove: removed=${context.item}, index=${context.index}`);
26
+ }}
27
+ onClear={() => {
28
+ addLog("onClear: 清空所有标签");
29
+ }}
30
+ onPaste={(context) => {
31
+ addLog(`onPaste: ${context.pasteValue}`);
32
+ }}
33
+ clearable
34
+ placeholder="请输入标签"
35
+ style={{ width: "350px" }}
36
+ />
37
+ </div>
38
+ <div
39
+ style={{
40
+ flex: 1,
41
+ padding: "12px",
42
+ background: "var(--td-bg-color-2)",
43
+ borderRadius: "4px",
44
+ fontSize: "12px",
45
+ maxHeight: "150px",
46
+ overflow: "auto"
47
+ }}
48
+ >
49
+ <div style={{ fontWeight: "bold", marginBottom: "8px" }}>事件日志:</div>
50
+ {logs.length === 0 ? (
51
+ <div style={{ color: "#999" }}>暂无日志</div>
52
+ ) : (
53
+ logs.map((log, index) => (
54
+ <div key={index} style={{ marginBottom: "4px", color: "#666" }}>
55
+ {log}
56
+ </div>
57
+ ))
58
+ )}
59
+ </div>
60
+ </div>
61
+ );
62
+ };
63
+
64
+ export default EventsExample;
@@ -0,0 +1,27 @@
1
+ import React from "react";
2
+ import { TagInput } from "@tendaui/react";
3
+
4
+ const ExcessDisplayExample = () => (
5
+ <div style={{ display: "flex", flexDirection: "column", gap: "24px", width: "500px" }}>
6
+ <div>
7
+ <div style={{ marginBottom: "8px", color: "#666" }}>换行显示(默认)</div>
8
+ <TagInput
9
+ defaultValue={["标签一", "标签二", "标签三", "标签四", "标签五", "标签六"]}
10
+ excessTagsDisplayType="break-line"
11
+ placeholder="请输入"
12
+ style={{ width: "300px" }}
13
+ />
14
+ </div>
15
+ <div>
16
+ <div style={{ marginBottom: "8px", color: "#666" }}>横向滚动</div>
17
+ <TagInput
18
+ defaultValue={["标签一", "标签二", "标签三", "标签四", "标签五", "标签六"]}
19
+ excessTagsDisplayType="scroll"
20
+ placeholder="请输入"
21
+ style={{ width: "300px" }}
22
+ />
23
+ </div>
24
+ </div>
25
+ );
26
+
27
+ export default ExcessDisplayExample;
@@ -0,0 +1,22 @@
1
+ import React, { useState } from "react";
2
+ import { TagInput, TagInputValue } from "@tendaui/react";
3
+
4
+ const MaxTagsExample = () => {
5
+ const [tags, setTags] = useState<TagInputValue>(["Vue", "React"]);
6
+
7
+ return (
8
+ <div style={{ display: "flex", flexDirection: "column", gap: "8px" }}>
9
+ <TagInput
10
+ value={tags}
11
+ onChange={(val) => setTags(val)}
12
+ max={5}
13
+ placeholder="最多输入 5 个标签"
14
+ clearable
15
+ style={{ width: "400px" }}
16
+ />
17
+ <div style={{ color: "#666", fontSize: "12px" }}>已输入 {tags.length}/5 个标签</div>
18
+ </div>
19
+ );
20
+ };
21
+
22
+ export default MaxTagsExample;
@@ -0,0 +1,21 @@
1
+ import React from "react";
2
+ import { TagInput } from "@tendaui/react";
3
+
4
+ const SizesExample = () => (
5
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
6
+ <div>
7
+ <div style={{ marginBottom: "8px", color: "#666" }}>小尺寸</div>
8
+ <TagInput size="small" defaultValue={["标签一", "标签二"]} placeholder="小尺寸" style={{ width: "400px" }} />
9
+ </div>
10
+ <div>
11
+ <div style={{ marginBottom: "8px", color: "#666" }}>中尺寸(默认)</div>
12
+ <TagInput size="medium" defaultValue={["标签一", "标签二"]} placeholder="中尺寸" style={{ width: "400px" }} />
13
+ </div>
14
+ <div>
15
+ <div style={{ marginBottom: "8px", color: "#666" }}>大尺寸</div>
16
+ <TagInput size="large" defaultValue={["标签一", "标签二"]} placeholder="大尺寸" style={{ width: "400px" }} />
17
+ </div>
18
+ </div>
19
+ );
20
+
21
+ export default SizesExample;
@@ -0,0 +1,37 @@
1
+ import React from "react";
2
+ import { TagInput } from "@tendaui/react";
3
+
4
+ const StatusExample = () => (
5
+ <div style={{ display: "flex", flexDirection: "column", gap: "24px", width: "500px", margin: "8px 0" }}>
6
+ <TagInput
7
+ status="default"
8
+ defaultValue={["默认"]}
9
+ tips="这是提示信息"
10
+ placeholder="默认状态"
11
+ style={{ width: "400px" }}
12
+ />
13
+ <TagInput
14
+ status="success"
15
+ defaultValue={["成功"]}
16
+ tips="校验通过"
17
+ placeholder="成功状态"
18
+ style={{ width: "400px" }}
19
+ />
20
+ <TagInput
21
+ status="warning"
22
+ defaultValue={["警告"]}
23
+ tips="请注意"
24
+ placeholder="警告状态"
25
+ style={{ width: "400px" }}
26
+ />
27
+ <TagInput
28
+ status="error"
29
+ defaultValue={["错误"]}
30
+ tips="输入有误"
31
+ placeholder="错误状态"
32
+ style={{ width: "400px" }}
33
+ />
34
+ </div>
35
+ );
36
+
37
+ export default StatusExample;
@@ -0,0 +1,23 @@
1
+ import React from "react";
2
+ import { TagInput } from "@tendaui/react";
3
+
4
+ const WithLabelExample = () => (
5
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
6
+ <TagInput
7
+ label="技术栈:"
8
+ defaultValue={["React", "TypeScript"]}
9
+ placeholder="请输入"
10
+ clearable
11
+ style={{ width: "450px" }}
12
+ />
13
+ <TagInput
14
+ label="城市:"
15
+ defaultValue={["北京", "上海"]}
16
+ placeholder="请输入"
17
+ clearable
18
+ style={{ width: "450px" }}
19
+ />
20
+ </div>
21
+ );
22
+
23
+ export default WithLabelExample;
@@ -103,7 +103,7 @@ export default function useTagList(props: TagInputProps) {
103
103
  value: tagValue,
104
104
  count: tagValue.length - minCollapsedNum,
105
105
  collapsedTags: tagValue.slice(minCollapsedNum, tagValue.length),
106
- collapsedSelectedItems: (options.slice(minCollapsedNum, tagValue.length) as TagInputValue),
106
+ collapsedSelectedItems: options.slice(minCollapsedNum, tagValue.length) as TagInputValue,
107
107
  onClose
108
108
  };
109
109
  const more = isFunction(collapsedItems) ? collapsedItems(params) : collapsedItems;
@@ -0,0 +1,76 @@
1
+ import React, { forwardRef, useState, useEffect, useRef, useImperativeHandle } from "react";
2
+ import classNames from "classnames";
3
+ import Popup, { PopupRef } from "../popup";
4
+ import useConfig from "../hooks/useConfig";
5
+ import type { TdTooltipProps } from "./type";
6
+ import { tooltipDefaultProps } from "./defaultProps";
7
+ import useDefaultProps from "../hooks/useDefaultProps";
8
+
9
+ export type TooltipProps = TdTooltipProps;
10
+
11
+ const Tooltip = forwardRef<Partial<PopupRef>, TdTooltipProps>((originalProps, ref) => {
12
+ const props = useDefaultProps<TdTooltipProps>(originalProps, tooltipDefaultProps);
13
+ const {
14
+ theme,
15
+ showArrow,
16
+ destroyOnClose,
17
+ overlayClassName,
18
+ children,
19
+ duration,
20
+ placement,
21
+ onVisibleChange,
22
+ ...restProps
23
+ } = props;
24
+
25
+ const { classPrefix } = useConfig();
26
+ const [timeUp, setTimeUp] = useState(false);
27
+ const popupRef = useRef<PopupRef>(null);
28
+ const timerRef = useRef<number | null>(null);
29
+ const toolTipClass = classNames(
30
+ `${classPrefix}-tooltip`,
31
+ {
32
+ [`${classPrefix}-tooltip--${theme}`]: theme
33
+ },
34
+ overlayClassName
35
+ );
36
+
37
+ function handleVisibleChange(visible: boolean, context: any) {
38
+ setTimeUp(false);
39
+ onVisibleChange?.(visible, context);
40
+ }
41
+
42
+ useEffect(() => {
43
+ if (duration !== 0 && !timeUp) {
44
+ popupRef.current?.setVisible?.(true);
45
+ timerRef.current = window.setTimeout(() => {
46
+ popupRef.current?.setVisible?.(false);
47
+ setTimeUp(true);
48
+ }, duration);
49
+ }
50
+ return () => {
51
+ window.clearTimeout(timerRef.current);
52
+ };
53
+ }, [duration, timeUp]);
54
+
55
+ useImperativeHandle(ref, () => ({
56
+ ...(popupRef.current || {})
57
+ }));
58
+
59
+ return (
60
+ <Popup
61
+ ref={popupRef}
62
+ destroyOnClose={destroyOnClose}
63
+ showArrow={showArrow}
64
+ overlayClassName={toolTipClass}
65
+ onVisibleChange={handleVisibleChange}
66
+ placement={placement}
67
+ {...restProps}
68
+ >
69
+ {children}
70
+ </Popup>
71
+ );
72
+ });
73
+
74
+ Tooltip.displayName = "Tooltip";
75
+
76
+ export default Tooltip;
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+ import { Tooltip, Button } from '@tendaui/react';
3
+
4
+ const BaseTooltipExample = () => {
5
+ return (
6
+ <div style={{ display: 'flex', gap: '16px', padding: '24px' }}>
7
+ <Tooltip content="这是一个默认提示">
8
+ <Button>默认提示</Button>
9
+ </Tooltip>
10
+
11
+ <Tooltip content="这是一个浅色主题提示" theme="light">
12
+ <Button variant="outline">浅色主题</Button>
13
+ </Tooltip>
14
+
15
+ <Tooltip content="点击查看提示" trigger="click">
16
+ <Button variant="dashed">点击触发</Button>
17
+ </Tooltip>
18
+
19
+ <Tooltip content="3秒后自动消失" duration={3000}>
20
+ <Button variant="text">自动消失</Button>
21
+ </Tooltip>
22
+ </div>
23
+ );
24
+ };
25
+
26
+ export default BaseTooltipExample;
@@ -0,0 +1,47 @@
1
+ import React from 'react';
2
+ import { Tooltip, Button, Tag } from '@tendaui/react';
3
+
4
+ const CustomContentTooltipExample = () => {
5
+ return (
6
+ <div style={{ display: 'flex', gap: '16px', padding: '24px' }}>
7
+ <Tooltip
8
+ content={
9
+ <div style={{ padding: '8px' }}>
10
+ <div style={{ fontWeight: 'bold', marginBottom: '4px' }}>用户信息</div>
11
+ <div>姓名: 张三</div>
12
+ <div>年龄: 28</div>
13
+ <div>职位: 前端工程师</div>
14
+ </div>
15
+ }
16
+ >
17
+ <Button>用户信息</Button>
18
+ </Tooltip>
19
+
20
+ <Tooltip
21
+ content={
22
+ <div style={{ display: 'flex', gap: '4px', flexWrap: 'wrap' }}>
23
+ <Tag color="primary">React</Tag>
24
+ <Tag color="success">TypeScript</Tag>
25
+ <Tag color="warning">SCSS</Tag>
26
+ <Tag color="error">Node.js</Tag>
27
+ </div>
28
+ }
29
+ >
30
+ <Button variant="outline">技术栈</Button>
31
+ </Tooltip>
32
+
33
+ <Tooltip
34
+ content={
35
+ <div style={{ textAlign: 'center' }}>
36
+ <div style={{ fontSize: '14px', marginBottom: '4px' }}>提示标题</div>
37
+ <div style={{ fontSize: '12px', color: '#999' }}>这是一段详细的提示信息,可以包含多行文本和各种样式。</div>
38
+ </div>
39
+ }
40
+ >
41
+ <Button variant="dashed">详细提示</Button>
42
+ </Tooltip>
43
+ </div>
44
+ );
45
+ };
46
+
47
+ export default CustomContentTooltipExample;
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+ import { Tooltip, Button } from '@tendaui/react';
3
+
4
+ const PlacementTooltipExample = () => {
5
+ const placements = [
6
+ 'top',
7
+ 'left',
8
+ 'right',
9
+ 'bottom',
10
+ 'top-left',
11
+ 'top-right',
12
+ 'bottom-left',
13
+ 'bottom-right',
14
+ 'left-top',
15
+ 'left-bottom',
16
+ 'right-top',
17
+ 'right-bottom',
18
+ ];
19
+
20
+ return (
21
+ <div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', gap: '16px', padding: '24px' }}>
22
+ {placements.map((placement) => (
23
+ <div key={placement} style={{ textAlign: 'center' }}>
24
+ <Tooltip content={`位置: ${placement}`} placement={placement}>
25
+ <Button style={{ width: '120px' }}>{placement}</Button>
26
+ </Tooltip>
27
+ </div>
28
+ ))}
29
+ </div>
30
+ );
31
+ };
32
+
33
+ export default PlacementTooltipExample;
@@ -0,0 +1,34 @@
1
+ import React from 'react';
2
+ import { Tooltip, Button } from '@tendaui/react';
3
+
4
+ const ThemeTooltipExample = () => {
5
+ return (
6
+ <div style={{ display: 'flex', gap: '16px', padding: '24px' }}>
7
+ <Tooltip content="这是一个默认深色主题" theme="dark">
8
+ <Button>默认深色</Button>
9
+ </Tooltip>
10
+
11
+ <Tooltip content="这是一个浅色主题" theme="light">
12
+ <Button variant="outline">浅色主题</Button>
13
+ </Tooltip>
14
+
15
+ <Tooltip content="这是一个主色主题" theme="primary">
16
+ <Button variant="dashed" color="primary">主色主题</Button>
17
+ </Tooltip>
18
+
19
+ <Tooltip content="这是一个成功主题" theme="success">
20
+ <Button variant="dashed" color="success">成功主题</Button>
21
+ </Tooltip>
22
+
23
+ <Tooltip content="这是一个错误主题" theme="error">
24
+ <Button variant="dashed" color="error">错误主题</Button>
25
+ </Tooltip>
26
+
27
+ <Tooltip content="这是一个警告主题" theme="warning">
28
+ <Button variant="dashed" color="warning">警告主题</Button>
29
+ </Tooltip>
30
+ </div>
31
+ );
32
+ };
33
+
34
+ export default ThemeTooltipExample;
@@ -0,0 +1,14 @@
1
+ import { TdTooltipProps } from './type';
2
+
3
+ export const tooltipDefaultProps: TdTooltipProps = {
4
+ theme: 'dark',
5
+ trigger: 'hover',
6
+ placement: 'top',
7
+ duration: 0,
8
+ showArrow: true,
9
+ destroyOnClose: true,
10
+ arrowPointAtCenter: true,
11
+ autoAdjustOverflow: true,
12
+ mouseEnterPopup: false,
13
+ disabled: false,
14
+ };
@@ -0,0 +1,7 @@
1
+ import _Tooltip from "./Tooltip";
2
+ import "./style/index";
3
+
4
+ export type { TooltipProps } from "./Tooltip";
5
+ export type * from "./type";
6
+ export const Tooltip = _Tooltip;
7
+ export default Tooltip;
@@ -0,0 +1 @@
1
+ import '../../styles/components/tooltip/_index.scss';