@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,122 @@
1
+ import { useEffect, useMemo } from 'react';
2
+ import { isNumber } from 'lodash-es';
3
+ import { TdInputProps } from './type';
4
+
5
+ // 计算字符长度,中文算两个字符
6
+ function getCharacterLength(str: string): number;
7
+ function getCharacterLength(str: string, maxCharacter?: number): { length: number; characters: string }
8
+ function getCharacterLength(str: string, maxCharacter?: number) {
9
+ const hasMaxCharacter = isNumber(maxCharacter);
10
+ if (!str || str.length === 0) {
11
+ if (hasMaxCharacter) {
12
+ return {
13
+ length: 0,
14
+ characters: str,
15
+ };
16
+ }
17
+ return 0;
18
+ }
19
+ let len = 0;
20
+ for (let i = 0; i < str.length; i++) {
21
+ let currentStringLength = 0;
22
+ if (str.charCodeAt(i) > 127) {
23
+ currentStringLength = 2;
24
+ } else {
25
+ currentStringLength = 1;
26
+ }
27
+ if (hasMaxCharacter && len + currentStringLength > maxCharacter) {
28
+ return {
29
+ length: len,
30
+ characters: str.slice(0, i),
31
+ };
32
+ }
33
+ len += currentStringLength;
34
+ }
35
+ if (hasMaxCharacter) {
36
+ return {
37
+ length: len,
38
+ characters: str,
39
+ };
40
+ }
41
+ return len;
42
+ }
43
+
44
+ // 计算 Unicode 长度
45
+ function getUnicodeLength(str: string): number {
46
+ return Array.from(str).length;
47
+ }
48
+
49
+ // 限制 Unicode 最大长度
50
+ function limitUnicodeMaxLength(str: string, maxLength: number): string {
51
+ return Array.from(str).slice(0, maxLength).join('');
52
+ }
53
+
54
+ export interface UseLengthLimitParams {
55
+ value: string | undefined;
56
+ maxlength: number;
57
+ maxcharacter: number;
58
+ allowInputOverMax: boolean;
59
+ status: TdInputProps['status'];
60
+ onValidate: TdInputProps['onValidate'];
61
+ }
62
+
63
+ export default function useLengthLimit(params: UseLengthLimitParams) {
64
+ // 文本超出数量限制时,是否允许继续输入
65
+ const getValueByLimitNumber = (inputValue: string) => {
66
+ const { allowInputOverMax, maxlength, maxcharacter } = params;
67
+ if (!(maxlength || maxcharacter) || allowInputOverMax || !inputValue) return inputValue;
68
+ if (maxlength) {
69
+ // input value could be unicode 😊
70
+ return limitUnicodeMaxLength(inputValue, maxlength);
71
+ }
72
+ if (maxcharacter) {
73
+ const r = getCharacterLength(inputValue, maxcharacter);
74
+ if (typeof r === 'object') {
75
+ return r.characters;
76
+ }
77
+ }
78
+ return inputValue;
79
+ };
80
+
81
+ const limitNumber = useMemo(() => {
82
+ const { maxlength, maxcharacter, value } = params;
83
+ if (typeof value === 'number') return String(value);
84
+ if (maxlength && maxcharacter) {
85
+ console.warn('Input', 'Pick one of maxlength and maxcharacter please.');
86
+ }
87
+ if (maxlength) {
88
+ const length = value?.length ? getUnicodeLength(value) : 0;
89
+ return `${length}/${maxlength}`;
90
+ }
91
+ if (maxcharacter) {
92
+ return `${getCharacterLength(value || '')}/${maxcharacter}`;
93
+ }
94
+ return '';
95
+ }, [params.maxcharacter, params.maxlength, params.value]);
96
+
97
+ const innerStatus = useMemo(() => {
98
+ if (limitNumber) {
99
+ const [current, total] = limitNumber.split('/');
100
+ return Number(current) > Number(total) ? 'error' : '';
101
+ }
102
+ return '';
103
+ }, [limitNumber]);
104
+
105
+ const tStatus = useMemo(() => params.status || innerStatus, [params.status, innerStatus]);
106
+
107
+ const onValidateChange = () => {
108
+ params.onValidate?.({
109
+ error: innerStatus ? 'exceed-maximum' : undefined,
110
+ });
111
+ };
112
+
113
+ useEffect(() => {
114
+ onValidateChange();
115
+ }, [innerStatus]);
116
+
117
+ return {
118
+ tStatus,
119
+ limitNumber,
120
+ getValueByLimitNumber,
121
+ };
122
+ }
@@ -1,124 +1,124 @@
1
- import React, { forwardRef, useImperativeHandle, useRef, ForwardedRef } from "react";
2
- import {
3
- IconChevronDown as TdChevronDownIcon,
4
- IconMinusStroked as TdRemoveIcon,
5
- IconChevronUp as TdChevronUpIcon,
6
- IconPlus as TdAddIcon
7
- } from "@tendaui/icons";
8
- import classNames from "classnames";
9
- import Input from "../input";
10
- import Button from "../button";
11
- import useInputNumber from "./useInputNumber";
12
- import useGlobalIcon from "../hooks/useGlobalIcon";
13
- import { inputNumberDefaultProps } from "./defaultProps";
14
- import { InputNumberValue, TdInputNumberProps } from "./type";
15
- import { StyledProps } from "../common";
16
- import useDefaultProps from "../hooks/useDefaultProps";
17
-
18
- export interface InputNumberProps<T = InputNumberValue> extends TdInputNumberProps<T>, StyledProps {}
19
-
20
- export interface InputNumberRef {
21
- currentElement: ForwardedRef<HTMLDivElement>;
22
- inputElement: ForwardedRef<HTMLDivElement>;
23
- }
24
-
25
- // https://fettblog.eu/typescript-react-generic-forward-refs/
26
- function TdInputNumber<T extends InputNumberValue = InputNumberValue>(
27
- originalProps: InputNumberProps<T>,
28
- ref: ForwardedRef<InputNumberRef>
29
- ) {
30
- const { ChevronDownIcon, RemoveIcon, ChevronUpIcon, AddIcon } = useGlobalIcon({
31
- ChevronDownIcon: TdChevronDownIcon,
32
- RemoveIcon: TdRemoveIcon,
33
- ChevronUpIcon: TdChevronUpIcon,
34
- AddIcon: TdAddIcon
35
- });
36
- const props = useDefaultProps<InputNumberProps<T>>(
37
- originalProps,
38
- inputNumberDefaultProps as Partial<InputNumberProps<T>>
39
- );
40
- const {
41
- classPrefix,
42
- wrapClasses,
43
- addClasses,
44
- reduceClasses,
45
- listeners,
46
- isError,
47
- inputRef,
48
- userInput,
49
- handleAdd,
50
- handleReduce,
51
- onInnerInputChange
52
- } = useInputNumber(props);
53
-
54
- const wrapRef = useRef(null);
55
-
56
- const status = isError ? "error" : props.status;
57
- const iconSize = props.size === "medium" ? "default" : props.size;
58
- const addIcon =
59
- props.theme === "column" ? <ChevronUpIcon size={iconSize as any} /> : <AddIcon size={iconSize as any} />;
60
- const reduceIcon =
61
- props.theme === "column" ? <ChevronDownIcon size={iconSize as any} /> : <RemoveIcon size={iconSize as any} />;
62
-
63
- useImperativeHandle(ref, () => ({
64
- currentElement: wrapRef.current,
65
- inputElement: inputRef.current
66
- }));
67
-
68
- return (
69
- <div className={classNames(wrapClasses, props.className)} style={props.style} ref={wrapRef}>
70
- {props.theme !== "normal" && (
71
- <Button
72
- className={reduceClasses}
73
- disabled={props.disabled}
74
- onClick={handleReduce}
75
- variant="outline"
76
- shape="square"
77
- icon={reduceIcon}
78
- />
79
- )}
80
- <Input
81
- ref={inputRef}
82
- autocomplete="off"
83
- disabled={props.disabled}
84
- readonly={props.readonly}
85
- placeholder={props.placeholder}
86
- autoWidth={props.autoWidth}
87
- align={props.align || (props.theme === "row" ? "center" : undefined)}
88
- status={status}
89
- label={props.label}
90
- suffix={props.suffix}
91
- value={userInput}
92
- onChange={onInnerInputChange}
93
- size={props.size}
94
- {...listeners}
95
- {...(props.inputProps || {})}
96
- />
97
- {props.theme !== "normal" && (
98
- <Button
99
- className={addClasses}
100
- disabled={props.disabled}
101
- onClick={handleAdd}
102
- variant="outline"
103
- shape="square"
104
- icon={addIcon}
105
- />
106
- )}
107
- {props.tips && (
108
- <div className={classNames(`${classPrefix}-input__tips`, `${classPrefix}-input__tips--${status}`)}>
109
- {props.tips}
110
- </div>
111
- )}
112
- </div>
113
- );
114
- }
115
-
116
- export type InputNumberOuterForwardRef = {
117
- <T>(props: InputNumberProps<T> & { ref?: ForwardedRef<InputNumberRef> }): ReturnType<typeof TdInputNumber>;
118
- } & React.ForwardRefExoticComponent<InputNumberProps>;
119
-
120
- const InputNumber = forwardRef<InputNumberRef, InputNumberProps<InputNumberValue>>(TdInputNumber);
121
-
122
- InputNumber.displayName = "InputNumber";
123
-
124
- export default InputNumber;
1
+ import React, { forwardRef, useImperativeHandle, useRef, ForwardedRef } from "react";
2
+ import {
3
+ IconChevronDown as TdChevronDownIcon,
4
+ IconMinusStroked as TdRemoveIcon,
5
+ IconChevronUp as TdChevronUpIcon,
6
+ IconPlus as TdAddIcon
7
+ } from "@tendaui/icons";
8
+ import classNames from "classnames";
9
+ import Input from "../input";
10
+ import Button from "../button";
11
+ import useInputNumber from "./useInputNumber";
12
+ import useGlobalIcon from "../hooks/useGlobalIcon";
13
+ import { inputNumberDefaultProps } from "./defaultProps";
14
+ import { InputNumberValue, TdInputNumberProps } from "./type";
15
+ import { StyledProps } from "../common";
16
+ import useDefaultProps from "../hooks/useDefaultProps";
17
+
18
+ export interface InputNumberProps<T = InputNumberValue> extends TdInputNumberProps<T>, StyledProps {}
19
+
20
+ export interface InputNumberRef {
21
+ currentElement: ForwardedRef<HTMLDivElement>;
22
+ inputElement: ForwardedRef<HTMLDivElement>;
23
+ }
24
+
25
+ // https://fettblog.eu/typescript-react-generic-forward-refs/
26
+ function TdInputNumber<T extends InputNumberValue = InputNumberValue>(
27
+ originalProps: InputNumberProps<T>,
28
+ ref: ForwardedRef<InputNumberRef>
29
+ ) {
30
+ const { ChevronDownIcon, RemoveIcon, ChevronUpIcon, AddIcon } = useGlobalIcon({
31
+ ChevronDownIcon: TdChevronDownIcon,
32
+ RemoveIcon: TdRemoveIcon,
33
+ ChevronUpIcon: TdChevronUpIcon,
34
+ AddIcon: TdAddIcon
35
+ });
36
+ const props = useDefaultProps<InputNumberProps<T>>(
37
+ originalProps,
38
+ inputNumberDefaultProps as Partial<InputNumberProps<T>>
39
+ );
40
+ const {
41
+ classPrefix,
42
+ wrapClasses,
43
+ addClasses,
44
+ reduceClasses,
45
+ listeners,
46
+ isError,
47
+ inputRef,
48
+ userInput,
49
+ handleAdd,
50
+ handleReduce,
51
+ onInnerInputChange
52
+ } = useInputNumber(props);
53
+
54
+ const wrapRef = useRef(null);
55
+
56
+ const status = isError ? "error" : props.status;
57
+ const iconSize = props.size === "medium" ? "default" : props.size;
58
+ const addIcon =
59
+ props.theme === "column" ? <ChevronUpIcon size={iconSize as any} /> : <AddIcon size={iconSize as any} />;
60
+ const reduceIcon =
61
+ props.theme === "column" ? <ChevronDownIcon size={iconSize as any} /> : <RemoveIcon size={iconSize as any} />;
62
+
63
+ useImperativeHandle(ref, () => ({
64
+ currentElement: wrapRef.current,
65
+ inputElement: inputRef.current
66
+ }));
67
+
68
+ return (
69
+ <div className={classNames(wrapClasses, props.className)} style={props.style} ref={wrapRef}>
70
+ {props.theme !== "normal" && (
71
+ <Button
72
+ className={reduceClasses}
73
+ disabled={props.disabled}
74
+ onClick={handleReduce}
75
+ variant="outline"
76
+ shape="square"
77
+ icon={reduceIcon}
78
+ />
79
+ )}
80
+ <Input
81
+ ref={inputRef}
82
+ autocomplete="off"
83
+ disabled={props.disabled}
84
+ readonly={props.readonly}
85
+ placeholder={props.placeholder}
86
+ autoWidth={props.autoWidth}
87
+ align={props.align || (props.theme === "row" ? "center" : undefined)}
88
+ status={status}
89
+ label={props.label}
90
+ suffix={props.suffix}
91
+ value={userInput}
92
+ onChange={onInnerInputChange}
93
+ size={props.size}
94
+ {...listeners}
95
+ {...(props.inputProps || {})}
96
+ />
97
+ {props.theme !== "normal" && (
98
+ <Button
99
+ className={addClasses}
100
+ disabled={props.disabled}
101
+ onClick={handleAdd}
102
+ variant="outline"
103
+ shape="square"
104
+ icon={addIcon}
105
+ />
106
+ )}
107
+ {props.tips && (
108
+ <div className={classNames(`${classPrefix}-input__tips`, `${classPrefix}-input__tips--${status}`)}>
109
+ {props.tips}
110
+ </div>
111
+ )}
112
+ </div>
113
+ );
114
+ }
115
+
116
+ export type InputNumberOuterForwardRef = {
117
+ <T>(props: InputNumberProps<T> & { ref?: ForwardedRef<InputNumberRef> }): ReturnType<typeof TdInputNumber>;
118
+ } & React.ForwardRefExoticComponent<InputNumberProps>;
119
+
120
+ const InputNumber = forwardRef<InputNumberRef, InputNumberProps<InputNumberValue>>(TdInputNumber);
121
+
122
+ InputNumber.displayName = "InputNumber";
123
+
124
+ export default InputNumber;
@@ -0,0 +1,23 @@
1
+ import React from "react";
2
+ import InputNumber from "../index";
3
+
4
+ const AlignInputNumber = () => (
5
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
6
+ <div style={{ display: "flex", gap: "16px" }}>
7
+ <div>
8
+ <div style={{ marginBottom: "4px", fontSize: "12px", color: "#999" }}>左对齐</div>
9
+ <InputNumber align="left" defaultValue={100} />
10
+ </div>
11
+ <div>
12
+ <div style={{ marginBottom: "4px", fontSize: "12px", color: "#999" }}>居中对齐</div>
13
+ <InputNumber align="center" defaultValue={200} />
14
+ </div>
15
+ <div>
16
+ <div style={{ marginBottom: "4px", fontSize: "12px", color: "#999" }}>右对齐</div>
17
+ <InputNumber align="right" defaultValue={300} />
18
+ </div>
19
+ </div>
20
+ </div>
21
+ );
22
+
23
+ export default AlignInputNumber;
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import InputNumber from "../index";
3
+
4
+ const AutoWidthInputNumber = () => (
5
+ <InputNumber autoWidth min={-5} defaultValue={1} />
6
+ );
7
+
8
+ export default AutoWidthInputNumber;
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import InputNumber from "../index";
3
+
4
+ const DefaultInputNumber = () => (
5
+ <InputNumber min={-5} max={15} defaultValue={1} placeholder="请输入数字" />
6
+ );
7
+
8
+ export default DefaultInputNumber;
@@ -0,0 +1,45 @@
1
+ import React, { useState, useMemo } from "react";
2
+ import InputNumber from "../index";
3
+
4
+ type InputNumberValue = string | number;
5
+ type ErrorType = "exceed-maximum" | "below-minimum";
6
+
7
+ const EventsInputNumber = () => {
8
+ const [value, setValue] = useState<InputNumberValue>(100);
9
+ const [error, setError] = useState<ErrorType>();
10
+
11
+ const tips = useMemo(() => {
12
+ if (error === "exceed-maximum") return "数值不能超过最大值";
13
+ if (error === "below-minimum") return "数值不能小于最小值";
14
+ return undefined;
15
+ }, [error]);
16
+
17
+ const handleChange = (v: InputNumberValue, ctx: any) => {
18
+ console.info("change", v, ctx);
19
+ setValue(v);
20
+ };
21
+ const onValidate = (ctx: { error: ErrorType }) => {
22
+ setError(ctx.error);
23
+ };
24
+
25
+ return (
26
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
27
+ <InputNumber
28
+ value={value}
29
+ max={15}
30
+ min={-2}
31
+ inputProps={{ tips }}
32
+ suffix="个"
33
+ style={{ width: 300 }}
34
+ onChange={handleChange}
35
+ onValidate={onValidate}
36
+ onBlur={(v, ctx) => console.info("blur", v, ctx)}
37
+ onFocus={(v, ctx) => console.info("focus", v, ctx)}
38
+ onEnter={(v, ctx) => console.info("enter", v, ctx)}
39
+ />
40
+ <div style={{ color: "#666", fontSize: "12px" }}>范围: -2 ~ 15, 查看控制台输出</div>
41
+ </div>
42
+ );
43
+ };
44
+
45
+ export default EventsInputNumber;
@@ -0,0 +1,27 @@
1
+ import React, { useState } from "react";
2
+ import InputNumber from "../index";
3
+
4
+ const FormatInputNumber = () => {
5
+ const [value, setValue] = useState(50);
6
+ const [value2, setValue2] = useState(1000);
7
+ return (
8
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
9
+ <div>
10
+ <div style={{ marginBottom: "8px", color: "#666" }}>百分比格式</div>
11
+ <InputNumber format={(val) => `${val} %`} value={value} onChange={setValue} style={{ width: 250 }} />
12
+ </div>
13
+ <div>
14
+ <div style={{ marginBottom: "8px", color: "#666" }}>货币格式(保留2位小数)</div>
15
+ <InputNumber
16
+ decimalPlaces={2}
17
+ format={(_, { fixedNumber }) => `¥ ${fixedNumber}`}
18
+ value={value2}
19
+ onChange={setValue2}
20
+ style={{ width: 250 }}
21
+ />
22
+ </div>
23
+ </div>
24
+ );
25
+ };
26
+
27
+ export default FormatInputNumber;
@@ -0,0 +1,17 @@
1
+ import React from "react";
2
+ import InputNumber from "../index";
3
+
4
+ const LargeNumberInputNumber = () => (
5
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
6
+ <div>
7
+ <div style={{ marginBottom: "8px", color: "#666" }}>大整数</div>
8
+ <InputNumber defaultValue="19999999999999999" largeNumber decimalPlaces={2} step={1} style={{ width: 350 }} />
9
+ </div>
10
+ <div>
11
+ <div style={{ marginBottom: "8px", color: "#666" }}>大小数</div>
12
+ <InputNumber defaultValue="0.8975527383412673418" largeNumber step={0.888} style={{ width: 350 }} />
13
+ </div>
14
+ </div>
15
+ );
16
+
17
+ export default LargeNumberInputNumber;
@@ -0,0 +1,14 @@
1
+ import React, { useState } from "react";
2
+ import InputNumber from "../index";
3
+
4
+ const MinMaxInputNumber = () => {
5
+ const [value, setValue] = useState(5);
6
+ return (
7
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
8
+ <InputNumber min={0} max={10} value={value} onChange={setValue} />
9
+ <div style={{ color: "#666", fontSize: "12px" }}>范围: 0 ~ 10, 当前值: {value}</div>
10
+ </div>
11
+ );
12
+ };
13
+
14
+ export default MinMaxInputNumber;
@@ -0,0 +1,35 @@
1
+ import React from "react";
2
+ import InputNumber from "../index";
3
+
4
+ const SizesInputNumber = () => (
5
+ <div style={{ display: "flex", flexDirection: "column", gap: "24px" }}>
6
+ <div style={{ display: "flex", gap: "16px", alignItems: "flex-start" }}>
7
+ <div>
8
+ <div style={{ marginBottom: "8px", color: "#666" }}>row 主题</div>
9
+ <div style={{ display: "flex", flexDirection: "column", gap: "8px" }}>
10
+ <InputNumber size="small" defaultValue={3} />
11
+ <InputNumber size="medium" defaultValue={6} />
12
+ <InputNumber size="large" defaultValue={9} />
13
+ </div>
14
+ </div>
15
+ <div>
16
+ <div style={{ marginBottom: "8px", color: "#666" }}>column 主题</div>
17
+ <div style={{ display: "flex", flexDirection: "column", gap: "8px" }}>
18
+ <InputNumber theme="column" size="small" defaultValue={3} />
19
+ <InputNumber theme="column" size="medium" defaultValue={6} />
20
+ <InputNumber theme="column" size="large" defaultValue={9} />
21
+ </div>
22
+ </div>
23
+ <div>
24
+ <div style={{ marginBottom: "8px", color: "#666" }}>normal 主题</div>
25
+ <div style={{ display: "flex", flexDirection: "column", gap: "8px" }}>
26
+ <InputNumber theme="normal" size="small" defaultValue={3} />
27
+ <InputNumber theme="normal" size="medium" defaultValue={6} />
28
+ <InputNumber theme="normal" size="large" defaultValue={9} />
29
+ </div>
30
+ </div>
31
+ </div>
32
+ </div>
33
+ );
34
+
35
+ export default SizesInputNumber;
@@ -0,0 +1,65 @@
1
+ import React, { useState } from "react";
2
+ import InputNumber from "../index";
3
+ import { Form } from "../../form";
4
+ import { Radio } from "../../radio";
5
+
6
+ const { FormItem } = Form;
7
+
8
+ type AlignType = "hide" | "align-left" | "align-input";
9
+
10
+ const StatusInputNumber = () => {
11
+ const [type, setType] = useState<AlignType>("align-input");
12
+ return (
13
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
14
+ <Radio.Group value={type} onChange={(val: AlignType) => setType(val)} variant="default-filled">
15
+ <Radio.Button value="hide">隐藏文本提示</Radio.Button>
16
+ <Radio.Button value="align-left">文本提示左对齐</Radio.Button>
17
+ <Radio.Button value="align-input">文本提示对齐输入框</Radio.Button>
18
+ </Radio.Group>
19
+
20
+ <Form>
21
+ {type === "hide" && (
22
+ <>
23
+ <FormItem label="禁用">
24
+ <InputNumber style={{ width: 300 }} disabled />
25
+ </FormItem>
26
+ <FormItem label="只读">
27
+ <InputNumber style={{ width: 300 }} readonly />
28
+ </FormItem>
29
+ <FormItem label="正常">
30
+ <InputNumber style={{ width: 300 }} />
31
+ </FormItem>
32
+ <FormItem label="成功">
33
+ <InputNumber style={{ width: 300 }} status="success" />
34
+ </FormItem>
35
+ <FormItem label="警告">
36
+ <InputNumber style={{ width: 300 }} status="warning" />
37
+ </FormItem>
38
+ <FormItem label="错误">
39
+ <InputNumber style={{ width: 300 }} status="error" />
40
+ </FormItem>
41
+ </>
42
+ )}
43
+
44
+ {(type === "align-left" || type === "align-input") && (
45
+ <>
46
+ <FormItem label="正常提示">
47
+ <InputNumber style={{ width: 300 }} tips="这是普通文本提示" />
48
+ </FormItem>
49
+ <FormItem label="成功提示">
50
+ <InputNumber style={{ width: 300 }} status="success" tips="校验通过文本提示" />
51
+ </FormItem>
52
+ <FormItem label="警告提示">
53
+ <InputNumber style={{ width: 300 }} status="warning" tips="校验不通过文本提示" />
54
+ </FormItem>
55
+ <FormItem label="错误提示">
56
+ <InputNumber style={{ width: 300 }} status="error" tips="校验存在严重问题文本提示" />
57
+ </FormItem>
58
+ </>
59
+ )}
60
+ </Form>
61
+ </div>
62
+ );
63
+ };
64
+
65
+ export default StatusInputNumber;
@@ -0,0 +1,14 @@
1
+ import React, { useState } from "react";
2
+ import InputNumber from "../index";
3
+
4
+ const StepAndDecimalInputNumber = () => {
5
+ const [value, setValue] = useState(3.2);
6
+ return (
7
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
8
+ <InputNumber step={1.2} decimalPlaces={2} value={value} onChange={setValue} />
9
+ <div style={{ color: "#666", fontSize: "12px" }}>步长: 1.2, 保留2位小数, 当前值: {value}</div>
10
+ </div>
11
+ );
12
+ };
13
+
14
+ export default StepAndDecimalInputNumber;
@@ -0,0 +1,21 @@
1
+ import React from "react";
2
+ import InputNumber from "../index";
3
+
4
+ const ThemesInputNumber = () => (
5
+ <div style={{ display: "flex", flexDirection: "column", gap: "24px" }}>
6
+ <div>
7
+ <div style={{ marginBottom: "8px", color: "#666" }}>row - 横向按钮(默认)</div>
8
+ <InputNumber theme="row" defaultValue={5} />
9
+ </div>
10
+ <div>
11
+ <div style={{ marginBottom: "8px", color: "#666" }}>column - 纵向按钮</div>
12
+ <InputNumber theme="column" defaultValue={5} />
13
+ </div>
14
+ <div>
15
+ <div style={{ marginBottom: "8px", color: "#666" }}>normal - 无按钮</div>
16
+ <InputNumber theme="normal" defaultValue={5} />
17
+ </div>
18
+ </div>
19
+ );
20
+
21
+ export default ThemesInputNumber;