@tendaui/components 1.2.3 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (406) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +176 -176
  3. package/_util/scroll.ts +9 -0
  4. package/alert/_example/base.tsx +13 -0
  5. package/alert/_example/collapse.tsx +15 -0
  6. package/badge/_example/base.tsx +10 -0
  7. package/badge/_example/count.tsx +29 -0
  8. package/badge/_example/custom-color.tsx +32 -0
  9. package/badge/_example/dot.tsx +26 -0
  10. package/badge/_example/max-count.tsx +26 -0
  11. package/badge/_example/offset.tsx +29 -0
  12. package/badge/_example/shape.tsx +32 -0
  13. package/badge/_example/show-zero.tsx +23 -0
  14. package/badge/_example/size.tsx +35 -0
  15. package/badge/_example/standalone.tsx +14 -0
  16. package/badge/_example/text-count.tsx +26 -0
  17. package/badge/_example/with-button.tsx +23 -0
  18. package/button/_example/block.tsx +18 -0
  19. package/button/_example/disabled.tsx +22 -0
  20. package/button/_example/ghost.tsx +24 -0
  21. package/button/_example/link.tsx +15 -0
  22. package/button/_example/loading.tsx +19 -0
  23. package/button/_example/shape.tsx +18 -0
  24. package/button/_example/size.tsx +18 -0
  25. package/button/_example/suffix.tsx +16 -0
  26. package/button/_example/theme.tsx +14 -0
  27. package/button/_example/variant-base.tsx +24 -0
  28. package/button/_example/variant-dashed.tsx +24 -0
  29. package/button/_example/variant-outline.tsx +24 -0
  30. package/button/_example/variant-text.tsx +24 -0
  31. package/checkbox/_example/base.tsx +8 -0
  32. package/checkbox/_example/controlled.tsx +11 -0
  33. package/checkbox/_example/group-disabled.tsx +13 -0
  34. package/checkbox/_example/group-with-check-all.tsx +22 -0
  35. package/checkbox/_example/group-with-max.tsx +17 -0
  36. package/checkbox/_example/group-with-options.tsx +18 -0
  37. package/checkbox/_example/group.tsx +17 -0
  38. package/checkbox/_example/states.tsx +19 -0
  39. package/color-picker/ColorPicker.tsx +16 -2
  40. package/color-picker/_example/base.tsx +12 -0
  41. package/color-picker/_example/borderless.tsx +17 -0
  42. package/color-picker/_example/clearable.tsx +12 -0
  43. package/color-picker/_example/disabled.tsx +17 -0
  44. package/color-picker/_example/formats.tsx +30 -0
  45. package/color-picker/_example/manual-input.tsx +39 -0
  46. package/color-picker/_example/recent-colors.tsx +19 -0
  47. package/color-picker/_example/swatch-colors.tsx +28 -0
  48. package/color-picker/_example/with-alpha.tsx +21 -0
  49. package/color-picker/components/panel/format/inputs.tsx +1 -1
  50. package/color-picker/components/panel/index.tsx +13 -0
  51. package/color-picker/components/trigger.tsx +64 -13
  52. package/color-picker/defaultProps.ts +4 -1
  53. package/color-picker/utils/color-picker/cmyk.ts +89 -89
  54. package/color-picker/utils/color-picker/color.ts +467 -467
  55. package/color-picker/utils/color-picker/constants.ts +187 -187
  56. package/color-picker/utils/color-picker/draggable.ts +99 -100
  57. package/color-picker/utils/color-picker/format.ts +90 -95
  58. package/color-picker/utils/color-picker/gradient.ts +237 -243
  59. package/color-picker/utils/color-picker/index.ts +7 -7
  60. package/color-picker/utils/color-picker/types.ts +33 -33
  61. package/config-provider/ConfigContext.tsx +1 -0
  62. package/config-provider/ConfigProvider.tsx +18 -1
  63. package/config-provider/type.ts +5 -0
  64. package/dialog/_example/base.tsx +27 -0
  65. package/dialog/_example/confirm-loading.tsx +32 -0
  66. package/dialog/_example/custom-buttons.tsx +24 -0
  67. package/dialog/_example/full-screen.tsx +26 -0
  68. package/dialog/_example/hide-buttons.tsx +39 -0
  69. package/dialog/_example/modeless.tsx +25 -0
  70. package/dialog/_example/placement.tsx +40 -0
  71. package/dialog/_example/plugin-example.tsx +69 -0
  72. package/dialog/_example/themes.tsx +41 -0
  73. package/dialog/hooks/useDialogPosition.ts +35 -35
  74. package/drawer/Drawer.tsx +17 -9
  75. package/drawer/_example/custom-header-footer.tsx +29 -0
  76. package/drawer/_example/default.tsx +20 -0
  77. package/drawer/_example/events.tsx +53 -0
  78. package/drawer/_example/no-footer.tsx +20 -0
  79. package/drawer/_example/no-overlay.tsx +20 -0
  80. package/drawer/_example/placement.tsx +43 -0
  81. package/drawer/_example/size-draggable.tsx +26 -0
  82. package/drawer/_example/size.tsx +40 -0
  83. package/drawer/defaultProps.ts +1 -1
  84. package/fireworks/Fireworks.tsx +1 -10
  85. package/fireworks/index.ts +0 -1
  86. package/fireworks/type.ts +0 -1
  87. package/form/_example/complex.tsx +76 -0
  88. package/form/_example/default.tsx +58 -0
  89. package/form/_example/disabled.tsx +26 -0
  90. package/form/_example/form-list.tsx +74 -0
  91. package/form/_example/inline-layout.tsx +20 -0
  92. package/form/_example/label-align.tsx +46 -0
  93. package/form/_example/methods.tsx +66 -0
  94. package/form/_example/validation.tsx +71 -0
  95. package/form/hooks/useFormItemStyle.tsx +19 -7
  96. package/form/index.ts +20 -2
  97. package/form/type.ts +519 -519
  98. package/global-config/default-config.ts +95 -95
  99. package/global-config/locale/ar_KW.ts +259 -270
  100. package/global-config/locale/en_US.ts +265 -280
  101. package/global-config/locale/it_IT.ts +264 -287
  102. package/global-config/locale/ja_JP.ts +264 -279
  103. package/global-config/locale/ko_KR.ts +264 -279
  104. package/global-config/locale/ru_RU.ts +277 -288
  105. package/global-config/locale/zh_CN.ts +265 -279
  106. package/global-config/locale/zh_TW.ts +265 -279
  107. package/global-config/mobile/default-config.ts +6 -6
  108. package/global-config/mobile/locale/ar_KW.ts +112 -113
  109. package/global-config/mobile/locale/en_US.ts +113 -114
  110. package/global-config/mobile/locale/it_IT.ts +113 -114
  111. package/global-config/mobile/locale/ja_JP.ts +100 -101
  112. package/global-config/mobile/locale/ko_KR.ts +100 -101
  113. package/global-config/mobile/locale/ru_RU.ts +112 -113
  114. package/global-config/mobile/locale/zh_CN.ts +100 -101
  115. package/global-config/mobile/locale/zh_TW.ts +100 -101
  116. package/global-config/t.ts +111 -111
  117. package/hooks/useDebounce.ts +27 -0
  118. package/hooks/useLastest.ts +6 -2
  119. package/hooks/useResizeObserve.ts +0 -1
  120. package/index.ts +1 -1
  121. package/input/Input.tsx +53 -10
  122. package/input/_example/auto-width.tsx +14 -0
  123. package/input/_example/borderless.tsx +17 -0
  124. package/input/_example/clearable.tsx +14 -0
  125. package/input/_example/default.tsx +10 -0
  126. package/input/_example/disabled-readonly.tsx +12 -0
  127. package/input/_example/events.tsx +42 -0
  128. package/input/_example/group.tsx +14 -0
  129. package/input/_example/label-suffix.tsx +12 -0
  130. package/input/_example/max-length.tsx +11 -0
  131. package/input/_example/password.tsx +14 -0
  132. package/input/_example/sizes.tsx +12 -0
  133. package/input/_example/status.tsx +13 -0
  134. package/input/_example/text-align.tsx +12 -0
  135. package/input/_example/with-icon.tsx +13 -0
  136. package/input/type.ts +3 -0
  137. package/input/useLengthLimit.ts +122 -0
  138. package/input-number/InputNumber.tsx +124 -124
  139. package/input-number/_example/align.tsx +23 -0
  140. package/input-number/_example/auto-width.tsx +8 -0
  141. package/input-number/_example/default.tsx +8 -0
  142. package/input-number/_example/events.tsx +45 -0
  143. package/input-number/_example/format.tsx +27 -0
  144. package/input-number/_example/large-number.tsx +17 -0
  145. package/input-number/_example/min-max.tsx +14 -0
  146. package/input-number/_example/sizes.tsx +35 -0
  147. package/input-number/_example/status.tsx +65 -0
  148. package/input-number/_example/step-and-decimal.tsx +14 -0
  149. package/input-number/_example/themes.tsx +21 -0
  150. package/input-number/_example/with-suffix.tsx +12 -0
  151. package/input-number/defaultProps.ts +17 -17
  152. package/input-number/index.ts +9 -9
  153. package/input-number/style/css.js +1 -1
  154. package/input-number/style/index.js +1 -1
  155. package/input-number/useInputNumber.tsx +270 -270
  156. package/ip-input/_example/controlled.tsx +26 -0
  157. package/ip-input/_example/default.tsx +12 -0
  158. package/ip-input/_example/full-featured.tsx +32 -0
  159. package/ip-input/_example/ipv6.tsx +23 -0
  160. package/ip-input/_example/keyboard-navigation.tsx +19 -0
  161. package/ip-input/_example/paste-demo.tsx +23 -0
  162. package/ip-input/_example/states.tsx +21 -0
  163. package/ip-input/_example/with-cidr.tsx +23 -0
  164. package/layout/_example/combine-left.tsx +54 -0
  165. package/layout/_example/combine-right.tsx +54 -0
  166. package/layout/_example/custom-aside-width.tsx +56 -0
  167. package/layout/_example/custom-height.tsx +45 -0
  168. package/layout/_example/double-sidebar.tsx +57 -0
  169. package/layout/_example/side-navigation-right.tsx +51 -0
  170. package/layout/_example/side-navigation.tsx +51 -0
  171. package/layout/_example/top-navigation.tsx +41 -0
  172. package/list/ListItem.tsx +36 -36
  173. package/list/ListItemMeta.tsx +40 -40
  174. package/list/_example/async-loading.tsx +46 -0
  175. package/list/_example/default.tsx +23 -0
  176. package/list/_example/header-footer.tsx +40 -0
  177. package/list/_example/multiline.tsx +24 -0
  178. package/list/_example/scroll-loading.tsx +69 -0
  179. package/list/_example/sizes.tsx +45 -0
  180. package/list/_example/split.tsx +36 -0
  181. package/list/_example/stripe.tsx +24 -0
  182. package/list/_example/virtual-scroll.tsx +51 -0
  183. package/list/_example/with-image.tsx +26 -0
  184. package/list/defaultProps.ts +11 -11
  185. package/list/hooks/useListVirtualScroll.ts +82 -82
  186. package/list/style/css.js +1 -1
  187. package/list/style/index.js +1 -1
  188. package/loading/_example/default.tsx +6 -0
  189. package/loading/_example/delay.tsx +53 -0
  190. package/loading/_example/fullscreen.tsx +29 -0
  191. package/loading/_example/inherit-color.tsx +24 -0
  192. package/loading/_example/no-overlay.tsx +15 -0
  193. package/loading/_example/sizes.tsx +25 -0
  194. package/loading/_example/with-text.tsx +12 -0
  195. package/loading/_example/wrapper.tsx +30 -0
  196. package/locale/LocalReceiver.ts +55 -55
  197. package/locale/ar_KW.ts +7 -7
  198. package/locale/en_US.ts +7 -7
  199. package/locale/it_IT.ts +6 -6
  200. package/locale/ja_JP.ts +6 -6
  201. package/locale/ko_KR.ts +6 -6
  202. package/locale/ru_RU.ts +6 -6
  203. package/locale/zh_CN.ts +5 -5
  204. package/locale/zh_TW.ts +7 -7
  205. package/notification/_example/default.tsx +31 -0
  206. package/notification/_example/long-content.tsx +37 -0
  207. package/notification/_example/stacking.tsx +40 -0
  208. package/notification/_example/types.tsx +78 -0
  209. package/notification/_example/usage-example.tsx +62 -0
  210. package/package.json +4 -3
  211. package/popup/Popup.tsx +17 -5
  212. package/popup/_example/controlled.tsx +32 -0
  213. package/popup/_example/custom-content.tsx +64 -0
  214. package/popup/_example/default.tsx +19 -0
  215. package/popup/_example/delay.tsx +35 -0
  216. package/popup/_example/disabled.tsx +17 -0
  217. package/popup/_example/no-arrow.tsx +17 -0
  218. package/popup/_example/placements.tsx +61 -0
  219. package/popup/_example/triggers.tsx +26 -0
  220. package/radio/_example/allow-uncheck.tsx +19 -0
  221. package/radio/_example/button-style.tsx +40 -0
  222. package/radio/_example/controlled.tsx +13 -0
  223. package/radio/_example/default.tsx +13 -0
  224. package/radio/_example/group-disabled.tsx +22 -0
  225. package/radio/_example/group-with-options.tsx +20 -0
  226. package/radio/_example/group.tsx +19 -0
  227. package/radio/_example/sizes.tsx +37 -0
  228. package/radio/_example/states.tsx +20 -0
  229. package/select/_example/collapsed.tsx +30 -0
  230. package/select/_example/creatable.tsx +36 -0
  231. package/select/_example/custom-content.tsx +26 -0
  232. package/select/_example/default.tsx +29 -0
  233. package/select/_example/disabled.tsx +20 -0
  234. package/select/_example/filterable.tsx +27 -0
  235. package/select/_example/group-options.tsx +44 -0
  236. package/select/_example/label-suffix.tsx +24 -0
  237. package/select/_example/loading.tsx +19 -0
  238. package/select/_example/multiple.tsx +31 -0
  239. package/select/_example/sizes.tsx +20 -0
  240. package/select/_example/status.tsx +27 -0
  241. package/select/type.ts +382 -382
  242. package/select-input/type.ts +280 -280
  243. package/slider/Slider.tsx +13 -5
  244. package/slider/SliderHandleButton.tsx +50 -50
  245. package/slider/_example/custom-label.tsx +19 -0
  246. package/slider/_example/default.tsx +14 -0
  247. package/slider/_example/disabled.tsx +17 -0
  248. package/slider/_example/marks.tsx +31 -0
  249. package/slider/_example/range.tsx +16 -0
  250. package/slider/_example/step.tsx +14 -0
  251. package/slider/_example/vertical.tsx +26 -0
  252. package/slider/_example/with-input-number.tsx +21 -0
  253. package/slider/defaultProps.ts +15 -15
  254. package/slider/style/css.js +1 -1
  255. package/slider/style/index.js +1 -1
  256. package/slider/type.ts +1 -1
  257. package/styles/_global.scss +40 -39
  258. package/styles/_vars.scss +374 -358
  259. package/styles/components/alert/_index.scss +175 -175
  260. package/styles/components/alert/_vars.scss +41 -39
  261. package/styles/components/badge/_index.scss +71 -70
  262. package/styles/components/badge/_vars.scss +26 -25
  263. package/styles/components/button/_index.scss +499 -499
  264. package/styles/components/button/_mixins.scss +40 -39
  265. package/styles/components/button/_vars.scss +121 -120
  266. package/styles/components/checkbox/_index.scss +158 -158
  267. package/styles/components/checkbox/_var.scss +59 -60
  268. package/styles/components/color-picker/_index.scss +586 -586
  269. package/styles/components/color-picker/_vars.scss +79 -84
  270. package/styles/components/dialog/_animate.scss +133 -135
  271. package/styles/components/dialog/_index.scss +310 -311
  272. package/styles/components/dialog/_vars.scss +60 -59
  273. package/styles/components/drawer/_index.scss +206 -205
  274. package/styles/components/drawer/_var.scss +55 -53
  275. package/styles/components/fireworks/_index.scss +86 -86
  276. package/styles/components/fireworks/_vars.scss +5 -4
  277. package/styles/components/form/_index.scss +175 -173
  278. package/styles/components/form/_mixins.scss +74 -76
  279. package/styles/components/form/_vars.scss +101 -100
  280. package/styles/components/input/_index.scss +350 -349
  281. package/styles/components/input/_mixins.scss +120 -116
  282. package/styles/components/input/_vars.scss +130 -134
  283. package/styles/components/input-number/_index.scss +342 -343
  284. package/styles/components/input-number/_vars.scss +56 -65
  285. package/styles/components/ip-input/_index.scss +277 -280
  286. package/styles/components/layout/_index.scss +47 -47
  287. package/styles/components/layout/_vars.scss +19 -18
  288. package/styles/components/layout/doc.scss +74 -74
  289. package/styles/components/list/_index.scss +172 -172
  290. package/styles/components/list/_vars.scss +42 -41
  291. package/styles/components/loading/_index.scss +113 -112
  292. package/styles/components/loading/_vars.scss +40 -39
  293. package/styles/components/notification/_index.scss +144 -143
  294. package/styles/components/notification/_mixins.scss +13 -12
  295. package/styles/components/notification/_vars.scss +60 -59
  296. package/styles/components/popup/_index.scss +78 -82
  297. package/styles/components/popup/_mixin.scss +149 -149
  298. package/styles/components/popup/{_var.scss → _vars.scss} +33 -31
  299. package/styles/components/radio/_index.scss +376 -376
  300. package/styles/components/radio/{_var.scss → _vars.scss} +89 -92
  301. package/styles/components/select/_index.scss +291 -290
  302. package/styles/components/select/_var.scss +64 -65
  303. package/styles/components/select-input/_index.scss +5 -5
  304. package/styles/components/select-input/_var.scss +4 -3
  305. package/styles/components/slider/_index.scss +241 -241
  306. package/styles/components/slider/_vars.scss +51 -50
  307. package/styles/components/switch/_index.scss +248 -164
  308. package/styles/components/switch/_vars.scss +63 -61
  309. package/styles/components/table/_index.scss +194 -193
  310. package/styles/components/table/_var.scss +52 -52
  311. package/styles/components/tabs/_index.scss +165 -165
  312. package/styles/components/tabs/_mixins.scss +11 -11
  313. package/styles/components/tabs/_vars.scss +72 -71
  314. package/styles/components/tag/_index.scss +317 -316
  315. package/styles/components/tag/_var.scss +86 -85
  316. package/styles/components/tag-input/_index.scss +164 -163
  317. package/styles/components/tag-input/_vars.scss +17 -16
  318. package/styles/components/tooltip/_index.scss +104 -0
  319. package/styles/components/tooltip/_vars.scss +23 -0
  320. package/styles/mixins/_focus.scss +8 -7
  321. package/styles/mixins/_layout.scss +32 -32
  322. package/styles/mixins/_reset.scss +11 -10
  323. package/styles/mixins/_scrollbar.scss +32 -31
  324. package/styles/mixins/_text.scss +50 -48
  325. package/styles/themes/_dark.scss +169 -191
  326. package/styles/themes/_font.scss +69 -69
  327. package/styles/themes/_index.scss +5 -5
  328. package/styles/themes/_light.scss +170 -190
  329. package/styles/themes/_radius.scss +9 -9
  330. package/styles/themes/_size.scss +68 -68
  331. package/styles/utilities/_animation.scss +58 -57
  332. package/styles/utilities/_tips.scss +10 -9
  333. package/switch/_example/async-change.tsx +25 -0
  334. package/switch/_example/before-change.tsx +22 -0
  335. package/switch/_example/controlled.tsx +14 -0
  336. package/switch/_example/custom-value.tsx +21 -0
  337. package/switch/_example/default.tsx +6 -0
  338. package/switch/_example/disabled.tsx +25 -0
  339. package/switch/_example/loading.tsx +17 -0
  340. package/switch/_example/sizes.tsx +21 -0
  341. package/switch/_example/with-label.tsx +21 -0
  342. package/tab/TabPanel.tsx +9 -6
  343. package/tab/_example/addable.tsx +45 -0
  344. package/tab/_example/card-theme.tsx +22 -0
  345. package/tab/_example/default.tsx +22 -0
  346. package/tab/_example/disabled.tsx +38 -0
  347. package/tab/_example/lazy.tsx +25 -0
  348. package/tab/_example/placement.tsx +36 -0
  349. package/tab/_example/removable.tsx +31 -0
  350. package/tab/_example/sizes.tsx +31 -0
  351. package/tab/_example/with-action.tsx +26 -0
  352. package/table/Cell.tsx +3 -6
  353. package/table/Ellipsis.tsx +73 -0
  354. package/table/_example/alignment.tsx +46 -0
  355. package/table/_example/auto-width.tsx +47 -0
  356. package/table/_example/bordered-stripe-hover.tsx +42 -0
  357. package/table/_example/bordered.tsx +42 -0
  358. package/table/_example/cell-click.tsx +52 -0
  359. package/table/_example/complex.tsx +82 -0
  360. package/table/_example/custom-cell.tsx +68 -0
  361. package/table/_example/custom-empty.tsx +37 -0
  362. package/table/_example/custom-row-class-name.tsx +57 -0
  363. package/table/_example/default.tsx +42 -0
  364. package/table/_example/ellipsis.tsx +56 -0
  365. package/table/_example/empty.tsx +28 -0
  366. package/table/_example/fixed-width.tsx +48 -0
  367. package/table/_example/hover.tsx +42 -0
  368. package/table/_example/row-click.tsx +52 -0
  369. package/table/_example/sizes.tsx +57 -0
  370. package/table/_example/stripe.tsx +42 -0
  371. package/table/_example/vertical-align.tsx +110 -0
  372. package/table/hooks/useTableClassName.ts +3 -3
  373. package/table/index.ts +2 -0
  374. package/table/type.ts +1 -0
  375. package/tag/Tag.tsx +1 -1
  376. package/tag/_example/closable.tsx +44 -0
  377. package/tag/_example/default.tsx +17 -0
  378. package/tag/_example/disabled.tsx +19 -0
  379. package/tag/_example/sizes.tsx +18 -0
  380. package/tag/_example/variants.tsx +37 -0
  381. package/tag-input/_example/collapsed.tsx +27 -0
  382. package/tag-input/_example/controlled-uncontrolled.tsx +26 -0
  383. package/tag-input/_example/default.tsx +15 -0
  384. package/tag-input/_example/disabled-readonly.tsx +21 -0
  385. package/tag-input/_example/events.tsx +64 -0
  386. package/tag-input/_example/excess-display.tsx +27 -0
  387. package/tag-input/_example/max-tags.tsx +22 -0
  388. package/tag-input/_example/sizes.tsx +21 -0
  389. package/tag-input/_example/status.tsx +37 -0
  390. package/tag-input/_example/with-label.tsx +23 -0
  391. package/tag-input/hooks/useTagList.tsx +1 -1
  392. package/tooltip/Tooltip.tsx +76 -0
  393. package/tooltip/_example/base.tsx +26 -0
  394. package/tooltip/_example/custom-content.tsx +47 -0
  395. package/tooltip/_example/placement.tsx +33 -0
  396. package/tooltip/_example/theme.tsx +34 -0
  397. package/tooltip/defaultProps.ts +14 -0
  398. package/tooltip/index.ts +7 -0
  399. package/tooltip/style/index.js +1 -0
  400. package/tooltip/type.ts +99 -0
  401. package/utils/input-number/large-number.ts +423 -423
  402. package/utils/input-number/number.ts +257 -257
  403. package/utils/log/index.ts +3 -3
  404. package/utils/log/log.ts +29 -30
  405. package/utils/log/types.ts +9 -12
  406. package/utils/style.ts +58 -58
@@ -0,0 +1,36 @@
1
+ import React, { useState } from "react";
2
+ import { Tabs, TabPanel } from "../index";
3
+
4
+ const PlacementExample = () => {
5
+ const [placement, setPlacement] = useState<"top" | "bottom" | "left" | "right">('top');
6
+ const [activeTab, setActiveTab] = useState("tab1");
7
+
8
+ return (
9
+ <div>
10
+ <div style={{ marginBottom: "16px" }}>
11
+ <span style={{ marginRight: "8px" }}>选项卡位置:</span>
12
+ <select value={placement} onChange={(e) => setPlacement(e.target.value as any)}>
13
+ <option value="top">顶部</option>
14
+ <option value="bottom">底部</option>
15
+ <option value="left">左侧</option>
16
+ <option value="right">右侧</option>
17
+ </select>
18
+ </div>
19
+ <div style={{ height: "200px", border: "1px solid #eee" }}>
20
+ <Tabs value={activeTab} onChange={(val) => setActiveTab(val as string)} placement={placement}>
21
+ <TabPanel label="选项卡一" value="tab1">
22
+ <div style={{ padding: "16px" }}>选项卡一的内容</div>
23
+ </TabPanel>
24
+ <TabPanel label="选项卡二" value="tab2">
25
+ <div style={{ padding: "16px" }}>选项卡二的内容</div>
26
+ </TabPanel>
27
+ <TabPanel label="选项卡三" value="tab3">
28
+ <div style={{ padding: "16px" }}>选项卡三的内容</div>
29
+ </TabPanel>
30
+ </Tabs>
31
+ </div>
32
+ </div>
33
+ );
34
+ };
35
+
36
+ export default PlacementExample;
@@ -0,0 +1,31 @@
1
+ import React, { useState } from "react";
2
+ import { Tabs, TabPanel } from "../index";
3
+
4
+ const RemovableExample = () => {
5
+ const [activeTab, setActiveTab] = useState("tab1");
6
+ const [tabs, setTabs] = useState([
7
+ { label: "选项卡一", value: "tab1" },
8
+ { label: "选项卡二", value: "tab2" },
9
+ { label: "选项卡三", value: "tab3" }
10
+ ]);
11
+
12
+ const handleRemove = (options: { value: string | number; index: number }) => {
13
+ const newTabs = tabs.filter((tab) => tab.value !== options.value);
14
+ setTabs(newTabs);
15
+ if (activeTab === options.value && newTabs.length > 0) {
16
+ setActiveTab(newTabs[0].value);
17
+ }
18
+ };
19
+
20
+ return (
21
+ <Tabs value={activeTab} onChange={(val) => setActiveTab(val as string)} onRemove={handleRemove}>
22
+ {tabs.map((tab) => (
23
+ <TabPanel key={tab.value} label={tab.label} value={tab.value} removable>
24
+ <div style={{ padding: "16px" }}>{tab.label} 的内容</div>
25
+ </TabPanel>
26
+ ))}
27
+ </Tabs>
28
+ );
29
+ };
30
+
31
+ export default RemovableExample;
@@ -0,0 +1,31 @@
1
+ import React from "react";
2
+ import { Tabs, TabPanel } from "../index";
3
+
4
+ const SizesExample = () => (
5
+ <div style={{ display: "flex", flexDirection: "column", gap: "24px" }}>
6
+ <div>
7
+ <div style={{ marginBottom: "8px", color: "#666" }}>中尺寸(默认)</div>
8
+ <Tabs defaultValue="tab1" size="medium">
9
+ <TabPanel label="选项卡一" value="tab1">
10
+ <div style={{ padding: "16px" }}>中尺寸内容</div>
11
+ </TabPanel>
12
+ <TabPanel label="选项卡二" value="tab2">
13
+ <div style={{ padding: "16px" }}>中尺寸内容</div>
14
+ </TabPanel>
15
+ </Tabs>
16
+ </div>
17
+ <div>
18
+ <div style={{ marginBottom: "8px", color: "#666" }}>大尺寸</div>
19
+ <Tabs defaultValue="tab1" size="large">
20
+ <TabPanel label="选项卡一" value="tab1">
21
+ <div style={{ padding: "16px" }}>大尺寸内容</div>
22
+ </TabPanel>
23
+ <TabPanel label="选项卡二" value="tab2">
24
+ <div style={{ padding: "16px" }}>大尺寸内容</div>
25
+ </TabPanel>
26
+ </Tabs>
27
+ </div>
28
+ </div>
29
+ );
30
+
31
+ export default SizesExample;
@@ -0,0 +1,26 @@
1
+ import React, { useState } from "react";
2
+ import { Tabs, TabPanel } from "../index";
3
+
4
+ const WithActionExample = () => {
5
+ const [activeTab, setActiveTab] = useState("tab1");
6
+
7
+ return (
8
+ <Tabs
9
+ value={activeTab}
10
+ onChange={(val) => setActiveTab(val as string)}
11
+ action={<button style={{ marginRight: "8px", cursor: "pointer" }}>操作按钮</button>}
12
+ >
13
+ <TabPanel label="选项卡一" value="tab1">
14
+ <div style={{ padding: "16px" }}>选项卡一的内容</div>
15
+ </TabPanel>
16
+ <TabPanel label="选项卡二" value="tab2">
17
+ <div style={{ padding: "16px" }}>选项卡二的内容</div>
18
+ </TabPanel>
19
+ <TabPanel label="选项卡三" value="tab3">
20
+ <div style={{ padding: "16px" }}>选项卡三的内容</div>
21
+ </TabPanel>
22
+ </Tabs>
23
+ );
24
+ };
25
+
26
+ export default WithActionExample;
package/table/Cell.tsx CHANGED
@@ -3,6 +3,7 @@ import classNames from "classnames";
3
3
  import { isFunction, get } from "lodash-es";
4
4
  import useConfig from "../hooks/useConfig";
5
5
  import { BaseTableCellParams, TableRowData } from "./type";
6
+ import Ellipsis from "./Ellipsis";
6
7
 
7
8
  export interface CellProps<T extends TableRowData = TableRowData> {
8
9
  cellParams: BaseTableCellParams<T>;
@@ -58,13 +59,9 @@ const Cell = <T extends TableRowData = TableRowData>(props: CellProps<T>) => {
58
59
  // 处理省略文本
59
60
  const isEllipsis = Boolean(col.ellipsis);
60
61
  const cellContent = isEllipsis ? (
61
- <div
62
- className={`${classPrefix}-table__ellipsis`}
63
- title={String(cellNode)}
64
- style={{ width: "100%", overflow: "hidden" }}
65
- >
62
+ <Ellipsis classPrefix={classPrefix}>
66
63
  {cellNode}
67
- </div>
64
+ </Ellipsis>
68
65
  ) : (
69
66
  cellNode
70
67
  );
@@ -0,0 +1,73 @@
1
+ import React, { useRef, useState, MouseEvent } from "react";
2
+ import classNames from "classnames";
3
+
4
+ import type { TNode } from "../common";
5
+ import { isNodeOverflow } from "../_util/scroll";
6
+ import { Tooltip } from "@tendaui/react";
7
+ import useDebounce from "../hooks/useDebounce";
8
+
9
+ export interface EllipsisProps {
10
+ content?: string | TNode;
11
+ children?: string | TNode;
12
+ popupContent?: string | number | TNode;
13
+ placement?: string;
14
+ attach?: () => HTMLElement;
15
+ tooltipProps?: any;
16
+ zIndex?: number;
17
+ overlayClassName?: string;
18
+ classPrefix?: string;
19
+ }
20
+
21
+ /** 超出省略显示 */
22
+ export default function Ellipsis(props: EllipsisProps) {
23
+ const { classPrefix = "td" } = props;
24
+ const root = useRef<HTMLDivElement>(null);
25
+ const [isOverflow, setIsOverflow] = useState(false);
26
+
27
+ const ellipsisClasses = classNames([`${classPrefix}-table__ellipsis`, `${classPrefix}-text-ellipsis`]);
28
+
29
+ const innerEllipsisClassName: any = [`${classPrefix}-table__ellipsis-content`, props.overlayClassName];
30
+
31
+ // 当表格数据量大时,不希望默认渲染全量的 Popup,期望在用户 mouseenter 的时候再显示
32
+ const onTriggerMouseenter = () => {
33
+ if (!root.current) return;
34
+ setIsOverflow(isNodeOverflow(root.current));
35
+ };
36
+
37
+ const onTriggerMouseleave = () => {
38
+ setIsOverflow(isNodeOverflow(root.current));
39
+ };
40
+
41
+ // 使用 debounce 有两个原因:1. 避免 safari/firefox 等浏览器不显示省略浮层;2. 避免省略列快速滚动时,出现一堆的省略浮层
42
+ const onMouseAround = useDebounce((e: MouseEvent<HTMLDivElement>) => {
43
+ e.type === "mouseleave" ? onTriggerMouseleave() : onTriggerMouseenter();
44
+ }, 80);
45
+
46
+ const cellNode = props.content || props.children;
47
+ const ellipsisContent = (
48
+ <div ref={root} className={ellipsisClasses} onMouseEnter={onMouseAround} onMouseLeave={onMouseAround}>
49
+ {cellNode}
50
+ </div>
51
+ );
52
+ let content = null;
53
+ const { tooltipProps } = props;
54
+ if (isOverflow) {
55
+ const rProps = {
56
+ content: props.popupContent || cellNode,
57
+ destroyOnClose: true,
58
+ zIndex: props.zIndex,
59
+ attach: props.attach,
60
+ placement: props.placement,
61
+ overlayClassName: tooltipProps?.overlayClassName
62
+ ? innerEllipsisClassName.concat(tooltipProps.overlayClassName)
63
+ : innerEllipsisClassName,
64
+ ...(props.tooltipProps || {})
65
+ };
66
+ content = <Tooltip {...rProps}>{ellipsisContent}</Tooltip>;
67
+ } else {
68
+ content = ellipsisContent;
69
+ }
70
+ return content;
71
+ }
72
+
73
+ Ellipsis.displayName = "Ellipsis";
@@ -0,0 +1,46 @@
1
+ import React from "react";
2
+ import Table from "../index";
3
+ import type { BaseTableCol, TableRowData } from "../type";
4
+
5
+ // 示例数据类型
6
+ interface UserData extends TableRowData {
7
+ id: number;
8
+ name: string;
9
+ age: number;
10
+ email: string;
11
+ address: string;
12
+ status: "active" | "inactive";
13
+ score: number;
14
+ }
15
+
16
+ // 基础数据
17
+ const baseData: UserData[] = [
18
+ {
19
+ id: 1,
20
+ name: "张三",
21
+ age: 25,
22
+ email: "zhangsan@example.com",
23
+ address: "北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区",
24
+ status: "active",
25
+ score: 95
26
+ },
27
+ { id: 2, name: "李四", age: 30, email: "lisi@example.com", address: "上海市浦东新区", status: "active", score: 88 },
28
+ { id: 3, name: "王五", age: 28, email: "wangwu@example.com", address: "广州市天河区", status: "inactive", score: 92 },
29
+ { id: 4, name: "赵六", age: 35, email: "zhaoliu@example.com", address: "深圳市南山区", status: "active", score: 87 },
30
+ { id: 5, name: "钱七", age: 22, email: "qianqi@example.com", address: "杭州市西湖区", status: "inactive", score: 90 }
31
+ ];
32
+
33
+ const AlignmentExample = () => (
34
+ <Table
35
+ columns={[
36
+ { colKey: "name", title: "左对齐", width: 120, align: "left" },
37
+ { colKey: "age", title: "居中", width: 100, align: "center" },
38
+ { colKey: "score", title: "右对齐", width: 100, align: "right" },
39
+ { colKey: "email", title: "默认(左对齐)", width: 240 }
40
+ ]}
41
+ data={baseData}
42
+ bordered
43
+ />
44
+ );
45
+
46
+ export default AlignmentExample;
@@ -0,0 +1,47 @@
1
+ import React from "react";
2
+ import Table from "../index";
3
+ import type { BaseTableCol, TableRowData } from "../type";
4
+
5
+ // 示例数据类型
6
+ interface UserData extends TableRowData {
7
+ id: number;
8
+ name: string;
9
+ age: number;
10
+ email: string;
11
+ address: string;
12
+ status: "active" | "inactive";
13
+ score: number;
14
+ }
15
+
16
+ // 基础数据
17
+ const baseData: UserData[] = [
18
+ {
19
+ id: 1,
20
+ name: "张三",
21
+ age: 25,
22
+ email: "zhangsan@example.com",
23
+ address: "北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区",
24
+ status: "active",
25
+ score: 95
26
+ },
27
+ { id: 2, name: "李四", age: 30, email: "lisi@example.com", address: "上海市浦东新区", status: "active", score: 88 },
28
+ { id: 3, name: "王五", age: 28, email: "wangwu@example.com", address: "广州市天河区", status: "inactive", score: 92 },
29
+ { id: 4, name: "赵六", age: 35, email: "zhaoliu@example.com", address: "深圳市南山区", status: "active", score: 87 },
30
+ { id: 5, name: "钱七", age: 22, email: "qianqi@example.com", address: "杭州市西湖区", status: "inactive", score: 90 }
31
+ ];
32
+
33
+ const AutoWidthExample = () => (
34
+ <Table
35
+ columns={[
36
+ { colKey: "name", title: "姓名" },
37
+ { colKey: "age", title: "年龄" },
38
+ { colKey: "email", title: "邮箱" },
39
+ { colKey: "address", title: "地址" }
40
+ ]}
41
+ data={baseData}
42
+ bordered
43
+ tableLayout="auto"
44
+ />
45
+ );
46
+
47
+ export default AutoWidthExample;
@@ -0,0 +1,42 @@
1
+ import React from "react";
2
+ import Table from "../index";
3
+ import type { BaseTableCol, TableRowData } from "../type";
4
+
5
+ // 示例数据类型
6
+ interface UserData extends TableRowData {
7
+ id: number;
8
+ name: string;
9
+ age: number;
10
+ email: string;
11
+ address: string;
12
+ status: "active" | "inactive";
13
+ score: number;
14
+ }
15
+
16
+ // 基础数据
17
+ const baseColumns: BaseTableCol<UserData>[] = [
18
+ { colKey: "name", title: "姓名", width: 120 },
19
+ { colKey: "age", title: "年龄", width: 80, align: "center" },
20
+ { colKey: "email", title: "邮箱", width: 240 },
21
+ { colKey: "address", title: "地址" }
22
+ ];
23
+
24
+ const baseData: UserData[] = [
25
+ {
26
+ id: 1,
27
+ name: "张三",
28
+ age: 25,
29
+ email: "zhangsan@example.com",
30
+ address: "北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区",
31
+ status: "active",
32
+ score: 95
33
+ },
34
+ { id: 2, name: "李四", age: 30, email: "lisi@example.com", address: "上海市浦东新区", status: "active", score: 88 },
35
+ { id: 3, name: "王五", age: 28, email: "wangwu@example.com", address: "广州市天河区", status: "inactive", score: 92 },
36
+ { id: 4, name: "赵六", age: 35, email: "zhaoliu@example.com", address: "深圳市南山区", status: "active", score: 87 },
37
+ { id: 5, name: "钱七", age: 22, email: "qianqi@example.com", address: "杭州市西湖区", status: "inactive", score: 90 }
38
+ ];
39
+
40
+ const BorderedStripeHoverExample = () => <Table columns={baseColumns} data={baseData} bordered stripe hover />;
41
+
42
+ export default BorderedStripeHoverExample;
@@ -0,0 +1,42 @@
1
+ import React from "react";
2
+ import Table from "../index";
3
+ import type { BaseTableCol, TableRowData } from "../type";
4
+
5
+ // 示例数据类型
6
+ interface UserData extends TableRowData {
7
+ id: number;
8
+ name: string;
9
+ age: number;
10
+ email: string;
11
+ address: string;
12
+ status: "active" | "inactive";
13
+ score: number;
14
+ }
15
+
16
+ // 基础数据
17
+ const baseColumns: BaseTableCol<UserData>[] = [
18
+ { colKey: "name", title: "姓名", width: 120 },
19
+ { colKey: "age", title: "年龄", width: 80, align: "center" },
20
+ { colKey: "email", title: "邮箱", width: 240 },
21
+ { colKey: "address", title: "地址" }
22
+ ];
23
+
24
+ const baseData: UserData[] = [
25
+ {
26
+ id: 1,
27
+ name: "张三",
28
+ age: 25,
29
+ email: "zhangsan@example.com",
30
+ address: "北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区",
31
+ status: "active",
32
+ score: 95
33
+ },
34
+ { id: 2, name: "李四", age: 30, email: "lisi@example.com", address: "上海市浦东新区", status: "active", score: 88 },
35
+ { id: 3, name: "王五", age: 28, email: "wangwu@example.com", address: "广州市天河区", status: "inactive", score: 92 },
36
+ { id: 4, name: "赵六", age: 35, email: "zhaoliu@example.com", address: "深圳市南山区", status: "active", score: 87 },
37
+ { id: 5, name: "钱七", age: 22, email: "qianqi@example.com", address: "杭州市西湖区", status: "inactive", score: 90 }
38
+ ];
39
+
40
+ const BorderedExample = () => <Table columns={baseColumns} data={baseData} bordered />;
41
+
42
+ export default BorderedExample;
@@ -0,0 +1,52 @@
1
+ import React from "react";
2
+ import Table from "../index";
3
+ import type { BaseTableCol, TableRowData } from "../type";
4
+
5
+ // 示例数据类型
6
+ interface UserData extends TableRowData {
7
+ id: number;
8
+ name: string;
9
+ age: number;
10
+ email: string;
11
+ address: string;
12
+ status: "active" | "inactive";
13
+ score: number;
14
+ }
15
+
16
+ // 基础数据
17
+ const baseColumns: BaseTableCol<UserData>[] = [
18
+ { colKey: "name", title: "姓名", width: 120 },
19
+ { colKey: "age", title: "年龄", width: 80, align: "center" },
20
+ { colKey: "email", title: "邮箱", width: 240 },
21
+ { colKey: "address", title: "地址" }
22
+ ];
23
+
24
+ const baseData: UserData[] = [
25
+ {
26
+ id: 1,
27
+ name: "张三",
28
+ age: 25,
29
+ email: "zhangsan@example.com",
30
+ address: "北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区",
31
+ status: "active",
32
+ score: 95
33
+ },
34
+ { id: 2, name: "李四", age: 30, email: "lisi@example.com", address: "上海市浦东新区", status: "active", score: 88 },
35
+ { id: 3, name: "王五", age: 28, email: "wangwu@example.com", address: "广州市天河区", status: "inactive", score: 92 },
36
+ { id: 4, name: "赵六", age: 35, email: "zhaoliu@example.com", address: "深圳市南山区", status: "active", score: 87 },
37
+ { id: 5, name: "钱七", age: 22, email: "qianqi@example.com", address: "杭州市西湖区", status: "inactive", score: 90 }
38
+ ];
39
+
40
+ const CellClickExample = () => (
41
+ <Table
42
+ columns={baseColumns}
43
+ data={baseData}
44
+ bordered
45
+ onCellClick={({ row, col, rowIndex, colIndex }) => {
46
+ console.log("点击单元格:", { row, col, rowIndex, colIndex });
47
+ window.alert(`点击了第 ${rowIndex + 1} 行,第 ${colIndex + 1} 列,值:${row[col.colKey]}`);
48
+ }}
49
+ />
50
+ );
51
+
52
+ export default CellClickExample;
@@ -0,0 +1,82 @@
1
+ import React from "react";
2
+ import Table from "../index";
3
+ import type { BaseTableCol, TableRowData } from "../type";
4
+
5
+ // 示例数据类型
6
+ interface UserData extends TableRowData {
7
+ id: number;
8
+ name: string;
9
+ age: number;
10
+ email: string;
11
+ address: string;
12
+ status: "active" | "inactive";
13
+ score: number;
14
+ }
15
+
16
+ // 基础数据
17
+ const baseData: UserData[] = [
18
+ {
19
+ id: 1,
20
+ name: "张三",
21
+ age: 25,
22
+ email: "zhangsan@example.com",
23
+ address: "北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区",
24
+ status: "active",
25
+ score: 95
26
+ },
27
+ { id: 2, name: "李四", age: 30, email: "lisi@example.com", address: "上海市浦东新区", status: "active", score: 88 },
28
+ { id: 3, name: "王五", age: 28, email: "wangwu@example.com", address: "广州市天河区", status: "inactive", score: 92 },
29
+ { id: 4, name: "赵六", age: 35, email: "zhaoliu@example.com", address: "深圳市南山区", status: "active", score: 87 },
30
+ { id: 5, name: "钱七", age: 22, email: "qianqi@example.com", address: "杭州市西湖区", status: "inactive", score: 90 }
31
+ ];
32
+
33
+ const ComplexExample = () => (
34
+ <Table
35
+ columns={[
36
+ { colKey: "name", title: "姓名", width: 120 },
37
+ { colKey: "age", title: "年龄", width: 80, align: "center" },
38
+ {
39
+ colKey: "status",
40
+ title: "状态",
41
+ width: 100,
42
+ align: "center",
43
+ cell: ({ row }) => (
44
+ <span
45
+ style={{
46
+ color: row.status === "active" ? "#52c41a" : "#ff4d4f",
47
+ fontWeight: "bold"
48
+ }}
49
+ >
50
+ {row.status === "active" ? "✓ 活跃" : "✗ 非活跃"}
51
+ </span>
52
+ )
53
+ },
54
+ {
55
+ colKey: "score",
56
+ title: "分数",
57
+ width: 120,
58
+ align: "right",
59
+ cell: ({ row }) => (
60
+ <span style={{ color: row.score >= 90 ? "#1890ff" : "#666", fontWeight: "bold" }}>{row.score} 分</span>
61
+ )
62
+ },
63
+ {
64
+ colKey: "email",
65
+ title: "邮箱",
66
+ width: 200,
67
+ ellipsis: true
68
+ },
69
+ { colKey: "address", title: "地址", width: 250, ellipsis: true }
70
+ ]}
71
+ data={baseData}
72
+ bordered
73
+ stripe
74
+ hover
75
+ size="medium"
76
+ onRowClick={({ row }) => {
77
+ console.log("点击行:", row);
78
+ }}
79
+ />
80
+ );
81
+
82
+ export default ComplexExample;
@@ -0,0 +1,68 @@
1
+ import React from "react";
2
+ import Table from "../index";
3
+ import type { BaseTableCol, TableRowData } from "../type";
4
+
5
+ // 示例数据类型
6
+ interface UserData extends TableRowData {
7
+ id: number;
8
+ name: string;
9
+ age: number;
10
+ email: string;
11
+ address: string;
12
+ status: "active" | "inactive";
13
+ score: number;
14
+ }
15
+
16
+ // 基础数据
17
+ const baseData: UserData[] = [
18
+ {
19
+ id: 1,
20
+ name: "张三",
21
+ age: 25,
22
+ email: "zhangsan@example.com",
23
+ address: "北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区",
24
+ status: "active",
25
+ score: 95
26
+ },
27
+ { id: 2, name: "李四", age: 30, email: "lisi@example.com", address: "上海市浦东新区", status: "active", score: 88 },
28
+ { id: 3, name: "王五", age: 28, email: "wangwu@example.com", address: "广州市天河区", status: "inactive", score: 92 },
29
+ { id: 4, name: "赵六", age: 35, email: "zhaoliu@example.com", address: "深圳市南山区", status: "active", score: 87 },
30
+ { id: 5, name: "钱七", age: 22, email: "qianqi@example.com", address: "杭州市西湖区", status: "inactive", score: 90 }
31
+ ];
32
+
33
+ const CustomCellExample = () => (
34
+ <Table
35
+ columns={[
36
+ { colKey: "name", title: "姓名", width: 120 },
37
+ {
38
+ colKey: "status",
39
+ title: "状态",
40
+ width: 100,
41
+ align: "center",
42
+ cell: ({ row }) => (
43
+ <span
44
+ style={{
45
+ color: row.status === "active" ? "#52c41a" : "#ff4d4f",
46
+ fontWeight: "bold"
47
+ }}
48
+ >
49
+ {row.status === "active" ? "活跃" : "非活跃"}
50
+ </span>
51
+ )
52
+ },
53
+ {
54
+ colKey: "score",
55
+ title: "分数",
56
+ width: 100,
57
+ align: "center",
58
+ cell: ({ row }) => <span style={{ color: row.score >= 90 ? "#1890ff" : "#666" }}>{row.score}</span>
59
+ },
60
+ { colKey: "email", title: "邮箱", width: 240 },
61
+ { colKey: "address", title: "地址" }
62
+ ]}
63
+ data={baseData}
64
+ bordered
65
+ />
66
+ );
67
+
68
+ export default CustomCellExample;
@@ -0,0 +1,37 @@
1
+ import React from "react";
2
+ import Table from "../index";
3
+ import type { BaseTableCol, TableRowData } from "../type";
4
+
5
+ // 示例数据类型
6
+ interface UserData extends TableRowData {
7
+ id: number;
8
+ name: string;
9
+ age: number;
10
+ email: string;
11
+ address: string;
12
+ status: "active" | "inactive";
13
+ score: number;
14
+ }
15
+
16
+ // 基础数据
17
+ const baseColumns: BaseTableCol<UserData>[] = [
18
+ { colKey: "name", title: "姓名", width: 120 },
19
+ { colKey: "age", title: "年龄", width: 80, align: "center" },
20
+ { colKey: "email", title: "邮箱", width: 240 },
21
+ { colKey: "address", title: "地址" }
22
+ ];
23
+
24
+ const CustomEmptyExample = () => (
25
+ <Table
26
+ columns={baseColumns}
27
+ data={[]}
28
+ empty={
29
+ <div style={{ padding: "40px", textAlign: "center", color: "#999" }}>
30
+ <div style={{ fontSize: "48px", marginBottom: "16px" }}>📭</div>
31
+ <div>暂无数据,请稍后再试</div>
32
+ </div>
33
+ }
34
+ />
35
+ );
36
+
37
+ export default CustomEmptyExample;