@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
@@ -1,111 +1,111 @@
1
- import { isString } from 'lodash-es';
2
-
3
- /**
4
- * 复数规则判断函数
5
- * @param count 数量
6
- * @returns 返回复数形式的索引 (0: zero/none, 1: one, 2: other/many)
7
- */
8
- function getPluralIndex(count: number): number {
9
- if (count === 0) return 0; // no items
10
- if (count === 1) return 1; // one item
11
- return 2; // multiple items
12
- }
13
-
14
- /**
15
- * @see https://github.com/Tencent/tdesign-vue-next/blob/develop/packages/components/config-provider/hooks/useConfig.ts#L48
16
- * 自定义 t function 可能依赖特定库函数,例如 tdesign-vue-next 中使用了 vue 的 h 函数
17
- * 因此交由各个类库自行实现
18
- */
19
-
20
- /**
21
- * 国际化函数,支持复数处理和变量替换
22
- *
23
- * 示例用法:
24
- * 1. 基本变量替换:
25
- * t('Hello {name}', { name: 'World' }) // => 'Hello World'
26
- *
27
- * 2. 复数处理(传入数字):
28
- * t('no apples | one apple | {count} apples', 0) // => 'no apples'
29
- * t('no apples | one apple | {count} apples', 1) // => 'one apple'
30
- * t('no apples | one apple | {count} apples', 5) // => '5 apples'
31
- *
32
- * 3. 复合使用:
33
- * t('no items found | found {count} item | found {count} items', 3, { count: 3 }) // => 'found 3 items'
34
- */
35
-
36
- // 类型重载定义
37
- export function t(pattern: string): string;
38
- export function t(pattern: string, data: Record<string, any>): string;
39
- export function t(pattern: string, count: number): string;
40
- export function t(pattern: string, count: number, data: Record<string, any>): string;
41
- export function t<T>(pattern: T): string;
42
-
43
- /**
44
- * @param pattern 文本模式,可以是字符串、函数或其他类型
45
- * @param args 参数列表,支持 (count: number) 或 (count: number, data: object) 或 (data: object)
46
- * @returns 处理后的文本
47
- */
48
- export function t<T>(pattern: T, ...args: any[]): string {
49
- if (isString(pattern)) {
50
- let text = pattern as string;
51
- let count: number | undefined;
52
- let data: Record<string, any> = {};
53
-
54
- // 解析参数
55
- if (args.length > 0) {
56
- const [firstArg, secondArg] = args;
57
-
58
- if (typeof firstArg === 'number') {
59
- // 第一个参数是数字,表示 count
60
- count = firstArg;
61
- if (secondArg && typeof secondArg === 'object') {
62
- // 第二个参数是对象,表示额外的数据
63
- data = secondArg;
64
- } else {
65
- data.count = count; // 若没有提供第二个参数,则将 count 添加到数据中
66
- }
67
- } else if (typeof firstArg === 'object' && firstArg !== null) {
68
- // 第一个参数是对象,表示数据
69
- data = firstArg;
70
- }
71
- }
72
-
73
- // 处理复数形式:支持 "no items | one item | {count} items" 格式
74
- if (text.includes('|')) {
75
- const pluralParts = text.split('|').map((part) => part.trim());
76
-
77
- if (typeof count === 'number') {
78
- // 使用 count 进行复数处理
79
- const pluralIndex = getPluralIndex(count);
80
-
81
- // 根据复数索引选择对应的文本
82
- if (pluralIndex < pluralParts.length) {
83
- text = pluralParts[pluralIndex];
84
- } else {
85
- // 如果索引超出范围,使用最后一个选项
86
- text = pluralParts[pluralParts.length - 1];
87
- }
88
- } else {
89
- // 如果没有 count,默认使用第一个选项
90
- const [firstPart] = pluralParts;
91
- text = firstPart;
92
- }
93
- }
94
-
95
- // 处理变量替换:{key} 格式
96
- if (data && Object.keys(data).length > 0) {
97
- const regular = /\{\s*([\w-]+)\s*\}/g;
98
- text = text.replace(regular, (match, key) => {
99
- if (Object.prototype.hasOwnProperty.call(data, key)) {
100
- return String(data[key]);
101
- }
102
- return match; // 如果找不到对应的键,保留原始占位符
103
- });
104
- }
105
-
106
- return text as any;
107
- }
108
-
109
- // 如果不是字符串或函数,返回空字符串
110
- return '';
111
- }
1
+ import { isString } from "lodash-es";
2
+
3
+ /**
4
+ * 复数规则判断函数
5
+ * @param count 数量
6
+ * @returns 返回复数形式的索引 (0: zero/none, 1: one, 2: other/many)
7
+ */
8
+ function getPluralIndex(count: number): number {
9
+ if (count === 0) return 0; // no items
10
+ if (count === 1) return 1; // one item
11
+ return 2; // multiple items
12
+ }
13
+
14
+ /**
15
+ * @see https://github.com/Tencent/tdesign-vue-next/blob/develop/packages/components/config-provider/hooks/useConfig.ts#L48
16
+ * 自定义 t function 可能依赖特定库函数,例如 tdesign-vue-next 中使用了 vue 的 h 函数
17
+ * 因此交由各个类库自行实现
18
+ */
19
+
20
+ /**
21
+ * 国际化函数,支持复数处理和变量替换
22
+ *
23
+ * 示例用法:
24
+ * 1. 基本变量替换:
25
+ * t('Hello {name}', { name: 'World' }) // => 'Hello World'
26
+ *
27
+ * 2. 复数处理(传入数字):
28
+ * t('no apples | one apple | {count} apples', 0) // => 'no apples'
29
+ * t('no apples | one apple | {count} apples', 1) // => 'one apple'
30
+ * t('no apples | one apple | {count} apples', 5) // => '5 apples'
31
+ *
32
+ * 3. 复合使用:
33
+ * t('no items found | found {count} item | found {count} items', 3, { count: 3 }) // => 'found 3 items'
34
+ */
35
+
36
+ // 类型重载定义
37
+ export function t(pattern: string): string;
38
+ export function t(pattern: string, data: Record<string, any>): string;
39
+ export function t(pattern: string, count: number): string;
40
+ export function t(pattern: string, count: number, data: Record<string, any>): string;
41
+ export function t<T>(pattern: T): string;
42
+
43
+ /**
44
+ * @param pattern 文本模式,可以是字符串、函数或其他类型
45
+ * @param args 参数列表,支持 (count: number) 或 (count: number, data: object) 或 (data: object)
46
+ * @returns 处理后的文本
47
+ */
48
+ export function t<T>(pattern: T, ...args: any[]): string {
49
+ if (isString(pattern)) {
50
+ let text = pattern as string;
51
+ let count: number | undefined;
52
+ let data: Record<string, any> = {};
53
+
54
+ // 解析参数
55
+ if (args.length > 0) {
56
+ const [firstArg, secondArg] = args;
57
+
58
+ if (typeof firstArg === "number") {
59
+ // 第一个参数是数字,表示 count
60
+ count = firstArg;
61
+ if (secondArg && typeof secondArg === "object") {
62
+ // 第二个参数是对象,表示额外的数据
63
+ data = secondArg;
64
+ } else {
65
+ data.count = count; // 若没有提供第二个参数,则将 count 添加到数据中
66
+ }
67
+ } else if (typeof firstArg === "object" && firstArg !== null) {
68
+ // 第一个参数是对象,表示数据
69
+ data = firstArg;
70
+ }
71
+ }
72
+
73
+ // 处理复数形式:支持 "no items | one item | {count} items" 格式
74
+ if (text.includes("|")) {
75
+ const pluralParts = text.split("|").map((part) => part.trim());
76
+
77
+ if (typeof count === "number") {
78
+ // 使用 count 进行复数处理
79
+ const pluralIndex = getPluralIndex(count);
80
+
81
+ // 根据复数索引选择对应的文本
82
+ if (pluralIndex < pluralParts.length) {
83
+ text = pluralParts[pluralIndex];
84
+ } else {
85
+ // 如果索引超出范围,使用最后一个选项
86
+ text = pluralParts[pluralParts.length - 1];
87
+ }
88
+ } else {
89
+ // 如果没有 count,默认使用第一个选项
90
+ const [firstPart] = pluralParts;
91
+ text = firstPart;
92
+ }
93
+ }
94
+
95
+ // 处理变量替换:{key} 格式
96
+ if (data && Object.keys(data).length > 0) {
97
+ const regular = /\{\s*([\w-]+)\s*\}/g;
98
+ text = text.replace(regular, (match, key) => {
99
+ if (Object.prototype.hasOwnProperty.call(data, key)) {
100
+ return String(data[key]);
101
+ }
102
+ return match; // 如果找不到对应的键,保留原始占位符
103
+ });
104
+ }
105
+
106
+ return text as any;
107
+ }
108
+
109
+ // 如果不是字符串或函数,返回空字符串
110
+ return "";
111
+ }
@@ -0,0 +1,27 @@
1
+ import { useCallback, useRef } from 'react';
2
+
3
+ /**
4
+ * 防抖钩子
5
+ * @param fn 要执行的函数
6
+ * @param delay 延迟时间(毫秒)
7
+ * @returns 防抖后的函数
8
+ */
9
+ export default function useDebounce<T extends (...args: any[]) => any>(
10
+ fn: T,
11
+ delay: number
12
+ ): (...args: Parameters<T>) => void {
13
+ const timeoutRef = useRef<NodeJS.Timeout | null>(null);
14
+
15
+ return useCallback(
16
+ (...args: Parameters<T>) => {
17
+ if (timeoutRef.current) {
18
+ clearTimeout(timeoutRef.current);
19
+ }
20
+
21
+ timeoutRef.current = setTimeout(() => {
22
+ fn(...args);
23
+ }, delay);
24
+ },
25
+ [fn, delay]
26
+ );
27
+ }
@@ -1,8 +1,12 @@
1
- import { useRef } from "react";
1
+ import { useRef, useEffect } from "react";
2
2
 
3
3
  const useLatest = <T>(value: T) => {
4
4
  const ref = useRef(value);
5
- ref.current = value;
5
+
6
+ useEffect(() => {
7
+ ref.current = value;
8
+ }, [value]);
9
+
6
10
  return ref;
7
11
  };
8
12
 
@@ -31,6 +31,5 @@ export default function useResizeObserver(
31
31
  observer = null;
32
32
  }
33
33
  };
34
- // eslint-disable-next-line
35
34
  }, [container, enabled]);
36
35
  }
package/index.ts CHANGED
@@ -34,7 +34,7 @@ export * from "./switch";
34
34
  export * from "./form";
35
35
  export * from "./ip-input";
36
36
  export * from "./fireworks";
37
- // export * from './tooltip';
37
+ export * from "./tooltip";
38
38
  export * from "./drawer";
39
39
  // export * from './progress';
40
40
  // export * from './popconfirm';
package/input/Input.tsx CHANGED
@@ -11,6 +11,8 @@ import { StyledProps, TNode, TElement } from "../common";
11
11
  import { isFunction } from "lodash-es";
12
12
  import useConfig from "../hooks/useConfig";
13
13
  import { useLocaleReceiver } from "../locale/LocalReceiver";
14
+ import useLengthLimit from "./useLengthLimit";
15
+
14
16
  export interface InputProps extends TdInputProps, StyledProps {
15
17
  showInput?: boolean; // 控制透传readonly同时是否展示input 默认保留 因为正常Input需要撑开宽度
16
18
  keepWrapperWidth?: boolean; // 控制透传autoWidth之后是否容器宽度也自适应 多选等组件需要用到自适应但也需要保留宽度
@@ -81,6 +83,12 @@ const Input = forwardRef<HTMLInputElement, InputProps>((originalProps, ref) => {
81
83
  onCompositionstart,
82
84
  onCompositionend,
83
85
  onChange: onChangeFromProps,
86
+ maxlength,
87
+ maxcharacter,
88
+ allowInputOverMax = false,
89
+ status,
90
+ onValidate,
91
+ showLimitNumber = true,
84
92
  ...restProps
85
93
  } = props;
86
94
  const composingRef = useRef(false);
@@ -97,6 +105,16 @@ const Input = forwardRef<HTMLInputElement, InputProps>((originalProps, ref) => {
97
105
  const isInnerInputReadonly = readonly || !allowInput;
98
106
  const isValueEnabled = value && !disabled;
99
107
  const isShowClearIcon = ((clearable && isValueEnabled) || showClearIconOnEmpty) && isHover;
108
+
109
+ // 使用长度限制 hook
110
+ const { limitNumber, getValueByLimitNumber, tStatus } = useLengthLimit({
111
+ value: value === undefined ? undefined : String(value),
112
+ status,
113
+ maxlength,
114
+ maxcharacter,
115
+ allowInputOverMax,
116
+ onValidate
117
+ });
100
118
  let suffixIconNew = suffixIcon;
101
119
  if (isShowClearIcon)
102
120
  suffixIconNew = (
@@ -128,6 +146,8 @@ const Input = forwardRef<HTMLInputElement, InputProps>((originalProps, ref) => {
128
146
  const suffixIconContent = renderIcon("t", "suffix", parseTNode(suffixIconNew));
129
147
  const labelContent = isFunction(label) ? label() : label;
130
148
  const suffixContent = isFunction(suffix) ? suffix() : suffix;
149
+ const limitNumberNode =
150
+ limitNumber && showLimitNumber ? <div className={`${classPrefix}-input__limit-number`}>{limitNumber}</div> : null;
131
151
 
132
152
  const updateInputWidth = () => {
133
153
  if (!autoWidth || !inputRef.current) return;
@@ -167,6 +187,17 @@ const Input = forwardRef<HTMLInputElement, InputProps>((originalProps, ref) => {
167
187
  setRenderType(type);
168
188
  }, [type]);
169
189
 
190
+ // 初始判断长度,如超限自动截断并触发onchange
191
+ useEffect(() => {
192
+ if (value) {
193
+ const limitedValue = getValueByLimitNumber(value);
194
+ if (limitedValue.length !== value.length && !allowInputOverMax) {
195
+ onChange?.(limitedValue, { trigger: "initial" });
196
+ }
197
+ }
198
+ // eslint-disable-next-line react-hooks/exhaustive-deps
199
+ }, []);
200
+
170
201
  const innerValue = composingRef.current ? composingValue : value ?? "";
171
202
  const formatDisplayValue = format && !isFocused ? format(innerValue) : innerValue;
172
203
 
@@ -204,9 +235,10 @@ const Input = forwardRef<HTMLInputElement, InputProps>((originalProps, ref) => {
204
235
  [`${classPrefix}-size-s`]: size === "small",
205
236
  [`${classPrefix}-size-l`]: size === "large",
206
237
  [`${classPrefix}-align-${align}`]: align,
207
- [`${classPrefix}-inpu${classPrefix}--prefix`]: prefixIcon || labelContent,
208
- [`${classPrefix}-inpu${classPrefix}--suffix`]: suffixIconContent || suffixContent,
209
- [`${classPrefix}-inpu${classPrefix}--borderless`]: borderless,
238
+ [`${classPrefix}-is-${tStatus}`]: tStatus && tStatus !== "default",
239
+ [`${classPrefix}-input--prefix`]: prefixIcon || labelContent,
240
+ [`${classPrefix}-input--suffix`]: suffixIconContent || suffixContent || limitNumberNode,
241
+ [`${classPrefix}-input--borderless`]: borderless,
210
242
  [`${classPrefix}-input--focused`]: isFocused
211
243
  })}
212
244
  onMouseEnter={handleMouseEnter}
@@ -225,7 +257,12 @@ const Input = forwardRef<HTMLInputElement, InputProps>((originalProps, ref) => {
225
257
  {innerValue || placeholder}
226
258
  </span>
227
259
  )}
228
- {suffixContent ? <div className={`${classPrefix}-input__suffix`}>{suffixContent}</div> : null}
260
+ {suffixContent || limitNumberNode ? (
261
+ <div className={`${classPrefix}-input__suffix`}>
262
+ {suffixContent}
263
+ {limitNumberNode}
264
+ </div>
265
+ ) : null}
229
266
  {suffixIconContent}
230
267
  </div>
231
268
  );
@@ -256,17 +293,17 @@ const Input = forwardRef<HTMLInputElement, InputProps>((originalProps, ref) => {
256
293
  trigger: InputContextTrigger = "input"
257
294
  ) {
258
295
  let { value: newStr } = e.currentTarget;
296
+ // 应用长度限制
297
+ const limitedValue = getValueByLimitNumber(newStr);
259
298
  if (composingRef.current) {
260
- setComposingValue(newStr);
299
+ setComposingValue(limitedValue);
261
300
  } else {
262
301
  // 完成中文输入时同步一次 composingValue
263
- setComposingValue(newStr);
264
- onChange(newStr, { e, trigger });
302
+ setComposingValue(limitedValue);
303
+ onChange(limitedValue, { e, trigger });
265
304
  }
266
305
  }
267
306
 
268
- // 添加MouseDown阻止冒泡,防止點擊Clear value會導致彈窗閃爍一下
269
- // https://github.com/Tencent/tdesign-react/issues/2320
270
307
  function handleMouseDown(e: React.MouseEvent<HTMLSpanElement, globalThis.MouseEvent>) {
271
308
  e.stopPropagation();
272
309
  // 兼容React16
@@ -378,7 +415,13 @@ const Input = forwardRef<HTMLInputElement, InputProps>((originalProps, ref) => {
378
415
  {...restProps}
379
416
  >
380
417
  {renderInputNode}
381
- {tips && <div className={classNames(`${classPrefix}-input__tips`)}>{tips}</div>}
418
+ {tips && (
419
+ <div
420
+ className={classNames(`${classPrefix}-input__tips`, `${classPrefix}-input__tips--${tStatus || "default"}`)}
421
+ >
422
+ {tips}
423
+ </div>
424
+ )}
382
425
  </div>
383
426
  );
384
427
  });
@@ -0,0 +1,14 @@
1
+ import React, { useState } from "react";
2
+ import { Input } from "../index";
3
+
4
+ const AutoWidthInput = () => {
5
+ const [value, setValue] = useState("自适应宽度");
6
+ return (
7
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
8
+ <Input autoWidth value={value} onChange={(val) => setValue(val)} placeholder="宽度随内容变化" />
9
+ <div style={{ color: "#666", fontSize: "12px" }}>输入更多内容,输入框会自动变宽</div>
10
+ </div>
11
+ );
12
+ };
13
+
14
+ export default AutoWidthInput;
@@ -0,0 +1,17 @@
1
+ import React from "react";
2
+ import { Input } from "../index";
3
+
4
+ const BorderlessInput = () => (
5
+ <div style={{ display: "flex", gap: "24px", width: "500px" }}>
6
+ <div>
7
+ <div style={{ marginBottom: "8px", color: "#666" }}>有边框</div>
8
+ <Input placeholder="有边框" />
9
+ </div>
10
+ <div>
11
+ <div style={{ marginBottom: "8px", color: "#666" }}>无边框</div>
12
+ <Input borderless placeholder="无边框" />
13
+ </div>
14
+ </div>
15
+ );
16
+
17
+ export default BorderlessInput;
@@ -0,0 +1,14 @@
1
+ import React, { useState } from "react";
2
+ import { Input } from "../index";
3
+
4
+ const ClearableInput = () => {
5
+ const [value, setValue] = useState("可清空的内容");
6
+ return (
7
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
8
+ <Input clearable value={value} onChange={(val) => setValue(val)} placeholder="输入内容后显示清除按钮" />
9
+ <div style={{ color: "#666", fontSize: "12px" }}>当前值:{value || "(空)"}</div>
10
+ </div>
11
+ );
12
+ };
13
+
14
+ export default ClearableInput;
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ import { Input } from "../index";
3
+
4
+ const DefaultInput = () => (
5
+ <div style={{ width: "500px" }}>
6
+ <Input placeholder="请输入内容" />
7
+ </div>
8
+ );
9
+
10
+ export default DefaultInput;
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+ import { Input } from "../index";
3
+
4
+ const DisabledReadonlyInput = () => (
5
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
6
+ <Input placeholder="正常状态" />
7
+ <Input disabled placeholder="禁用状态" defaultValue="禁用内容" />
8
+ <Input readonly placeholder="只读状态" defaultValue="只读内容" />
9
+ </div>
10
+ );
11
+
12
+ export default DisabledReadonlyInput;
@@ -0,0 +1,42 @@
1
+ import React, { useState } from "react";
2
+ import { Input } from "../index";
3
+
4
+ const EventsInput = () => {
5
+ const [log, setLog] = useState<string[]>([]);
6
+
7
+ const addLog = (msg: string) => {
8
+ setLog((prev) => [...prev.slice(-4), msg]);
9
+ };
10
+
11
+ return (
12
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
13
+ <Input
14
+ placeholder="触发各种事件(查看下方日志)"
15
+ clearable
16
+ onChange={(val) => addLog(`onChange: ${val}`)}
17
+ onFocus={() => addLog("onFocus")}
18
+ onBlur={() => addLog("onBlur")}
19
+ onEnter={(val) => addLog(`onEnter: ${val}`)}
20
+ onClear={() => addLog("onClear")}
21
+ />
22
+ <div
23
+ style={{
24
+ padding: "12px",
25
+ background: "var(--tendaui-color-primary-1)",
26
+ borderRadius: "4px",
27
+ fontSize: "12px",
28
+ fontFamily: "monospace"
29
+ }}
30
+ >
31
+ <div style={{ marginBottom: "8px", fontWeight: "bold" }}>事件日志:</div>
32
+ {log.length === 0 ? (
33
+ <div style={{ color: "#999" }}>暂无事件触发</div>
34
+ ) : (
35
+ log.map((item, index) => <div key={index}>{item}</div>)
36
+ )}
37
+ </div>
38
+ </div>
39
+ );
40
+ };
41
+
42
+ export default EventsInput;
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+ import { Input, InputGroup } from "../index";
3
+ import { IconUser, IconLock } from "@tendaui/icons";
4
+
5
+ const InputGroupExample = () => (
6
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
7
+ <InputGroup separate>
8
+ <Input placeholder="用户名" prefixIcon={<IconUser />} />
9
+ <Input type="password" placeholder="密码" prefixIcon={<IconLock />} />
10
+ </InputGroup>
11
+ </div>
12
+ );
13
+
14
+ export default InputGroupExample;
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+ import { Input } from "../index";
3
+
4
+ const LabelSuffixInput = () => (
5
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
6
+ <Input label="http://" placeholder="请输入网址" />
7
+ <Input suffix=".com" placeholder="请输入域名" />
8
+ <Input label="http://" suffix=".com" placeholder="请输入域名" />
9
+ </div>
10
+ );
11
+
12
+ export default LabelSuffixInput;
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ import { Input } from "../index";
3
+
4
+ const MaxLengthInput = () => (
5
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
6
+ <Input maxlength={10} placeholder="最多输入10个字符" />
7
+ <Input maxcharacter={20} placeholder="最多输入20个字符(中文算2个)" />
8
+ </div>
9
+ );
10
+
11
+ export default MaxLengthInput;
@@ -0,0 +1,14 @@
1
+ import React, { useState } from "react";
2
+ import { Input } from "../index";
3
+ import { IconLock, IconEyeOpened, IconEyeClosed } from "@tendaui/icons";
4
+
5
+ const PasswordInput = () => {
6
+ const [visible, setVisible] = useState(false);
7
+ return (
8
+ <div style={{ width: 500 }}>
9
+ <Input type={visible ? "text" : "password"} prefixIcon={<IconLock />} placeholder="请输入密码" />
10
+ </div>
11
+ );
12
+ };
13
+
14
+ export default PasswordInput;
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+ import { Input } from "../index";
3
+
4
+ const SizesInput = () => (
5
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
6
+ <Input size="small" placeholder="小尺寸" />
7
+ <Input size="medium" placeholder="中尺寸(默认)" />
8
+ <Input size="large" placeholder="大尺寸" />
9
+ </div>
10
+ );
11
+
12
+ export default SizesInput;
@@ -0,0 +1,13 @@
1
+ import React from "react";
2
+ import { Input } from "../index";
3
+
4
+ const StatusInput = () => (
5
+ <div style={{ display: "flex", flexDirection: "column", gap: "24px", width: "500px", margin: "8px 0" }}>
6
+ <Input status="default" placeholder="默认状态" tips="这是一条提示信息" />
7
+ <Input status="success" placeholder="成功状态" tips="校验通过" />
8
+ <Input status="warning" placeholder="警告状态" tips="请注意输入内容" />
9
+ <Input status="error" placeholder="错误状态" tips="输入内容有误" />
10
+ </div>
11
+ );
12
+
13
+ export default StatusInput;
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+ import { Input } from "../index";
3
+
4
+ const TextAlignInput = () => (
5
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px", width: 500 }}>
6
+ <Input align="left" placeholder="左对齐" defaultValue="左对齐内容" />
7
+ <Input align="center" placeholder="居中对齐" defaultValue="居中对齐内容" />
8
+ <Input align="right" placeholder="右对齐" defaultValue="右对齐内容" />
9
+ </div>
10
+ );
11
+
12
+ export default TextAlignInput;
@@ -0,0 +1,13 @@
1
+ import React from "react";
2
+ import { Input } from "../index";
3
+ import { IconSearch, IconUser } from "@tendaui/icons";
4
+
5
+ const WithIconInput = () => (
6
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
7
+ <Input prefixIcon={<IconSearch />} placeholder="前置图标" />
8
+ <Input suffixIcon={<IconSearch />} placeholder="后置图标" />
9
+ <Input prefixIcon={<IconUser />} suffixIcon={<IconSearch />} placeholder="前后图标" />
10
+ </div>
11
+ );
12
+
13
+ export default WithIconInput;
package/input/type.ts CHANGED
@@ -64,6 +64,9 @@ export interface TdInputProps {
64
64
  * 用户最多可以输入的文本长度,一个中文等于一个计数长度。值为空,则表示不限制输入长度。`maxcharacter` 和 `maxlength` 二选一使用
65
65
  */
66
66
  maxlength?: number;
67
+
68
+ allowInputOverMax?: boolean;
69
+ showLimitNumber?: boolean;
67
70
  /**
68
71
  * 名称
69
72
  * @default ''