@tendaui/components 1.2.4 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (406) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +176 -176
  3. package/_util/scroll.ts +9 -0
  4. package/alert/_example/base.tsx +13 -0
  5. package/alert/_example/collapse.tsx +15 -0
  6. package/badge/_example/base.tsx +10 -0
  7. package/badge/_example/count.tsx +29 -0
  8. package/badge/_example/custom-color.tsx +32 -0
  9. package/badge/_example/dot.tsx +26 -0
  10. package/badge/_example/max-count.tsx +26 -0
  11. package/badge/_example/offset.tsx +29 -0
  12. package/badge/_example/shape.tsx +32 -0
  13. package/badge/_example/show-zero.tsx +23 -0
  14. package/badge/_example/size.tsx +35 -0
  15. package/badge/_example/standalone.tsx +14 -0
  16. package/badge/_example/text-count.tsx +26 -0
  17. package/badge/_example/with-button.tsx +23 -0
  18. package/button/_example/block.tsx +18 -0
  19. package/button/_example/disabled.tsx +22 -0
  20. package/button/_example/ghost.tsx +24 -0
  21. package/button/_example/link.tsx +15 -0
  22. package/button/_example/loading.tsx +19 -0
  23. package/button/_example/shape.tsx +18 -0
  24. package/button/_example/size.tsx +18 -0
  25. package/button/_example/suffix.tsx +16 -0
  26. package/button/_example/theme.tsx +14 -0
  27. package/button/_example/variant-base.tsx +24 -0
  28. package/button/_example/variant-dashed.tsx +24 -0
  29. package/button/_example/variant-outline.tsx +24 -0
  30. package/button/_example/variant-text.tsx +24 -0
  31. package/checkbox/_example/base.tsx +8 -0
  32. package/checkbox/_example/controlled.tsx +11 -0
  33. package/checkbox/_example/group-disabled.tsx +13 -0
  34. package/checkbox/_example/group-with-check-all.tsx +22 -0
  35. package/checkbox/_example/group-with-max.tsx +17 -0
  36. package/checkbox/_example/group-with-options.tsx +18 -0
  37. package/checkbox/_example/group.tsx +17 -0
  38. package/checkbox/_example/states.tsx +19 -0
  39. package/color-picker/ColorPicker.tsx +16 -2
  40. package/color-picker/_example/base.tsx +12 -0
  41. package/color-picker/_example/borderless.tsx +17 -0
  42. package/color-picker/_example/clearable.tsx +12 -0
  43. package/color-picker/_example/disabled.tsx +17 -0
  44. package/color-picker/_example/formats.tsx +30 -0
  45. package/color-picker/_example/manual-input.tsx +39 -0
  46. package/color-picker/_example/recent-colors.tsx +19 -0
  47. package/color-picker/_example/swatch-colors.tsx +28 -0
  48. package/color-picker/_example/with-alpha.tsx +21 -0
  49. package/color-picker/components/panel/format/inputs.tsx +1 -1
  50. package/color-picker/components/panel/index.tsx +13 -0
  51. package/color-picker/components/trigger.tsx +64 -13
  52. package/color-picker/defaultProps.ts +4 -1
  53. package/color-picker/utils/color-picker/cmyk.ts +89 -89
  54. package/color-picker/utils/color-picker/color.ts +467 -467
  55. package/color-picker/utils/color-picker/constants.ts +187 -187
  56. package/color-picker/utils/color-picker/draggable.ts +99 -100
  57. package/color-picker/utils/color-picker/format.ts +90 -95
  58. package/color-picker/utils/color-picker/gradient.ts +237 -243
  59. package/color-picker/utils/color-picker/index.ts +7 -7
  60. package/color-picker/utils/color-picker/types.ts +33 -33
  61. package/config-provider/ConfigContext.tsx +1 -0
  62. package/config-provider/ConfigProvider.tsx +18 -1
  63. package/config-provider/type.ts +5 -0
  64. package/dialog/_example/base.tsx +27 -0
  65. package/dialog/_example/confirm-loading.tsx +32 -0
  66. package/dialog/_example/custom-buttons.tsx +24 -0
  67. package/dialog/_example/full-screen.tsx +26 -0
  68. package/dialog/_example/hide-buttons.tsx +39 -0
  69. package/dialog/_example/modeless.tsx +25 -0
  70. package/dialog/_example/placement.tsx +40 -0
  71. package/dialog/_example/plugin-example.tsx +69 -0
  72. package/dialog/_example/themes.tsx +41 -0
  73. package/dialog/hooks/useDialogPosition.ts +35 -35
  74. package/drawer/Drawer.tsx +17 -9
  75. package/drawer/_example/custom-header-footer.tsx +29 -0
  76. package/drawer/_example/default.tsx +20 -0
  77. package/drawer/_example/events.tsx +53 -0
  78. package/drawer/_example/no-footer.tsx +20 -0
  79. package/drawer/_example/no-overlay.tsx +20 -0
  80. package/drawer/_example/placement.tsx +43 -0
  81. package/drawer/_example/size-draggable.tsx +26 -0
  82. package/drawer/_example/size.tsx +40 -0
  83. package/drawer/defaultProps.ts +1 -1
  84. package/fireworks/Fireworks.tsx +1 -10
  85. package/fireworks/index.ts +0 -1
  86. package/fireworks/type.ts +0 -1
  87. package/form/_example/complex.tsx +76 -0
  88. package/form/_example/default.tsx +58 -0
  89. package/form/_example/disabled.tsx +26 -0
  90. package/form/_example/form-list.tsx +74 -0
  91. package/form/_example/inline-layout.tsx +20 -0
  92. package/form/_example/label-align.tsx +46 -0
  93. package/form/_example/methods.tsx +66 -0
  94. package/form/_example/validation.tsx +71 -0
  95. package/form/hooks/useFormItemStyle.tsx +19 -7
  96. package/form/index.ts +20 -2
  97. package/form/type.ts +519 -519
  98. package/global-config/default-config.ts +95 -95
  99. package/global-config/locale/ar_KW.ts +259 -270
  100. package/global-config/locale/en_US.ts +265 -280
  101. package/global-config/locale/it_IT.ts +264 -287
  102. package/global-config/locale/ja_JP.ts +264 -279
  103. package/global-config/locale/ko_KR.ts +264 -279
  104. package/global-config/locale/ru_RU.ts +277 -288
  105. package/global-config/locale/zh_CN.ts +265 -279
  106. package/global-config/locale/zh_TW.ts +265 -279
  107. package/global-config/mobile/default-config.ts +6 -6
  108. package/global-config/mobile/locale/ar_KW.ts +112 -113
  109. package/global-config/mobile/locale/en_US.ts +113 -114
  110. package/global-config/mobile/locale/it_IT.ts +113 -114
  111. package/global-config/mobile/locale/ja_JP.ts +100 -101
  112. package/global-config/mobile/locale/ko_KR.ts +100 -101
  113. package/global-config/mobile/locale/ru_RU.ts +112 -113
  114. package/global-config/mobile/locale/zh_CN.ts +100 -101
  115. package/global-config/mobile/locale/zh_TW.ts +100 -101
  116. package/global-config/t.ts +111 -111
  117. package/hooks/useDebounce.ts +27 -0
  118. package/hooks/useLastest.ts +6 -2
  119. package/hooks/useResizeObserve.ts +0 -1
  120. package/index.ts +1 -1
  121. package/input/Input.tsx +53 -10
  122. package/input/_example/auto-width.tsx +14 -0
  123. package/input/_example/borderless.tsx +17 -0
  124. package/input/_example/clearable.tsx +14 -0
  125. package/input/_example/default.tsx +10 -0
  126. package/input/_example/disabled-readonly.tsx +12 -0
  127. package/input/_example/events.tsx +42 -0
  128. package/input/_example/group.tsx +14 -0
  129. package/input/_example/label-suffix.tsx +12 -0
  130. package/input/_example/max-length.tsx +11 -0
  131. package/input/_example/password.tsx +14 -0
  132. package/input/_example/sizes.tsx +12 -0
  133. package/input/_example/status.tsx +13 -0
  134. package/input/_example/text-align.tsx +12 -0
  135. package/input/_example/with-icon.tsx +13 -0
  136. package/input/type.ts +3 -0
  137. package/input/useLengthLimit.ts +122 -0
  138. package/input-number/InputNumber.tsx +124 -124
  139. package/input-number/_example/align.tsx +23 -0
  140. package/input-number/_example/auto-width.tsx +8 -0
  141. package/input-number/_example/default.tsx +8 -0
  142. package/input-number/_example/events.tsx +45 -0
  143. package/input-number/_example/format.tsx +27 -0
  144. package/input-number/_example/large-number.tsx +17 -0
  145. package/input-number/_example/min-max.tsx +14 -0
  146. package/input-number/_example/sizes.tsx +35 -0
  147. package/input-number/_example/status.tsx +65 -0
  148. package/input-number/_example/step-and-decimal.tsx +14 -0
  149. package/input-number/_example/themes.tsx +21 -0
  150. package/input-number/_example/with-suffix.tsx +12 -0
  151. package/input-number/defaultProps.ts +17 -17
  152. package/input-number/index.ts +9 -9
  153. package/input-number/style/css.js +1 -1
  154. package/input-number/style/index.js +1 -1
  155. package/input-number/useInputNumber.tsx +270 -270
  156. package/ip-input/_example/controlled.tsx +26 -0
  157. package/ip-input/_example/default.tsx +12 -0
  158. package/ip-input/_example/full-featured.tsx +32 -0
  159. package/ip-input/_example/ipv6.tsx +23 -0
  160. package/ip-input/_example/keyboard-navigation.tsx +19 -0
  161. package/ip-input/_example/paste-demo.tsx +23 -0
  162. package/ip-input/_example/states.tsx +21 -0
  163. package/ip-input/_example/with-cidr.tsx +23 -0
  164. package/layout/_example/combine-left.tsx +54 -0
  165. package/layout/_example/combine-right.tsx +54 -0
  166. package/layout/_example/custom-aside-width.tsx +56 -0
  167. package/layout/_example/custom-height.tsx +45 -0
  168. package/layout/_example/double-sidebar.tsx +57 -0
  169. package/layout/_example/side-navigation-right.tsx +51 -0
  170. package/layout/_example/side-navigation.tsx +51 -0
  171. package/layout/_example/top-navigation.tsx +41 -0
  172. package/list/ListItem.tsx +36 -36
  173. package/list/ListItemMeta.tsx +40 -40
  174. package/list/_example/async-loading.tsx +46 -0
  175. package/list/_example/default.tsx +23 -0
  176. package/list/_example/header-footer.tsx +40 -0
  177. package/list/_example/multiline.tsx +24 -0
  178. package/list/_example/scroll-loading.tsx +69 -0
  179. package/list/_example/sizes.tsx +45 -0
  180. package/list/_example/split.tsx +36 -0
  181. package/list/_example/stripe.tsx +24 -0
  182. package/list/_example/virtual-scroll.tsx +51 -0
  183. package/list/_example/with-image.tsx +26 -0
  184. package/list/defaultProps.ts +11 -11
  185. package/list/hooks/useListVirtualScroll.ts +82 -82
  186. package/list/style/css.js +1 -1
  187. package/list/style/index.js +1 -1
  188. package/loading/_example/default.tsx +6 -0
  189. package/loading/_example/delay.tsx +53 -0
  190. package/loading/_example/fullscreen.tsx +29 -0
  191. package/loading/_example/inherit-color.tsx +24 -0
  192. package/loading/_example/no-overlay.tsx +15 -0
  193. package/loading/_example/sizes.tsx +25 -0
  194. package/loading/_example/with-text.tsx +12 -0
  195. package/loading/_example/wrapper.tsx +30 -0
  196. package/locale/LocalReceiver.ts +55 -55
  197. package/locale/ar_KW.ts +7 -7
  198. package/locale/en_US.ts +7 -7
  199. package/locale/it_IT.ts +6 -6
  200. package/locale/ja_JP.ts +6 -6
  201. package/locale/ko_KR.ts +6 -6
  202. package/locale/ru_RU.ts +6 -6
  203. package/locale/zh_CN.ts +5 -5
  204. package/locale/zh_TW.ts +7 -7
  205. package/notification/_example/default.tsx +31 -0
  206. package/notification/_example/long-content.tsx +37 -0
  207. package/notification/_example/stacking.tsx +40 -0
  208. package/notification/_example/types.tsx +78 -0
  209. package/notification/_example/usage-example.tsx +62 -0
  210. package/package.json +4 -3
  211. package/popup/Popup.tsx +17 -5
  212. package/popup/_example/controlled.tsx +32 -0
  213. package/popup/_example/custom-content.tsx +64 -0
  214. package/popup/_example/default.tsx +19 -0
  215. package/popup/_example/delay.tsx +35 -0
  216. package/popup/_example/disabled.tsx +17 -0
  217. package/popup/_example/no-arrow.tsx +17 -0
  218. package/popup/_example/placements.tsx +61 -0
  219. package/popup/_example/triggers.tsx +26 -0
  220. package/radio/_example/allow-uncheck.tsx +19 -0
  221. package/radio/_example/button-style.tsx +40 -0
  222. package/radio/_example/controlled.tsx +13 -0
  223. package/radio/_example/default.tsx +13 -0
  224. package/radio/_example/group-disabled.tsx +22 -0
  225. package/radio/_example/group-with-options.tsx +20 -0
  226. package/radio/_example/group.tsx +19 -0
  227. package/radio/_example/sizes.tsx +37 -0
  228. package/radio/_example/states.tsx +20 -0
  229. package/select/_example/collapsed.tsx +30 -0
  230. package/select/_example/creatable.tsx +36 -0
  231. package/select/_example/custom-content.tsx +26 -0
  232. package/select/_example/default.tsx +29 -0
  233. package/select/_example/disabled.tsx +20 -0
  234. package/select/_example/filterable.tsx +27 -0
  235. package/select/_example/group-options.tsx +44 -0
  236. package/select/_example/label-suffix.tsx +24 -0
  237. package/select/_example/loading.tsx +19 -0
  238. package/select/_example/multiple.tsx +31 -0
  239. package/select/_example/sizes.tsx +20 -0
  240. package/select/_example/status.tsx +27 -0
  241. package/select/type.ts +382 -382
  242. package/select-input/type.ts +280 -280
  243. package/slider/Slider.tsx +13 -5
  244. package/slider/SliderHandleButton.tsx +50 -50
  245. package/slider/_example/custom-label.tsx +19 -0
  246. package/slider/_example/default.tsx +14 -0
  247. package/slider/_example/disabled.tsx +17 -0
  248. package/slider/_example/marks.tsx +31 -0
  249. package/slider/_example/range.tsx +16 -0
  250. package/slider/_example/step.tsx +14 -0
  251. package/slider/_example/vertical.tsx +26 -0
  252. package/slider/_example/with-input-number.tsx +21 -0
  253. package/slider/defaultProps.ts +15 -15
  254. package/slider/style/css.js +1 -1
  255. package/slider/style/index.js +1 -1
  256. package/slider/type.ts +1 -1
  257. package/styles/_global.scss +40 -40
  258. package/styles/_vars.scss +374 -358
  259. package/styles/components/alert/_index.scss +175 -175
  260. package/styles/components/alert/_vars.scss +41 -41
  261. package/styles/components/badge/_index.scss +71 -71
  262. package/styles/components/badge/_vars.scss +26 -26
  263. package/styles/components/button/_index.scss +499 -499
  264. package/styles/components/button/_mixins.scss +40 -40
  265. package/styles/components/button/_vars.scss +121 -121
  266. package/styles/components/checkbox/_index.scss +158 -158
  267. package/styles/components/checkbox/_var.scss +59 -59
  268. package/styles/components/color-picker/_index.scss +586 -586
  269. package/styles/components/color-picker/_vars.scss +79 -79
  270. package/styles/components/dialog/_animate.scss +133 -133
  271. package/styles/components/dialog/_index.scss +310 -312
  272. package/styles/components/dialog/_vars.scss +60 -60
  273. package/styles/components/drawer/_index.scss +206 -205
  274. package/styles/components/drawer/_var.scss +55 -55
  275. package/styles/components/fireworks/_index.scss +86 -86
  276. package/styles/components/fireworks/_vars.scss +5 -5
  277. package/styles/components/form/_index.scss +175 -174
  278. package/styles/components/form/_mixins.scss +74 -74
  279. package/styles/components/form/_vars.scss +101 -101
  280. package/styles/components/input/_index.scss +350 -350
  281. package/styles/components/input/_mixins.scss +120 -118
  282. package/styles/components/input/_vars.scss +130 -130
  283. package/styles/components/input-number/_index.scss +340 -339
  284. package/styles/components/input-number/_vars.scss +56 -56
  285. package/styles/components/ip-input/_index.scss +277 -277
  286. package/styles/components/layout/_index.scss +47 -47
  287. package/styles/components/layout/_vars.scss +19 -19
  288. package/styles/components/layout/doc.scss +74 -74
  289. package/styles/components/list/_index.scss +172 -172
  290. package/styles/components/list/_vars.scss +42 -42
  291. package/styles/components/loading/_index.scss +113 -113
  292. package/styles/components/loading/_vars.scss +40 -40
  293. package/styles/components/notification/_index.scss +144 -144
  294. package/styles/components/notification/_mixins.scss +13 -13
  295. package/styles/components/notification/_vars.scss +60 -60
  296. package/styles/components/popup/_index.scss +78 -78
  297. package/styles/components/popup/_mixin.scss +149 -149
  298. package/styles/components/popup/_vars.scss +33 -33
  299. package/styles/components/radio/_index.scss +376 -376
  300. package/styles/components/radio/_vars.scss +89 -89
  301. package/styles/components/select/_index.scss +291 -291
  302. package/styles/components/select/_var.scss +64 -64
  303. package/styles/components/select-input/_index.scss +5 -5
  304. package/styles/components/select-input/_var.scss +4 -4
  305. package/styles/components/slider/_index.scss +241 -241
  306. package/styles/components/slider/_vars.scss +51 -51
  307. package/styles/components/switch/_index.scss +248 -165
  308. package/styles/components/switch/_vars.scss +63 -63
  309. package/styles/components/table/_index.scss +194 -186
  310. package/styles/components/table/_var.scss +52 -52
  311. package/styles/components/tabs/_index.scss +165 -166
  312. package/styles/components/tabs/_mixins.scss +11 -11
  313. package/styles/components/tabs/_vars.scss +72 -72
  314. package/styles/components/tag/_index.scss +317 -317
  315. package/styles/components/tag/_var.scss +86 -86
  316. package/styles/components/tag-input/_index.scss +164 -164
  317. package/styles/components/tag-input/_vars.scss +17 -17
  318. package/styles/components/tooltip/_index.scss +104 -0
  319. package/styles/components/tooltip/_vars.scss +23 -0
  320. package/styles/mixins/_focus.scss +8 -8
  321. package/styles/mixins/_layout.scss +32 -32
  322. package/styles/mixins/_reset.scss +11 -11
  323. package/styles/mixins/_scrollbar.scss +32 -32
  324. package/styles/mixins/_text.scss +50 -50
  325. package/styles/themes/_dark.scss +169 -169
  326. package/styles/themes/_font.scss +69 -69
  327. package/styles/themes/_index.scss +5 -5
  328. package/styles/themes/_light.scss +170 -170
  329. package/styles/themes/_radius.scss +9 -9
  330. package/styles/themes/_size.scss +68 -68
  331. package/styles/utilities/_animation.scss +58 -58
  332. package/styles/utilities/_tips.scss +10 -10
  333. package/switch/_example/async-change.tsx +25 -0
  334. package/switch/_example/before-change.tsx +22 -0
  335. package/switch/_example/controlled.tsx +14 -0
  336. package/switch/_example/custom-value.tsx +21 -0
  337. package/switch/_example/default.tsx +6 -0
  338. package/switch/_example/disabled.tsx +25 -0
  339. package/switch/_example/loading.tsx +17 -0
  340. package/switch/_example/sizes.tsx +21 -0
  341. package/switch/_example/with-label.tsx +21 -0
  342. package/tab/TabPanel.tsx +9 -6
  343. package/tab/_example/addable.tsx +45 -0
  344. package/tab/_example/card-theme.tsx +22 -0
  345. package/tab/_example/default.tsx +22 -0
  346. package/tab/_example/disabled.tsx +38 -0
  347. package/tab/_example/lazy.tsx +25 -0
  348. package/tab/_example/placement.tsx +36 -0
  349. package/tab/_example/removable.tsx +31 -0
  350. package/tab/_example/sizes.tsx +31 -0
  351. package/tab/_example/with-action.tsx +26 -0
  352. package/table/Cell.tsx +3 -6
  353. package/table/Ellipsis.tsx +73 -0
  354. package/table/_example/alignment.tsx +46 -0
  355. package/table/_example/auto-width.tsx +47 -0
  356. package/table/_example/bordered-stripe-hover.tsx +42 -0
  357. package/table/_example/bordered.tsx +42 -0
  358. package/table/_example/cell-click.tsx +52 -0
  359. package/table/_example/complex.tsx +82 -0
  360. package/table/_example/custom-cell.tsx +68 -0
  361. package/table/_example/custom-empty.tsx +37 -0
  362. package/table/_example/custom-row-class-name.tsx +57 -0
  363. package/table/_example/default.tsx +42 -0
  364. package/table/_example/ellipsis.tsx +56 -0
  365. package/table/_example/empty.tsx +28 -0
  366. package/table/_example/fixed-width.tsx +48 -0
  367. package/table/_example/hover.tsx +42 -0
  368. package/table/_example/row-click.tsx +52 -0
  369. package/table/_example/sizes.tsx +57 -0
  370. package/table/_example/stripe.tsx +42 -0
  371. package/table/_example/vertical-align.tsx +110 -0
  372. package/table/hooks/useTableClassName.ts +3 -3
  373. package/table/index.ts +2 -0
  374. package/table/type.ts +1 -0
  375. package/tag/Tag.tsx +1 -1
  376. package/tag/_example/closable.tsx +44 -0
  377. package/tag/_example/default.tsx +17 -0
  378. package/tag/_example/disabled.tsx +19 -0
  379. package/tag/_example/sizes.tsx +18 -0
  380. package/tag/_example/variants.tsx +37 -0
  381. package/tag-input/_example/collapsed.tsx +27 -0
  382. package/tag-input/_example/controlled-uncontrolled.tsx +26 -0
  383. package/tag-input/_example/default.tsx +15 -0
  384. package/tag-input/_example/disabled-readonly.tsx +21 -0
  385. package/tag-input/_example/events.tsx +64 -0
  386. package/tag-input/_example/excess-display.tsx +27 -0
  387. package/tag-input/_example/max-tags.tsx +22 -0
  388. package/tag-input/_example/sizes.tsx +21 -0
  389. package/tag-input/_example/status.tsx +37 -0
  390. package/tag-input/_example/with-label.tsx +23 -0
  391. package/tag-input/hooks/useTagList.tsx +1 -1
  392. package/tooltip/Tooltip.tsx +76 -0
  393. package/tooltip/_example/base.tsx +26 -0
  394. package/tooltip/_example/custom-content.tsx +47 -0
  395. package/tooltip/_example/placement.tsx +33 -0
  396. package/tooltip/_example/theme.tsx +34 -0
  397. package/tooltip/defaultProps.ts +14 -0
  398. package/tooltip/index.ts +7 -0
  399. package/tooltip/style/index.js +1 -0
  400. package/tooltip/type.ts +99 -0
  401. package/utils/input-number/large-number.ts +423 -423
  402. package/utils/input-number/number.ts +257 -257
  403. package/utils/log/index.ts +3 -3
  404. package/utils/log/log.ts +29 -30
  405. package/utils/log/types.ts +9 -12
  406. package/utils/style.ts +58 -58
@@ -0,0 +1,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';
@@ -0,0 +1,99 @@
1
+ import { TNode, TElement } from "../common";
2
+ import { TdPopupProps, PopupPlacement } from "../popup/type";
3
+ export interface TdTooltipProps extends Omit<TdPopupProps, "content"> {
4
+ /**
5
+ * tooltip 内容
6
+ */
7
+ content: TNode;
8
+ /**
9
+ * 触发方式,可选项:hover/click/focus/context-menu
10
+ * @default 'hover'
11
+ */
12
+ trigger?: "hover" | "click" | "focus" | "context-menu";
13
+ /**
14
+ * 主题,可选项:dark/light/primary/success/error/warning
15
+ * @default 'dark'
16
+ */
17
+ theme?: "dark" | "light" | "primary" | "success" | "error" | "warning";
18
+ /**
19
+ * 显示/隐藏触发方式
20
+ * @default 'hover'
21
+ */
22
+ placement?:
23
+ | "top"
24
+ | "left"
25
+ | "right"
26
+ | "bottom"
27
+ | "top-left"
28
+ | "top-right"
29
+ | "bottom-left"
30
+ | "bottom-right"
31
+ | "left-top"
32
+ | "left-bottom"
33
+ | "right-top"
34
+ | "right-bottom";
35
+ /**
36
+ * 浮层出现后自动隐藏延时,单位:毫秒
37
+ * @default 0
38
+ */
39
+ duration?: number;
40
+ /**
41
+ * 是否显示箭头
42
+ * @default true
43
+ */
44
+ showArrow?: boolean;
45
+ /**
46
+ * 自定义提示框类名
47
+ */
48
+ overlayClassName?: string | string[];
49
+ /**
50
+ * 浮层隐藏时是否销毁浮层
51
+ * @default true
52
+ */
53
+ destroyOnClose?: boolean;
54
+ /**
55
+ * 自定义弹出层内容
56
+ */
57
+ popupContent?: TNode;
58
+
59
+ /**
60
+ * 箭头是否指向目标元素中心
61
+ * @default true
62
+ */
63
+ arrowPointAtCenter?: boolean;
64
+ /**
65
+ * 手动控制浮层显隐
66
+ */
67
+ visible?: boolean;
68
+ /**
69
+ * 当浮层无法完全显示时,是否自动调整位置
70
+ * @default true
71
+ */
72
+ autoAdjustOverflow?: boolean;
73
+ /**
74
+ * 浮层偏移量,示例:[10, 20] 或 (placement) => [10, 20]
75
+ */
76
+ offset?: Array<number> | ((placement: string) => Array<number>);
77
+ /**
78
+ * 透传 Popper.js 的配置项
79
+ */
80
+ popperOptions?: object;
81
+ /**
82
+ * 触发元素
83
+ */
84
+ triggerElement?: TElement;
85
+
86
+ /**
87
+ * 层级
88
+ */
89
+ zIndex?: number;
90
+ /**
91
+ * 鼠标是否可进入浮层
92
+ * @default false
93
+ */
94
+ mouseEnterPopup?: boolean;
95
+ /**
96
+ * 是否禁用
97
+ */
98
+ disabled?: boolean;
99
+ }