@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,40 +1,40 @@
1
- import React, { forwardRef } from "react";
2
- import classNames from "classnames";
3
- import useConfig from "../hooks/useConfig";
4
- import { TdListItemMetaProps } from "./type";
5
- import { StyledProps } from "../common";
6
-
7
- export interface ListItemMetaProps extends TdListItemMetaProps, StyledProps {}
8
- /**
9
- * 列表组件
10
- */
11
- const ListItemMeta = forwardRef<HTMLDivElement, ListItemMetaProps>((props, ref) => {
12
- const { title, image, description, className, style } = props;
13
- const { classPrefix } = useConfig();
14
-
15
- const renderAvatar = () => {
16
- if (image && typeof image === "string") {
17
- return (
18
- <div className={`${classPrefix}-list-item__meta-avatar`}>
19
- <img src={image} alt="" />
20
- </div>
21
- );
22
- }
23
- return <div className={`${classPrefix}-list-item__meta-avatar`}>{image}</div>;
24
- };
25
- return (
26
- <div ref={ref} className={classNames(`${classPrefix}-list-item__meta`, className)} style={style}>
27
- {image && renderAvatar()}
28
- <div className={`${classPrefix}-list-item__meta-content`}>
29
- <h3 className={`${classPrefix}-list-item__meta-title`}>{title}</h3>
30
- <div className={`${classPrefix}-list-item__meta-description`}>
31
- {typeof description === "string" ? <p>{description}</p> : description}
32
- </div>
33
- </div>
34
- </div>
35
- );
36
- });
37
-
38
- ListItemMeta.displayName = "ListItemMeta";
39
-
40
- export default ListItemMeta;
1
+ import React, { forwardRef } from "react";
2
+ import classNames from "classnames";
3
+ import useConfig from "../hooks/useConfig";
4
+ import { TdListItemMetaProps } from "./type";
5
+ import { StyledProps } from "../common";
6
+
7
+ export interface ListItemMetaProps extends TdListItemMetaProps, StyledProps {}
8
+ /**
9
+ * 列表组件
10
+ */
11
+ const ListItemMeta = forwardRef<HTMLDivElement, ListItemMetaProps>((props, ref) => {
12
+ const { title, image, description, className, style } = props;
13
+ const { classPrefix } = useConfig();
14
+
15
+ const renderAvatar = () => {
16
+ if (image && typeof image === "string") {
17
+ return (
18
+ <div className={`${classPrefix}-list-item__meta-avatar`}>
19
+ <img src={image} alt="" />
20
+ </div>
21
+ );
22
+ }
23
+ return <div className={`${classPrefix}-list-item__meta-avatar`}>{image}</div>;
24
+ };
25
+ return (
26
+ <div ref={ref} className={classNames(`${classPrefix}-list-item__meta`, className)} style={style}>
27
+ {image && renderAvatar()}
28
+ <div className={`${classPrefix}-list-item__meta-content`}>
29
+ <h3 className={`${classPrefix}-list-item__meta-title`}>{title}</h3>
30
+ <div className={`${classPrefix}-list-item__meta-description`}>
31
+ {typeof description === "string" ? <p>{description}</p> : description}
32
+ </div>
33
+ </div>
34
+ </div>
35
+ );
36
+ });
37
+
38
+ ListItemMeta.displayName = "ListItemMeta";
39
+
40
+ export default ListItemMeta;
@@ -0,0 +1,46 @@
1
+ import React, { useState } from "react";
2
+ import { List } from "../index";
3
+
4
+ const { ListItem } = List;
5
+
6
+ const AsyncLoadingList = () => {
7
+ const [asyncLoading, setAsyncLoading] = useState<React.ReactNode>("");
8
+
9
+ const listData = [
10
+ { id: 1, content: "列表内容列表内容列表内容" },
11
+ { id: 2, content: "列表内容列表内容列表内容" },
12
+ { id: 3, content: "列表内容列表内容列表内容" },
13
+ { id: 4, content: "列表内容列表内容列表内容" }
14
+ ];
15
+
16
+ const handleAsyncLoading = (val: string) => {
17
+ if (val === "loading-custom") {
18
+ setAsyncLoading(<div style={{ textAlign: "center", padding: "12px", color: "#999" }}>没有更多数据了</div>);
19
+ } else {
20
+ setAsyncLoading(val);
21
+ }
22
+ };
23
+
24
+ const onLoadMore = () => {
25
+ console.log("加载更多");
26
+ handleAsyncLoading("loading");
27
+ };
28
+
29
+ return (
30
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
31
+ <div style={{ display: "flex", gap: "8px", flexWrap: "wrap" }}>
32
+ <button onClick={() => handleAsyncLoading("load-more")}>显示加载更多</button>
33
+ <button onClick={() => handleAsyncLoading("loading")}>显示加载中</button>
34
+ <button onClick={() => handleAsyncLoading("loading-custom")}>自定义底部</button>
35
+ <button onClick={() => handleAsyncLoading("")}>隐藏加载状态</button>
36
+ </div>
37
+ <List asyncLoading={asyncLoading} onLoadMore={onLoadMore}>
38
+ {listData.map((item) => (
39
+ <ListItem key={item.id}>{item.content}</ListItem>
40
+ ))}
41
+ </List>
42
+ </div>
43
+ );
44
+ };
45
+
46
+ export default AsyncLoadingList;
@@ -0,0 +1,23 @@
1
+ import React from "react";
2
+ import { List } from "../index";
3
+
4
+ const { ListItem } = List;
5
+
6
+ const DefaultList = () => {
7
+ const listData = [
8
+ { id: 1, content: "列表内容的描述性文字" },
9
+ { id: 2, content: "列表内容的描述性文字" },
10
+ { id: 3, content: "列表内容的描述性文字" },
11
+ { id: 4, content: "列表内容的描述性文字" }
12
+ ];
13
+
14
+ return (
15
+ <List>
16
+ {listData.map((item) => (
17
+ <ListItem key={item.id}>{item.content}</ListItem>
18
+ ))}
19
+ </List>
20
+ );
21
+ };
22
+
23
+ export default DefaultList;
@@ -0,0 +1,40 @@
1
+ import React from "react";
2
+ import { List } from "../index";
3
+
4
+ const { ListItem } = List;
5
+
6
+ const HeaderFooterList = () => {
7
+ const listData = [
8
+ { id: 1, content: "列表内容列表内容列表内容" },
9
+ { id: 2, content: "列表内容列表内容列表内容" },
10
+ { id: 3, content: "列表内容列表内容列表内容" },
11
+ { id: 4, content: "列表内容列表内容列表内容" }
12
+ ];
13
+
14
+ return (
15
+ <div style={{ display: "flex", flexDirection: "column", gap: "24px" }}>
16
+ <div>
17
+ <h4 style={{ marginBottom: "16px", color: "#666" }}>字符串头部/底部</h4>
18
+ <List header="这里是 Header" footer="这里是 Footer">
19
+ {listData.map((item) => (
20
+ <ListItem key={item.id}>{item.content}</ListItem>
21
+ ))}
22
+ </List>
23
+ </div>
24
+
25
+ <div>
26
+ <h4 style={{ marginBottom: "16px", color: "#666" }}>自定义头部/底部</h4>
27
+ <List
28
+ header={<div style={{ fontWeight: "bold", color: "var(--td-brand-color)" }}>自定义 Header</div>}
29
+ footer={<div style={{ textAlign: "center", color: "#999" }}>自定义 Footer</div>}
30
+ >
31
+ {listData.map((item) => (
32
+ <ListItem key={item.id}>{item.content}</ListItem>
33
+ ))}
34
+ </List>
35
+ </div>
36
+ </div>
37
+ );
38
+ };
39
+
40
+ export default HeaderFooterList;
@@ -0,0 +1,24 @@
1
+ import React from "react";
2
+ import { List } from "../index";
3
+
4
+ const { ListItem, ListItemMeta } = List;
5
+
6
+ const MultilineList = () => {
7
+ const listData = [
8
+ { id: 1, title: "列表主标题", content: "这是一段较长的描述文字,用于展示多行文本的效果。" },
9
+ { id: 2, title: "列表主标题", content: "这是一段较长的描述文字,用于展示多行文本的效果。" },
10
+ { id: 3, title: "列表主标题", content: "这是一段较长的描述文字,用于展示多行文本的效果。" }
11
+ ];
12
+
13
+ return (
14
+ <List>
15
+ {listData.map((item) => (
16
+ <ListItem key={item.id}>
17
+ <ListItemMeta title={item.title} description={item.content} />
18
+ </ListItem>
19
+ ))}
20
+ </List>
21
+ );
22
+ };
23
+
24
+ export default MultilineList;
@@ -0,0 +1,69 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { List } from "../index";
3
+
4
+ const { ListItem, ListItemMeta } = List;
5
+
6
+ interface ListItemData {
7
+ id: number;
8
+ content: string;
9
+ icon: string;
10
+ title: string;
11
+ }
12
+
13
+ const ScrollLoadingList = () => {
14
+ const [listData, setListData] = useState<ListItemData[]>([]);
15
+ const [isLoading, setIsLoading] = useState(false);
16
+ const [pageNum, setPageNum] = useState(1);
17
+
18
+ const dataSource: ListItemData[] = [];
19
+ const total = 100;
20
+ const pageSize = 20;
21
+
22
+ for (let i = 0; i < total; i++) {
23
+ dataSource.push({
24
+ id: i,
25
+ content: "列表内容列表内容列表内容",
26
+ icon: "https://tdesign.gtimg.com/list-icon.png",
27
+ title: `列表标题 ${i + 1}`
28
+ });
29
+ }
30
+
31
+ const fetchData = async (pageInfo: { pageNum: number; pageSize: number }) => {
32
+ if (isLoading) return;
33
+ setIsLoading(true);
34
+ setTimeout(() => {
35
+ const { pageNum, pageSize } = pageInfo;
36
+ const newDataSource = dataSource.slice((pageNum - 1) * pageSize, pageNum * pageSize);
37
+ setListData((prev) => prev.concat(newDataSource));
38
+ setPageNum(pageNum);
39
+ setIsLoading(false);
40
+ }, 500);
41
+ };
42
+
43
+ const handleScroll = ({ scrollBottom }: { scrollTop: number; scrollBottom: number }) => {
44
+ if (!scrollBottom && listData.length < total) {
45
+ fetchData({ pageNum: pageNum + 1, pageSize });
46
+ }
47
+ };
48
+
49
+ useEffect(() => {
50
+ fetchData({ pageNum, pageSize });
51
+ }, []);
52
+
53
+ return (
54
+ <List
55
+ asyncLoading={isLoading ? "loading" : ""}
56
+ size="small"
57
+ style={{ height: "300px", overflow: "auto" }}
58
+ onScroll={handleScroll}
59
+ >
60
+ {listData.map((item) => (
61
+ <ListItem key={item.id}>
62
+ <ListItemMeta image={item.icon} title={item.title} description={item.content} />
63
+ </ListItem>
64
+ ))}
65
+ </List>
66
+ );
67
+ };
68
+
69
+ export default ScrollLoadingList;
@@ -0,0 +1,45 @@
1
+ import React from "react";
2
+ import { List } from "../index";
3
+
4
+ const { ListItem } = List;
5
+
6
+ const SizesList = () => {
7
+ const listData = [
8
+ { id: 1, content: "列表内容列表内容列表内容" },
9
+ { id: 2, content: "列表内容列表内容列表内容" },
10
+ { id: 3, content: "列表内容列表内容列表内容" }
11
+ ];
12
+
13
+ return (
14
+ <div style={{ display: "flex", flexDirection: "column", gap: "32px" }}>
15
+ <div>
16
+ <h4 style={{ marginBottom: "16px", color: "#666" }}>小尺寸</h4>
17
+ <List size="small">
18
+ {listData.map((item) => (
19
+ <ListItem key={item.id}>{item.content}</ListItem>
20
+ ))}
21
+ </List>
22
+ </div>
23
+
24
+ <div>
25
+ <h4 style={{ marginBottom: "16px", color: "#666" }}>中尺寸(默认)</h4>
26
+ <List size="medium">
27
+ {listData.map((item) => (
28
+ <ListItem key={item.id}>{item.content}</ListItem>
29
+ ))}
30
+ </List>
31
+ </div>
32
+
33
+ <div>
34
+ <h4 style={{ marginBottom: "16px", color: "#666" }}>大尺寸</h4>
35
+ <List size="large">
36
+ {listData.map((item) => (
37
+ <ListItem key={item.id}>{item.content}</ListItem>
38
+ ))}
39
+ </List>
40
+ </div>
41
+ </div>
42
+ );
43
+ };
44
+
45
+ export default SizesList;
@@ -0,0 +1,36 @@
1
+ import React from "react";
2
+ import { List } from "../index";
3
+
4
+ const { ListItem } = List;
5
+
6
+ const SplitList = () => {
7
+ const listData = [
8
+ { id: 1, content: "列表内容列表内容列表内容" },
9
+ { id: 2, content: "列表内容列表内容列表内容" },
10
+ { id: 3, content: "列表内容列表内容列表内容" },
11
+ { id: 4, content: "列表内容列表内容列表内容" }
12
+ ];
13
+
14
+ return (
15
+ <div style={{ display: "flex", gap: "32px" }}>
16
+ <div style={{ flex: 1 }}>
17
+ <h4 style={{ marginBottom: "16px", color: "#666" }}>无分割线</h4>
18
+ <List split={false}>
19
+ {listData.map((item) => (
20
+ <ListItem key={item.id}>{item.content}</ListItem>
21
+ ))}
22
+ </List>
23
+ </div>
24
+ <div style={{ flex: 1 }}>
25
+ <h4 style={{ marginBottom: "16px", color: "#666" }}>有分割线</h4>
26
+ <List split={true}>
27
+ {listData.map((item) => (
28
+ <ListItem key={item.id}>{item.content}</ListItem>
29
+ ))}
30
+ </List>
31
+ </div>
32
+ </div>
33
+ );
34
+ };
35
+
36
+ export default SplitList;
@@ -0,0 +1,24 @@
1
+ import React from "react";
2
+ import { List } from "../index";
3
+
4
+ const { ListItem } = List;
5
+
6
+ const StripeList = () => {
7
+ const listData = [
8
+ { id: 1, content: "列表内容列表内容列表内容" },
9
+ { id: 2, content: "列表内容列表内容列表内容" },
10
+ { id: 3, content: "列表内容列表内容列表内容" },
11
+ { id: 4, content: "列表内容列表内容列表内容" },
12
+ { id: 5, content: "列表内容列表内容列表内容" }
13
+ ];
14
+
15
+ return (
16
+ <List stripe={true} split={false}>
17
+ {listData.map((item) => (
18
+ <ListItem key={item.id}>{item.content}</ListItem>
19
+ ))}
20
+ </List>
21
+ );
22
+ };
23
+
24
+ export default StripeList;
@@ -0,0 +1,51 @@
1
+ import React, { useEffect, useRef, useState } from "react";
2
+ import { List } from "../index";
3
+
4
+ const { ListItem, ListItemMeta } = List;
5
+
6
+ interface ListItemData {
7
+ content: string;
8
+ }
9
+
10
+ const VirtualScrollList = () => {
11
+ const [data, setData] = useState<ListItemData[]>([]);
12
+ const listRef = useRef<any>(null);
13
+
14
+ const handleScrollTo = () => {
15
+ listRef.current?.scrollTo({
16
+ index: 30,
17
+ behavior: "smooth"
18
+ });
19
+ };
20
+
21
+ useEffect(() => {
22
+ const list: ListItemData[] = [];
23
+ for (let i = 0; i < 3000; i++) {
24
+ list.push({ content: `第${i + 1}个列表内容的描述性文字` });
25
+ }
26
+ setTimeout(() => setData(list), 0);
27
+ }, []);
28
+
29
+ const imageUrl = "https://tdesign.gtimg.com/site/avatar.jpg";
30
+
31
+ return (
32
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
33
+ <List
34
+ ref={listRef}
35
+ style={{ height: "300px" }}
36
+ scroll={{ type: "virtual", rowHeight: 80, bufferSize: 10, threshold: 10 }}
37
+ >
38
+ {data.map((item, index) => (
39
+ <ListItem key={index}>
40
+ <ListItemMeta image={imageUrl} title="列表标题" description={item.content} />
41
+ </ListItem>
42
+ ))}
43
+ </List>
44
+ <div>
45
+ <button onClick={handleScrollTo}>滚动到第 30 项</button>
46
+ </div>
47
+ </div>
48
+ );
49
+ };
50
+
51
+ export default VirtualScrollList;
@@ -0,0 +1,26 @@
1
+ import React from "react";
2
+ import { List } from "../index";
3
+
4
+ const { ListItem, ListItemMeta } = List;
5
+
6
+ const WithImageList = () => {
7
+ const avatarUrl = "https://tdesign.gtimg.com/site/avatar.jpg";
8
+ const listData = [
9
+ { id: 1, title: "列表主内容", content: "列表内容列表内容列表内容" },
10
+ { id: 2, title: "列表主内容", content: "列表内容列表内容列表内容" },
11
+ { id: 3, title: "列表主内容", content: "列表内容列表内容列表内容" },
12
+ { id: 4, title: "列表主内容", content: "列表内容列表内容列表内容" }
13
+ ];
14
+
15
+ return (
16
+ <List>
17
+ {listData.map((item) => (
18
+ <ListItem key={item.id}>
19
+ <ListItemMeta image={avatarUrl} title={item.title} description={item.content} />
20
+ </ListItem>
21
+ ))}
22
+ </List>
23
+ );
24
+ };
25
+
26
+ export default WithImageList;
@@ -1,11 +1,11 @@
1
- /**
2
- * 该文件为脚本自动生成文件,请勿随意修改。如需修改请联系 PMC
3
- * */
4
-
5
- import { TdListProps, TdListItemProps, TdListItemMetaProps } from "./type";
6
-
7
- export const listDefaultProps: TdListProps = { layout: "horizontal", size: "medium", split: false, stripe: false };
8
-
9
- export const listItemDefaultProps: TdListItemProps = {};
10
-
11
- export const listItemMetaDefaultProps: TdListItemMetaProps = {};
1
+ /**
2
+ * 该文件为脚本自动生成文件,请勿随意修改。如需修改请联系 PMC
3
+ * */
4
+
5
+ import { TdListProps, TdListItemProps, TdListItemMetaProps } from "./type";
6
+
7
+ export const listDefaultProps: TdListProps = { layout: "horizontal", size: "medium", split: false, stripe: false };
8
+
9
+ export const listItemDefaultProps: TdListItemProps = {};
10
+
11
+ export const listItemMetaDefaultProps: TdListItemMetaProps = {};
@@ -1,82 +1,82 @@
1
- import React, { useMemo } from "react";
2
- // import log from "@tdesign/common-js/log/index";
3
- import useVirtualScroll from "../../hooks/useVirtualScroll";
4
- import { TdListProps } from "../type";
5
- import { Styles, type ScrollToElementParams } from "../../common";
6
- const log = console.log;
7
- export const useListVirtualScroll = (
8
- scroll: TdListProps["scroll"],
9
- listRef: React.MutableRefObject<HTMLElement>,
10
- listItems: any[]
11
- ) => {
12
- const virtualScrollParams = useMemo(
13
- () => ({
14
- data: listItems,
15
- scroll
16
- }),
17
- [listItems, scroll]
18
- );
19
- const virtualConfig = useVirtualScroll(listRef, virtualScrollParams);
20
- const { isVirtualScroll } = virtualConfig;
21
- let lastScrollY = -1;
22
-
23
- const onInnerVirtualScroll = (e: WheelEvent) => {
24
- const target = (e.target || e.srcElement) as HTMLElement;
25
- const top = target.scrollTop;
26
- if (lastScrollY !== top) {
27
- virtualConfig.isVirtualScroll && virtualConfig.handleScroll();
28
- } else {
29
- lastScrollY = -1;
30
- }
31
- lastScrollY = top;
32
- };
33
-
34
- const cursorStyle = useMemo(
35
- () =>
36
- ({
37
- position: "absolute",
38
- width: "1px",
39
- height: "1px",
40
- transition: "transform 0.2s",
41
- transform: `translate(0, ${virtualConfig.scrollHeight}px)`,
42
- msTransform: `translate(0, ${virtualConfig.scrollHeight}px)`,
43
- MozTransform: `translate(0, ${virtualConfig.scrollHeight}px)`,
44
- WebkitTransform: `translate(0, ${virtualConfig.scrollHeight}px)`
45
- }) as Styles,
46
- [virtualConfig.scrollHeight]
47
- );
48
-
49
- const listStyle = useMemo(
50
- () =>
51
- ({
52
- transform: `translate(0, ${virtualConfig.translateY}px)`,
53
- msTransform: `translate(0, ${virtualConfig.translateY}px)`,
54
- MozTransform: `translate(0, ${virtualConfig.translateY}px)`,
55
- WebkitTransform: `translate(0, ${virtualConfig.translateY}px)`
56
- }) as Styles,
57
- [virtualConfig.translateY]
58
- );
59
-
60
- const handleScrollTo = (params: ScrollToElementParams) => {
61
- const { index, key } = params;
62
- const targetIndex = index === 0 ? index : index ?? Number(key);
63
- if (!targetIndex && targetIndex !== 0) {
64
- console.error("List", "scrollTo: `index` or `key` must exist.");
65
- return;
66
- }
67
- if (targetIndex < 0 || targetIndex >= listItems.length) {
68
- console.error("List", `${targetIndex} does not exist in data, check \`index\` or \`key\` please.`);
69
- return;
70
- }
71
- virtualConfig.scrollToElement({ ...params, index: targetIndex - 1 });
72
- };
73
-
74
- return {
75
- virtualConfig,
76
- cursorStyle,
77
- listStyle,
78
- isVirtualScroll,
79
- onInnerVirtualScroll,
80
- scrollToElement: handleScrollTo
81
- };
82
- };
1
+ import React, { useMemo } from "react";
2
+ // import log from "@tdesign/common-js/log/index";
3
+ import useVirtualScroll from "../../hooks/useVirtualScroll";
4
+ import { TdListProps } from "../type";
5
+ import { Styles, type ScrollToElementParams } from "../../common";
6
+ const log = console.log;
7
+ export const useListVirtualScroll = (
8
+ scroll: TdListProps["scroll"],
9
+ listRef: React.MutableRefObject<HTMLElement>,
10
+ listItems: any[]
11
+ ) => {
12
+ const virtualScrollParams = useMemo(
13
+ () => ({
14
+ data: listItems,
15
+ scroll
16
+ }),
17
+ [listItems, scroll]
18
+ );
19
+ const virtualConfig = useVirtualScroll(listRef, virtualScrollParams);
20
+ const { isVirtualScroll } = virtualConfig;
21
+ let lastScrollY = -1;
22
+
23
+ const onInnerVirtualScroll = (e: WheelEvent) => {
24
+ const target = (e.target || e.srcElement) as HTMLElement;
25
+ const top = target.scrollTop;
26
+ if (lastScrollY !== top) {
27
+ virtualConfig.isVirtualScroll && virtualConfig.handleScroll();
28
+ } else {
29
+ lastScrollY = -1;
30
+ }
31
+ lastScrollY = top;
32
+ };
33
+
34
+ const cursorStyle = useMemo(
35
+ () =>
36
+ ({
37
+ position: "absolute",
38
+ width: "1px",
39
+ height: "1px",
40
+ transition: "transform 0.2s",
41
+ transform: `translate(0, ${virtualConfig.scrollHeight}px)`,
42
+ msTransform: `translate(0, ${virtualConfig.scrollHeight}px)`,
43
+ MozTransform: `translate(0, ${virtualConfig.scrollHeight}px)`,
44
+ WebkitTransform: `translate(0, ${virtualConfig.scrollHeight}px)`
45
+ }) as Styles,
46
+ [virtualConfig.scrollHeight]
47
+ );
48
+
49
+ const listStyle = useMemo(
50
+ () =>
51
+ ({
52
+ transform: `translate(0, ${virtualConfig.translateY}px)`,
53
+ msTransform: `translate(0, ${virtualConfig.translateY}px)`,
54
+ MozTransform: `translate(0, ${virtualConfig.translateY}px)`,
55
+ WebkitTransform: `translate(0, ${virtualConfig.translateY}px)`
56
+ }) as Styles,
57
+ [virtualConfig.translateY]
58
+ );
59
+
60
+ const handleScrollTo = (params: ScrollToElementParams) => {
61
+ const { index, key } = params;
62
+ const targetIndex = index === 0 ? index : index ?? Number(key);
63
+ if (!targetIndex && targetIndex !== 0) {
64
+ console.error("List", "scrollTo: `index` or `key` must exist.");
65
+ return;
66
+ }
67
+ if (targetIndex < 0 || targetIndex >= listItems.length) {
68
+ console.error("List", `${targetIndex} does not exist in data, check \`index\` or \`key\` please.`);
69
+ return;
70
+ }
71
+ virtualConfig.scrollToElement({ ...params, index: targetIndex - 1 });
72
+ };
73
+
74
+ return {
75
+ virtualConfig,
76
+ cursorStyle,
77
+ listStyle,
78
+ isVirtualScroll,
79
+ onInnerVirtualScroll,
80
+ scrollToElement: handleScrollTo
81
+ };
82
+ };
package/list/style/css.js CHANGED
@@ -1 +1 @@
1
- import "./index.css";
1
+ import "./index.css";
@@ -1 +1 @@
1
- import "../../styles/components/list/_index.scss";
1
+ import "../../styles/components/list/_index.scss";