@superad/ui 0.1.1

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 (343) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +42 -0
  3. package/es/Button/Button.d.mts +7 -0
  4. package/es/Button/Button.mjs +29 -0
  5. package/es/Button/Button.mjs.map +1 -0
  6. package/es/Button/index.d.mts +3 -0
  7. package/es/Button/index.d.ts +1 -0
  8. package/es/Button/index.js +1 -0
  9. package/es/Button/index.mjs +2 -0
  10. package/es/Button/style.mjs +33 -0
  11. package/es/Button/style.mjs.map +1 -0
  12. package/es/Button/type.d.mts +21 -0
  13. package/es/ConfigProvider/index.d.mts +9 -0
  14. package/es/ConfigProvider/index.d.ts +1 -0
  15. package/es/ConfigProvider/index.js +1 -0
  16. package/es/ConfigProvider/index.mjs +82 -0
  17. package/es/ConfigProvider/index.mjs.map +1 -0
  18. package/es/ConfigProvider/type.d.mts +24 -0
  19. package/es/DraggablePanel/DraggablePanel.d.mts +6 -0
  20. package/es/DraggablePanel/DraggablePanel.mjs +104 -0
  21. package/es/DraggablePanel/DraggablePanel.mjs.map +1 -0
  22. package/es/DraggablePanel/index.d.mts +3 -0
  23. package/es/DraggablePanel/index.d.ts +1 -0
  24. package/es/DraggablePanel/index.js +1 -0
  25. package/es/DraggablePanel/index.mjs +3 -0
  26. package/es/DraggablePanel/style.mjs +86 -0
  27. package/es/DraggablePanel/style.mjs.map +1 -0
  28. package/es/DraggablePanel/type.d.mts +27 -0
  29. package/es/Flex/Center.d.mts +7 -0
  30. package/es/Flex/Center.mjs +14 -0
  31. package/es/Flex/Center.mjs.map +1 -0
  32. package/es/Flex/FlexBasic.d.mts +6 -0
  33. package/es/Flex/FlexBasic.mjs +46 -0
  34. package/es/Flex/FlexBasic.mjs.map +1 -0
  35. package/es/Flex/Flexbox.d.mts +2 -0
  36. package/es/Flex/index.d.mts +5 -0
  37. package/es/Flex/index.d.ts +1 -0
  38. package/es/Flex/index.js +1 -0
  39. package/es/Flex/index.mjs +3 -0
  40. package/es/Flex/type.d.mts +35 -0
  41. package/es/Flex/utils.mjs +24 -0
  42. package/es/Flex/utils.mjs.map +1 -0
  43. package/es/FontLoader/index.d.mts +9 -0
  44. package/es/FontLoader/index.d.ts +1 -0
  45. package/es/FontLoader/index.js +1 -0
  46. package/es/FontLoader/index.mjs +23 -0
  47. package/es/FontLoader/index.mjs.map +1 -0
  48. package/es/GlobalFocusRing/index.d.mts +6 -0
  49. package/es/GlobalFocusRing/index.d.ts +1 -0
  50. package/es/GlobalFocusRing/index.js +1 -0
  51. package/es/GlobalFocusRing/index.mjs +204 -0
  52. package/es/GlobalFocusRing/index.mjs.map +1 -0
  53. package/es/GlobalFocusRing/style.mjs +35 -0
  54. package/es/GlobalFocusRing/style.mjs.map +1 -0
  55. package/es/Provider.d.mts +5 -0
  56. package/es/Table/canvas/canvasPalette.mjs +11 -0
  57. package/es/Table/canvas/canvasPalette.mjs.map +1 -0
  58. package/es/Table/canvas/chipPainters.mjs +408 -0
  59. package/es/Table/canvas/chipPainters.mjs.map +1 -0
  60. package/es/Table/canvas/controlPainters.mjs +193 -0
  61. package/es/Table/canvas/controlPainters.mjs.map +1 -0
  62. package/es/Table/canvas/groupTitle.mjs +181 -0
  63. package/es/Table/canvas/groupTitle.mjs.map +1 -0
  64. package/es/Table/canvas/paintUtils.mjs +70 -0
  65. package/es/Table/canvas/paintUtils.mjs.map +1 -0
  66. package/es/Table/canvas/rowSeries.mjs +130 -0
  67. package/es/Table/canvas/rowSeries.mjs.map +1 -0
  68. package/es/Table/canvas/textPainters.mjs +97 -0
  69. package/es/Table/canvas/textPainters.mjs.map +1 -0
  70. package/es/Table/canvas/theme.d.mts +14 -0
  71. package/es/Table/canvas/theme.mjs +276 -0
  72. package/es/Table/canvas/theme.mjs.map +1 -0
  73. package/es/Table/core/cellValue.d.mts +1 -0
  74. package/es/Table/core/cellValue.mjs +240 -0
  75. package/es/Table/core/cellValue.mjs.map +1 -0
  76. package/es/Table/core/rowSelection.mjs +138 -0
  77. package/es/Table/core/rowSelection.mjs.map +1 -0
  78. package/es/Table/core/size.mjs +60 -0
  79. package/es/Table/core/size.mjs.map +1 -0
  80. package/es/Table/core/tableI18n.d.mts +11 -0
  81. package/es/Table/core/tableI18n.mjs +123 -0
  82. package/es/Table/core/tableI18n.mjs.map +1 -0
  83. package/es/Table/core/tagTone.mjs +245 -0
  84. package/es/Table/core/tagTone.mjs.map +1 -0
  85. package/es/Table/core/zIndex.mjs +7 -0
  86. package/es/Table/core/zIndex.mjs.map +1 -0
  87. package/es/Table/index.d.mts +6 -0
  88. package/es/Table/index.d.ts +1 -0
  89. package/es/Table/index.js +1 -0
  90. package/es/Table/index.mjs +6 -0
  91. package/es/Table/react/Table.d.mts +9 -0
  92. package/es/Table/react/Table.mjs +407 -0
  93. package/es/Table/react/Table.mjs.map +1 -0
  94. package/es/Table/react/TableColumnSettings.mjs +65 -0
  95. package/es/Table/react/TableColumnSettings.mjs.map +1 -0
  96. package/es/Table/react/a11y.mjs +72 -0
  97. package/es/Table/react/a11y.mjs.map +1 -0
  98. package/es/Table/react/editors/base.mjs +427 -0
  99. package/es/Table/react/editors/base.mjs.map +1 -0
  100. package/es/Table/react/editors/inline.mjs +225 -0
  101. package/es/Table/react/editors/inline.mjs.map +1 -0
  102. package/es/Table/react/editors/picker.mjs +368 -0
  103. package/es/Table/react/editors/picker.mjs.map +1 -0
  104. package/es/Table/react/overlayChips.mjs +50 -0
  105. package/es/Table/react/overlayChips.mjs.map +1 -0
  106. package/es/Table/react/sameRenderInputs.mjs +50 -0
  107. package/es/Table/react/sameRenderInputs.mjs.map +1 -0
  108. package/es/Table/react/style.mjs +650 -0
  109. package/es/Table/react/style.mjs.map +1 -0
  110. package/es/Table/react/useTableCellEvents.mjs +32 -0
  111. package/es/Table/react/useTableCellEvents.mjs.map +1 -0
  112. package/es/Table/react/useTableColumnSettings.mjs +107 -0
  113. package/es/Table/react/useTableColumnSettings.mjs.map +1 -0
  114. package/es/Table/react/useTableEditorSync.mjs +41 -0
  115. package/es/Table/react/useTableEditorSync.mjs.map +1 -0
  116. package/es/Table/react/useTableHoverHint.mjs +62 -0
  117. package/es/Table/react/useTableHoverHint.mjs.map +1 -0
  118. package/es/Table/react/useTableKeyboard.mjs +41 -0
  119. package/es/Table/react/useTableKeyboard.mjs.map +1 -0
  120. package/es/Table/react/useTableRenderState.mjs +194 -0
  121. package/es/Table/react/useTableRenderState.mjs.map +1 -0
  122. package/es/Table/react/useTableScroll.mjs +33 -0
  123. package/es/Table/react/useTableScroll.mjs.map +1 -0
  124. package/es/Table/react/useTableSelectionInfo.mjs +48 -0
  125. package/es/Table/react/useTableSelectionInfo.mjs.map +1 -0
  126. package/es/Table/react/useTableVTableEvents.mjs +132 -0
  127. package/es/Table/react/useTableVTableEvents.mjs.map +1 -0
  128. package/es/Table/type.d.mts +279 -0
  129. package/es/Table/type.mjs +34 -0
  130. package/es/Table/type.mjs.map +1 -0
  131. package/es/Table/vtable/columns.d.mts +17 -0
  132. package/es/Table/vtable/columns.mjs +381 -0
  133. package/es/Table/vtable/columns.mjs.map +1 -0
  134. package/es/Table/vtable/frozenShadow.mjs +27 -0
  135. package/es/Table/vtable/frozenShadow.mjs.map +1 -0
  136. package/es/Table/vtable/interaction.mjs +175 -0
  137. package/es/Table/vtable/interaction.mjs.map +1 -0
  138. package/es/Table/vtable/option.d.mts +39 -0
  139. package/es/Table/vtable/option.mjs +232 -0
  140. package/es/Table/vtable/option.mjs.map +1 -0
  141. package/es/Table/vtable/seriesSelection.mjs +374 -0
  142. package/es/Table/vtable/seriesSelection.mjs.map +1 -0
  143. package/es/Table/vtable/vtableAdapter.mjs +96 -0
  144. package/es/Table/vtable/vtableAdapter.mjs.map +1 -0
  145. package/es/ThemeProvider/AppElementContext.d.mts +5 -0
  146. package/es/ThemeProvider/AppElementContext.mjs +10 -0
  147. package/es/ThemeProvider/AppElementContext.mjs.map +1 -0
  148. package/es/ThemeProvider/ConfigProvider.mjs +29 -0
  149. package/es/ThemeProvider/ConfigProvider.mjs.map +1 -0
  150. package/es/ThemeProvider/GlobalStyle/antdOverride.mjs +73 -0
  151. package/es/ThemeProvider/GlobalStyle/antdOverride.mjs.map +1 -0
  152. package/es/ThemeProvider/GlobalStyle/essential.mjs +50 -0
  153. package/es/ThemeProvider/GlobalStyle/essential.mjs.map +1 -0
  154. package/es/ThemeProvider/GlobalStyle/global.mjs +90 -0
  155. package/es/ThemeProvider/GlobalStyle/global.mjs.map +1 -0
  156. package/es/ThemeProvider/GlobalStyle/index.mjs +14 -0
  157. package/es/ThemeProvider/GlobalStyle/index.mjs.map +1 -0
  158. package/es/ThemeProvider/Meta.d.mts +7 -0
  159. package/es/ThemeProvider/Meta.mjs +48 -0
  160. package/es/ThemeProvider/Meta.mjs.map +1 -0
  161. package/es/ThemeProvider/ThemeProvider.d.mts +6 -0
  162. package/es/ThemeProvider/ThemeProvider.mjs +89 -0
  163. package/es/ThemeProvider/ThemeProvider.mjs.map +1 -0
  164. package/es/ThemeProvider/constants.d.mts +5 -0
  165. package/es/ThemeProvider/constants.mjs +6 -0
  166. package/es/ThemeProvider/constants.mjs.map +1 -0
  167. package/es/ThemeProvider/index.d.mts +6 -0
  168. package/es/ThemeProvider/index.d.ts +1 -0
  169. package/es/ThemeProvider/index.js +1 -0
  170. package/es/ThemeProvider/index.mjs +5 -0
  171. package/es/ThemeProvider/type.d.mts +48 -0
  172. package/es/_virtual/_rolldown/runtime.mjs +13 -0
  173. package/es/color/colors/blue.d.mts +6 -0
  174. package/es/color/colors/blue.mjs +67 -0
  175. package/es/color/colors/blue.mjs.map +1 -0
  176. package/es/color/colors/cyan.d.mts +6 -0
  177. package/es/color/colors/cyan.mjs +67 -0
  178. package/es/color/colors/cyan.mjs.map +1 -0
  179. package/es/color/colors/geekblue.d.mts +6 -0
  180. package/es/color/colors/geekblue.mjs +67 -0
  181. package/es/color/colors/geekblue.mjs.map +1 -0
  182. package/es/color/colors/gold.d.mts +6 -0
  183. package/es/color/colors/gold.mjs +67 -0
  184. package/es/color/colors/gold.mjs.map +1 -0
  185. package/es/color/colors/gray.d.mts +6 -0
  186. package/es/color/colors/gray.mjs +67 -0
  187. package/es/color/colors/gray.mjs.map +1 -0
  188. package/es/color/colors/green.d.mts +6 -0
  189. package/es/color/colors/green.mjs +67 -0
  190. package/es/color/colors/green.mjs.map +1 -0
  191. package/es/color/colors/index.d.mts +22 -0
  192. package/es/color/colors/index.mjs +35 -0
  193. package/es/color/colors/index.mjs.map +1 -0
  194. package/es/color/colors/lime.d.mts +6 -0
  195. package/es/color/colors/lime.mjs +67 -0
  196. package/es/color/colors/lime.mjs.map +1 -0
  197. package/es/color/colors/magenta.d.mts +6 -0
  198. package/es/color/colors/magenta.mjs +67 -0
  199. package/es/color/colors/magenta.mjs.map +1 -0
  200. package/es/color/colors/orange.d.mts +6 -0
  201. package/es/color/colors/orange.mjs +67 -0
  202. package/es/color/colors/orange.mjs.map +1 -0
  203. package/es/color/colors/primary.d.mts +6 -0
  204. package/es/color/colors/primary.mjs +67 -0
  205. package/es/color/colors/primary.mjs.map +1 -0
  206. package/es/color/colors/purple.d.mts +6 -0
  207. package/es/color/colors/purple.mjs +67 -0
  208. package/es/color/colors/purple.mjs.map +1 -0
  209. package/es/color/colors/red.d.mts +6 -0
  210. package/es/color/colors/red.mjs +67 -0
  211. package/es/color/colors/red.mjs.map +1 -0
  212. package/es/color/colors/volcano.d.mts +6 -0
  213. package/es/color/colors/volcano.mjs +67 -0
  214. package/es/color/colors/volcano.mjs.map +1 -0
  215. package/es/color/colors/yellow.d.mts +6 -0
  216. package/es/color/colors/yellow.mjs +67 -0
  217. package/es/color/colors/yellow.mjs.map +1 -0
  218. package/es/color/index.d.mts +23 -0
  219. package/es/color/index.d.ts +1 -0
  220. package/es/color/index.js +1 -0
  221. package/es/color/index.mjs +22 -0
  222. package/es/color/neutrals/index.d.mts +13 -0
  223. package/es/color/neutrals/index.mjs +17 -0
  224. package/es/color/neutrals/index.mjs.map +1 -0
  225. package/es/color/neutrals/mauve.d.mts +6 -0
  226. package/es/color/neutrals/mauve.mjs +67 -0
  227. package/es/color/neutrals/mauve.mjs.map +1 -0
  228. package/es/color/neutrals/olive.d.mts +6 -0
  229. package/es/color/neutrals/olive.mjs +67 -0
  230. package/es/color/neutrals/olive.mjs.map +1 -0
  231. package/es/color/neutrals/sage.d.mts +6 -0
  232. package/es/color/neutrals/sage.mjs +67 -0
  233. package/es/color/neutrals/sage.mjs.map +1 -0
  234. package/es/color/neutrals/sand.d.mts +6 -0
  235. package/es/color/neutrals/sand.mjs +67 -0
  236. package/es/color/neutrals/sand.mjs.map +1 -0
  237. package/es/color/neutrals/slate.d.mts +6 -0
  238. package/es/color/neutrals/slate.mjs +67 -0
  239. package/es/color/neutrals/slate.mjs.map +1 -0
  240. package/es/color/types.d.mts +16 -0
  241. package/es/eslint/index.d.mts +26 -0
  242. package/es/eslint/index.d.ts +1 -0
  243. package/es/eslint/index.js +1 -0
  244. package/es/eslint/index.mjs +11 -0
  245. package/es/eslint/index.mjs.map +1 -0
  246. package/es/hooks/useIsClient.d.mts +8 -0
  247. package/es/hooks/useIsClient.mjs +13 -0
  248. package/es/hooks/useIsClient.mjs.map +1 -0
  249. package/es/i18n/context.d.mts +7 -0
  250. package/es/i18n/context.mjs +16 -0
  251. package/es/i18n/context.mjs.map +1 -0
  252. package/es/i18n/index.d.mts +6 -0
  253. package/es/i18n/index.d.ts +1 -0
  254. package/es/i18n/index.js +1 -0
  255. package/es/i18n/index.mjs +5 -0
  256. package/es/i18n/resources/en/common.d.mts +35 -0
  257. package/es/i18n/resources/en/common.mjs +36 -0
  258. package/es/i18n/resources/en/common.mjs.map +1 -0
  259. package/es/i18n/resources/en/index.d.mts +7 -0
  260. package/es/i18n/resources/en/index.mjs +8 -0
  261. package/es/i18n/resources/en/index.mjs.map +1 -0
  262. package/es/i18n/resources/zhCn/common.d.mts +35 -0
  263. package/es/i18n/resources/zhCn/common.mjs +36 -0
  264. package/es/i18n/resources/zhCn/common.mjs.map +1 -0
  265. package/es/i18n/resources/zhCn/index.d.mts +7 -0
  266. package/es/i18n/resources/zhCn/index.mjs +8 -0
  267. package/es/i18n/resources/zhCn/index.mjs.map +1 -0
  268. package/es/i18n/types.d.mts +22 -0
  269. package/es/i18n/useTranslation.d.mts +12 -0
  270. package/es/i18n/useTranslation.mjs +22 -0
  271. package/es/i18n/useTranslation.mjs.map +1 -0
  272. package/es/index.d.mts +43 -0
  273. package/es/index.mjs +26 -0
  274. package/es/storybook/StoryBook/StoryBook.d.mts +7 -0
  275. package/es/storybook/StoryBook/StoryBook.mjs +52 -0
  276. package/es/storybook/StoryBook/StoryBook.mjs.map +1 -0
  277. package/es/storybook/StoryBook/index.d.mts +3 -0
  278. package/es/storybook/StoryBook/style.mjs +97 -0
  279. package/es/storybook/StoryBook/style.mjs.map +1 -0
  280. package/es/storybook/StoryBook/type.d.mts +13 -0
  281. package/es/storybook/index.d.mts +4 -0
  282. package/es/storybook/index.d.ts +1 -0
  283. package/es/storybook/index.js +1 -0
  284. package/es/storybook/index.mjs +2 -0
  285. package/es/styles/classNames.d.mts +11 -0
  286. package/es/styles/classNames.mjs +12 -0
  287. package/es/styles/classNames.mjs.map +1 -0
  288. package/es/styles/customTheme.d.mts +36 -0
  289. package/es/styles/customTheme.mjs +71 -0
  290. package/es/styles/customTheme.mjs.map +1 -0
  291. package/es/styles/index.d.mts +6 -0
  292. package/es/styles/index.d.ts +1 -0
  293. package/es/styles/index.js +1 -0
  294. package/es/styles/index.mjs +6 -0
  295. package/es/styles/theme/algorithms/darkAlgorithm.mjs +18 -0
  296. package/es/styles/theme/algorithms/darkAlgorithm.mjs.map +1 -0
  297. package/es/styles/theme/algorithms/lightAlgorithm.mjs +18 -0
  298. package/es/styles/theme/algorithms/lightAlgorithm.mjs.map +1 -0
  299. package/es/styles/theme/algorithms/resolveScales.mjs +25 -0
  300. package/es/styles/theme/algorithms/resolveScales.mjs.map +1 -0
  301. package/es/styles/theme/antdTheme.mjs +31 -0
  302. package/es/styles/theme/antdTheme.mjs.map +1 -0
  303. package/es/styles/theme/customStylish.d.mts +7 -0
  304. package/es/styles/theme/customStylish.mjs +158 -0
  305. package/es/styles/theme/customStylish.mjs.map +1 -0
  306. package/es/styles/theme/customStylishStatic.d.mts +6 -0
  307. package/es/styles/theme/customStylishStatic.mjs +156 -0
  308. package/es/styles/theme/customStylishStatic.mjs.map +1 -0
  309. package/es/styles/theme/customToken.d.mts +7 -0
  310. package/es/styles/theme/customToken.mjs +127 -0
  311. package/es/styles/theme/customToken.mjs.map +1 -0
  312. package/es/styles/theme/generateColorPalette.d.mts +16 -0
  313. package/es/styles/theme/generateColorPalette.mjs +170 -0
  314. package/es/styles/theme/generateColorPalette.mjs.map +1 -0
  315. package/es/styles/theme/token/base.mjs +64 -0
  316. package/es/styles/theme/token/base.mjs.map +1 -0
  317. package/es/styles/theme/token/dark.mjs +37 -0
  318. package/es/styles/theme/token/dark.mjs.map +1 -0
  319. package/es/styles/theme/token/light.mjs +37 -0
  320. package/es/styles/theme/token/light.mjs.map +1 -0
  321. package/es/types/customStylish.d.mts +28 -0
  322. package/es/types/customToken.d.mts +34 -0
  323. package/es/types/customToken.mjs +32 -0
  324. package/es/types/customToken.mjs.map +1 -0
  325. package/es/types/index.d.mts +15 -0
  326. package/es/types/index.d.ts +1 -0
  327. package/es/types/index.js +1 -0
  328. package/es/types/index.mjs +2 -0
  329. package/es/utils/composeEventHandlers.d.mts +5 -0
  330. package/es/utils/composeEventHandlers.mjs +10 -0
  331. package/es/utils/composeEventHandlers.mjs.map +1 -0
  332. package/es/utils/copyToClipboard.d.mts +5 -0
  333. package/es/utils/copyToClipboard.mjs +28 -0
  334. package/es/utils/copyToClipboard.mjs.map +1 -0
  335. package/es/utils/dom.d.mts +15 -0
  336. package/es/utils/dom.mjs +16 -0
  337. package/es/utils/dom.mjs.map +1 -0
  338. package/es/utils/genCdnUrl.d.mts +12 -0
  339. package/es/utils/genCdnUrl.mjs +17 -0
  340. package/es/utils/genCdnUrl.mjs.map +1 -0
  341. package/es/utils/safeReadableColor.mjs +6 -0
  342. package/es/utils/safeReadableColor.mjs.map +1 -0
  343. package/package.json +96 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tagTone.mjs","names":[],"sources":["../../../src/Table/core/tagTone.ts"],"sourcesContent":["/**\n * SuperAd Table light-theme status and tag text/background pairs.\n *\n * Names are kept for API compatibility, but the rendered palette follows the\n * Tailwind / SuperAd status colors used by the Figma table design.\n */\nexport const TABLE_TAG_TONES = {\n amber: { bg: '#FFF7ED', color: '#EA580C' },\n blue: { bg: '#EFF6FF', color: '#1F5EFF' },\n bronze: { bg: '#F5F5F4', color: '#78716C' },\n brown: { bg: '#F5F5F4', color: '#78716C' },\n crimson: { bg: '#FFF1F2', color: '#E11D48' },\n cyan: { bg: '#ECFEFF', color: '#0891B2' },\n gold: { bg: '#FEFCE8', color: '#CA8A04' },\n grass: { bg: '#F7FEE7', color: '#65A30D' },\n gray: { bg: '#FFFFFF', border: '#E4E4E7', color: '#52525B' },\n green: { bg: '#F0FDF4', color: '#16A34A' },\n iris: { bg: '#EEF2FF', color: '#4F46E5' },\n jade: { bg: '#ECFDF5', color: '#059669' },\n lime: { bg: '#F7FEE7', color: '#65A30D' },\n mint: { bg: '#F0FDFA', color: '#0D9488' },\n orange: { bg: '#FFF7ED', color: '#EA580C' },\n pink: { bg: '#FDF2F8', color: '#DB2777' },\n plum: { bg: '#FAF5FF', color: '#9333EA' },\n purple: { bg: '#FAF5FF', color: '#9333EA' },\n red: { bg: '#FEF2F2', color: '#DC2626' },\n ruby: { bg: '#FFF1F2', color: '#E11D48' },\n sky: { bg: '#F0F9FF', color: '#0284C7' },\n tomato: { bg: '#FEF2F2', color: '#DC2626' },\n turquoise: { bg: '#F0FDFA', color: '#0D9488' },\n violet: { bg: '#F5F3FF', color: '#7C3AED' },\n yellow: { bg: '#FEFCE8', color: '#CA8A04' },\n} as const;\n\nexport type TableTagColor = keyof typeof TABLE_TAG_TONES;\n\nexport interface CellTone {\n bg: string;\n border?: string;\n color: string;\n}\n\nexport interface Rgb {\n b: number;\n g: number;\n r: number;\n}\n\nconst TAG_TONE_LIST = Object.values(TABLE_TAG_TONES);\n\nexport const parseHex = (value: string): Rgb | undefined => {\n const hex = value.trim().replace(/^#/, '');\n const full =\n hex.length === 3\n ? hex\n .split('')\n .map((part) => part + part)\n .join('')\n : hex;\n if (!/^[\\da-fA-F]{6}$/.test(full)) return undefined;\n return {\n b: Number.parseInt(full.slice(4, 6), 16),\n g: Number.parseInt(full.slice(2, 4), 16),\n r: Number.parseInt(full.slice(0, 2), 16),\n };\n};\n\nconst withAlpha = (color: string, alpha: number): string => {\n const rgb = parseHex(color);\n return rgb ? `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})` : color;\n};\n\n/** WCAG 2.x 相对亮度。 */\nexport const relativeLuminance = ({ b, g, r }: Rgb): number => {\n const channel = (value: number): number => {\n const ratio = value / 255;\n return ratio <= 0.03928 ? ratio / 12.92 : ((ratio + 0.055) / 1.055) ** 2.4;\n };\n return 0.2126 * channel(r) + 0.7152 * channel(g) + 0.0722 * channel(b);\n};\n\n/** WCAG 2.x 对比度,1:1 – 21:1。 */\nexport const contrastRatio = (a: Rgb, b: Rgb): number => {\n const first = relativeLuminance(a);\n const second = relativeLuminance(b);\n const lighter = Math.max(first, second);\n const darker = Math.min(first, second);\n return (lighter + 0.05) / (darker + 0.05);\n};\n\n/** 把半透明色叠在底色上,得到实际看到的颜色。 */\nexport const compositeOver = (color: Rgb, alpha: number, base: Rgb): Rgb => ({\n b: alpha * color.b + (1 - alpha) * base.b,\n g: alpha * color.g + (1 - alpha) * base.g,\n r: alpha * color.r + (1 - alpha) * base.r,\n});\n\nconst mixWithBlack = ({ b, g, r }: Rgb, ratio: number): Rgb => ({\n b: b * (1 - ratio),\n g: g * (1 - ratio),\n r: r * (1 - ratio),\n});\n\n/**\n * 把前景色往**背景的反方向**调,直到对比度达到 AA 正文门槛:暗底提亮、亮底压暗。\n *\n * 逐档试探而不是一步到位:各 tone 的起点亮度差很多,固定比例会让本来就亮的过曝、暗的仍不达标。\n * 这替代了原先「直接用调色板里的 600 级色值」的做法 —— 那套色值两边都不达标(暗底上 2.6–3.8:1,\n * 浅底上 gold 2.84、lime 2.98…),13px 的标签文字读不清。色调不变,只动明度。\n */\nconst readableOn = (backdrop: Rgb, color: Rgb): Rgb => {\n const lighten = relativeLuminance(backdrop) < 0.5;\n const mix = (ratio: number) =>\n lighten ? mixWithWhite(color, ratio) : mixWithBlack(color, ratio);\n\n for (let ratio = 0; ratio <= 1; ratio += 0.05) {\n const candidate = mix(ratio);\n if (contrastRatio(candidate, backdrop) >= DARK_TEXT_CONTRAST) return candidate;\n }\n return mix(1);\n};\n\nconst mixWithWhite = ({ b, g, r }: Rgb, ratio: number): Rgb => ({\n b: b + (255 - b) * ratio,\n g: g + (255 - g) * ratio,\n r: r + (255 - r) * ratio,\n});\n\nconst toHex = ({ b, g, r }: Rgb): string =>\n `#${[r, g, b].map((value) => Math.round(value).toString(16).padStart(2, '0')).join('')}`.toUpperCase();\n\n/** 暗色下 chip 底色/描边的透明度。 */\nexport const DARK_TONE_BG_ALPHA = 0.16;\nconst DARK_TONE_BORDER_ALPHA = 0.3;\n/** 正文文字(13px,非大字号)的 WCAG AA 门槛。 */\nexport const DARK_TEXT_CONTRAST = 4.5;\n\nconst nearestTagTone = (hex: string): CellTone | undefined => {\n const rgb = parseHex(hex);\n if (!rgb) return undefined;\n let best: CellTone = TABLE_TAG_TONES.gray;\n let bestDist = Number.POSITIVE_INFINITY;\n for (const tone of TAG_TONE_LIST) {\n const target = parseHex(tone.color);\n if (!target) continue;\n const dist = (rgb.r - target.r) ** 2 + (rgb.g - target.g) ** 2 + (rgb.b - target.b) ** 2;\n if (dist < bestDist) {\n best = tone;\n bestDist = dist;\n }\n }\n return best;\n};\n\n/**\n * 暗色模式下合成 chip 底色用的兜底单元格背景。调用方应传 `palette.checkboxBg`\n * (即 antd 的 `colorBgContainer`);这里只在拿不到时用 antd 暗色的默认值。\n */\nconst DARK_BASE_BG = '#141414';\n\nexport const toneFor = (key: string, color?: string, isDark = false, baseBg?: string): CellTone => {\n let tone: CellTone;\n\n if (color) {\n const named = TABLE_TAG_TONES[color.trim().toLowerCase() as TableTagColor];\n if (named) tone = named;\n else if (color.trim().toLowerCase() === 'transparent') {\n tone = { bg: 'transparent', color: TABLE_TAG_TONES.gray.color };\n } else {\n tone = nearestTagTone(color) ?? TABLE_TAG_TONES.gray;\n }\n } else {\n tone = TAG_TONE_LIST[Math.abs(hashTone(key)) % TAG_TONE_LIST.length] ?? TABLE_TAG_TONES.gray;\n }\n\n // `transparent` 没有底色可依据,保持原样。\n if (tone.bg === 'transparent') return tone;\n\n if (isDark === false) {\n // 浅色下 chip 底色是不透明的 `tone.bg`,文字就是 `tone.color`。只压暗文字,底色不动 ——\n // 改底色等于换一套品牌色。\n const background = parseHex(tone.bg);\n const foreground = parseHex(tone.color);\n if (!background || !foreground) return tone;\n // 本来就达标就原样返回:保住对象身份,也保住调色板里写的那个色值拼写。\n if (contrastRatio(foreground, background) >= DARK_TEXT_CONTRAST) return tone;\n\n return { ...tone, color: toHex(readableOn(background, foreground)) };\n }\n\n const rgb = parseHex(tone.color);\n const base = parseHex(baseBg ?? DARK_BASE_BG);\n if (!rgb || !base) return tone;\n\n // chip 底色是 tone 色的半透明叠在单元格背景上 —— 文字要按**合成后**的底色来定,\n // 不能按容器色或 tone 色本身算。\n const backdrop = compositeOver(rgb, DARK_TONE_BG_ALPHA, base);\n\n return {\n bg: withAlpha(tone.color, DARK_TONE_BG_ALPHA),\n border: withAlpha(tone.color, DARK_TONE_BORDER_ALPHA),\n color: toHex(readableOn(backdrop, rgb)),\n };\n};\n\nconst hashTone = (value: string): number => {\n let hash = 0;\n for (let index = 0; index < value.length; index += 1) {\n hash = (hash * 31 + value.charCodeAt(index)) | 0;\n }\n return hash;\n};\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ //#region src/Table/core/zIndex.ts
2
+ const Z_EDITOR = 9998;
3
+ const Z_POPPER = 9999;
4
+ //#endregion
5
+ export { Z_EDITOR, Z_POPPER };
6
+
7
+ //# sourceMappingURL=zIndex.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zIndex.mjs","names":[],"sources":["../../../src/Table/core/zIndex.ts"],"sourcesContent":["/**\n * Table DOM overlay z-index scale.\n *\n * canvas draws all persistent content; DOM is only used for transient overlays\n * (editor, picker, menu, tooltip, drag indicator). Every overlay must use these\n * constants instead of ad-hoc numbers, and persistent content must never live in\n * a DOM layer above the canvas.\n */\nexport const Z_HOVER = 12;\nexport const Z_DRAG = 25;\nexport const Z_SELECTION_BAR = 30;\nexport const Z_COLUMN_SETTINGS = 35;\nexport const Z_MENU = 50;\nexport const Z_EDITOR = 9998;\nexport const Z_POPPER = 9999;\n"],"mappings":";AAaA,MAAa,WAAW;AACxB,MAAa,WAAW"}
@@ -0,0 +1,6 @@
1
+ import { ColumnDefine, ColumnsDefine, DEFAULT_TABLE_COLUMN_MIN_WIDTH, ListTableConstructorOptions, TABLE_CELL_MIN_WIDTH, TABLE_HEADER_HEIGHT, TABLE_ROW_HEIGHT, TableAddress, TableCellType, TableColumn, TableColumnInput, TableHover, TableProps, TableRecord, TableSelectOption, TableSize, TableTheme, TableUser } from "./type.mjs";
2
+ import { createTableTheme } from "./canvas/theme.mjs";
3
+ import Table from "./react/Table.mjs";
4
+ import { compileColumns } from "./vtable/columns.mjs";
5
+ import { createTableOption } from "./vtable/option.mjs";
6
+ export { type ColumnDefine, type ColumnsDefine, DEFAULT_TABLE_COLUMN_MIN_WIDTH, type ListTableConstructorOptions, TABLE_CELL_MIN_WIDTH, TABLE_HEADER_HEIGHT, TABLE_ROW_HEIGHT, type TableAddress, type TableCellType, type TableColumn, type TableColumnInput, type TableHover, type TableProps, type TableRecord, type TableSelectOption, type TableSize, type TableTheme, type TableUser, compileColumns, createTableOption, createTableTheme, Table as default };
@@ -0,0 +1 @@
1
+ export * from './index.d.mts';
@@ -0,0 +1 @@
1
+ export * from './index.mjs';
@@ -0,0 +1,6 @@
1
+ import { createTableTheme } from "./canvas/theme.mjs";
2
+ import { DEFAULT_TABLE_COLUMN_MIN_WIDTH, TABLE_CELL_MIN_WIDTH, TABLE_HEADER_HEIGHT, TABLE_ROW_HEIGHT } from "./type.mjs";
3
+ import { compileColumns } from "./vtable/columns.mjs";
4
+ import { createTableOption } from "./vtable/option.mjs";
5
+ import Table from "./react/Table.mjs";
6
+ export { DEFAULT_TABLE_COLUMN_MIN_WIDTH, TABLE_CELL_MIN_WIDTH, TABLE_HEADER_HEIGHT, TABLE_ROW_HEIGHT, compileColumns, createTableOption, createTableTheme, Table as default };
@@ -0,0 +1,9 @@
1
+ import { TableProps } from "../type.mjs";
2
+ //#region src/Table/react/Table.d.ts
3
+ declare const Table: {
4
+ ({ autoFillWidth, autoHeight, className, columns, editable, emptyText, frozenColCount, groupBy, groupTitleColors, groupTitleStyle, headerRowHeight, height, hover, onColumnOrderChange, onColumnVisibilityChange, onReady, option, records, ref, rowDrag, rowHeight, selectionActions, showColumnSettings, showHeader, showRowIndex, showRowSelection, showVerticalBorder, size, style, theme, tree, treeExpandLevel, treeIndent, width }: TableProps): import("react").JSX.Element;
5
+ displayName: string;
6
+ };
7
+ //#endregion
8
+ export { Table as default };
9
+ //# sourceMappingURL=Table.d.mts.map
@@ -0,0 +1,407 @@
1
+ "use client";
2
+ import common_default from "../../i18n/resources/zhCn/common.mjs";
3
+ import { useIsClient } from "../../hooks/useIsClient.mjs";
4
+ import { useTranslation } from "../../i18n/useTranslation.mjs";
5
+ import { getCanvasPalette } from "../canvas/canvasPalette.mjs";
6
+ import { formatTableMessage } from "../core/tableI18n.mjs";
7
+ import { layoutArrayChips, layoutLinkChips, layoutTagChips, layoutUserChips, resolveUserEntries, tagDurationSuffix } from "../canvas/chipPainters.mjs";
8
+ import { isTableReleased } from "../vtable/vtableAdapter.mjs";
9
+ import { applyFrozenShadow, hasFrozenColumns, shouldShowFrozenShadow } from "../vtable/frozenShadow.mjs";
10
+ import { styles } from "./style.mjs";
11
+ import { clearCascadeSelection, isCascadeSelectionTable } from "../vtable/seriesSelection.mjs";
12
+ import { removeChipAt } from "../vtable/interaction.mjs";
13
+ import { TableA11yLayer } from "./a11y.mjs";
14
+ import { TableColumnSettings } from "./TableColumnSettings.mjs";
15
+ import { useTableCellEvents } from "./useTableCellEvents.mjs";
16
+ import { useTableColumnSettings } from "./useTableColumnSettings.mjs";
17
+ import { useTableEditorSync } from "./useTableEditorSync.mjs";
18
+ import { useTableHoverHint } from "./useTableHoverHint.mjs";
19
+ import { useTableKeyboard } from "./useTableKeyboard.mjs";
20
+ import { useTableRenderState } from "./useTableRenderState.mjs";
21
+ import { useTableScroll } from "./useTableScroll.mjs";
22
+ import { useTableSelectionInfo } from "./useTableSelectionInfo.mjs";
23
+ import { useTableVTableEvents } from "./useTableVTableEvents.mjs";
24
+ import { cx } from "antd-style";
25
+ import { jsx, jsxs } from "react/jsx-runtime";
26
+ import { useEffect, useRef, useState } from "react";
27
+ import { ListTable } from "@visactor/react-vtable";
28
+ import * as ReactDOM from "react-dom/client";
29
+ //#region src/Table/react/Table.tsx
30
+ const PencilIcon = () => /* @__PURE__ */ jsxs("svg", {
31
+ fill: "none",
32
+ height: "14",
33
+ viewBox: "0 0 16 16",
34
+ width: "14",
35
+ children: [/* @__PURE__ */ jsx("path", {
36
+ d: "M11.4 2.6a1.2 1.2 0 0 1 1.7 0l.3.3a1.2 1.2 0 0 1 0 1.7L5.8 12.2 3 13l.8-2.8L11.4 2.6Z",
37
+ stroke: "currentColor",
38
+ strokeLinejoin: "round",
39
+ strokeWidth: "1.4"
40
+ }), /* @__PURE__ */ jsx("path", {
41
+ d: "m10.2 3.8 2 2",
42
+ stroke: "currentColor",
43
+ strokeLinecap: "round",
44
+ strokeWidth: "1.4"
45
+ })]
46
+ });
47
+ /**
48
+ * chip 上那颗移除 ×。用内联 SVG 而不是 `×` 字符:字符在 10px 下笔画细到发虚,与 antd
49
+ * `Tag closable` 的关闭图标对不上。`@ant-design/icons` 不在依赖里(见 `editors/base.tsx` 里
50
+ * 同款说明),一律内联。
51
+ */
52
+ const CloseIcon = () => /* @__PURE__ */ jsx("svg", {
53
+ fill: "none",
54
+ height: "10",
55
+ viewBox: "0 0 10 10",
56
+ width: "10",
57
+ children: /* @__PURE__ */ jsx("path", {
58
+ d: "M1.6 1.6 8.4 8.4M8.4 1.6 1.6 8.4",
59
+ stroke: "currentColor",
60
+ strokeLinecap: "round",
61
+ strokeWidth: "1.2"
62
+ })
63
+ });
64
+ /**
65
+ * 这一格该按哪套 chip 排布。**必须与 painter 的分派逐条对应**(`vtable/columns.ts` 里 tag 与
66
+ * select 共用 `createTagLayout`,这里也得让它们共用一套),否则浮层的 × 会落在错误的位置上。
67
+ * 没有 chip 的格返回空数组。
68
+ */
69
+ const layoutCellChips = (define, value, record, geometry) => {
70
+ const { paddingX, width } = geometry;
71
+ const packWidth = Math.max(width - 28, 1);
72
+ switch (define.superadKind) {
73
+ case "array": return layoutArrayChips({
74
+ paddingX,
75
+ value,
76
+ width: packWidth
77
+ }).boxes;
78
+ case "link": return layoutLinkChips({
79
+ kind: define.superadLinkKind ?? "link",
80
+ paddingX,
81
+ value,
82
+ width: packWidth
83
+ }).boxes;
84
+ case "select":
85
+ case "tag": {
86
+ const { width: suffixWidth } = tagDurationSuffix(record, define.superadDuration);
87
+ return layoutTagChips({
88
+ options: define.superadOptions,
89
+ paddingX,
90
+ reserve: suffixWidth,
91
+ value,
92
+ width: packWidth
93
+ }).boxes;
94
+ }
95
+ case "user": return layoutUserChips({
96
+ paddingX,
97
+ users: resolveUserEntries(value),
98
+ width: packWidth
99
+ }).boxes;
100
+ default: return [];
101
+ }
102
+ };
103
+ const Table = ({ autoFillWidth = true, autoHeight = true, className, columns, editable, emptyText, frozenColCount, groupBy, groupTitleColors, groupTitleStyle, headerRowHeight, height, hover, onColumnOrderChange, onColumnVisibilityChange, onReady, option, records, ref, rowDrag, rowHeight, selectionActions, showColumnSettings = true, showHeader, showRowIndex = false, showRowSelection = true, showVerticalBorder = false, size = "middle", style, theme, tree, treeExpandLevel, treeIndent, width = "100%" }) => {
104
+ const isClient = useIsClient();
105
+ const { t } = useTranslation(common_default);
106
+ const rootRef = useRef(null);
107
+ const tableRef = useRef(null);
108
+ const tableCleanupRef = useRef(void 0);
109
+ const [box, setBox] = useState({
110
+ height: 0,
111
+ width: 0
112
+ });
113
+ const [a11yVersion, setA11yVersion] = useState(0);
114
+ /**
115
+ * 用户折叠 / 展开之后,引擎实测的内容高度。null = 还没折叠过,容器高度按数据算。
116
+ * 写入点在 `useTableVTableEvents` 的 `onHierarchyChange`,消费点在 `useTableRenderState`。
117
+ */
118
+ const [measuredContentHeight, setMeasuredContentHeight] = useState(null);
119
+ const [resizeGuide, setResizeGuide] = useState(null);
120
+ const [selectionVersion, setSelectionVersion] = useState(0);
121
+ const { applyHint, hint, hintAtCell, setHint } = useTableHoverHint({
122
+ box,
123
+ isClient,
124
+ rootRef,
125
+ tableRef
126
+ });
127
+ const { scheduleEditorSync, syncEditorPosition } = useTableEditorSync({ tableRef });
128
+ /**
129
+ * 悬停在哪一枚 chip 上。存的是**这一格 hint 的对象身份**,不是 `col:row`:
130
+ * `applyHint` 用 `sameEditHint` 保证「同一格内指针不动」时引用不变,而离开这一格再回来会拿到
131
+ * 新对象。拿字符串比的话,回来时新格子同号的那枚会直接亮着 × —— 可指针其实没进过它。
132
+ */
133
+ const [hoveredChip, setHoveredChip] = useState(null);
134
+ /**
135
+ * 删 chip 只写记录 + 重绘画布,React 这边什么都不知道 —— 而 chip 位置是渲染时现算的,
136
+ * 不推一帧就还是删之前那几枚(按钮盖在谁身上、`aria-label` 念的是谁,两边对不上)。
137
+ * 这个计数**只用来推帧**,不参与任何计算。
138
+ */
139
+ const [, refreshChipBoxes] = useState(0);
140
+ /**
141
+ * 可移除的 chip 格(人员、标签 / 单选、数组、链接)悬停时,要在**画布已经画出来的** chip 上
142
+ * 盖一个 ×(悬停哪枚哪枚才显示),所以位置必须和 painter 用同一个 layout 函数算 —— 两边各算
143
+ * 一遍就会错位(画布的文本宽度是自算的,量不到同一份)。
144
+ *
145
+ * 这里**故意不 memo**:位置依赖记录里的值,而「在同一格里删掉一枚 chip」不会让 `hint` 变,
146
+ * 缓存下来的就是删之前那几枚 chip —— 按钮盖在谁身上、`aria-label` 念的是谁,两边对不上。
147
+ * 代价是每次重渲染重算一遍纯算术(只有悬停在可编辑格上时才跑)。
148
+ */
149
+ const chipCell = (() => {
150
+ const table = tableRef.current;
151
+ if (hint == null || table == null || isTableReleased(table)) return null;
152
+ const define = table.getBodyColumnDefine(hint.col, hint.row);
153
+ if (typeof define?.field !== "string") return null;
154
+ const record = table.getCellOriginRecord(hint.col, hint.row);
155
+ if (record == null) return null;
156
+ const boxes = layoutCellChips(define, record[define.field], record, {
157
+ paddingX: getCanvasPalette(table).paddingX,
158
+ width: hint.width
159
+ });
160
+ return boxes.length > 0 ? {
161
+ boxes,
162
+ kind: define.superadKind
163
+ } : null;
164
+ })();
165
+ const chipBoxes = chipCell?.boxes ?? null;
166
+ const chipCompact = chipCell != null && chipCell.kind !== "user";
167
+ const hoveredChipIndex = hoveredChip != null && hoveredChip.hint === hint ? hoveredChip.index : null;
168
+ const { columnEntries, columnSettingsOpen, columnSettingsRef, hiddenFields, moveColumn, orderedEntries, setColumnSettingsOpen, toggleColumnVisibility, visibleColumns } = useTableColumnSettings({
169
+ columns,
170
+ onColumnOrderChange,
171
+ onColumnVisibilityChange
172
+ });
173
+ const { mergedOption, rootStyle, stickyGroupBackground, token } = useTableRenderState({
174
+ autoFillWidth,
175
+ autoHeight,
176
+ columns: visibleColumns,
177
+ editable,
178
+ emptyText,
179
+ frozenColCount,
180
+ groupBy,
181
+ groupTitleColors,
182
+ groupTitleStyle,
183
+ headerRowHeight,
184
+ height,
185
+ hover,
186
+ measuredContentHeight,
187
+ option,
188
+ records,
189
+ rowDrag,
190
+ rowHeight,
191
+ showHeader,
192
+ showRowIndex,
193
+ showRowSelection,
194
+ showVerticalBorder,
195
+ size,
196
+ style,
197
+ tableRef,
198
+ theme,
199
+ tree,
200
+ treeExpandLevel,
201
+ treeIndent,
202
+ width
203
+ });
204
+ useEffect(() => {
205
+ applyHint(null);
206
+ setMeasuredContentHeight(null);
207
+ }, [applyHint, mergedOption]);
208
+ useEffect(() => () => {
209
+ const instance = tableRef.current;
210
+ if (instance != null && isTableReleased(instance) === false) instance.cancelEditCell?.();
211
+ tableCleanupRef.current?.();
212
+ tableCleanupRef.current = void 0;
213
+ }, []);
214
+ useEffect(() => {
215
+ const node = rootRef.current;
216
+ if (!node) return;
217
+ const update = () => setBox({
218
+ height: node.clientHeight,
219
+ width: node.clientWidth
220
+ });
221
+ update();
222
+ const observer = new ResizeObserver(update);
223
+ observer.observe(node);
224
+ return () => observer.disconnect();
225
+ }, []);
226
+ const selectedRowsInfo = useTableSelectionInfo({
227
+ selectionActions,
228
+ selectionVersion,
229
+ tableRef
230
+ });
231
+ const clearSelection = () => {
232
+ const table = tableRef.current;
233
+ if (table == null || isTableReleased(table)) return;
234
+ table.clearSelected?.();
235
+ if (isCascadeSelectionTable(table)) clearCascadeSelection(table);
236
+ setSelectionVersion((version) => version + 1);
237
+ };
238
+ const syncFrozenColumnShadow = () => {
239
+ const table = tableRef.current;
240
+ if (table == null || hasFrozenColumns(table) === false) return;
241
+ applyFrozenShadow(table, shouldShowFrozenShadow(table));
242
+ };
243
+ const handleScroll = useTableScroll({
244
+ rootRef,
245
+ setA11yVersion,
246
+ setHint,
247
+ syncEditorPosition,
248
+ syncFrozenColumnShadow,
249
+ tableRef
250
+ });
251
+ const lastRowSeriesHoverRef = useRef(null);
252
+ const { onClickCell, onMouseEnterCell, onMouseMoveCell } = useTableCellEvents({
253
+ applyHint,
254
+ hintAtCell,
255
+ lastRowSeriesHoverRef,
256
+ tableRef
257
+ });
258
+ const { onReady: handleReady } = useTableVTableEvents({
259
+ lastRowSeriesHoverRef,
260
+ onReady,
261
+ rootRef,
262
+ scheduleEditorSync,
263
+ setA11yVersion,
264
+ setMeasuredContentHeight,
265
+ setResizeGuide,
266
+ setSelectionVersion,
267
+ stickyGroupBackground,
268
+ syncFrozenColumnShadow,
269
+ tableCleanupRef,
270
+ tableRef,
271
+ token
272
+ });
273
+ const handleKeyDown = useTableKeyboard({
274
+ columnSettingsRef,
275
+ tableRef
276
+ });
277
+ return /* @__PURE__ */ jsxs("div", {
278
+ className: cx(styles.root, className),
279
+ "data-superad-table": "",
280
+ ref: rootRef,
281
+ style: rootStyle,
282
+ onKeyDownCapture: handleKeyDown,
283
+ children: [
284
+ isClient && box.width > 0 && box.height > 0 ? /* @__PURE__ */ jsx(ListTable, {
285
+ ReactDOM,
286
+ height: box.height,
287
+ option: mergedOption,
288
+ ref,
289
+ width: box.width,
290
+ onClickCell,
291
+ onMouseEnterCell,
292
+ onMouseMoveCell,
293
+ onReady: handleReady,
294
+ onScroll: handleScroll
295
+ }) : null,
296
+ isClient && tableRef.current ? /* @__PURE__ */ jsx(TableA11yLayer, {
297
+ table: tableRef.current,
298
+ version: a11yVersion
299
+ }) : null,
300
+ showColumnSettings && showHeader !== false && columnEntries.length > 0 ? /* @__PURE__ */ jsx(TableColumnSettings, {
301
+ columnEntries,
302
+ columnSettingsOpen,
303
+ columnSettingsRef,
304
+ hiddenFields,
305
+ moveColumn,
306
+ orderedEntries,
307
+ setColumnSettingsOpen,
308
+ t,
309
+ onToggleVisibility: toggleColumnVisibility
310
+ }) : null,
311
+ selectedRowsInfo.count > 0 ? /* @__PURE__ */ jsxs("div", {
312
+ className: styles.selectionBar,
313
+ "data-superad-selection-bar": "",
314
+ children: [
315
+ /* @__PURE__ */ jsx("span", {
316
+ className: styles.selectionBarLabel,
317
+ children: formatTableMessage(t("table.selectedRows"), { count: selectedRowsInfo.count.toLocaleString() })
318
+ }),
319
+ selectionActions?.(selectedRowsInfo.rows, clearSelection),
320
+ /* @__PURE__ */ jsx("button", {
321
+ className: styles.selectionBarButton,
322
+ type: "button",
323
+ onClick: clearSelection,
324
+ children: t("table.clearSelection")
325
+ })
326
+ ]
327
+ }) : null,
328
+ resizeGuide != null ? /* @__PURE__ */ jsx("div", {
329
+ className: styles.resizeGuide,
330
+ style: { left: resizeGuide }
331
+ }) : null,
332
+ hint ? /* @__PURE__ */ jsxs("div", {
333
+ className: styles.hoverFrame,
334
+ "data-superad-edit-hint": "",
335
+ style: {
336
+ height: hint.height,
337
+ left: hint.left,
338
+ top: hint.top,
339
+ width: hint.width
340
+ },
341
+ children: [/* @__PURE__ */ jsx("button", {
342
+ "aria-label": t("common.edit"),
343
+ className: styles.editButton,
344
+ type: "button",
345
+ onClick: (event) => {
346
+ event.preventDefault();
347
+ event.stopPropagation();
348
+ const table = tableRef.current;
349
+ if (!table) return;
350
+ table.startEditCell(hint.col, hint.row);
351
+ scheduleEditorSync();
352
+ applyHint(null);
353
+ },
354
+ onMouseDown: (event) => {
355
+ event.preventDefault();
356
+ event.stopPropagation();
357
+ },
358
+ children: /* @__PURE__ */ jsx(PencilIcon, {})
359
+ }), chipBoxes?.map((chip) => {
360
+ const hovered = hoveredChipIndex === chip.index;
361
+ return /* @__PURE__ */ jsx("span", {
362
+ className: styles.chipHover,
363
+ style: {
364
+ left: chip.x,
365
+ width: chip.width
366
+ },
367
+ onMouseEnter: () => setHoveredChip({
368
+ hint,
369
+ index: chip.index
370
+ }),
371
+ onClick: (event) => {
372
+ if (hovered) return;
373
+ event.preventDefault();
374
+ event.stopPropagation();
375
+ const table = tableRef.current;
376
+ if (table == null || isTableReleased(table)) return;
377
+ table.startEditCell(hint.col, hint.row);
378
+ scheduleEditorSync();
379
+ applyHint(null);
380
+ },
381
+ onMouseLeave: () => setHoveredChip((prev) => prev?.index === chip.index ? null : prev),
382
+ children: hovered ? /* @__PURE__ */ jsx("button", {
383
+ "aria-label": formatTableMessage(t("table.remove"), { label: chip.label }),
384
+ className: cx(styles.chipRemove, chipCompact && styles.chipRemoveCompact),
385
+ type: "button",
386
+ onMouseDown: (event) => event.stopPropagation(),
387
+ onClick: (event) => {
388
+ event.preventDefault();
389
+ event.stopPropagation();
390
+ const table = tableRef.current;
391
+ if (table == null || isTableReleased(table)) return;
392
+ removeChipAt(table, hint.col, hint.row, chip.index);
393
+ refreshChipBoxes((version) => version + 1);
394
+ },
395
+ children: /* @__PURE__ */ jsx(CloseIcon, {})
396
+ }) : null
397
+ }, chip.index);
398
+ })]
399
+ }) : null
400
+ ]
401
+ });
402
+ };
403
+ Table.displayName = "SuperadTable";
404
+ //#endregion
405
+ export { Table as default };
406
+
407
+ //# sourceMappingURL=Table.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Table.mjs","names":["zhCommon"],"sources":["../../../src/Table/react/Table.tsx"],"sourcesContent":["'use client';\n\nimport { ListTable } from '@visactor/react-vtable';\nimport type { ColumnDefine, ListTable as ListTableInstance } from '@visactor/vtable';\nimport { cx } from 'antd-style';\nimport { useEffect, useRef, useState } from 'react';\nimport * as ReactDOM from 'react-dom/client';\n\nimport { useIsClient } from '@/hooks/useIsClient';\nimport zhCommon from '@/i18n/resources/zhCn/common';\nimport { useTranslation } from '@/i18n/useTranslation';\n\nimport { getCanvasPalette } from '../canvas/canvasPalette';\nimport {\n type ChipBox,\n layoutArrayChips,\n layoutLinkChips,\n layoutTagChips,\n layoutUserChips,\n resolveUserEntries,\n tagDurationSuffix,\n} from '../canvas/chipPainters';\nimport { EDIT_HINT_GUTTER } from '../canvas/paintUtils';\nimport { formatTableMessage } from '../core/tableI18n';\nimport type { TableProps } from '../type';\nimport type { SuperAdCellMarkers } from '../vtable/columns';\nimport {\n applyFrozenShadow,\n type FrozenShadowTable,\n hasFrozenColumns,\n shouldShowFrozenShadow,\n} from '../vtable/frozenShadow';\nimport { type CellEditHint, removeChipAt } from '../vtable/interaction';\nimport { clearCascadeSelection, isCascadeSelectionTable } from '../vtable/seriesSelection';\nimport { isTableReleased } from '../vtable/vtableAdapter';\nimport { TableA11yLayer } from './a11y';\nimport { styles } from './style';\nimport { TableColumnSettings } from './TableColumnSettings';\nimport { useTableCellEvents } from './useTableCellEvents';\nimport { useTableColumnSettings } from './useTableColumnSettings';\nimport { useTableEditorSync } from './useTableEditorSync';\nimport { useTableHoverHint } from './useTableHoverHint';\nimport { useTableKeyboard } from './useTableKeyboard';\nimport { useTableRenderState } from './useTableRenderState';\nimport { useTableScroll } from './useTableScroll';\nimport { useTableSelectionInfo } from './useTableSelectionInfo';\nimport { useTableVTableEvents } from './useTableVTableEvents';\n\nconst PencilIcon = () => (\n <svg fill=\"none\" height=\"14\" viewBox=\"0 0 16 16\" width=\"14\">\n <path\n d=\"M11.4 2.6a1.2 1.2 0 0 1 1.7 0l.3.3a1.2 1.2 0 0 1 0 1.7L5.8 12.2 3 13l.8-2.8L11.4 2.6Z\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.4\"\n />\n <path d=\"m10.2 3.8 2 2\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeWidth=\"1.4\" />\n </svg>\n);\n\n/**\n * chip 上那颗移除 ×。用内联 SVG 而不是 `×` 字符:字符在 10px 下笔画细到发虚,与 antd\n * `Tag closable` 的关闭图标对不上。`@ant-design/icons` 不在依赖里(见 `editors/base.tsx` 里\n * 同款说明),一律内联。\n */\nconst CloseIcon = () => (\n <svg fill=\"none\" height=\"10\" viewBox=\"0 0 10 10\" width=\"10\">\n <path\n d=\"M1.6 1.6 8.4 8.4M8.4 1.6 1.6 8.4\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeWidth=\"1.2\"\n />\n </svg>\n);\n\n/**\n * 这一格该按哪套 chip 排布。**必须与 painter 的分派逐条对应**(`vtable/columns.ts` 里 tag 与\n * select 共用 `createTagLayout`,这里也得让它们共用一套),否则浮层的 × 会落在错误的位置上。\n * 没有 chip 的格返回空数组。\n */\nconst layoutCellChips = (\n define: ColumnDefine & SuperAdCellMarkers,\n value: unknown,\n record: unknown,\n geometry: { paddingX: number; width: number },\n): ChipBox[] => {\n const { paddingX, width } = geometry;\n // 悬停铅笔占右侧一条槽;与画布 `editHintGutterFor` 同源,否则 × / chip 会钻进铅笔底下。\n const packWidth = Math.max(width - EDIT_HINT_GUTTER, 1);\n\n switch (define.superadKind) {\n case 'array': {\n return layoutArrayChips({ paddingX, value, width: packWidth }).boxes;\n }\n case 'link': {\n return layoutLinkChips({\n kind: define.superadLinkKind ?? 'link',\n paddingX,\n value,\n width: packWidth,\n }).boxes;\n }\n case 'select':\n case 'tag': {\n // 时长标注会挤占打包预算 —— 与画布用同一份计算,否则 × 落在错误的 chip 上。\n const { width: suffixWidth } = tagDurationSuffix(record, define.superadDuration);\n return layoutTagChips({\n options: define.superadOptions,\n paddingX,\n reserve: suffixWidth,\n value,\n width: packWidth,\n }).boxes;\n }\n case 'user': {\n return layoutUserChips({ paddingX, users: resolveUserEntries(value), width: packWidth })\n .boxes;\n }\n default: {\n return [];\n }\n }\n};\n\nconst Table = ({\n autoFillWidth = true,\n autoHeight = true,\n className,\n columns,\n editable,\n emptyText,\n frozenColCount,\n groupBy,\n groupTitleColors,\n groupTitleStyle,\n headerRowHeight,\n height,\n hover,\n onColumnOrderChange,\n onColumnVisibilityChange,\n onReady,\n option,\n records,\n ref,\n rowDrag,\n rowHeight,\n selectionActions,\n showColumnSettings = true,\n showHeader,\n showRowIndex = false,\n showRowSelection = true,\n showVerticalBorder = false,\n size = 'middle',\n style,\n theme,\n tree,\n treeExpandLevel,\n treeIndent,\n width = '100%',\n}: TableProps) => {\n const isClient = useIsClient();\n const { t } = useTranslation(zhCommon);\n const rootRef = useRef<HTMLDivElement>(null);\n const tableRef = useRef<ListTableInstance | null>(null);\n const tableCleanupRef = useRef<(() => void) | undefined>(undefined);\n const [box, setBox] = useState({ height: 0, width: 0 });\n const [a11yVersion, setA11yVersion] = useState(0);\n /**\n * 用户折叠 / 展开之后,引擎实测的内容高度。null = 还没折叠过,容器高度按数据算。\n * 写入点在 `useTableVTableEvents` 的 `onHierarchyChange`,消费点在 `useTableRenderState`。\n */\n const [measuredContentHeight, setMeasuredContentHeight] = useState<number | null>(null);\n const [resizeGuide, setResizeGuide] = useState<number | null>(null);\n const [selectionVersion, setSelectionVersion] = useState(0);\n const { applyHint, hint, hintAtCell, setHint } = useTableHoverHint({\n box,\n isClient,\n rootRef,\n tableRef,\n });\n const { scheduleEditorSync, syncEditorPosition } = useTableEditorSync({ tableRef });\n /**\n * 悬停在哪一枚 chip 上。存的是**这一格 hint 的对象身份**,不是 `col:row`:\n * `applyHint` 用 `sameEditHint` 保证「同一格内指针不动」时引用不变,而离开这一格再回来会拿到\n * 新对象。拿字符串比的话,回来时新格子同号的那枚会直接亮着 × —— 可指针其实没进过它。\n */\n const [hoveredChip, setHoveredChip] = useState<{ hint: CellEditHint; index: number } | null>(\n null,\n );\n /**\n * 删 chip 只写记录 + 重绘画布,React 这边什么都不知道 —— 而 chip 位置是渲染时现算的,\n * 不推一帧就还是删之前那几枚(按钮盖在谁身上、`aria-label` 念的是谁,两边对不上)。\n * 这个计数**只用来推帧**,不参与任何计算。\n */\n const [, refreshChipBoxes] = useState(0);\n\n /**\n * 可移除的 chip 格(人员、标签 / 单选、数组、链接)悬停时,要在**画布已经画出来的** chip 上\n * 盖一个 ×(悬停哪枚哪枚才显示),所以位置必须和 painter 用同一个 layout 函数算 —— 两边各算\n * 一遍就会错位(画布的文本宽度是自算的,量不到同一份)。\n *\n * 这里**故意不 memo**:位置依赖记录里的值,而「在同一格里删掉一枚 chip」不会让 `hint` 变,\n * 缓存下来的就是删之前那几枚 chip —— 按钮盖在谁身上、`aria-label` 念的是谁,两边对不上。\n * 代价是每次重渲染重算一遍纯算术(只有悬停在可编辑格上时才跑)。\n */\n const chipCell = (() => {\n const table = tableRef.current;\n if (hint == null || table == null || isTableReleased(table)) return null;\n\n const define = table.getBodyColumnDefine(hint.col, hint.row) as\n (ColumnDefine & SuperAdCellMarkers) | undefined;\n if (typeof define?.field !== 'string') return null;\n\n const record = table.getCellOriginRecord(hint.col, hint.row);\n if (record == null) return null;\n\n const boxes = layoutCellChips(define, record[define.field], record, {\n paddingX: getCanvasPalette(table).paddingX,\n width: hint.width,\n });\n\n return boxes.length > 0 ? { boxes, kind: define.superadKind } : null;\n })();\n\n const chipBoxes = chipCell?.boxes ?? null;\n // 人员 chip 的留白(USER_CHIP_TRAILING 22)放得下 14px 的 ×;其余几种的右内边距是\n // CHIP_PAD(14),只容得下 12px 那版(见 `CHIP_REMOVE_ROOM`)。\n const chipCompact = chipCell != null && chipCell.kind !== 'user';\n\n const hoveredChipIndex =\n hoveredChip != null && hoveredChip.hint === hint ? hoveredChip.index : null;\n\n const {\n columnEntries,\n columnSettingsOpen,\n columnSettingsRef,\n hiddenFields,\n moveColumn,\n orderedEntries,\n setColumnSettingsOpen,\n toggleColumnVisibility,\n visibleColumns,\n } = useTableColumnSettings({ columns, onColumnOrderChange, onColumnVisibilityChange });\n const { mergedOption, rootStyle, stickyGroupBackground, token } = useTableRenderState({\n autoFillWidth,\n autoHeight,\n columns: visibleColumns,\n editable,\n emptyText,\n frozenColCount,\n groupBy,\n groupTitleColors,\n groupTitleStyle,\n headerRowHeight,\n height,\n hover,\n measuredContentHeight,\n option,\n records,\n rowDrag,\n rowHeight,\n showHeader,\n showRowIndex,\n showRowSelection,\n showVerticalBorder,\n size,\n style,\n tableRef,\n theme,\n tree,\n treeExpandLevel,\n treeIndent,\n width,\n });\n\n // 记录或列一变,悬浮框连同它带的 col/row 就过期了 —— 它只在 pointermove / scroll 时重算,\n // 否则会停在旧的像素位置,点铅笔打开的编辑目标与用户看到的行不是同一条记录。\n //\n // 引擎实测的高度同样过期:`updateOption` 会让 VTable 按新 records 重排,折叠状态跟着回到数据\n // 自带的那一份(实测:折到 12 行后 updateOption,引擎自己回到 20 行)—— 留着旧值就把上一份\n // 布局的高度带到新数据上。清掉即退回按数据算,与引擎此刻的状态一致。\n useEffect(() => {\n applyHint(null);\n /* eslint-disable-next-line @eslint-react/hooks-extra/no-direct-set-state-in-use-effect */\n setMeasuredContentHeight(null);\n }, [applyHint, mergedOption]);\n\n useEffect(\n () => () => {\n // 表被拆掉时 VTable 的 release() 不会结束正在进行的编辑(只摘自己的监听),编辑器的\n // document 捕获监听与 React root 就永久留着;之后任意一次外部 pointerdown 会走\n // completeEdit() 打到已释放的表上。父组件的 cleanup 先于 <ListTable> 跑,所以这里\n // 实例还活着,cancelEditCell 能正常收尾(走 cancelEdit → onEnd,不写值)。\n const instance = tableRef.current as\n (ListTableInstance & { cancelEditCell?: () => void }) | null;\n if (instance != null && isTableReleased(instance) === false) instance.cancelEditCell?.();\n tableCleanupRef.current?.();\n tableCleanupRef.current = undefined;\n },\n [],\n );\n\n useEffect(() => {\n const node = rootRef.current;\n if (!node) return;\n // 挂载后必须同步测一次:ResizeObserver 的首次回调要等下一帧,只靠它会让首帧按默认尺寸渲染。\n // 这是「订阅外部系统」型的 effect,setState 是它的正常用法。\n /* eslint-disable-next-line @eslint-react/hooks-extra/no-direct-set-state-in-use-effect */\n const update = () => setBox({ height: node.clientHeight, width: node.clientWidth });\n update();\n const observer = new ResizeObserver(update);\n observer.observe(node);\n return () => observer.disconnect();\n }, []);\n\n const selectedRowsInfo = useTableSelectionInfo({\n selectionActions,\n selectionVersion,\n tableRef,\n });\n\n const clearSelection = () => {\n const table = tableRef.current;\n // `release()` 之后 `internalProps` 是 null,而 `clearSelected` 第一行就读 `table.colCount`\n // —— 容器塌成 0×0 让表卸载之后,这条路上的按钮仍然点得到。与 useTableSelectionInfo /\n // a11y 那几处同一句守卫。\n if (table == null || isTableReleased(table)) return;\n\n table.clearSelected?.();\n if (isCascadeSelectionTable(table)) clearCascadeSelection(table);\n setSelectionVersion((version) => version + 1);\n };\n\n const syncFrozenColumnShadow = () => {\n const table = tableRef.current as FrozenShadowTable | null;\n if (table == null || hasFrozenColumns(table) === false) return;\n\n applyFrozenShadow(table, shouldShowFrozenShadow(table));\n };\n\n const handleScroll = useTableScroll({\n rootRef,\n setA11yVersion,\n setHint,\n syncEditorPosition,\n syncFrozenColumnShadow,\n tableRef,\n });\n\n const lastRowSeriesHoverRef = useRef<number | null>(null);\n const { onClickCell, onMouseEnterCell, onMouseMoveCell } = useTableCellEvents({\n applyHint,\n hintAtCell,\n lastRowSeriesHoverRef,\n tableRef,\n });\n const { onReady: handleReady } = useTableVTableEvents({\n lastRowSeriesHoverRef,\n onReady,\n rootRef,\n scheduleEditorSync,\n setA11yVersion,\n setMeasuredContentHeight,\n setResizeGuide,\n setSelectionVersion,\n stickyGroupBackground,\n syncFrozenColumnShadow,\n tableCleanupRef,\n tableRef,\n token,\n });\n\n const handleKeyDown = useTableKeyboard({ columnSettingsRef, tableRef });\n\n return (\n <div\n className={cx(styles.root, className)}\n data-superad-table=\"\"\n ref={rootRef}\n style={rootStyle}\n onKeyDownCapture={handleKeyDown}\n >\n {isClient && box.width > 0 && box.height > 0 ? (\n <ListTable\n ReactDOM={ReactDOM}\n height={box.height}\n option={mergedOption}\n ref={ref}\n width={box.width}\n onClickCell={onClickCell}\n onMouseEnterCell={onMouseEnterCell}\n onMouseMoveCell={onMouseMoveCell}\n onReady={handleReady}\n onScroll={handleScroll}\n />\n ) : null}\n {isClient && tableRef.current ? (\n <TableA11yLayer table={tableRef.current} version={a11yVersion} />\n ) : null}\n {showColumnSettings && showHeader !== false && columnEntries.length > 0 ? (\n <TableColumnSettings\n columnEntries={columnEntries}\n columnSettingsOpen={columnSettingsOpen}\n columnSettingsRef={columnSettingsRef}\n hiddenFields={hiddenFields}\n moveColumn={moveColumn}\n orderedEntries={orderedEntries}\n setColumnSettingsOpen={setColumnSettingsOpen}\n t={t}\n onToggleVisibility={toggleColumnVisibility}\n />\n ) : null}\n {selectedRowsInfo.count > 0 ? (\n <div className={styles.selectionBar} data-superad-selection-bar=\"\">\n <span className={styles.selectionBarLabel}>\n {formatTableMessage(t('table.selectedRows'), {\n count: selectedRowsInfo.count.toLocaleString(),\n })}\n </span>\n {selectionActions?.(selectedRowsInfo.rows, clearSelection)}\n <button className={styles.selectionBarButton} type=\"button\" onClick={clearSelection}>\n {t('table.clearSelection')}\n </button>\n </div>\n ) : null}\n {resizeGuide != null ? (\n <div className={styles.resizeGuide} style={{ left: resizeGuide }} />\n ) : null}\n {hint ? (\n <div\n className={styles.hoverFrame}\n data-superad-edit-hint=\"\"\n style={{ height: hint.height, left: hint.left, top: hint.top, width: hint.width }}\n >\n <button\n aria-label={t('common.edit')}\n className={styles.editButton}\n type=\"button\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n const table = tableRef.current;\n if (!table) return;\n table.startEditCell(hint.col, hint.row);\n scheduleEditorSync();\n applyHint(null);\n }}\n onMouseDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n >\n <PencilIcon />\n </button>\n {chipBoxes?.map((chip) => {\n const hovered = hoveredChipIndex === chip.index;\n\n return (\n <span\n className={styles.chipHover}\n key={chip.index}\n style={{ left: chip.x, width: chip.width }}\n onMouseEnter={() => setHoveredChip({ hint, index: chip.index })}\n onClick={(event) => {\n // 点 chip 本身 = 点单元格,照常进编辑 —— 这层浮层盖在画布上,不转发的话\n // 「点人名改这一格」会忽然失灵。点在 × 上时不进编辑(按钮自己会拦)。\n if (hovered) return;\n event.preventDefault();\n event.stopPropagation();\n const table = tableRef.current;\n if (table == null || isTableReleased(table)) return;\n table.startEditCell(hint.col, hint.row);\n scheduleEditorSync();\n applyHint(null);\n }}\n onMouseLeave={() =>\n setHoveredChip((prev) => (prev?.index === chip.index ? null : prev))\n }\n >\n {hovered ? (\n <button\n aria-label={formatTableMessage(t('table.remove'), { label: chip.label })}\n className={cx(styles.chipRemove, chipCompact && styles.chipRemoveCompact)}\n type=\"button\"\n onMouseDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n const table = tableRef.current;\n if (table == null || isTableReleased(table)) return;\n // **不清 hoveredChip**:删掉之后后面的 chip 会顶到这一格,指针底下正好换成\n // 下一枚的 × —— 与浏览器里删 tag 的观感一致(连着点就是连着删)。\n removeChipAt(table, hint.col, hint.row, chip.index);\n refreshChipBoxes((version) => version + 1);\n }}\n >\n <CloseIcon />\n </button>\n ) : null}\n </span>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n};\n\nTable.displayName = 'SuperadTable';\n\nexport default Table;\n"],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ "use client";
2
+ import { formatTableMessage } from "../core/tableI18n.mjs";
3
+ import { styles } from "./style.mjs";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ //#region src/Table/react/TableColumnSettings.tsx
6
+ const TableColumnSettings = ({ columnEntries, columnSettingsOpen, columnSettingsRef, hiddenFields, moveColumn, onToggleVisibility, orderedEntries, setColumnSettingsOpen, t }) => {
7
+ const visibleCount = columnEntries.length - hiddenFields.length;
8
+ return /* @__PURE__ */ jsxs("div", {
9
+ className: styles.columnSettings,
10
+ ref: columnSettingsRef,
11
+ children: [/* @__PURE__ */ jsx("button", {
12
+ "aria-expanded": columnSettingsOpen,
13
+ "aria-label": t("table.fieldSettings"),
14
+ className: styles.columnSettingsTrigger,
15
+ type: "button",
16
+ onClick: () => setColumnSettingsOpen((open) => open === false),
17
+ children: "⋯"
18
+ }), columnSettingsOpen ? /* @__PURE__ */ jsx("div", {
19
+ className: styles.columnSettingsMenu,
20
+ "data-superad-column-settings": "",
21
+ children: orderedEntries.map((entry, index) => {
22
+ const hidden = hiddenFields.includes(entry.field);
23
+ return /* @__PURE__ */ jsxs("div", {
24
+ className: styles.columnSettingsItem,
25
+ children: [
26
+ /* @__PURE__ */ jsx("button", {
27
+ "aria-pressed": hidden === false,
28
+ className: styles.columnSettingsCheck,
29
+ "data-checked": hidden ? "false" : "true",
30
+ disabled: hidden === false && visibleCount <= 1,
31
+ type: "button",
32
+ "aria-label": formatTableMessage(t(hidden ? "table.showColumn" : "table.hideColumn"), { title: entry.title }),
33
+ onClick: () => onToggleVisibility(entry.field),
34
+ children: hidden ? "" : "✓"
35
+ }),
36
+ /* @__PURE__ */ jsx("span", {
37
+ className: styles.columnSettingsLabel,
38
+ children: entry.title
39
+ }),
40
+ /* @__PURE__ */ jsx("button", {
41
+ "aria-label": t("table.moveLeft"),
42
+ className: styles.columnSettingsMove,
43
+ disabled: index === 0,
44
+ type: "button",
45
+ onClick: () => moveColumn(entry.field, -1),
46
+ children: "‹"
47
+ }),
48
+ /* @__PURE__ */ jsx("button", {
49
+ "aria-label": t("table.moveRight"),
50
+ className: styles.columnSettingsMove,
51
+ disabled: index === orderedEntries.length - 1,
52
+ type: "button",
53
+ onClick: () => moveColumn(entry.field, 1),
54
+ children: "›"
55
+ })
56
+ ]
57
+ }, entry.field);
58
+ })
59
+ }) : null]
60
+ });
61
+ };
62
+ //#endregion
63
+ export { TableColumnSettings };
64
+
65
+ //# sourceMappingURL=TableColumnSettings.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableColumnSettings.mjs","names":[],"sources":["../../../src/Table/react/TableColumnSettings.tsx"],"sourcesContent":["'use client';\n\nimport type { RefObject } from 'react';\n\nimport type { TranslationKey } from '@/i18n/types';\n\nimport { formatTableMessage } from '../core/tableI18n';\nimport { styles } from './style';\n\nexport interface TableColumnSettingEntry {\n field: string;\n title: string;\n}\n\nexport const TableColumnSettings = ({\n columnEntries,\n columnSettingsOpen,\n columnSettingsRef,\n hiddenFields,\n moveColumn,\n onToggleVisibility,\n orderedEntries,\n setColumnSettingsOpen,\n t,\n}: {\n columnEntries: TableColumnSettingEntry[];\n columnSettingsOpen: boolean;\n columnSettingsRef: RefObject<HTMLDivElement | null>;\n hiddenFields: string[];\n moveColumn: (field: string, direction: -1 | 1) => void;\n onToggleVisibility: (field: string) => void;\n orderedEntries: TableColumnSettingEntry[];\n setColumnSettingsOpen: (updater: (open: boolean) => boolean) => void;\n t: (key: TranslationKey) => string;\n}) => {\n const visibleCount = columnEntries.length - hiddenFields.length;\n\n return (\n <div className={styles.columnSettings} ref={columnSettingsRef}>\n <button\n aria-expanded={columnSettingsOpen}\n aria-label={t('table.fieldSettings')}\n className={styles.columnSettingsTrigger}\n type=\"button\"\n onClick={() => setColumnSettingsOpen((open) => open === false)}\n >\n ⋯\n </button>\n {columnSettingsOpen ? (\n <div className={styles.columnSettingsMenu} data-superad-column-settings=\"\">\n {orderedEntries.map((entry, index) => {\n const hidden = hiddenFields.includes(entry.field);\n\n return (\n <div className={styles.columnSettingsItem} key={entry.field}>\n <button\n aria-pressed={hidden === false}\n className={styles.columnSettingsCheck}\n data-checked={hidden ? 'false' : 'true'}\n disabled={hidden === false && visibleCount <= 1}\n type=\"button\"\n aria-label={formatTableMessage(\n t(hidden ? 'table.showColumn' : 'table.hideColumn'),\n { title: entry.title },\n )}\n onClick={() => onToggleVisibility(entry.field)}\n >\n {hidden ? '' : '✓'}\n </button>\n <span className={styles.columnSettingsLabel}>{entry.title}</span>\n <button\n aria-label={t('table.moveLeft')}\n className={styles.columnSettingsMove}\n disabled={index === 0}\n type=\"button\"\n onClick={() => moveColumn(entry.field, -1)}\n >\n ‹\n </button>\n <button\n aria-label={t('table.moveRight')}\n className={styles.columnSettingsMove}\n disabled={index === orderedEntries.length - 1}\n type=\"button\"\n onClick={() => moveColumn(entry.field, 1)}\n >\n ›\n </button>\n </div>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n};\n"],"mappings":";;;;;AAcA,MAAa,uBAAuB,EAClC,eACA,oBACA,mBACA,cACA,YACA,oBACA,gBACA,uBACA,QAWI;CACJ,MAAM,eAAe,cAAc,SAAS,aAAa;CAEzD,OACE,qBAAC,OAAD;EAAK,WAAW,OAAO;EAAgB,KAAK;EAA5C,UAAA,CACE,oBAAC,UAAD;GACE,iBAAe;GACf,cAAY,EAAE,qBAAqB;GACnC,WAAW,OAAO;GAClB,MAAK;GACL,eAAe,uBAAuB,SAAS,SAAS,KAAK;GAC9D,UAAA;EAEO,CAAA,GACP,qBACC,oBAAC,OAAD;GAAK,WAAW,OAAO;GAAoB,gCAA6B;GACrE,UAAA,eAAe,KAAK,OAAO,UAAU;IACpC,MAAM,SAAS,aAAa,SAAS,MAAM,KAAK;IAEhD,OACE,qBAAC,OAAD;KAAK,WAAW,OAAO;KAAvB,UAAA;MACE,oBAAC,UAAD;OACE,gBAAc,WAAW;OACzB,WAAW,OAAO;OAClB,gBAAc,SAAS,UAAU;OACjC,UAAU,WAAW,SAAS,gBAAgB;OAC9C,MAAK;OACL,cAAY,mBACV,EAAE,SAAS,qBAAqB,kBAAkB,GAClD,EAAE,OAAO,MAAM,MAAM,CACvB;OACA,eAAe,mBAAmB,MAAM,KAAK;OAE5C,UAAA,SAAS,KAAK;MACT,CAAA;MACR,oBAAC,QAAD;OAAM,WAAW,OAAO;OAAsB,UAAA,MAAM;MAAY,CAAA;MAChE,oBAAC,UAAD;OACE,cAAY,EAAE,gBAAgB;OAC9B,WAAW,OAAO;OAClB,UAAU,UAAU;OACpB,MAAK;OACL,eAAe,WAAW,MAAM,OAAO,EAAE;OAC1C,UAAA;MAEO,CAAA;MACR,oBAAC,UAAD;OACE,cAAY,EAAE,iBAAiB;OAC/B,WAAW,OAAO;OAClB,UAAU,UAAU,eAAe,SAAS;OAC5C,MAAK;OACL,eAAe,WAAW,MAAM,OAAO,CAAC;OACzC,UAAA;MAEO,CAAA;KACL;IAlC2C,GAAA,MAAM,KAkCjD;GAET,CAAC;EACE,CAAA,IACH,IACD;;AAET"}