@zerodep-dev/vue-tsx-pro-ui 0.2.0 → 0.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 (416) hide show
  1. package/dist/base/Badge.js +3 -3
  2. package/dist/base/Badge.js.map +1 -1
  3. package/dist/base/Can.d.ts +12 -0
  4. package/dist/base/Can.js +20 -0
  5. package/dist/base/Can.js.map +1 -0
  6. package/dist/base/ClientOnly.d.ts +10 -0
  7. package/dist/base/ClientOnly.js +18 -0
  8. package/dist/base/ClientOnly.js.map +1 -0
  9. package/dist/base/CloseButton.js +3 -3
  10. package/dist/base/CloseButton.js.map +1 -1
  11. package/dist/base/CodeBlock.js +5 -5
  12. package/dist/base/CodeBlock.js.map +1 -1
  13. package/dist/base/CopyButton.js +3 -3
  14. package/dist/base/CopyButton.js.map +1 -1
  15. package/dist/base/Icon.js +3 -3
  16. package/dist/base/Icon.js.map +1 -1
  17. package/dist/base/Indicator.js +3 -3
  18. package/dist/base/Indicator.js.map +1 -1
  19. package/dist/base/StatusDot.js +3 -3
  20. package/dist/base/StatusDot.js.map +1 -1
  21. package/dist/base/Tag.js +5 -5
  22. package/dist/base/Tag.js.map +1 -1
  23. package/dist/base/button-core.js +4 -4
  24. package/dist/base/button-core.js.map +1 -1
  25. package/dist/charts/AreaChart.js +3 -3
  26. package/dist/charts/AreaChart.js.map +1 -1
  27. package/dist/charts/BarChart.js +3 -3
  28. package/dist/charts/BarChart.js.map +1 -1
  29. package/dist/charts/ChordChart.js +3 -3
  30. package/dist/charts/ChordChart.js.map +1 -1
  31. package/dist/charts/ComboChart.js +3 -3
  32. package/dist/charts/ComboChart.js.map +1 -1
  33. package/dist/charts/DonutChart.js +3 -3
  34. package/dist/charts/DonutChart.js.map +1 -1
  35. package/dist/charts/FunnelChart.js +5 -5
  36. package/dist/charts/FunnelChart.js.map +1 -1
  37. package/dist/charts/GraphChart.js +3 -3
  38. package/dist/charts/GraphChart.js.map +1 -1
  39. package/dist/charts/LineChart.js +3 -3
  40. package/dist/charts/LineChart.js.map +1 -1
  41. package/dist/charts/MapChart.js +7 -7
  42. package/dist/charts/MapChart.js.map +1 -1
  43. package/dist/charts/RadarChart.js +16 -15
  44. package/dist/charts/RadarChart.js.map +1 -1
  45. package/dist/charts/SankeyChart.js +3 -3
  46. package/dist/charts/SankeyChart.js.map +1 -1
  47. package/dist/charts/ScatterChart.js +3 -3
  48. package/dist/charts/ScatterChart.js.map +1 -1
  49. package/dist/charts/TimelineChart.js +6 -5
  50. package/dist/charts/TimelineChart.js.map +1 -1
  51. package/dist/charts/TreemapChart.js +3 -3
  52. package/dist/charts/TreemapChart.js.map +1 -1
  53. package/dist/charts/WaterfallChart.js +3 -3
  54. package/dist/charts/WaterfallChart.js.map +1 -1
  55. package/dist/charts/XYChart.js +9 -7
  56. package/dist/charts/XYChart.js.map +1 -1
  57. package/dist/charts/frame.js +10 -8
  58. package/dist/charts/frame.js.map +1 -1
  59. package/dist/charts/single.js +4 -3
  60. package/dist/charts/single.js.map +1 -1
  61. package/dist/config/Provider.d.ts +3 -1
  62. package/dist/config/Provider.js +9 -4
  63. package/dist/config/Provider.js.map +1 -1
  64. package/dist/config/context.d.ts +18 -0
  65. package/dist/config/context.js +16 -1
  66. package/dist/config/context.js.map +1 -1
  67. package/dist/config/createUi.d.ts +20 -3
  68. package/dist/config/createUi.js +80 -49
  69. package/dist/config/createUi.js.map +1 -1
  70. package/dist/config/layout/preference.d.ts +43 -0
  71. package/dist/config/layout/preference.js +108 -0
  72. package/dist/config/layout/preference.js.map +1 -0
  73. package/dist/date/Calendar.js +3 -3
  74. package/dist/date/Calendar.js.map +1 -1
  75. package/dist/date/CalendarBoard.js +9 -9
  76. package/dist/date/CalendarBoard.js.map +1 -1
  77. package/dist/date/CalendarView.js +7 -7
  78. package/dist/date/CalendarView.js.map +1 -1
  79. package/dist/date/DateField.js +3 -3
  80. package/dist/date/DateField.js.map +1 -1
  81. package/dist/date/DatePicker.js +5 -5
  82. package/dist/date/DatePicker.js.map +1 -1
  83. package/dist/date/DateRangePicker.js +5 -5
  84. package/dist/date/DateRangePicker.js.map +1 -1
  85. package/dist/date/DateSegmentGroup.js +5 -5
  86. package/dist/date/DateSegmentGroup.js.map +1 -1
  87. package/dist/date/QuarterCalendar.js +6 -6
  88. package/dist/date/QuarterCalendar.js.map +1 -1
  89. package/dist/date/RangeCalendar.js +3 -3
  90. package/dist/date/RangeCalendar.js.map +1 -1
  91. package/dist/date/SegmentedField.js +3 -3
  92. package/dist/date/SegmentedField.js.map +1 -1
  93. package/dist/date/TimeField.js +3 -3
  94. package/dist/date/TimeField.js.map +1 -1
  95. package/dist/date/TimePicker.js +4 -4
  96. package/dist/date/TimePicker.js.map +1 -1
  97. package/dist/date/date-segments.js +1 -1
  98. package/dist/date/date-segments.js.map +1 -1
  99. package/dist/date/picker-popover.js +3 -2
  100. package/dist/date/picker-popover.js.map +1 -1
  101. package/dist/diagram/Diagram.js +12 -12
  102. package/dist/diagram/Diagram.js.map +1 -1
  103. package/dist/diagram/DiagramLanes.js +3 -3
  104. package/dist/diagram/DiagramLanes.js.map +1 -1
  105. package/dist/diagram/DiagramMinimap.js +4 -4
  106. package/dist/diagram/DiagramMinimap.js.map +1 -1
  107. package/dist/display/Accordion.js +6 -6
  108. package/dist/display/Accordion.js.map +1 -1
  109. package/dist/display/AnimatedNumber.js +4 -4
  110. package/dist/display/AnimatedNumber.js.map +1 -1
  111. package/dist/display/Avatar.js +4 -4
  112. package/dist/display/Avatar.js.map +1 -1
  113. package/dist/display/Checklist.js +7 -7
  114. package/dist/display/Checklist.js.map +1 -1
  115. package/dist/display/Collapse.js +8 -5
  116. package/dist/display/Collapse.js.map +1 -1
  117. package/dist/display/Collapsible.js +3 -3
  118. package/dist/display/Collapsible.js.map +1 -1
  119. package/dist/display/Descriptions.js +5 -5
  120. package/dist/display/Descriptions.js.map +1 -1
  121. package/dist/display/Ellipsis.js +3 -3
  122. package/dist/display/Ellipsis.js.map +1 -1
  123. package/dist/display/FieldCompare.js +4 -4
  124. package/dist/display/FieldCompare.js.map +1 -1
  125. package/dist/display/Gauge.js +11 -11
  126. package/dist/display/Gauge.js.map +1 -1
  127. package/dist/display/Image.js +4 -4
  128. package/dist/display/Image.js.map +1 -1
  129. package/dist/display/Marquee.js +3 -3
  130. package/dist/display/Marquee.js.map +1 -1
  131. package/dist/display/ProportionBar.js +4 -4
  132. package/dist/display/ProportionBar.js.map +1 -1
  133. package/dist/display/Sortable.js +4 -4
  134. package/dist/display/Sortable.js.map +1 -1
  135. package/dist/display/Sparkline.js +6 -6
  136. package/dist/display/Sparkline.js.map +1 -1
  137. package/dist/display/Stat.js +3 -3
  138. package/dist/display/Stat.js.map +1 -1
  139. package/dist/display/Timeline.js +7 -7
  140. package/dist/display/Timeline.js.map +1 -1
  141. package/dist/display/Tree.js +10 -10
  142. package/dist/display/Tree.js.map +1 -1
  143. package/dist/display/VirtualList.js +7 -7
  144. package/dist/display/VirtualList.js.map +1 -1
  145. package/dist/display/Watermark.js +3 -3
  146. package/dist/display/Watermark.js.map +1 -1
  147. package/dist/docs-kit/CodeGroup.js +5 -5
  148. package/dist/docs-kit/CodeGroup.js.map +1 -1
  149. package/dist/docs-kit/CodePreview.js +6 -6
  150. package/dist/docs-kit/CodePreview.js.map +1 -1
  151. package/dist/docs-kit/PropsTable.js +4 -4
  152. package/dist/docs-kit/PropsTable.js.map +1 -1
  153. package/dist/feedback/Alert.js +5 -5
  154. package/dist/feedback/Alert.js.map +1 -1
  155. package/dist/feedback/Banner.js +5 -5
  156. package/dist/feedback/Banner.js.map +1 -1
  157. package/dist/feedback/Empty.js +4 -4
  158. package/dist/feedback/Empty.js.map +1 -1
  159. package/dist/feedback/LoadingBar.js +20 -13
  160. package/dist/feedback/LoadingBar.js.map +1 -1
  161. package/dist/feedback/LoadingOverlay.js +3 -3
  162. package/dist/feedback/LoadingOverlay.js.map +1 -1
  163. package/dist/feedback/Progress.js +14 -14
  164. package/dist/feedback/Progress.js.map +1 -1
  165. package/dist/feedback/Result.js +4 -4
  166. package/dist/feedback/Result.js.map +1 -1
  167. package/dist/feedback/SkeletonText.js +3 -3
  168. package/dist/feedback/SkeletonText.js.map +1 -1
  169. package/dist/feedback/Toast.js +6 -6
  170. package/dist/feedback/Toast.js.map +1 -1
  171. package/dist/form/Field.js +7 -7
  172. package/dist/form/Field.js.map +1 -1
  173. package/dist/form/Form.js +3 -3
  174. package/dist/form/Form.js.map +1 -1
  175. package/dist/form/FormErrorSummary.js +3 -3
  176. package/dist/form/FormErrorSummary.js.map +1 -1
  177. package/dist/form/FormSection.js +6 -6
  178. package/dist/form/FormSection.js.map +1 -1
  179. package/dist/index.d.ts +11 -6
  180. package/dist/index.js +10 -5
  181. package/dist/input/Autocomplete.js +3 -3
  182. package/dist/input/Autocomplete.js.map +1 -1
  183. package/dist/input/Cascader.js +7 -7
  184. package/dist/input/Cascader.js.map +1 -1
  185. package/dist/input/CharacterCount.js +3 -3
  186. package/dist/input/CharacterCount.js.map +1 -1
  187. package/dist/input/Checkbox.js +5 -5
  188. package/dist/input/Checkbox.js.map +1 -1
  189. package/dist/input/ColorField.js +4 -4
  190. package/dist/input/ColorField.js.map +1 -1
  191. package/dist/input/Combobox.js +4 -4
  192. package/dist/input/Combobox.js.map +1 -1
  193. package/dist/input/ConditionBuilder.js +15 -14
  194. package/dist/input/ConditionBuilder.js.map +1 -1
  195. package/dist/input/FileDrop.js +3 -3
  196. package/dist/input/FileDrop.js.map +1 -1
  197. package/dist/input/Listbox.js +9 -9
  198. package/dist/input/Listbox.js.map +1 -1
  199. package/dist/input/Mentions.js +3 -3
  200. package/dist/input/Mentions.js.map +1 -1
  201. package/dist/input/NumberField.js +3 -3
  202. package/dist/input/NumberField.js.map +1 -1
  203. package/dist/input/NumberRangeField.js +5 -5
  204. package/dist/input/NumberRangeField.js.map +1 -1
  205. package/dist/input/OtpField.js +5 -5
  206. package/dist/input/OtpField.js.map +1 -1
  207. package/dist/input/PeoplePicker.js +6 -6
  208. package/dist/input/PeoplePicker.js.map +1 -1
  209. package/dist/input/PeoplePickerPanel.js +4 -4
  210. package/dist/input/PeoplePickerPanel.js.map +1 -1
  211. package/dist/input/Radio.js +4 -4
  212. package/dist/input/Radio.js.map +1 -1
  213. package/dist/input/Rating.js +5 -5
  214. package/dist/input/Rating.js.map +1 -1
  215. package/dist/input/Select.js +4 -4
  216. package/dist/input/Select.js.map +1 -1
  217. package/dist/input/SelectedTags.js +4 -4
  218. package/dist/input/SelectedTags.js.map +1 -1
  219. package/dist/input/Slider.js +6 -6
  220. package/dist/input/Slider.js.map +1 -1
  221. package/dist/input/Switch.js +3 -3
  222. package/dist/input/Switch.js.map +1 -1
  223. package/dist/input/TagsInput.js +5 -5
  224. package/dist/input/TagsInput.js.map +1 -1
  225. package/dist/input/TextField.js +5 -5
  226. package/dist/input/TextField.js.map +1 -1
  227. package/dist/input/Textarea.js +4 -4
  228. package/dist/input/Textarea.js.map +1 -1
  229. package/dist/input/ToggleGroup.js +4 -4
  230. package/dist/input/ToggleGroup.js.map +1 -1
  231. package/dist/input/Transfer.js +8 -8
  232. package/dist/input/Transfer.js.map +1 -1
  233. package/dist/input/TreeSelect.js +6 -6
  234. package/dist/input/TreeSelect.js.map +1 -1
  235. package/dist/input/Upload.js +8 -8
  236. package/dist/input/Upload.js.map +1 -1
  237. package/dist/layout/Affix.js +4 -4
  238. package/dist/layout/Affix.js.map +1 -1
  239. package/dist/layout/ResizeHandle.d.ts +6 -2
  240. package/dist/layout/ResizeHandle.js +32 -9
  241. package/dist/layout/ResizeHandle.js.map +1 -1
  242. package/dist/layout/ScrollArea.js +3 -3
  243. package/dist/layout/ScrollArea.js.map +1 -1
  244. package/dist/layout/Separator.js +3 -3
  245. package/dist/layout/Separator.js.map +1 -1
  246. package/dist/layout/Splitter.js +3 -3
  247. package/dist/layout/Splitter.js.map +1 -1
  248. package/dist/layout/ViewportFill.d.ts +2 -2
  249. package/dist/layout/ViewportFill.js +4 -4
  250. package/dist/layout/ViewportFill.js.map +1 -1
  251. package/dist/navigation/Breadcrumbs.js +4 -4
  252. package/dist/navigation/Breadcrumbs.js.map +1 -1
  253. package/dist/navigation/NavBar.js +6 -6
  254. package/dist/navigation/NavBar.js.map +1 -1
  255. package/dist/navigation/NavList.d.ts +1 -0
  256. package/dist/navigation/NavList.js +20 -12
  257. package/dist/navigation/NavList.js.map +1 -1
  258. package/dist/navigation/NavMenu.d.ts +27 -0
  259. package/dist/navigation/NavMenu.js +54 -0
  260. package/dist/navigation/NavMenu.js.map +1 -0
  261. package/dist/navigation/PageJump.js +3 -3
  262. package/dist/navigation/PageJump.js.map +1 -1
  263. package/dist/navigation/PageSizeSelect.js +4 -4
  264. package/dist/navigation/PageSizeSelect.js.map +1 -1
  265. package/dist/navigation/Pagination.js +6 -6
  266. package/dist/navigation/Pagination.js.map +1 -1
  267. package/dist/navigation/PaginationBar.js +5 -5
  268. package/dist/navigation/PaginationBar.js.map +1 -1
  269. package/dist/navigation/Steps.js +4 -4
  270. package/dist/navigation/Steps.js.map +1 -1
  271. package/dist/navigation/TableOfContents.js +5 -5
  272. package/dist/navigation/TableOfContents.js.map +1 -1
  273. package/dist/navigation/Tabs.js +7 -7
  274. package/dist/navigation/Tabs.js.map +1 -1
  275. package/dist/navigation/Toolbar.js +3 -3
  276. package/dist/navigation/Toolbar.js.map +1 -1
  277. package/dist/overlay/AlertDialog.js +4 -4
  278. package/dist/overlay/AlertDialog.js.map +1 -1
  279. package/dist/overlay/CommandPalette.js +4 -4
  280. package/dist/overlay/CommandPalette.js.map +1 -1
  281. package/dist/overlay/ContextMenu.js +3 -3
  282. package/dist/overlay/ContextMenu.js.map +1 -1
  283. package/dist/overlay/Dialog.js +4 -4
  284. package/dist/overlay/Dialog.js.map +1 -1
  285. package/dist/overlay/Drawer.js +5 -5
  286. package/dist/overlay/Drawer.js.map +1 -1
  287. package/dist/overlay/HoverCard.js +5 -3
  288. package/dist/overlay/HoverCard.js.map +1 -1
  289. package/dist/overlay/Lightbox.js +5 -5
  290. package/dist/overlay/Lightbox.js.map +1 -1
  291. package/dist/overlay/Menu.js +7 -7
  292. package/dist/overlay/Menu.js.map +1 -1
  293. package/dist/overlay/ModalCore.js +9 -9
  294. package/dist/overlay/ModalCore.js.map +1 -1
  295. package/dist/overlay/Popconfirm.js +6 -6
  296. package/dist/overlay/Popconfirm.js.map +1 -1
  297. package/dist/overlay/Popover.js +5 -3
  298. package/dist/overlay/Popover.js.map +1 -1
  299. package/dist/overlay/Tooltip.js +5 -3
  300. package/dist/overlay/Tooltip.js.map +1 -1
  301. package/dist/overlay/Tour.js +8 -8
  302. package/dist/overlay/Tour.js.map +1 -1
  303. package/dist/overlay/detached.d.ts +2 -0
  304. package/dist/overlay/detached.js +73 -42
  305. package/dist/overlay/detached.js.map +1 -1
  306. package/dist/patterns/ActionBar.js +3 -3
  307. package/dist/patterns/ActionBar.js.map +1 -1
  308. package/dist/patterns/AppShell.d.ts +28 -1
  309. package/dist/patterns/AppShell.js +158 -52
  310. package/dist/patterns/AppShell.js.map +1 -1
  311. package/dist/patterns/AuthLayout.d.ts +28 -0
  312. package/dist/patterns/AuthLayout.js +77 -0
  313. package/dist/patterns/AuthLayout.js.map +1 -0
  314. package/dist/patterns/CommentThread.js +9 -9
  315. package/dist/patterns/CommentThread.js.map +1 -1
  316. package/dist/patterns/DataImport.js +4 -4
  317. package/dist/patterns/DataImport.js.map +1 -1
  318. package/dist/patterns/DeadlineBadge.js +3 -3
  319. package/dist/patterns/DeadlineBadge.js.map +1 -1
  320. package/dist/patterns/FilterBar.d.ts +11 -1
  321. package/dist/patterns/FilterBar.js +39 -10
  322. package/dist/patterns/FilterBar.js.map +1 -1
  323. package/dist/patterns/FormDialog.d.ts +18 -0
  324. package/dist/patterns/FormDialog.js +46 -0
  325. package/dist/patterns/FormDialog.js.map +1 -0
  326. package/dist/patterns/KanbanBoard.js +8 -8
  327. package/dist/patterns/KanbanBoard.js.map +1 -1
  328. package/dist/patterns/LayoutSwitcher.d.ts +12 -0
  329. package/dist/patterns/LayoutSwitcher.js +79 -0
  330. package/dist/patterns/LayoutSwitcher.js.map +1 -0
  331. package/dist/patterns/NotificationCenter.js +8 -8
  332. package/dist/patterns/NotificationCenter.js.map +1 -1
  333. package/dist/patterns/PageTabs.d.ts +12 -7
  334. package/dist/patterns/PageTabs.js +41 -29
  335. package/dist/patterns/PageTabs.js.map +1 -1
  336. package/dist/patterns/QueryTable.d.ts +7 -1
  337. package/dist/patterns/QueryTable.js +116 -81
  338. package/dist/patterns/QueryTable.js.map +1 -1
  339. package/dist/patterns/SlideCaptcha.d.ts +80 -0
  340. package/dist/patterns/SlideCaptcha.js +354 -0
  341. package/dist/patterns/SlideCaptcha.js.map +1 -0
  342. package/dist/patterns/StepsForm.js +7 -7
  343. package/dist/patterns/StepsForm.js.map +1 -1
  344. package/dist/patterns/ThemeSwitcher.js +3 -3
  345. package/dist/patterns/ThemeSwitcher.js.map +1 -1
  346. package/dist/patterns/index.d.ts +7 -3
  347. package/dist/patterns/index.js +5 -1
  348. package/dist/patterns/messages.d.ts +37 -1
  349. package/dist/patterns/messages.js +38 -2
  350. package/dist/patterns/messages.js.map +1 -1
  351. package/dist/table/ColumnHeaderActions.js +3 -3
  352. package/dist/table/ColumnHeaderActions.js.map +1 -1
  353. package/dist/table/ColumnResizer.js +3 -3
  354. package/dist/table/ColumnResizer.js.map +1 -1
  355. package/dist/table/ColumnSettings.js +5 -5
  356. package/dist/table/ColumnSettings.js.map +1 -1
  357. package/dist/table/ColumnTable.js +8 -8
  358. package/dist/table/ColumnTable.js.map +1 -1
  359. package/dist/table/DataTable.js +8 -8
  360. package/dist/table/DataTable.js.map +1 -1
  361. package/dist/table/DataTableView.js +21 -21
  362. package/dist/table/DataTableView.js.map +1 -1
  363. package/dist/table/PivotTable.js +3 -3
  364. package/dist/table/PivotTable.js.map +1 -1
  365. package/dist/table/SelectionBar.js +4 -4
  366. package/dist/table/SelectionBar.js.map +1 -1
  367. package/dist/table/TreeDataTable.js +5 -5
  368. package/dist/table/TreeDataTable.js.map +1 -1
  369. package/dist/theme-customize/ThemeCustomizer.js +7 -6
  370. package/dist/theme-customize/ThemeCustomizer.js.map +1 -1
  371. package/dist/theme-customize/ThemeThumbnail.js +3 -3
  372. package/dist/theme-customize/ThemeThumbnail.js.map +1 -1
  373. package/dist/three/background/AuroraBackground.js +3 -3
  374. package/dist/three/background/AuroraBackground.js.map +1 -1
  375. package/dist/three/background/MeshGradient.js +3 -3
  376. package/dist/three/background/MeshGradient.js.map +1 -1
  377. package/dist/three/background/ShaderBackground.js +3 -3
  378. package/dist/three/background/ShaderBackground.js.map +1 -1
  379. package/dist/three/core/EffectSurface.js +3 -3
  380. package/dist/three/core/EffectSurface.js.map +1 -1
  381. package/dist/three/core/ThreeCanvas.js +4 -4
  382. package/dist/three/core/ThreeCanvas.js.map +1 -1
  383. package/dist/three/effects/Confetti.js +3 -3
  384. package/dist/three/effects/Confetti.js.map +1 -1
  385. package/dist/three/effects/ParticleField.js +3 -3
  386. package/dist/three/effects/ParticleField.js.map +1 -1
  387. package/dist/three/effects/WaveGrid.js +3 -3
  388. package/dist/three/effects/WaveGrid.js.map +1 -1
  389. package/dist/three/globe/Globe.js +3 -3
  390. package/dist/three/globe/Globe.js.map +1 -1
  391. package/dist/three/model/ModelViewer.js +3 -3
  392. package/dist/three/model/ModelViewer.js.map +1 -1
  393. package/dist/utils/data/number.d.ts +5 -0
  394. package/dist/utils/data/number.js +8 -1
  395. package/dist/utils/data/number.js.map +1 -1
  396. package/dist/utils/dom/element.d.ts +3 -1
  397. package/dist/utils/dom/element.js +8 -4
  398. package/dist/utils/dom/element.js.map +1 -1
  399. package/dist/utils/dom/fullscreen.d.ts +1 -1
  400. package/dist/utils/dom/fullscreen.js +12 -8
  401. package/dist/utils/dom/fullscreen.js.map +1 -1
  402. package/dist/utils/dom/mounted.d.ts +7 -0
  403. package/dist/utils/dom/mounted.js +16 -0
  404. package/dist/utils/dom/mounted.js.map +1 -0
  405. package/dist/utils/dom/overflow.js +2 -1
  406. package/dist/utils/dom/overflow.js.map +1 -1
  407. package/dist/utils/dom/pan-zoom.js +2 -1
  408. package/dist/utils/dom/pan-zoom.js.map +1 -1
  409. package/dist/utils/props.js +3 -13
  410. package/dist/utils/props.js.map +1 -1
  411. package/dist/utils/request/http.d.ts +12 -0
  412. package/dist/utils/request/http.js +6 -2
  413. package/dist/utils/request/http.js.map +1 -1
  414. package/dist/utils/request/use-request.js +4 -2
  415. package/dist/utils/request/use-request.js.map +1 -1
  416. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"DataTableView.js","names":["_isVNode","_vtp_readonlyProp","_vue_computed","_createVNode","_mergeProps","mergeProps","_vtp_restProps","_vue_shallowRef","_vue_ref","_Fragment"],"sources":["../../src/table/DataTableView.tsx"],"sourcesContent":["/**\n * 表格的渲染层:DataTable、TreeDataTable 共用(同 Listbox 与 ListboxView 的分工)。只管画,状态(排序、选择、展开、列宽)由外层决定。\n *\n * - 结构:原生 table(读屏按表格念:第几行第几列、列标题)+ table-layout: fixed + colgroup 定列宽,\n * 外层是 ScrollArea(两个方向滚动,内容超出时视口可聚焦,键盘也能滚)。\n * - 虚拟滚动(useVirtualizer):只渲染看得见的行,上下各一行占位撑出滚动高度(各列仍在同一张表里对齐);\n * 行带 aria-rowindex,表格带 aria-rowcount,读屏知道总行数与当前位置。\n * - 分组表头(columnGroups):相邻的几列上方共用一个标题,表头两行(th scope=\"colgroup\"),没分组的列跨两行。\n * - 吸顶表头、固定列:position: sticky,固定列的偏移按列宽累加(逻辑方向,从右到左排版自动换边);\n * 固定列的单元格继承行的底色,盖住滚过去的内容。\n * - 排序:可排序的列标题是按钮,th 带 aria-sort(多列排序时只在第一排序列上,其余列的次序写给读屏);\n * 勾选列用 Checkbox(表头的全选有部分选中状态)。\n * - 表头筛选(列定义的 filter)与列菜单(columnMenu):列标题结尾的小按钮(ColumnHeaderActions),状态在外层。\n * - 单元格导航(cellNavigation):表格是 role=\"grid\",方向键在格之间走(gridFocus),只有一格能 Tab 进入;\n * 可编辑的格按 Enter / F2、双击或直接打字开始编辑,编辑器由外层给(renderEditor),校验错误标在格上(rowErrors)。\n * - 列宽:表头结束边的 ColumnResizer(拖动或 ← / →)调整;固定列偏移与最小宽度的计算在 columns.ts。\n * - 详情行(renderDetail):多一列展开按钮(aria-expanded、aria-controls),展开的行下面多一行跨全部列的详情,\n * 内容让过勾选列与展开列、和第一个数据列对齐;\n * 详情在虚拟滚动里也算一行(测量真实高度),内容贴着视口的起始边,横向滚动时不跟着滚走。\n * - 加载:没有数据时显示骨架行;已有数据(刷新中)时表头下方显示一条进度条;表格带 aria-busy。没有数据时显示 Empty。\n */\nimport { ArrowDown, ArrowUp, ArrowUpDown, ChevronRight } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { useId, watch, type VNodeChild } from 'vue';\nimport { ButtonBase, type ButtonBaseProps } from '../base/ButtonBase';\nimport { Icon, type IconProps } from '../base/Icon';\nimport { IconButton, type IconButtonProps } from '../base/IconButton';\nimport { VisuallyHidden, visuallyHiddenStyles } from '../base/VisuallyHidden';\nimport { clamp } from '../utils/data/number';\nimport { useDelayedLoading } from '../utils/motion/delayed-loading';\nimport { useLang } from '../config/context';\nimport { useRecipe } from '../config/styles';\nimport { Empty, type EmptyProps } from '../feedback/Empty';\nimport { Progress, type ProgressProps } from '../feedback/Progress';\nimport { Skeleton, type SkeletonProps, type SkeletonShapeProps } from '../feedback/Skeleton';\nimport { SHIMMER_STAGGER } from '../utils/style/shimmer';\nimport { Checkbox, type CheckboxProps } from '../input/Checkbox';\nimport { Radio, RadioGroupContext, type RadioProps } from '../input/Radio';\nimport { ScrollArea, type ScrollAreaProps } from '../layout/ScrollArea';\nimport { mergeAttrs, mergePartProps, mergeProps, type PartProps } from '../utils/props';\nimport { disclosureStyles } from '../utils/style/transitions';\nimport type { SelectionModes } from '../utils/data/selection';\nimport { plainText } from '../utils/data/text';\nimport { gridFocus } from '../utils/dom/roving-focus';\nimport { useVirtualizer } from '../utils/virtual/use-virtualizer';\nimport type { VirtualScrollOptions, VisibleRange } from '../utils/virtual/virtualizer';\nimport {\n ColumnFilterButton,\n ColumnMenuButton,\n type ColumnMenuActions,\n} from './ColumnHeaderActions';\nimport { ColumnResizer, type ColumnResizerProps } from './ColumnResizer';\nimport { useColumnDisplay } from './column-display';\nimport {\n columnFilter,\n columnType,\n isCellEditable,\n columnValue,\n headerLayout,\n sameStickyOffsets,\n stickyOffsets,\n sortList,\n sumColumn,\n tableMinWidth,\n type ColumnFilterOption,\n type ColumnTypes,\n type DataTableColumnGroup,\n type SortState,\n type StickyOffsets,\n type DataTableColumn,\n} from './columns';\nimport {\n dataTableRecipe,\n dataTableStateStyles,\n type DataTableDensities,\n type DataTableOptions,\n type DataTableVariants,\n} from './table-styles';\n\n/** 要渲染的一行:DataTable 是平铺的行,TreeDataTable 是展开后的树(带层级) */\nexport interface DataTableRowModel<T> {\n /** 行的 key(选择、展开、测量都按它) */\n key: string;\n /** 这一行的数据 */\n data: T;\n /** 层级(TreeDataTable),从 0 开始 */\n depth: number;\n}\n\n/** 行、单元格的部件属性:可以按行(与列)计算 */\ntype RowPartProps<T> = PartProps<'tr'> | ((row: T, index: number) => PartProps<'tr'>);\ntype CellPartProps<T> = PartProps<'td'> | ((row: T, column: DataTableColumn<T>) => PartProps<'td'>);\n\n/** DataTableView 的属性;未声明的属性落到 table 上(aria-label 或 aria-labelledby 是表格的名称) */\nexport interface DataTableViewProps<T> extends PartProps<'table', 'role'>, DataTableOptions {\n /** 要渲染的行(已排序、已按展开状态展开) */\n rows: readonly DataTableRowModel<T>[];\n /** 列 */\n columns: readonly DataTableColumn<T>[];\n /** 当前排序:一列,或多列(前面的优先) */\n sort?: SortState | readonly SortState[] | null;\n /** 点了可排序的列标题(多列排序时按住 Shift 是追加) */\n onSortClick?: (key: string, event: MouseEvent) => void;\n /** 表头筛选:各列选中的值(列定义写了 filter 的列,列标题上有筛选按钮) */\n filters?: Readonly<Record<string, readonly string[]>>;\n /** 改了一列的筛选 */\n onFilterChange?: (key: string, values: string[]) => void;\n /** 表头筛选的选项(列出出现过的值时要看全部行,由外层给) */\n filterOptionsOf?: (column: DataTableColumn<T>) => readonly ColumnFilterOption[];\n /** 列菜单:列标题结尾多一个 ⋮,排序、固定、移动、隐藏,选了交给 onColumnAction */\n columnMenu?: boolean;\n /** 选了列菜单里的一项;width 是这一列现在的宽度(固定没写宽度的列时,外层把它记成列宽) */\n onColumnAction?: (key: string, action: keyof ColumnMenuActions, width: number) => void;\n /** 单元格导航:表格是 role=\"grid\",方向键在格之间走,只有一格能 Tab 进入;有可编辑的列时默认开 */\n cellNavigation?: boolean;\n /** 正在编辑的格 */\n editing?: CellPosition | null;\n /** 正在编辑的格里放的编辑器 */\n renderEditor?: (row: T, column: DataTableColumn<T>) => VNodeChild;\n /** 各行的校验错误:列的 key → 原因(行校验,如“结束日期早于开始日期”),标在格上 */\n rowErrors?: (row: T) => Readonly<Record<string, string>> | null | undefined;\n /** 在可编辑的格上按 Enter / F2、双击,或直接打字(text 是打的字,替换原值):开始编辑 */\n onEditStart?: (cell: CellPosition, text?: string) => void;\n /** 编辑中的按键(Enter 提交、Tab 提交并到下一格、Esc 放弃),由外层处理 */\n onEditKeydown?: (event: KeyboardEvent, cell: CellPosition) => void;\n /** 选择方式;不写时没有勾选列。多选时表头有全选 */\n selectionMode?: keyof SelectionModes;\n /** 已选行的 key */\n selectedKeys?: readonly string[];\n /** 部分勾选的行的 key(树形表格的父行:子孙只勾了一部分):勾选框显示横线,读屏念“部分选中” */\n partialKeys?: readonly string[];\n /** 勾选或取消一行 */\n onToggleRow?: (key: string) => void;\n /** 表头的全选:全部选中时取消全部,否则全选 */\n onToggleAll?: () => void;\n /** 各列当前的宽度(px):拖动调整过的、或列定义里写的 */\n widths: Readonly<Record<string, number | undefined>>;\n /** 拖动或用键盘调整了某列的宽度 */\n onResize?: (key: string, width: number) => void;\n /** 列宽可以调整(列定义里的 resizable 优先) */\n resizable?: boolean;\n /** 加载中 */\n loading?: boolean;\n /** 没有数据时显示的内容;默认是 Empty(文案取语言包) */\n empty?: VNodeChild;\n /** 第一个数据列的单元格内容前面加的东西(TreeDataTable 的缩进与展开按钮) */\n leading?: (row: DataTableRowModel<T>, index: number) => VNodeChild;\n /** 行的估计高度(px);不写时按密度估计,渲染后以实际高度为准 */\n estimateRowHeight?: number;\n /** 行的色调:导入校验的错误行、即将超期的行整行着浅色底(不透明,固定列也盖得住) */\n rowTone?: (row: T) => RowTone | undefined;\n /** 主从视图里正在看的那一行的 key:整行高亮、起始边一条竖线,带 aria-current */\n activeKey?: string | null;\n /**\n * 点了一行(点在按钮、链接、输入框上的除外):主从视图里打开这一行的详情。\n * 只是鼠标的捷径:行里还要有键盘能到的入口(如名称做成按钮或链接)\n */\n onRowClick?: (row: T, key: string) => void;\n /** 这一行能不能勾选:不能的勾选框不可用,全选也跳过它 */\n isRowSelectable?: (row: T) => boolean;\n /** 隐藏的列的 key:列显示设置(用 Menu 的 MenuCheckboxItem 组合)写回这里 */\n hiddenColumns?: readonly string[];\n /** 合计行第一列的文字(第一列自己没写 summary 时),默认取语言包(合计) */\n summaryLabel?: VNodeChild;\n /** 分组表头:相邻的几列上方共用一个标题,表头变成两行;没分组的列跨两行 */\n columnGroups?: readonly DataTableColumnGroup[];\n /** 行的详情:写了它时多一列展开按钮,展开的行下面多一行跨全部列的详情 */\n renderDetail?: (row: T) => VNodeChild;\n /** 这一行有没有详情:没有的不显示展开按钮;默认都有 */\n hasDetail?: (row: T) => boolean;\n /** 展开了详情的行的 key */\n expandedRows?: readonly string[];\n /** 点了一行的展开按钮 */\n onToggleDetail?: (key: string) => void;\n /** 可见行范围变化(不含 overscan):接近末尾时加载更多 */\n onRangeChange?: (range: VisibleRange) => void;\n /** 挂载后拿到滚动到某一行的方法:`handle={(api) => (table = api)}` */\n handle?: (api: DataTableHandle) => void;\n /**\n * 放在竖排的弹性容器(ViewportFill、Flex direction=\"column\")里:按行数自己的高度,最多占到剩下的高度,\n * 再多在表格里滚动;分页紧跟在表格下面。不写时最高 32em\n */\n flexible?: boolean;\n /** 外层滚动区域(决定表格的高度)的部件属性;高度用 sx 给,默认最高 32em */\n propsRoot?: Partial<ScrollAreaProps>;\n /** 每一行(tr)的部件属性,可以按行计算 */\n propsRow?: RowPartProps<T>;\n /** 每个单元格(td)的部件属性,可以按行与列计算 */\n propsCell?: CellPartProps<T>;\n /** 每个列标题(th)的部件属性,可以按列计算 */\n propsHeaderCell?: PartProps<'th'> | ((column: DataTableColumn<T>) => PartProps<'th'>);\n /** 空状态的部件属性 */\n propsEmpty?: Partial<EmptyProps>;\n /** 加载中占位的部件属性 */\n propsSkeleton?: SkeletonShapeProps;\n /** 分组标题(th,跨组里的几列)的部件属性,可以按组计算 */\n propsGroupHeaderCell?: PartProps<'th'> | ((group: DataTableColumnGroup) => PartProps<'th'>);\n /** 可排序列标题里的排序按钮的部件属性 */\n propsSortButton?: Partial<ButtonBaseProps>;\n /** 列宽调整手柄的部件属性 */\n propsResizer?: Partial<ColumnResizerProps>;\n /** 可排序列标题里的文字(排序按钮里、图标前)的部件属性 */\n propsSortLabel?: PartProps<'span'>;\n /** 表头(thead,吸顶)的部件属性 */\n propsHead?: PartProps<'thead'>;\n /** 表头的行(tr)的部件属性;分组表头的两行都用它 */\n propsHeadRow?: PartProps<'tr', 'aria-rowindex'>;\n /** 表头勾选列(th,多选时里面是全选框)的部件属性 */\n propsSelectHeaderCell?: PartProps<'th', 'scope'>;\n /** 每行勾选列(td)的部件属性 */\n propsSelectCell?: PartProps<'td'>;\n /** 表头的全选框(多选时)的部件属性;勾选状态、不可用与切换由组件管理 */\n propsSelectAll?: Omit<Partial<CheckboxProps>, SelectCheckboxManaged | 'disabled'>;\n /** 每一行的勾选框(多选时)的部件属性;勾选状态、切换与名称(选择第 N 行,每行不同)由组件管理 */\n propsSelectCheckbox?: Omit<Partial<CheckboxProps>, SelectCheckboxManaged | 'aria-label'>;\n /** 每一行的单选框(单选时)的部件属性;选中状态、切换与名称由组件管理 */\n propsSelectRadio?: Omit<Partial<RadioProps>, 'value' | 'disabled' | 'aria-label'>;\n /** 第一个数据列里 leading 与内容的外层(有 leading 时才有)的部件属性 */\n propsLeading?: PartProps<'div'>;\n /** 第一个数据列里内容的包装(有 leading 时才有)的部件属性 */\n propsContent?: PartProps<'div'>;\n /** 刷新中表头下方的进度条的部件属性 */\n propsProgress?: Partial<ProgressProps>;\n /** 空状态所在的单元格(td,跨全部列)的部件属性 */\n propsEmptyCell?: PartProps<'td', 'colspan'>;\n /** 详情列的列标题(th,文字只给读屏)的部件属性 */\n propsDetailHeaderCell?: PartProps<'th', 'scope'>;\n /** 每行展开按钮所在单元格(td)的部件属性 */\n propsDetailToggleCell?: PartProps<'td'>;\n /** 展开按钮的部件属性;展开状态、关联的详情与点击由组件管理 */\n propsDetailToggle?: Omit<Partial<IconButtonProps>, 'aria-expanded' | 'aria-controls' | 'onClick'>;\n /** 详情行(tr)的部件属性 */\n propsDetailRow?: PartProps<'tr', 'aria-rowindex'>;\n /** 详情所在的单元格(td,跨全部列)的部件属性 */\n propsDetailCell?: PartProps<'td', 'colspan'>;\n /** 表尾(tfoot,合计行,吸底)的部件属性 */\n propsFoot?: PartProps<'tfoot'>;\n /** 合计行每个单元格的部件属性,可以按列计算 */\n propsSummaryCell?: PartProps<'td'> | ((column: DataTableColumn<T>) => PartProps<'td'>);\n}\n\n/** 一格的位置:行的 key 与列的 key */\nexport interface CellPosition {\n /** 行的 key */\n row: string;\n /** 列的 key */\n column: string;\n}\n\n/** DataTable、TreeDataTable 的 handle 拿到的方法 */\nexport interface DataTableHandle {\n /**\n * 滚动到 key 这一行:还没渲染(虚拟滚动)的行也行,停在吸顶表头之下、吸底合计行之上;\n * align 默认 auto(已经完整可见就不动)。树形表格里只能滚到已展开的行。找不到这一行时返回 false\n */\n scrollToRow: (key: string, options?: VirtualScrollOptions) => boolean;\n}\n\n/** 行的色调:整行浅色底 */\nexport type RowTone = 'info' | 'success' | 'warning' | 'danger';\n\n/** 勾选列里的勾选框由表格管理的属性 */\ntype SelectCheckboxManaged = 'checked' | 'indeterminate' | 'onChange';\n\n/** 勾选列的宽度(px) */\nconst SELECT_WIDTH = 44;\n/** 详情列(展开按钮)的宽度(px) */\nconst DETAIL_WIDTH = 40;\n/** 详情行的估计高度(px),渲染后以实际高度为准 */\nconst DETAIL_HEIGHT = 160;\n/** 加载中至少、至多显示几行骨架:在这之间按表体到窗口底边的高度铺满 */\nconst SKELETON_ROWS = { min: 6, max: 50 };\n/** 各密度下行高的估计(px) */\nconst ROW_HEIGHT: Record<keyof DataTableDensities, number> = {\n compact: 36,\n standard: 44,\n comfortable: 52,\n};\n\n/** DataTable、TreeDataTable 的样式:行的色调(不透明的浅色底,悬停加深) */\nexport const dataTableRowToneStyles = css.create({\n info: { backgroundColor: { default: '_infoSoft', ':hover': '_infoSoftHover' } },\n success: { backgroundColor: { default: '_successSoft', ':hover': '_successSoftHover' } },\n warning: { backgroundColor: { default: '_warningSoft', ':hover': '_warningSoftHover' } },\n danger: { backgroundColor: { default: '_dangerSoft', ':hover': '_dangerSoftHover' } },\n});\n\n// 列宽、偏移、占位高度是任意值,用动态样式;单独一个 create,见 COMPONENTS.md §4\n/** DataTable、TreeDataTable 的样式:width、minWidth、height、start、end、percent */\nexport const dataTableDynamicStyles = css.create({\n width: (px: number) => ({ width: px }),\n minWidth: (px: number) => ({ minWidth: px }),\n height: (px: number) => ({ height: px }),\n start: (px: number) => ({ insetInlineStart: px }),\n end: (px: number) => ({ insetInlineEnd: px }),\n // 详情内容让过勾选列与展开列,和第一个数据列对齐\n indent: (px: number) => ({ marginInlineStart: px, maxWidth: `calc(100cqi - ${px}px)` }),\n percent: (value: string) => ({ width: value }),\n});\n\n/** 固定列单元格的样式:position: sticky 加上按列宽累加的偏移;挨着滚动列的那一列加一条竖线 */\nfunction stickyCellSx(column: DataTableColumn<never>, offsets: StickyOffsets) {\n if (column.sticky === 'start')\n return [\n dataTableStateStyles.sticky,\n dataTableDynamicStyles.start(offsets.start.get(column.key)!),\n offsets.startEdge === column.key && dataTableStateStyles.stickyStartEdge,\n ];\n if (column.sticky === 'end')\n return [\n dataTableStateStyles.sticky,\n dataTableDynamicStyles.end(offsets.end.get(column.key)!),\n offsets.endEdge === column.key && dataTableStateStyles.stickyEndEdge,\n ];\n return null;\n}\n\n/** 勾选列、详情列在有起始边固定列时也固定,偏移是它前面的列宽 */\nfunction leadingStickySx(sticky: boolean, offset: number) {\n return sticky && [dataTableStateStyles.sticky, dataTableDynamicStyles.start(offset)];\n}\n\n/** 分组标题的固定:组里的列都固定在同一侧时跟着固定,偏移取最靠外的一列;含挨着滚动列的那一列时也画竖线 */\nfunction groupStickySx(columns: readonly DataTableColumn<never>[], offsets: StickyOffsets) {\n const side = columns[0]?.sticky;\n if (!side || columns.some((column) => column.sticky !== side)) return null;\n const [outer, inner] =\n side === 'start' ? [columns[0]!, columns.at(-1)!] : [columns.at(-1)!, columns[0]!];\n return side === 'start'\n ? [\n dataTableStateStyles.sticky,\n dataTableDynamicStyles.start(offsets.start.get(outer.key)!),\n offsets.startEdge === inner.key && dataTableStateStyles.stickyStartEdge,\n ]\n : [\n dataTableStateStyles.sticky,\n dataTableDynamicStyles.end(offsets.end.get(outer.key)!),\n offsets.endEdge === inner.key && dataTableStateStyles.stickyEndEdge,\n ];\n}\n\n/** DataTableRow 的属性:一行要用到的全部数据;除了 row、index、selected,同一张表里各行都相同 */\nexport interface DataTableRowProps<T> {\n /** 这一行 */\n row: DataTableRowModel<T>;\n /** 在全部行里的序号 */\n index: number;\n /** 是否已选 */\n selected: boolean;\n /** 部分勾选(树形表格的父行) */\n partial?: boolean;\n /** 能不能勾选,默认 true */\n selectable?: boolean;\n /** 整行的色调 */\n tone?: RowTone;\n /** 主从视图里正在看的一行 */\n active?: boolean;\n /** 点了这一行 */\n onRowClick?: (row: T, key: string) => void;\n /** 选择方式;不写时没有勾选列 */\n selectionMode?: keyof SelectionModes;\n /** 列 */\n columns: readonly DataTableColumn<T>[];\n /** 密度 */\n density: keyof DataTableDensities;\n /** 样式 */\n variant: keyof DataTableVariants;\n /** 斑马纹 */\n striped: boolean;\n /** 固定列的偏移 */\n offsets: StickyOffsets;\n /** 表头有几行(分组表头是两行):行的 aria-rowindex 从表头之后算起,默认 1 */\n headerRows?: number;\n /** 在表体里的位置(展开的详情也算一行):测量与 aria-rowindex 用它;默认等于 index */\n position?: number;\n /** 表格有详情列 */\n detailColumn?: boolean;\n /** 这一行有详情(显示展开按钮),默认 true */\n expandable?: boolean;\n /** 详情已展开 */\n expanded?: boolean;\n /** 详情单元格的 id(展开按钮的 aria-controls) */\n detailId?: string;\n /** 详情列单元格的部件属性 */\n propsDetailToggleCell?: PartProps<'td'>;\n /** 展开按钮的部件属性 */\n propsDetailToggle?: DataTableViewProps<T>['propsDetailToggle'];\n /** 点了展开按钮 */\n onToggleDetail?: (key: string) => void;\n /** 第一个数据列前面加的东西(TreeDataTable 的缩进与展开按钮) */\n leading?: (row: DataTableRowModel<T>, index: number) => VNodeChild;\n /** 行的部件属性 */\n propsRow?: RowPartProps<T>;\n /** 单元格的部件属性 */\n propsCell?: CellPartProps<T>;\n /** 勾选列单元格的部件属性 */\n propsSelectCell?: PartProps<'td'>;\n /** 勾选框的部件属性 */\n propsSelectCheckbox?: DataTableViewProps<T>['propsSelectCheckbox'];\n /** 单选框的部件属性 */\n propsSelectRadio?: DataTableViewProps<T>['propsSelectRadio'];\n /** leading 与内容外层的部件属性 */\n propsLeading?: PartProps<'div'>;\n /** 内容包装的部件属性 */\n propsContent?: PartProps<'div'>;\n /** 测量行高(虚拟滚动) */\n measure: (element: unknown) => void;\n /** 勾选或取消这一行 */\n onToggle?: (key: string) => void;\n /** 单元格导航:数据格可以聚焦,可编辑的格响应 Enter / F2、双击、打字 */\n cellNavigation?: boolean;\n /** 这一行正在编辑的列 */\n editingColumn?: string;\n /** 正在编辑的格里放的编辑器 */\n renderEditor?: DataTableViewProps<T>['renderEditor'];\n /** 这一行的校验错误 */\n rowErrors?: DataTableViewProps<T>['rowErrors'];\n /** 开始编辑一格 */\n onEditStart?: DataTableViewProps<T>['onEditStart'];\n /** 编辑中的按键 */\n onEditKeydown?: DataTableViewProps<T>['onEditKeydown'];\n}\n\n/**\n * 表格的一行:单独成组件,props 没变的行在表格重新渲染时直接跳过——\n * 滚动只挂载新进入视口的行,勾选一行只更新这一行(原来每次都重建全部可见行与其中的勾选框)\n */\nexport const DataTableRow = _component(\n <T,>({\n row,\n index,\n selected,\n partial = false,\n selectable = true,\n tone,\n active = false,\n onRowClick,\n selectionMode,\n columns,\n density,\n variant,\n striped,\n offsets,\n headerRows = 1,\n position = index,\n detailColumn = false,\n expandable = true,\n expanded = false,\n detailId,\n propsDetailToggleCell,\n propsDetailToggle,\n onToggleDetail,\n leading,\n propsRow,\n propsCell,\n propsSelectCell,\n propsSelectCheckbox,\n propsSelectRadio,\n propsLeading,\n propsContent,\n measure,\n onToggle,\n cellNavigation = false,\n editingColumn,\n renderEditor,\n rowErrors,\n onEditStart,\n onEditKeydown,\n }: DataTableRowProps<T>) => {\n const lang = useLang();\n const recipe = useRecipe(dataTableRecipe);\n // 各部件层按档位组合缓存:同一种行(奇偶、密度、样式)的各格拿到的是同一个对象\n const s = _derived(recipe({ density, variant, striped: striped && index % 2 === 1 }));\n\n /** 数据格的按键:编辑中交给外层;可编辑的格按 Enter / F2 开始编辑,打一个字直接替换 */\n function onCellKeydown(event: KeyboardEvent, column: DataTableColumn<T>) {\n const cell = { row: row.key, column: column.key };\n if (editingColumn === column.key) return onEditKeydown?.(event, cell);\n if (event.target !== event.currentTarget || !isCellEditable(column, row.data)) return;\n if (event.key === 'Enter' || event.key === 'F2') {\n event.preventDefault();\n onEditStart?.(cell);\n } else if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n onEditStart?.(cell, event.key);\n }\n }\n return () => (\n <tr\n {...mergeAttrs<'tr'>(\n {\n ...s.row,\n sx: [\n s.row.sx,\n tone && dataTableRowToneStyles[tone],\n selected && dataTableStateStyles.selected,\n active && dataTableStateStyles.active,\n onRowClick && dataTableStateStyles.clickable,\n ],\n },\n typeof propsRow === 'function' ? propsRow(row.data, index) : propsRow,\n {\n ref: measure,\n 'aria-rowindex': position + headerRows + 1,\n 'aria-selected': selectionMode != null ? selected : undefined,\n 'aria-current': active ? 'true' : undefined,\n onClick: onRowClick\n ? (event: MouseEvent) => {\n // 点在行里的控件上:交给控件自己\n if (\n (event.target as Element).closest('a, button, input, select, textarea, label')\n )\n return;\n onRowClick(row.data, row.key);\n }\n : undefined,\n },\n )}\n data-index={position}\n data-key={row.key}\n data-state={selected ? 'selected' : undefined}\n data-tone={tone}\n >\n {selectionMode && (\n <td\n {...mergeAttrs<'td'>(\n {\n ...s.selectCell,\n sx: [\n s.cell.sx,\n s.selectCell.sx,\n offsets.start.size > 0 && dataTableStateStyles.stickySelect,\n active && dataTableStateStyles.activeEdge,\n ],\n },\n propsSelectCell,\n )}\n >\n {selectionMode === 'single' ? (\n // 单选:同一个 name 的原生单选框,选中由 DataTableView 提供的 RadioGroupContext 决定\n <Radio\n {...mergePartProps<Partial<RadioProps>>(s.selectRadio, propsSelectRadio, {\n disabled: !selectable,\n 'aria-label': lang.tableSelectRow(index + 1),\n })}\n value={row.key}\n />\n ) : (\n <Checkbox\n {...mergePartProps<CheckboxProps>(\n // 名称每行不同(选择第 N 行):类型里不让使用方覆盖\n { ...s.selectCheckbox, 'aria-label': lang.tableSelectRow(index + 1) },\n propsSelectCheckbox,\n {\n _checked: selected,\n indeterminate: partial,\n disabled: !selectable,\n onChange: () => onToggle?.(row.key),\n },\n )}\n />\n )}\n </td>\n )}\n {detailColumn && (\n <td\n {...mergeAttrs<'td'>(\n {\n ...s.detailToggleCell,\n sx: [\n s.cell.sx,\n s.detailToggleCell.sx,\n leadingStickySx(offsets.start.size > 0, selectionMode ? SELECT_WIDTH : 0),\n active && !selectionMode && dataTableStateStyles.activeEdge,\n ],\n },\n propsDetailToggleCell,\n )}\n >\n {expandable && (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n {\n ...s.detailToggle,\n icon: ChevronRight,\n size: 'sm',\n radius: 'full',\n 'aria-label': lang.tableRowDetails(rowLabel(columns, row)),\n },\n propsDetailToggle,\n {\n 'aria-expanded': expanded,\n 'aria-controls': expanded ? detailId : undefined,\n // 箭头的转向跟着展开状态:使用方的 propsIcon 合并进来,而不是整个替换掉\n propsIcon: mergeProps<IconProps>(\n { flipInRtl: true, sx: disclosureStyles.icon },\n propsDetailToggle?.propsIcon,\n expanded ? { sx: dataTableStateStyles.chevronOpen } : undefined,\n ),\n onClick: () => onToggleDetail?.(row.key),\n },\n )}\n />\n )}\n </td>\n )}\n {columns.map((column, position) => {\n const editing = editingColumn === column.key;\n const value = editing\n ? renderEditor?.(row.data, column)\n : column.cell\n ? column.cell(row.data, index)\n : String(columnValue(column, row.data) ?? '');\n const error = cellNavigation ? rowErrors?.(row.data)?.[column.key] : undefined;\n const editable = cellNavigation && isCellEditable(column, row.data);\n return (\n <td\n key={column.key}\n {...mergeAttrs<'td'>(\n {\n ...s.cell,\n sx: [\n s.cell.sx,\n dataTableStateStyles[column.align ?? 'start'],\n column.wrap && dataTableStateStyles.wrap,\n stickyCellSx(column, offsets),\n active &&\n position === 0 &&\n !selectionMode &&\n !detailColumn &&\n dataTableStateStyles.activeEdge,\n cellNavigation && dataTableStateStyles.gridCell,\n editing && dataTableStateStyles.editingCell,\n !!error && dataTableStateStyles.invalidCell,\n ],\n },\n typeof propsCell === 'function' ? propsCell(row.data, column) : propsCell,\n cellNavigation\n ? ({\n 'data-column': column.key,\n 'aria-invalid': error ? 'true' : undefined,\n // 错误原因:悬停看,读屏随格一起念(aria-description)\n title: error,\n 'aria-description': error,\n onKeydown: (event: KeyboardEvent) => onCellKeydown(event, column),\n onDblclick: editable\n ? () => onEditStart?.({ row: row.key, column: column.key })\n : undefined,\n } as PartProps<'td'>)\n : {},\n )}\n >\n {position === 0 && leading ? (\n <div {...mergeAttrs<'div'>(s.leading, propsLeading)}>\n {leading(row, index)}\n <div {...mergeAttrs<'div'>(s.content, propsContent)}>{value}</div>\n </div>\n ) : (\n value\n )}\n </td>\n );\n })}\n </tr>\n );\n },\n);\n\n/** 行的名称(展开按钮用):第一列的文字,没有时用行的 key */\nexport function rowLabel<T>(\n columns: readonly DataTableColumn<T>[],\n row: DataTableRowModel<T>,\n): string {\n const first = columns[0] ? columnValue(columns[0], row.data) : undefined;\n return first != null && first !== '' ? String(first) : row.key;\n}\n\n/** DataTableDetailRow 的属性 */\nexport interface DataTableDetailRowProps<T> {\n /** 详情所属的行 */\n row: DataTableRowModel<T>;\n /** 在表体里的位置(测量与 aria-rowindex) */\n position: number;\n /** 表头有几行 */\n headerRows: number;\n /** 跨几列(全部列,含勾选列与详情列) */\n span: number;\n /** 勾选列与展开列的宽度(px):内容让过它们,和第一个数据列对齐 */\n indent: number;\n /** 详情单元格的 id(展开按钮的 aria-controls 指向它) */\n id: string;\n /** 详情的内容 */\n renderDetail: (row: T) => VNodeChild;\n /** 详情行的部件属性 */\n propsDetailRow?: PartProps<'tr', 'aria-rowindex'>;\n /** 详情单元格的部件属性 */\n propsDetailCell?: PartProps<'td', 'colspan'>;\n /** 测量行高(虚拟滚动) */\n measure: (element: unknown) => void;\n}\n\n/** 展开的详情:一行一个跨全部列的单元格;单独成组件,滚动时没变的详情不必重渲 */\nexport const DataTableDetailRow = _component(\n <T,>({\n row,\n position,\n headerRows,\n span,\n indent,\n id,\n renderDetail,\n propsDetailRow,\n propsDetailCell,\n measure,\n }: DataTableDetailRowProps<T>) => {\n const recipe = useRecipe(dataTableRecipe);\n // 不选档位:详情的格不要按密度的上下内边距(内边距在内容上),行的底色也用不到\n const s = _derived(recipe());\n return () => (\n <tr\n {...mergeAttrs<'tr'>(s.detailRow, propsDetailRow, {\n ref: measure,\n 'aria-rowindex': position + headerRows + 1,\n })}\n data-index={position}\n data-detail=\"\"\n >\n <td\n {...mergeAttrs<'td'>(\n { ...s.detailCell, sx: [s.cell.sx, s.detailCell.sx] },\n propsDetailCell,\n { id, colspan: span },\n )}\n >\n <div\n {...mergeAttrs<'div'>({\n ...s.detailContent,\n sx: [s.detailContent.sx, dataTableDynamicStyles.indent(indent)],\n })}\n >\n {renderDetail(row.data)}\n </div>\n </td>\n </tr>\n );\n },\n);\n\n/** 表体里的一行:数据行,或某一行展开的详情 */\ninterface BodyEntry<T> {\n /** 所属的数据行 */\n row: DataTableRowModel<T>;\n /** 数据行在 rows 里的序号 */\n index: number;\n /** 是这一行的详情 */\n detail: boolean;\n}\n\n/** 表格的渲染层:虚拟滚动的行、吸顶表头、固定列、排序、勾选、列宽调整、加载与空状态 */\nexport const DataTableView = _component(\n <T,>({\n rows,\n columns,\n sort,\n onSortClick,\n filters,\n onFilterChange,\n filterOptionsOf,\n columnMenu = false,\n onColumnAction,\n cellNavigation = false,\n editing,\n renderEditor,\n rowErrors,\n onEditStart,\n onEditKeydown,\n selectionMode,\n selectedKeys = [],\n partialKeys,\n onToggleRow,\n onToggleAll,\n widths,\n onResize,\n resizable = false,\n loading = false,\n empty,\n leading,\n density = 'standard',\n variant = 'surface',\n striped = false,\n estimateRowHeight,\n onRangeChange,\n handle,\n rowTone,\n activeKey,\n onRowClick,\n isRowSelectable,\n hiddenColumns,\n summaryLabel,\n columnGroups,\n renderDetail,\n hasDetail,\n expandedRows,\n onToggleDetail,\n flexible = false,\n propsRoot,\n propsRow,\n propsCell,\n propsHeaderCell,\n propsGroupHeaderCell,\n propsEmpty,\n propsSkeleton,\n propsSortButton,\n propsResizer,\n propsSortLabel,\n propsHead,\n propsHeadRow,\n propsSelectHeaderCell,\n propsSelectCell,\n propsSelectAll,\n propsSelectCheckbox,\n propsSelectRadio,\n propsLeading,\n propsContent,\n propsProgress,\n propsEmptyCell,\n propsFoot,\n propsSummaryCell,\n propsDetailHeaderCell,\n propsDetailToggleCell,\n propsDetailToggle,\n propsDetailRow,\n propsDetailCell,\n ...rest\n }: DataTableViewProps<T>) => {\n const lang = useLang();\n const columnDisplay = useColumnDisplay<T>();\n const recipe = useRecipe(dataTableRecipe);\n // 表头、表尾、骨架、空状态的部件层:只随密度、样式与主题定制变(行各自按奇偶取,见 DataTableRow)\n const s = _derived(recipe({ density, variant }));\n // 骨架、进度条防闪烁;aria-busy 与空状态按真实的 loading\n const indicator = useDelayedLoading(() => loading);\n const selectedSet = _derived.by(() => new Set(selectedKeys));\n const partialSet = _derived.by(() => new Set(partialKeys));\n // 单选:各行的 Radio 接入这一组(同一个 name,方向键在可见的行之间移动),选中即写回\n const radioName = useId();\n RadioGroupContext.provide({\n get value() {\n return selectedKeys[0] ?? null;\n },\n name: radioName,\n disabled: false,\n readonly: false,\n required: false,\n invalid: false,\n size: undefined,\n tone: 'accent',\n select: (key) => onToggleRow?.(key),\n });\n // 遍历全部行:放在派生里,滚动时的重新渲染不必再算一遍;全选只看能勾选的行\n const selectableRows = _derived(\n isRowSelectable ? rows.filter((row) => isRowSelectable(row.data)) : rows,\n );\n const allSelected = _derived(\n selectableRows.length > 0 && selectableRows.every((row) => selectedSet.has(row.key)),\n );\n const someSelected = _derived(\n !allSelected && selectableRows.some((row) => selectedSet.has(row.key)),\n );\n const hidden = _derived.by(() => new Set(hiddenColumns ?? []));\n const visibleColumns = _derived(\n hidden.size > 0 ? columns.filter((column) => !hidden.has(column.key)) : columns,\n );\n let viewport = _state.raw<HTMLElement | null>(null);\n let body = _state.raw<HTMLElement | null>(null);\n // 单元格导航:表体里的数据格之间用方向键走(虚拟滚动下聚焦的格滚进视口,后面的行随之渲染出来)\n _effect(() =>\n body && cellNavigation\n ? gridFocus(body, { rows: 'tr[data-key]', cells: 'td[data-column]' })\n : undefined,\n );\n let head = _state.raw<HTMLElement | null>(null);\n let foot = _state.raw<HTMLElement | null>(null);\n // 骨架铺满表体到窗口底边(第一次加载时表格还没有高度,只放几行显得没铺开);\n // 行高量已经画出来的第一行骨架,估计值与实际差几 px,几十行下来就差出一截\n let skeletonRows = _state(SKELETON_ROWS.min);\n _effect(() => {\n if (!indicator.value || !body || rows.length > 0) return;\n const drawn = (body.firstElementChild as HTMLElement | null)?.offsetHeight;\n const rowHeight = drawn || (estimateRowHeight ?? ROW_HEIGHT[density]);\n const space = window.innerHeight - body.getBoundingClientRect().top;\n skeletonRows = clamp(Math.ceil(space / rowHeight), SKELETON_ROWS.min, SKELETON_ROWS.max);\n });\n\n const detailIdPrefix = useId();\n const detailId = (index: number) => `${detailIdPrefix}-detail-${index}`;\n const expandedSet = _derived.by(() => new Set(expandedRows ?? []));\n /** 表体里的各行:展开了详情的行后面跟它的详情;没有展开的详情时为 null,直接用 rows */\n const entries = _derived.by((): BodyEntry<T>[] | null => {\n if (!renderDetail || expandedSet.size === 0) return null;\n const list: BodyEntry<T>[] = [];\n rows.forEach((row, index) => {\n list.push({ row, index, detail: false });\n // 展开记录里可能留着已经没有详情的行(数据变了):只给还有详情的行出详情\n if (expandedSet.has(row.key) && (hasDetail?.(row.data) ?? true)) {\n list.push({ row, index, detail: true });\n }\n });\n return list;\n });\n const entryAt = (position: number): BodyEntry<T> =>\n entries ? entries[position]! : { row: rows[position]!, index: position, detail: false };\n\n const virtual = useVirtualizer(() => {\n const current = rows;\n const list = entries;\n // 先读出来:估计行高对每一行都要调用一次(几万行),每次都经过 props 的响应式读取很慢\n const rowHeight = estimateRowHeight ?? ROW_HEIGHT[density];\n return {\n count: list?.length ?? current.length,\n scrollElement: viewport,\n list: body,\n estimateSize: (position: number) => (list?.[position]?.detail ? DETAIL_HEIGHT : rowHeight),\n // 详情的 key 是行的 key 加一个不会出现在 key 里的分隔:与数据行的 key 不会重复\n getItemKey: (position: number) => {\n if (!list) return current[position]!.key;\n const entry = list[position]!;\n return entry.detail ? `${entry.row.key}\\u0000detail` : entry.row.key;\n },\n overscan: 8,\n onRangeChange,\n // 表头吸顶、合计行吸底:滚动到某一行时停在它们之间,不被挡住\n scrollPaddingStart: () => head?.offsetHeight ?? 0,\n scrollPaddingEnd: () => foot?.offsetHeight ?? 0,\n };\n });\n\n // 挂载之后才交出 handle:使用方在回调里立即滚动(打开页面就定位到某一行)也能生效\n const api: DataTableHandle = {\n scrollToRow(key, options) {\n const position = entries\n ? entries.findIndex((entry) => !entry.detail && entry.row.key === key)\n : rows.findIndex((row) => row.key === key);\n if (position < 0) return false;\n virtual.scrollToIndex(position, options);\n return true;\n },\n };\n watch(\n () => viewport,\n (element) => {\n if (element) handle?.(api);\n },\n { flush: 'post' },\n );\n\n // 每列的值类型(没写 type 时看第一个非空值)拼成字符串:类型没变时 shown 保持同一个引用,行组件不必重渲\n const types = _derived(\n visibleColumns\n .map((column) =>\n columnType(\n column,\n (function* () {\n for (const row of rows) yield row.data;\n })(),\n ),\n )\n .join('|'),\n );\n /** 补上默认对齐与格式化的列:没写 align、cell 的列按值类型来 */\n const shown = _derived.by(() =>\n columnDisplay.columns(visibleColumns, types.split('|') as (keyof ColumnTypes)[]),\n );\n const hasSummary = _derived(visibleColumns.some((column) => column.summary != null));\n // 有可见的分组时表头两行:第一行是分组标题与没分组的列(跨两行),第二行是组里的列\n const layout = _derived.by(() =>\n columnGroups?.length ? headerLayout(shown, columnGroups) : null,\n );\n const headerRows = _derived(layout?.some((cell) => cell.kind === 'group') ? 2 : 1);\n\n // 合计只随数据与列变:放在派生值里,滚动时(虚拟列表每换一次可见范围都重新渲染)不再逐行重算\n const rowData = _derived.by(() => rows.map((row) => row.data));\n const sums = _derived.by(() =>\n hasSummary\n ? shown.map((column) => (column.summary === 'sum' ? sumColumn(column, rowData) : null))\n : [],\n );\n\n /** 合计行里一列的内容 */\n function summaryOf(column: DataTableColumn<T>, position: number): VNodeChild {\n if (column.summary === 'sum') {\n const type = (types.split('|')[position] ?? 'number') as keyof ColumnTypes;\n const total = sums[position];\n return total == null\n ? (column.empty ?? lang.emptyValue)\n : columnDisplay.value(column, type, total);\n }\n if (column.summary) return column.summary(rowData);\n return position === 0 ? (summaryLabel ?? lang.tableSummary) : null;\n }\n\n /** 列的宽度:调整过的、列定义里的,或者没有(与其他没写宽度的列平分) */\n const widthOf = (column: DataTableColumn<T>) => widths[column.key] ?? column.width;\n\n const leadingWidth = () =>\n (selectionMode ? SELECT_WIDTH : 0) + (renderDetail ? DETAIL_WIDTH : 0);\n const bodyRowCount = () => entries?.length ?? rows.length;\n // 偏移没变时沿用上一次的对象:它交给每一行,调整非固定列的宽度(每次指针移动)时各行不必重渲染\n let lastOffsets: StickyOffsets | undefined;\n const offsets = _derived.by(() => {\n const next = stickyOffsets(shown, widthOf, leadingWidth());\n if (lastOffsets && sameStickyOffsets(lastOffsets, next)) return lastOffsets;\n return (lastOffsets = next);\n });\n const minWidth = () => tableMinWidth(shown, widthOf, leadingWidth());\n\n const sorts = _derived(sortList(sort));\n\n /** 列标题结尾的筛选按钮与列菜单 */\n function renderHeaderActions(\n column: DataTableColumn<T>,\n label: string,\n cell: () => HTMLElement | null,\n ) {\n const filter = columnFilter(column);\n if (!filter && !columnMenu) return null;\n const position = shown.findIndex((item) => item.key === column.key);\n const neighbour = (step: 1 | -1) => shown[position + step];\n return (\n <>\n {filter && (\n <ColumnFilterButton\n label={label}\n options={filter.options === 'text' ? 'text' : (filterOptionsOf?.(column) ?? [])}\n values={filters?.[column.key] ?? []}\n onChange={(values) => onFilterChange?.(column.key, values)}\n />\n )}\n {columnMenu && (\n <ColumnMenuButton\n label={label}\n sortable={!!column.sortable}\n sorted={sorts.find((item) => item.key === column.key)?.direction}\n pinned={column.sticky}\n // 固定列与不固定的列各自一段,只在段内移动\n canMove={{\n backward: neighbour(-1)?.sticky === column.sticky,\n forward: neighbour(1)?.sticky === column.sticky,\n }}\n canHide={shown.length > 1}\n onAction={(action) => onColumnAction?.(column.key, action, cell()?.offsetWidth ?? 0)}\n />\n )}\n </>\n );\n }\n\n /** 一个列标题;rowspan 是没分组的列在两行表头里跨两行,divider 是与分组相邻的竖线 */\n function renderHeaderCell(column: DataTableColumn<T>, rowspan = 1, divider = false) {\n const own = typeof propsHeaderCell === 'function' ? propsHeaderCell(column) : propsHeaderCell;\n const priority = sorts.findIndex((item) => item.key === column.key);\n const sorted = priority >= 0 ? sorts[priority]!.direction : undefined;\n const label = plainText(column.header) ?? column.key;\n const canResize = column.resizable ?? resizable;\n let cell: HTMLElement | null = null;\n const actions = renderHeaderActions(column, label, () => cell);\n const sortButton = column.sortable && (\n <ButtonBase\n {...mergePartProps<ButtonBaseProps>(s.sortButton, propsSortButton, {\n onClick: (event: MouseEvent) => onSortClick?.(column.key, event),\n })}\n >\n <span {...mergeAttrs<'span'>(s.sortLabel, propsSortLabel)}>{column.header}</span>\n <Icon\n {...mergePartProps<IconProps>({\n ...s.sortIcon,\n icon:\n sorted === 'ascending'\n ? ArrowUp\n : sorted === 'descending'\n ? ArrowDown\n : ArrowUpDown,\n sx: [s.sortIcon.sx, sorted && dataTableStateStyles.sortActive],\n })}\n />\n {sorts.length > 1 && priority >= 0 && (\n <>\n <span {...mergeAttrs<'span'>(s.sortPriority)} aria-hidden=\"true\">\n {priority + 1}\n </span>\n {/* aria-sort 只放在第一排序列上(ARIA 的要求),其余列的次序与方向写给读屏 */}\n {priority > 0 && (\n <VisuallyHidden>\n {lang.tableSortPriority(\n priority + 1,\n sorted === 'ascending' ? lang.tableSortAscending : lang.tableSortDescending,\n )}\n </VisuallyHidden>\n )}\n </>\n )}\n </ButtonBase>\n );\n const content = sortButton || column.header;\n return (\n <th\n key={column.key}\n {...mergeAttrs<'th'>(\n {\n ...s.headerCell,\n sx: [\n s.headerCell.sx,\n dataTableStateStyles[column.align ?? 'start'],\n stickyCellSx(column, offsets),\n divider && dataTableStateStyles.groupDivider,\n ],\n },\n own,\n {\n ref: (element: unknown) => (cell = element as HTMLElement | null),\n scope: 'col',\n rowspan: rowspan > 1 ? rowspan : undefined,\n 'aria-sort': column.sortable ? (priority === 0 ? sorted : 'none') : undefined,\n },\n )}\n data-sticky={column.sticky}\n >\n {actions ? (\n <div {...mergeAttrs<'div'>(s.headerContent)}>\n <span\n {...mergeAttrs<'span'>({\n ...s.headerMain,\n sx: [\n s.headerMain.sx,\n column.align === 'end' && dataTableStateStyles.headerMainEnd,\n ],\n })}\n >\n {content}\n </span>\n {actions}\n </div>\n ) : (\n content\n )}\n {canResize && (\n <ColumnResizer\n {...mergePartProps<ColumnResizerProps>(\n {\n label,\n width: widthOf(column),\n minWidth: column.minWidth,\n onWidthChange: (width: number) => onResize?.(column.key, width),\n },\n propsResizer,\n )}\n />\n )}\n </th>\n );\n }\n\n /** 一个分组标题:跨组里的几列 */\n function renderGroupCell(\n group: DataTableColumnGroup,\n members: DataTableColumn<T>[],\n key: string,\n divider: boolean,\n ) {\n return (\n <th\n key={key}\n {...mergeAttrs<'th'>(\n {\n ...s.groupHeaderCell,\n sx: [\n s.headerCell.sx,\n s.groupHeaderCell.sx,\n groupStickySx(members, offsets),\n divider && dataTableStateStyles.groupDivider,\n ],\n },\n typeof propsGroupHeaderCell === 'function'\n ? propsGroupHeaderCell(group)\n : propsGroupHeaderCell,\n { scope: 'colgroup', colspan: members.length },\n )}\n >\n {group.header}\n </th>\n );\n }\n\n /** 表头的列标题:一行;有分组时两行 */\n function renderHeaderRows(selectHeader: VNodeChild, detailHeader: VNodeChild) {\n const cells = layout;\n if (!cells || headerRows === 1)\n return (\n <tr {...mergeAttrs<'tr'>(s.headRow, propsHeadRow, { 'aria-rowindex': 1 })}>\n {selectHeader}\n {detailHeader}\n {shown.map((column) => renderHeaderCell(column))}\n </tr>\n );\n const nextToGroup = (position: number) =>\n position > 0 &&\n (cells[position]!.kind === 'group' || cells[position - 1]!.kind === 'group');\n return [\n <tr key=\"groups\" {...mergeAttrs<'tr'>(s.headRow, propsHeadRow, { 'aria-rowindex': 1 })}>\n {selectHeader}\n {detailHeader}\n {cells.map((cell, position) =>\n cell.kind === 'group'\n ? renderGroupCell(\n cell.group,\n cell.columns,\n `${cell.group.key}-${position}`,\n nextToGroup(position),\n )\n : renderHeaderCell(cell.column, 2, nextToGroup(position)),\n )}\n </tr>,\n <tr key=\"columns\" {...mergeAttrs<'tr'>(s.headRow, propsHeadRow, { 'aria-rowindex': 2 })}>\n {cells.flatMap((cell, position) =>\n cell.kind === 'group'\n ? cell.columns.map((column, index) =>\n renderHeaderCell(column, 1, index === 0 && position > 0),\n )\n : [],\n )}\n </tr>,\n ];\n }\n\n return () => {\n const span = shown.length + (selectionMode ? 1 : 0) + (renderDetail ? 1 : 0);\n const items = virtual.items;\n const top = items[0]?.start ?? 0;\n const bottom = items.length ? virtual.total - items.at(-1)!.end : 0;\n return (\n <ScrollArea\n {...mergePartProps<ScrollAreaProps>(\n {\n ...s.root,\n axis: 'both',\n sx: [s.root.sx, flexible && dataTableStateStyles.flexible],\n },\n propsRoot,\n { propsViewport: { ref: _toRef(viewport) } },\n )}\n >\n <table\n {...mergeAttrs<'table'>(\n { ...s.table, sx: [s.table.sx, dataTableDynamicStyles.minWidth(minWidth())] },\n rest,\n {\n // 合计行只在有数据时渲染(见 tfoot),没渲染时不算进总行数\n 'aria-rowcount':\n bodyRowCount() + headerRows + (hasSummary && rows.length > 0 ? 1 : 0),\n 'aria-busy': loading || undefined,\n // 单元格导航:读屏按网格念,方向键在格之间走\n role: cellNavigation ? 'grid' : undefined,\n },\n )}\n >\n <colgroup>\n {selectionMode && <col {...css.attrs(dataTableDynamicStyles.width(SELECT_WIDTH))} />}\n {renderDetail && <col {...css.attrs(dataTableDynamicStyles.width(DETAIL_WIDTH))} />}\n {shown.map((column) => {\n const width = widthOf(column);\n return (\n <col\n key={column.key}\n {...(width != null ? css.attrs(dataTableDynamicStyles.width(width)) : {})}\n />\n );\n })}\n </colgroup>\n <thead {...mergeAttrs<'thead'>(s.head, propsHead, { ref: _toRef(head) })}>\n {renderHeaderRows(\n selectionMode && (\n <th\n {...mergeAttrs<'th'>(\n {\n ...s.selectHeaderCell,\n sx: [\n s.headerCell.sx,\n s.selectHeaderCell.sx,\n offsets.start.size > 0 && dataTableStateStyles.stickySelect,\n ],\n },\n propsSelectHeaderCell,\n { scope: 'col', rowspan: headerRows > 1 ? headerRows : undefined },\n )}\n >\n {selectionMode === 'single' && (\n // 单选没有全选:这一列的标题只给读屏\n <VisuallyHidden>{lang.tableSelectColumn}</VisuallyHidden>\n )}\n {selectionMode === 'multiple' && (\n <Checkbox\n {...mergePartProps<CheckboxProps>(\n { ...s.selectAll, 'aria-label': lang.tableSelectAll },\n propsSelectAll,\n {\n _checked: allSelected,\n indeterminate: someSelected,\n disabled: selectableRows.length === 0,\n onChange: () => onToggleAll?.(),\n },\n )}\n />\n )}\n </th>\n ),\n renderDetail && (\n <th\n {...mergeAttrs<'th'>(\n {\n ...s.detailHeaderCell,\n sx: [\n s.headerCell.sx,\n s.detailHeaderCell.sx,\n leadingStickySx(offsets.start.size > 0, selectionMode ? SELECT_WIDTH : 0),\n ],\n },\n propsDetailHeaderCell,\n { scope: 'col', rowspan: headerRows > 1 ? headerRows : undefined },\n )}\n >\n <span {...css.attrs(visuallyHiddenStyles.hidden)}>{lang.tableDetails}</span>\n </th>\n ),\n )}\n {indicator.value && rows.length > 0 && (\n <tr aria-hidden=\"true\">\n <td colspan={span} {...mergeAttrs<'td'>(s.progressCell)}>\n <div {...mergeAttrs<'div'>(s.progress)}>\n <Progress\n {...mergePartProps<ProgressProps>(\n { size: 'xs', 'aria-label': lang.loading },\n propsProgress,\n )}\n />\n </div>\n </td>\n </tr>\n )}\n </thead>\n <tbody {...mergeAttrs<'tbody'>(s.body)} ref={_toRef(body)}>\n {rows.length === 0 &&\n indicator.value &&\n Array.from({ length: skeletonRows }, (_, index) => (\n <tr key={`skeleton-${index}`} aria-hidden=\"true\" {...mergeAttrs<'tr'>(s.row)}>\n {selectionMode && <td {...mergeAttrs<'td'>(s.cell)} />}\n {renderDetail && <td {...mergeAttrs<'td'>(s.cell)} />}\n {shown.map((column, position) => (\n <td key={column.key} {...mergeAttrs<'td'>(s.cell)}>\n <Skeleton\n {...mergePartProps<SkeletonProps>(\n {\n ...s.skeleton,\n sx: [\n s.skeleton.sx,\n dataTableDynamicStyles.percent(\n `${90 - ((index + position) % 4) * 15}%`,\n ),\n ],\n // 同一行的单元格一起扫,行与行依次错开:一道波从上往下推过表格\n delay: index * SHIMMER_STAGGER,\n },\n propsSkeleton,\n )}\n />\n </td>\n ))}\n </tr>\n ))}\n {rows.length === 0 && !loading && (\n <tr>\n <td\n {...mergeAttrs<'td'>(\n { ...s.emptyCell, sx: [s.cell.sx, s.emptyCell.sx] },\n propsEmptyCell,\n { colspan: span },\n )}\n >\n {empty ?? (\n <Empty\n {...mergePartProps<EmptyProps>(\n { size: 'sm', title: lang.tableEmpty },\n propsEmpty,\n )}\n />\n )}\n </td>\n </tr>\n )}\n {top > 0 && (\n <tr aria-hidden=\"true\">\n <td\n colspan={span}\n {...mergeAttrs<'td'>({\n ...s.spacer,\n sx: [s.spacer.sx, dataTableDynamicStyles.height(top)],\n })}\n />\n </tr>\n )}\n {items.map((item) => {\n const { row, index, detail } = entryAt(item.index);\n if (detail && renderDetail)\n return (\n <DataTableDetailRow\n key={item.key as string}\n row={row}\n position={item.index}\n headerRows={headerRows}\n span={span}\n indent={leadingWidth()}\n id={detailId(index)}\n renderDetail={renderDetail}\n propsDetailRow={propsDetailRow}\n propsDetailCell={propsDetailCell}\n measure={virtual.measure}\n />\n );\n return (\n <DataTableRow\n key={row.key}\n row={row}\n index={index}\n position={item.index}\n detailColumn={renderDetail != null}\n expandable={hasDetail ? hasDetail(row.data) : true}\n expanded={expandedSet.has(row.key)}\n detailId={detailId(index)}\n propsDetailToggleCell={propsDetailToggleCell}\n propsDetailToggle={propsDetailToggle}\n onToggleDetail={onToggleDetail}\n selected={selectionMode != null && selectedSet.has(row.key)}\n partial={partialSet.has(row.key)}\n selectable={isRowSelectable ? isRowSelectable(row.data) : true}\n tone={rowTone?.(row.data)}\n active={activeKey != null && activeKey === row.key}\n onRowClick={onRowClick}\n selectionMode={selectionMode}\n columns={shown}\n density={density}\n variant={variant}\n striped={striped}\n offsets={offsets}\n headerRows={headerRows}\n leading={leading}\n propsRow={propsRow}\n propsCell={propsCell}\n propsSelectCell={propsSelectCell}\n propsSelectCheckbox={propsSelectCheckbox}\n propsSelectRadio={propsSelectRadio}\n propsLeading={propsLeading}\n propsContent={propsContent}\n measure={virtual.measure}\n onToggle={onToggleRow}\n cellNavigation={cellNavigation}\n editingColumn={editing?.row === row.key ? editing.column : undefined}\n renderEditor={renderEditor}\n rowErrors={rowErrors}\n onEditStart={onEditStart}\n onEditKeydown={onEditKeydown}\n />\n );\n })}\n {bottom > 0 && (\n <tr aria-hidden=\"true\">\n <td\n colspan={span}\n {...mergeAttrs<'td'>({\n ...s.spacer,\n sx: [s.spacer.sx, dataTableDynamicStyles.height(bottom)],\n })}\n />\n </tr>\n )}\n </tbody>\n {hasSummary && rows.length > 0 && (\n <tfoot {...mergeAttrs<'tfoot'>(s.foot, propsFoot, { ref: _toRef(foot) })}>\n <tr aria-rowindex={bodyRowCount() + headerRows + 1}>\n {selectionMode && (\n <td\n {...mergeAttrs<'td'>({\n ...s.summaryCell,\n sx: [\n s.cell.sx,\n s.summaryCell.sx,\n offsets.start.size > 0 && dataTableStateStyles.stickySelect,\n ],\n })}\n />\n )}\n {renderDetail && (\n <td\n {...mergeAttrs<'td'>({\n ...s.summaryCell,\n sx: [\n s.cell.sx,\n s.summaryCell.sx,\n leadingStickySx(offsets.start.size > 0, selectionMode ? SELECT_WIDTH : 0),\n ],\n })}\n />\n )}\n {shown.map((column, position) => (\n <td\n key={column.key}\n {...mergeAttrs<'td'>(\n {\n ...s.summaryCell,\n sx: [\n s.cell.sx,\n s.summaryCell.sx,\n dataTableStateStyles[column.align ?? 'start'],\n stickyCellSx(column, offsets),\n ],\n },\n typeof propsSummaryCell === 'function'\n ? propsSummaryCell(column)\n : propsSummaryCell,\n )}\n >\n {summaryOf(column, position)}\n </td>\n ))}\n </tr>\n </tfoot>\n )}\n </table>\n </ScrollArea>\n );\n };\n },\n { name: 'DataTableView' },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"DataTableView.js","names":["_isVNode","_vtp_readonlyProp","_vue_computed","_createVNode","_mergeProps","_vtp_restProps","_vue_shallowRef","_vue_ref","_Fragment"],"sources":["../../src/table/DataTableView.tsx"],"sourcesContent":["/**\n * 表格的渲染层:DataTable、TreeDataTable 共用(同 Listbox 与 ListboxView 的分工)。只管画,状态(排序、选择、展开、列宽)由外层决定。\n *\n * - 结构:原生 table(读屏按表格念:第几行第几列、列标题)+ table-layout: fixed + colgroup 定列宽,\n * 外层是 ScrollArea(两个方向滚动,内容超出时视口可聚焦,键盘也能滚)。\n * - 虚拟滚动(useVirtualizer):只渲染看得见的行,上下各一行占位撑出滚动高度(各列仍在同一张表里对齐);\n * 行带 aria-rowindex,表格带 aria-rowcount,读屏知道总行数与当前位置。\n * - 分组表头(columnGroups):相邻的几列上方共用一个标题,表头两行(th scope=\"colgroup\"),没分组的列跨两行。\n * - 吸顶表头、固定列:position: sticky,固定列的偏移按列宽累加(逻辑方向,从右到左排版自动换边);\n * 固定列的单元格继承行的底色,盖住滚过去的内容。\n * - 排序:可排序的列标题是按钮,th 带 aria-sort(多列排序时只在第一排序列上,其余列的次序写给读屏);\n * 勾选列用 Checkbox(表头的全选有部分选中状态)。\n * - 表头筛选(列定义的 filter)与列菜单(columnMenu):列标题结尾的小按钮(ColumnHeaderActions),状态在外层。\n * - 单元格导航(cellNavigation):表格是 role=\"grid\",方向键在格之间走(gridFocus),只有一格能 Tab 进入;\n * 可编辑的格按 Enter / F2、双击或直接打字开始编辑,编辑器由外层给(renderEditor),校验错误标在格上(rowErrors)。\n * - 列宽:表头结束边的 ColumnResizer(拖动或 ← / →)调整;固定列偏移与最小宽度的计算在 columns.ts。\n * - 详情行(renderDetail):多一列展开按钮(aria-expanded、aria-controls),展开的行下面多一行跨全部列的详情,\n * 内容让过勾选列与展开列、和第一个数据列对齐;\n * 详情在虚拟滚动里也算一行(测量真实高度),内容贴着视口的起始边,横向滚动时不跟着滚走。\n * - 加载:没有数据时显示骨架行;已有数据(刷新中)时表头下方显示一条进度条;表格带 aria-busy。没有数据时显示 Empty。\n */\nimport { ArrowDown, ArrowUp, ArrowUpDown, ChevronRight } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { useId, watch, type VNodeChild } from 'vue';\nimport { ButtonBase, type ButtonBaseProps } from '../base/ButtonBase';\nimport { Icon, type IconProps } from '../base/Icon';\nimport { IconButton, type IconButtonProps } from '../base/IconButton';\nimport { VisuallyHidden, visuallyHiddenStyles } from '../base/VisuallyHidden';\nimport { clamp } from '../utils/data/number';\nimport { useDelayedLoading } from '../utils/motion/delayed-loading';\nimport { useLang } from '../config/context';\nimport { useRecipe } from '../config/styles';\nimport { Empty, type EmptyProps } from '../feedback/Empty';\nimport { Progress, type ProgressProps } from '../feedback/Progress';\nimport { Skeleton, type SkeletonProps, type SkeletonShapeProps } from '../feedback/Skeleton';\nimport { SHIMMER_STAGGER } from '../utils/style/shimmer';\nimport { Checkbox, type CheckboxProps } from '../input/Checkbox';\nimport { Radio, RadioGroupContext, type RadioProps } from '../input/Radio';\nimport { ScrollArea, type ScrollAreaProps } from '../layout/ScrollArea';\nimport { mergeAttrs, mergePartProps, mergeProps, type PartProps } from '../utils/props';\nimport { disclosureStyles } from '../utils/style/transitions';\nimport type { SelectionModes } from '../utils/data/selection';\nimport { plainText } from '../utils/data/text';\nimport { gridFocus } from '../utils/dom/roving-focus';\nimport { useVirtualizer } from '../utils/virtual/use-virtualizer';\nimport type { VirtualScrollOptions, VisibleRange } from '../utils/virtual/virtualizer';\nimport {\n ColumnFilterButton,\n ColumnMenuButton,\n type ColumnMenuActions,\n} from './ColumnHeaderActions';\nimport { ColumnResizer, type ColumnResizerProps } from './ColumnResizer';\nimport { useColumnDisplay } from './column-display';\nimport {\n columnFilter,\n columnType,\n isCellEditable,\n columnValue,\n headerLayout,\n sameStickyOffsets,\n stickyOffsets,\n sortList,\n sumColumn,\n tableMinWidth,\n type ColumnFilterOption,\n type ColumnTypes,\n type DataTableColumnGroup,\n type SortState,\n type StickyOffsets,\n type DataTableColumn,\n} from './columns';\nimport {\n dataTableRecipe,\n dataTableStateStyles,\n type DataTableDensities,\n type DataTableOptions,\n type DataTableVariants,\n} from './table-styles';\n\n/** 要渲染的一行:DataTable 是平铺的行,TreeDataTable 是展开后的树(带层级) */\nexport interface DataTableRowModel<T> {\n /** 行的 key(选择、展开、测量都按它) */\n key: string;\n /** 这一行的数据 */\n data: T;\n /** 层级(TreeDataTable),从 0 开始 */\n depth: number;\n}\n\n/** 行、单元格的部件属性:可以按行(与列)计算 */\ntype RowPartProps<T> = PartProps<'tr'> | ((row: T, index: number) => PartProps<'tr'>);\ntype CellPartProps<T> = PartProps<'td'> | ((row: T, column: DataTableColumn<T>) => PartProps<'td'>);\n\n/** DataTableView 的属性;未声明的属性落到 table 上(aria-label 或 aria-labelledby 是表格的名称) */\nexport interface DataTableViewProps<T> extends PartProps<'table', 'role'>, DataTableOptions {\n /** 要渲染的行(已排序、已按展开状态展开) */\n rows: readonly DataTableRowModel<T>[];\n /** 列 */\n columns: readonly DataTableColumn<T>[];\n /** 当前排序:一列,或多列(前面的优先) */\n sort?: SortState | readonly SortState[] | null;\n /** 点了可排序的列标题(多列排序时按住 Shift 是追加) */\n onSortClick?: (key: string, event: MouseEvent) => void;\n /** 表头筛选:各列选中的值(列定义写了 filter 的列,列标题上有筛选按钮) */\n filters?: Readonly<Record<string, readonly string[]>>;\n /** 改了一列的筛选 */\n onFilterChange?: (key: string, values: string[]) => void;\n /** 表头筛选的选项(列出出现过的值时要看全部行,由外层给) */\n filterOptionsOf?: (column: DataTableColumn<T>) => readonly ColumnFilterOption[];\n /** 列菜单:列标题结尾多一个 ⋮,排序、固定、移动、隐藏,选了交给 onColumnAction */\n columnMenu?: boolean;\n /** 选了列菜单里的一项;width 是这一列现在的宽度(固定没写宽度的列时,外层把它记成列宽) */\n onColumnAction?: (key: string, action: keyof ColumnMenuActions, width: number) => void;\n /** 单元格导航:表格是 role=\"grid\",方向键在格之间走,只有一格能 Tab 进入;有可编辑的列时默认开 */\n cellNavigation?: boolean;\n /** 正在编辑的格 */\n editing?: CellPosition | null;\n /** 正在编辑的格里放的编辑器 */\n renderEditor?: (row: T, column: DataTableColumn<T>) => VNodeChild;\n /** 各行的校验错误:列的 key → 原因(行校验,如“结束日期早于开始日期”),标在格上 */\n rowErrors?: (row: T) => Readonly<Record<string, string>> | null | undefined;\n /** 在可编辑的格上按 Enter / F2、双击,或直接打字(text 是打的字,替换原值):开始编辑 */\n onEditStart?: (cell: CellPosition, text?: string) => void;\n /** 编辑中的按键(Enter 提交、Tab 提交并到下一格、Esc 放弃),由外层处理 */\n onEditKeydown?: (event: KeyboardEvent, cell: CellPosition) => void;\n /** 选择方式;不写时没有勾选列。多选时表头有全选 */\n selectionMode?: keyof SelectionModes;\n /** 已选行的 key */\n selectedKeys?: readonly string[];\n /** 部分勾选的行的 key(树形表格的父行:子孙只勾了一部分):勾选框显示横线,读屏念“部分选中” */\n partialKeys?: readonly string[];\n /** 勾选或取消一行 */\n onToggleRow?: (key: string) => void;\n /** 表头的全选:全部选中时取消全部,否则全选 */\n onToggleAll?: () => void;\n /** 各列当前的宽度(px):拖动调整过的、或列定义里写的 */\n widths: Readonly<Record<string, number | undefined>>;\n /** 拖动或用键盘调整了某列的宽度 */\n onResize?: (key: string, width: number) => void;\n /** 列宽可以调整(列定义里的 resizable 优先) */\n resizable?: boolean;\n /** 加载中 */\n loading?: boolean;\n /** 没有数据时显示的内容;默认是 Empty(文案取语言包) */\n empty?: VNodeChild;\n /** 第一个数据列的单元格内容前面加的东西(TreeDataTable 的缩进与展开按钮) */\n leading?: (row: DataTableRowModel<T>, index: number) => VNodeChild;\n /** 行的估计高度(px);不写时按密度估计,渲染后以实际高度为准 */\n estimateRowHeight?: number;\n /** 行的色调:导入校验的错误行、即将超期的行整行着浅色底(不透明,固定列也盖得住) */\n rowTone?: (row: T) => RowTone | undefined;\n /** 主从视图里正在看的那一行的 key:整行高亮、起始边一条竖线,带 aria-current */\n activeKey?: string | null;\n /**\n * 点了一行(点在按钮、链接、输入框上的除外):主从视图里打开这一行的详情。\n * 只是鼠标的捷径:行里还要有键盘能到的入口(如名称做成按钮或链接)\n */\n onRowClick?: (row: T, key: string) => void;\n /** 这一行能不能勾选:不能的勾选框不可用,全选也跳过它 */\n isRowSelectable?: (row: T) => boolean;\n /** 隐藏的列的 key:列显示设置(用 Menu 的 MenuCheckboxItem 组合)写回这里 */\n hiddenColumns?: readonly string[];\n /** 合计行第一列的文字(第一列自己没写 summary 时),默认取语言包(合计) */\n summaryLabel?: VNodeChild;\n /** 分组表头:相邻的几列上方共用一个标题,表头变成两行;没分组的列跨两行 */\n columnGroups?: readonly DataTableColumnGroup[];\n /** 行的详情:写了它时多一列展开按钮,展开的行下面多一行跨全部列的详情 */\n renderDetail?: (row: T) => VNodeChild;\n /** 这一行有没有详情:没有的不显示展开按钮;默认都有 */\n hasDetail?: (row: T) => boolean;\n /** 展开了详情的行的 key */\n expandedRows?: readonly string[];\n /** 点了一行的展开按钮 */\n onToggleDetail?: (key: string) => void;\n /** 可见行范围变化(不含 overscan):接近末尾时加载更多 */\n onRangeChange?: (range: VisibleRange) => void;\n /** 挂载后拿到滚动到某一行的方法:`handle={(api) => (table = api)}` */\n handle?: (api: DataTableHandle) => void;\n /**\n * 放在竖排的弹性容器(ViewportFill、Flex direction=\"column\")里:按行数自己的高度,最多占到剩下的高度,\n * 再多在表格里滚动;分页紧跟在表格下面。不写时最高 32em\n */\n flexible?: boolean;\n /** 外层滚动区域(决定表格的高度)的部件属性;高度用 sx 给,默认最高 32em */\n propsRoot?: Partial<ScrollAreaProps>;\n /** 每一行(tr)的部件属性,可以按行计算 */\n propsRow?: RowPartProps<T>;\n /** 每个单元格(td)的部件属性,可以按行与列计算 */\n propsCell?: CellPartProps<T>;\n /** 每个列标题(th)的部件属性,可以按列计算 */\n propsHeaderCell?: PartProps<'th'> | ((column: DataTableColumn<T>) => PartProps<'th'>);\n /** 空状态的部件属性 */\n propsEmpty?: Partial<EmptyProps>;\n /** 加载中占位的部件属性 */\n propsSkeleton?: SkeletonShapeProps;\n /** 分组标题(th,跨组里的几列)的部件属性,可以按组计算 */\n propsGroupHeaderCell?: PartProps<'th'> | ((group: DataTableColumnGroup) => PartProps<'th'>);\n /** 可排序列标题里的排序按钮的部件属性 */\n propsSortButton?: Partial<ButtonBaseProps>;\n /** 列宽调整手柄的部件属性 */\n propsResizer?: Partial<ColumnResizerProps>;\n /** 可排序列标题里的文字(排序按钮里、图标前)的部件属性 */\n propsSortLabel?: PartProps<'span'>;\n /** 表头(thead,吸顶)的部件属性 */\n propsHead?: PartProps<'thead'>;\n /** 表头的行(tr)的部件属性;分组表头的两行都用它 */\n propsHeadRow?: PartProps<'tr', 'aria-rowindex'>;\n /** 表头勾选列(th,多选时里面是全选框)的部件属性 */\n propsSelectHeaderCell?: PartProps<'th', 'scope'>;\n /** 每行勾选列(td)的部件属性 */\n propsSelectCell?: PartProps<'td'>;\n /** 表头的全选框(多选时)的部件属性;勾选状态、不可用与切换由组件管理 */\n propsSelectAll?: Omit<Partial<CheckboxProps>, SelectCheckboxManaged | 'disabled'>;\n /** 每一行的勾选框(多选时)的部件属性;勾选状态、切换与名称(选择第 N 行,每行不同)由组件管理 */\n propsSelectCheckbox?: Omit<Partial<CheckboxProps>, SelectCheckboxManaged | 'aria-label'>;\n /** 每一行的单选框(单选时)的部件属性;选中状态、切换与名称由组件管理 */\n propsSelectRadio?: Omit<Partial<RadioProps>, 'value' | 'disabled' | 'aria-label'>;\n /** 第一个数据列里 leading 与内容的外层(有 leading 时才有)的部件属性 */\n propsLeading?: PartProps<'div'>;\n /** 第一个数据列里内容的包装(有 leading 时才有)的部件属性 */\n propsContent?: PartProps<'div'>;\n /** 刷新中表头下方的进度条的部件属性 */\n propsProgress?: Partial<ProgressProps>;\n /** 空状态所在的单元格(td,跨全部列)的部件属性 */\n propsEmptyCell?: PartProps<'td', 'colspan'>;\n /** 详情列的列标题(th,文字只给读屏)的部件属性 */\n propsDetailHeaderCell?: PartProps<'th', 'scope'>;\n /** 每行展开按钮所在单元格(td)的部件属性 */\n propsDetailToggleCell?: PartProps<'td'>;\n /** 展开按钮的部件属性;展开状态、关联的详情与点击由组件管理 */\n propsDetailToggle?: Omit<Partial<IconButtonProps>, 'aria-expanded' | 'aria-controls' | 'onClick'>;\n /** 详情行(tr)的部件属性 */\n propsDetailRow?: PartProps<'tr', 'aria-rowindex'>;\n /** 详情所在的单元格(td,跨全部列)的部件属性 */\n propsDetailCell?: PartProps<'td', 'colspan'>;\n /** 表尾(tfoot,合计行,吸底)的部件属性 */\n propsFoot?: PartProps<'tfoot'>;\n /** 合计行每个单元格的部件属性,可以按列计算 */\n propsSummaryCell?: PartProps<'td'> | ((column: DataTableColumn<T>) => PartProps<'td'>);\n}\n\n/** 一格的位置:行的 key 与列的 key */\nexport interface CellPosition {\n /** 行的 key */\n row: string;\n /** 列的 key */\n column: string;\n}\n\n/** DataTable、TreeDataTable 的 handle 拿到的方法 */\nexport interface DataTableHandle {\n /**\n * 滚动到 key 这一行:还没渲染(虚拟滚动)的行也行,停在吸顶表头之下、吸底合计行之上;\n * align 默认 auto(已经完整可见就不动)。树形表格里只能滚到已展开的行。找不到这一行时返回 false\n */\n scrollToRow: (key: string, options?: VirtualScrollOptions) => boolean;\n}\n\n/** 行的色调:整行浅色底 */\nexport type RowTone = 'info' | 'success' | 'warning' | 'danger';\n\n/** 勾选列里的勾选框由表格管理的属性 */\ntype SelectCheckboxManaged = 'checked' | 'indeterminate' | 'onChange';\n\n/** 勾选列的宽度(px) */\nconst SELECT_WIDTH = 44;\n/** 详情列(展开按钮)的宽度(px) */\nconst DETAIL_WIDTH = 40;\n/** 详情行的估计高度(px),渲染后以实际高度为准 */\nconst DETAIL_HEIGHT = 160;\n/** 加载中至少、至多显示几行骨架:在这之间按表体到窗口底边的高度铺满 */\nconst SKELETON_ROWS = { min: 6, max: 50 };\n/** 各密度下行高的估计(px) */\nconst ROW_HEIGHT: Record<keyof DataTableDensities, number> = {\n compact: 36,\n standard: 44,\n comfortable: 52,\n};\n\n/** DataTable、TreeDataTable 的样式:行的色调(不透明的浅色底,悬停加深) */\nexport const dataTableRowToneStyles = css.create({\n info: { backgroundColor: { default: '_infoSoft', ':hover': '_infoSoftHover' } },\n success: { backgroundColor: { default: '_successSoft', ':hover': '_successSoftHover' } },\n warning: { backgroundColor: { default: '_warningSoft', ':hover': '_warningSoftHover' } },\n danger: { backgroundColor: { default: '_dangerSoft', ':hover': '_dangerSoftHover' } },\n});\n\n// 列宽、偏移、占位高度是任意值,用动态样式;单独一个 create,见 COMPONENTS.md §4\n/** DataTable、TreeDataTable 的样式:width、minWidth、height、start、end、percent */\nexport const dataTableDynamicStyles = css.create({\n width: (px: number) => ({ width: px }),\n minWidth: (px: number) => ({ minWidth: px }),\n height: (px: number) => ({ height: px }),\n start: (px: number) => ({ insetInlineStart: px }),\n end: (px: number) => ({ insetInlineEnd: px }),\n // 详情内容让过勾选列与展开列,和第一个数据列对齐\n indent: (px: number) => ({ marginInlineStart: px, maxWidth: `calc(100cqi - ${px}px)` }),\n percent: (value: string) => ({ width: value }),\n});\n\n/** 固定列单元格的样式:position: sticky 加上按列宽累加的偏移;挨着滚动列的那一列加一条竖线 */\nfunction stickyCellSx(column: DataTableColumn<never>, offsets: StickyOffsets) {\n if (column.sticky === 'start')\n return [\n dataTableStateStyles.sticky,\n dataTableDynamicStyles.start(offsets.start.get(column.key)!),\n offsets.startEdge === column.key && dataTableStateStyles.stickyStartEdge,\n ];\n if (column.sticky === 'end')\n return [\n dataTableStateStyles.sticky,\n dataTableDynamicStyles.end(offsets.end.get(column.key)!),\n offsets.endEdge === column.key && dataTableStateStyles.stickyEndEdge,\n ];\n return null;\n}\n\n/** 勾选列、详情列在有起始边固定列时也固定,偏移是它前面的列宽 */\nfunction leadingStickySx(sticky: boolean, offset: number) {\n return sticky && [dataTableStateStyles.sticky, dataTableDynamicStyles.start(offset)];\n}\n\n/** 分组标题的固定:组里的列都固定在同一侧时跟着固定,偏移取最靠外的一列;含挨着滚动列的那一列时也画竖线 */\nfunction groupStickySx(columns: readonly DataTableColumn<never>[], offsets: StickyOffsets) {\n const side = columns[0]?.sticky;\n if (!side || columns.some((column) => column.sticky !== side)) return null;\n const [outer, inner] =\n side === 'start' ? [columns[0]!, columns.at(-1)!] : [columns.at(-1)!, columns[0]!];\n return side === 'start'\n ? [\n dataTableStateStyles.sticky,\n dataTableDynamicStyles.start(offsets.start.get(outer.key)!),\n offsets.startEdge === inner.key && dataTableStateStyles.stickyStartEdge,\n ]\n : [\n dataTableStateStyles.sticky,\n dataTableDynamicStyles.end(offsets.end.get(outer.key)!),\n offsets.endEdge === inner.key && dataTableStateStyles.stickyEndEdge,\n ];\n}\n\n/** DataTableRow 的属性:一行要用到的全部数据;除了 row、index、selected,同一张表里各行都相同 */\nexport interface DataTableRowProps<T> {\n /** 这一行 */\n row: DataTableRowModel<T>;\n /** 在全部行里的序号 */\n index: number;\n /** 是否已选 */\n selected: boolean;\n /** 部分勾选(树形表格的父行) */\n partial?: boolean;\n /** 能不能勾选,默认 true */\n selectable?: boolean;\n /** 整行的色调 */\n tone?: RowTone;\n /** 主从视图里正在看的一行 */\n active?: boolean;\n /** 点了这一行 */\n onRowClick?: (row: T, key: string) => void;\n /** 选择方式;不写时没有勾选列 */\n selectionMode?: keyof SelectionModes;\n /** 列 */\n columns: readonly DataTableColumn<T>[];\n /** 密度 */\n density: keyof DataTableDensities;\n /** 样式 */\n variant: keyof DataTableVariants;\n /** 斑马纹 */\n striped: boolean;\n /** 固定列的偏移 */\n offsets: StickyOffsets;\n /** 表头有几行(分组表头是两行):行的 aria-rowindex 从表头之后算起,默认 1 */\n headerRows?: number;\n /** 在表体里的位置(展开的详情也算一行):测量与 aria-rowindex 用它;默认等于 index */\n position?: number;\n /** 表格有详情列 */\n detailColumn?: boolean;\n /** 这一行有详情(显示展开按钮),默认 true */\n expandable?: boolean;\n /** 详情已展开 */\n expanded?: boolean;\n /** 详情单元格的 id(展开按钮的 aria-controls) */\n detailId?: string;\n /** 详情列单元格的部件属性 */\n propsDetailToggleCell?: PartProps<'td'>;\n /** 展开按钮的部件属性 */\n propsDetailToggle?: DataTableViewProps<T>['propsDetailToggle'];\n /** 点了展开按钮 */\n onToggleDetail?: (key: string) => void;\n /** 第一个数据列前面加的东西(TreeDataTable 的缩进与展开按钮) */\n leading?: (row: DataTableRowModel<T>, index: number) => VNodeChild;\n /** 行的部件属性 */\n propsRow?: RowPartProps<T>;\n /** 单元格的部件属性 */\n propsCell?: CellPartProps<T>;\n /** 勾选列单元格的部件属性 */\n propsSelectCell?: PartProps<'td'>;\n /** 勾选框的部件属性 */\n propsSelectCheckbox?: DataTableViewProps<T>['propsSelectCheckbox'];\n /** 单选框的部件属性 */\n propsSelectRadio?: DataTableViewProps<T>['propsSelectRadio'];\n /** leading 与内容外层的部件属性 */\n propsLeading?: PartProps<'div'>;\n /** 内容包装的部件属性 */\n propsContent?: PartProps<'div'>;\n /** 测量行高(虚拟滚动) */\n measure: (element: unknown) => void;\n /** 勾选或取消这一行 */\n onToggle?: (key: string) => void;\n /** 单元格导航:数据格可以聚焦,可编辑的格响应 Enter / F2、双击、打字 */\n cellNavigation?: boolean;\n /** 这一行正在编辑的列 */\n editingColumn?: string;\n /** 正在编辑的格里放的编辑器 */\n renderEditor?: DataTableViewProps<T>['renderEditor'];\n /** 这一行的校验错误 */\n rowErrors?: DataTableViewProps<T>['rowErrors'];\n /** 开始编辑一格 */\n onEditStart?: DataTableViewProps<T>['onEditStart'];\n /** 编辑中的按键 */\n onEditKeydown?: DataTableViewProps<T>['onEditKeydown'];\n}\n\n/**\n * 表格的一行:单独成组件,props 没变的行在表格重新渲染时直接跳过——\n * 滚动只挂载新进入视口的行,勾选一行只更新这一行(原来每次都重建全部可见行与其中的勾选框)\n */\nexport const DataTableRow = _component(\n <T,>({\n row,\n index,\n selected,\n partial = false,\n selectable = true,\n tone,\n active = false,\n onRowClick,\n selectionMode,\n columns,\n density,\n variant,\n striped,\n offsets,\n headerRows = 1,\n position = index,\n detailColumn = false,\n expandable = true,\n expanded = false,\n detailId,\n propsDetailToggleCell,\n propsDetailToggle,\n onToggleDetail,\n leading,\n propsRow,\n propsCell,\n propsSelectCell,\n propsSelectCheckbox,\n propsSelectRadio,\n propsLeading,\n propsContent,\n measure,\n onToggle,\n cellNavigation = false,\n editingColumn,\n renderEditor,\n rowErrors,\n onEditStart,\n onEditKeydown,\n }: DataTableRowProps<T>) => {\n const lang = useLang();\n const recipe = useRecipe(dataTableRecipe);\n // 各部件层按档位组合缓存:同一种行(奇偶、密度、样式)的各格拿到的是同一个对象\n const s = _derived(recipe({ density, variant, striped: striped && index % 2 === 1 }));\n\n /** 数据格的按键:编辑中交给外层;可编辑的格按 Enter / F2 开始编辑,打一个字直接替换 */\n function onCellKeydown(event: KeyboardEvent, column: DataTableColumn<T>) {\n const cell = { row: row.key, column: column.key };\n if (editingColumn === column.key) return onEditKeydown?.(event, cell);\n if (event.target !== event.currentTarget || !isCellEditable(column, row.data)) return;\n if (event.key === 'Enter' || event.key === 'F2') {\n event.preventDefault();\n onEditStart?.(cell);\n } else if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n onEditStart?.(cell, event.key);\n }\n }\n return () => (\n <tr\n {...mergeAttrs<'tr'>(\n {\n ...s.row,\n sx: [\n s.row.sx,\n tone && dataTableRowToneStyles[tone],\n selected && dataTableStateStyles.selected,\n active && dataTableStateStyles.active,\n onRowClick && dataTableStateStyles.clickable,\n ],\n },\n typeof propsRow === 'function' ? propsRow(row.data, index) : propsRow,\n {\n ref: measure,\n 'aria-rowindex': position + headerRows + 1,\n 'aria-selected': selectionMode != null ? selected : undefined,\n 'aria-current': active ? 'true' : undefined,\n onClick: onRowClick\n ? (event: MouseEvent) => {\n // 点在行里的控件上:交给控件自己\n if (\n (event.target as Element).closest('a, button, input, select, textarea, label')\n )\n return;\n onRowClick(row.data, row.key);\n }\n : undefined,\n },\n )}\n data-index={position}\n data-key={row.key}\n data-state={selected ? 'selected' : undefined}\n data-tone={tone}\n >\n {selectionMode && (\n <td\n {...mergeAttrs<'td'>(\n {\n ...s.selectCell,\n sx: [\n s.cell.sx,\n s.selectCell.sx,\n offsets.start.size > 0 && dataTableStateStyles.stickySelect,\n active && dataTableStateStyles.activeEdge,\n ],\n },\n propsSelectCell,\n )}\n >\n {selectionMode === 'single' ? (\n // 单选:同一个 name 的原生单选框,选中由 DataTableView 提供的 RadioGroupContext 决定\n <Radio\n {...mergePartProps<Partial<RadioProps>>(s.selectRadio, propsSelectRadio, {\n disabled: !selectable,\n 'aria-label': lang.tableSelectRow(index + 1),\n })}\n value={row.key}\n />\n ) : (\n <Checkbox\n {...mergePartProps<CheckboxProps>(\n // 名称每行不同(选择第 N 行):类型里不让使用方覆盖\n { ...s.selectCheckbox, 'aria-label': lang.tableSelectRow(index + 1) },\n propsSelectCheckbox,\n {\n _checked: selected,\n indeterminate: partial,\n disabled: !selectable,\n onChange: () => onToggle?.(row.key),\n },\n )}\n />\n )}\n </td>\n )}\n {detailColumn && (\n <td\n {...mergeAttrs<'td'>(\n {\n ...s.detailToggleCell,\n sx: [\n s.cell.sx,\n s.detailToggleCell.sx,\n leadingStickySx(offsets.start.size > 0, selectionMode ? SELECT_WIDTH : 0),\n active && !selectionMode && dataTableStateStyles.activeEdge,\n ],\n },\n propsDetailToggleCell,\n )}\n >\n {expandable && (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n {\n ...s.detailToggle,\n icon: ChevronRight,\n size: 'sm',\n radius: 'full',\n 'aria-label': lang.tableRowDetails(rowLabel(columns, row)),\n },\n propsDetailToggle,\n {\n 'aria-expanded': expanded,\n 'aria-controls': expanded ? detailId : undefined,\n // 箭头的转向跟着展开状态:使用方的 propsIcon 合并进来,而不是整个替换掉\n propsIcon: mergeProps<IconProps>(\n { flipInRtl: true, sx: disclosureStyles.icon },\n propsDetailToggle?.propsIcon,\n expanded ? { sx: dataTableStateStyles.chevronOpen } : undefined,\n ),\n onClick: () => onToggleDetail?.(row.key),\n },\n )}\n />\n )}\n </td>\n )}\n {columns.map((column, position) => {\n const editing = editingColumn === column.key;\n const value = editing\n ? renderEditor?.(row.data, column)\n : column.cell\n ? column.cell(row.data, index)\n : String(columnValue(column, row.data) ?? '');\n const error = cellNavigation ? rowErrors?.(row.data)?.[column.key] : undefined;\n const editable = cellNavigation && isCellEditable(column, row.data);\n return (\n <td\n key={column.key}\n {...mergeAttrs<'td'>(\n {\n ...s.cell,\n sx: [\n s.cell.sx,\n dataTableStateStyles[column.align ?? 'start'],\n column.wrap && dataTableStateStyles.wrap,\n stickyCellSx(column, offsets),\n active &&\n position === 0 &&\n !selectionMode &&\n !detailColumn &&\n dataTableStateStyles.activeEdge,\n cellNavigation && dataTableStateStyles.gridCell,\n editing && dataTableStateStyles.editingCell,\n !!error && dataTableStateStyles.invalidCell,\n ],\n },\n typeof propsCell === 'function' ? propsCell(row.data, column) : propsCell,\n cellNavigation\n ? ({\n 'data-column': column.key,\n 'aria-invalid': error ? 'true' : undefined,\n // 错误原因:悬停看,读屏随格一起念(aria-description)\n title: error,\n 'aria-description': error,\n onKeydown: (event: KeyboardEvent) => onCellKeydown(event, column),\n onDblclick: editable\n ? () => onEditStart?.({ row: row.key, column: column.key })\n : undefined,\n } as PartProps<'td'>)\n : {},\n )}\n >\n {position === 0 && leading ? (\n <div {...mergeAttrs<'div'>(s.leading, propsLeading)}>\n {leading(row, index)}\n <div {...mergeAttrs<'div'>(s.content, propsContent)}>{value}</div>\n </div>\n ) : (\n value\n )}\n </td>\n );\n })}\n </tr>\n );\n },\n);\n\n/** 行的名称(展开按钮用):第一列的文字,没有时用行的 key */\nexport function rowLabel<T>(\n columns: readonly DataTableColumn<T>[],\n row: DataTableRowModel<T>,\n): string {\n const first = columns[0] ? columnValue(columns[0], row.data) : undefined;\n return first != null && first !== '' ? String(first) : row.key;\n}\n\n/** DataTableDetailRow 的属性 */\nexport interface DataTableDetailRowProps<T> {\n /** 详情所属的行 */\n row: DataTableRowModel<T>;\n /** 在表体里的位置(测量与 aria-rowindex) */\n position: number;\n /** 表头有几行 */\n headerRows: number;\n /** 跨几列(全部列,含勾选列与详情列) */\n span: number;\n /** 勾选列与展开列的宽度(px):内容让过它们,和第一个数据列对齐 */\n indent: number;\n /** 详情单元格的 id(展开按钮的 aria-controls 指向它) */\n id: string;\n /** 详情的内容 */\n renderDetail: (row: T) => VNodeChild;\n /** 详情行的部件属性 */\n propsDetailRow?: PartProps<'tr', 'aria-rowindex'>;\n /** 详情单元格的部件属性 */\n propsDetailCell?: PartProps<'td', 'colspan'>;\n /** 测量行高(虚拟滚动) */\n measure: (element: unknown) => void;\n}\n\n/** 展开的详情:一行一个跨全部列的单元格;单独成组件,滚动时没变的详情不必重渲 */\nexport const DataTableDetailRow = _component(\n <T,>({\n row,\n position,\n headerRows,\n span,\n indent,\n id,\n renderDetail,\n propsDetailRow,\n propsDetailCell,\n measure,\n }: DataTableDetailRowProps<T>) => {\n const recipe = useRecipe(dataTableRecipe);\n // 不选档位:详情的格不要按密度的上下内边距(内边距在内容上),行的底色也用不到\n const s = _derived(recipe());\n return () => (\n <tr\n {...mergeAttrs<'tr'>(s.detailRow, propsDetailRow, {\n ref: measure,\n 'aria-rowindex': position + headerRows + 1,\n })}\n data-index={position}\n data-detail=\"\"\n >\n <td\n {...mergeAttrs<'td'>(\n { ...s.detailCell, sx: [s.cell.sx, s.detailCell.sx] },\n propsDetailCell,\n { id, colspan: span },\n )}\n >\n <div\n {...mergeAttrs<'div'>({\n ...s.detailContent,\n sx: [s.detailContent.sx, dataTableDynamicStyles.indent(indent)],\n })}\n >\n {renderDetail(row.data)}\n </div>\n </td>\n </tr>\n );\n },\n);\n\n/** 表体里的一行:数据行,或某一行展开的详情 */\ninterface BodyEntry<T> {\n /** 所属的数据行 */\n row: DataTableRowModel<T>;\n /** 数据行在 rows 里的序号 */\n index: number;\n /** 是这一行的详情 */\n detail: boolean;\n}\n\n/** 表格的渲染层:虚拟滚动的行、吸顶表头、固定列、排序、勾选、列宽调整、加载与空状态 */\nexport const DataTableView = _component(\n <T,>({\n rows,\n columns,\n sort,\n onSortClick,\n filters,\n onFilterChange,\n filterOptionsOf,\n columnMenu = false,\n onColumnAction,\n cellNavigation = false,\n editing,\n renderEditor,\n rowErrors,\n onEditStart,\n onEditKeydown,\n selectionMode,\n selectedKeys = [],\n partialKeys,\n onToggleRow,\n onToggleAll,\n widths,\n onResize,\n resizable = false,\n loading = false,\n empty,\n leading,\n density = 'standard',\n variant = 'surface',\n striped = false,\n estimateRowHeight,\n onRangeChange,\n handle,\n rowTone,\n activeKey,\n onRowClick,\n isRowSelectable,\n hiddenColumns,\n summaryLabel,\n columnGroups,\n renderDetail,\n hasDetail,\n expandedRows,\n onToggleDetail,\n flexible = false,\n propsRoot,\n propsRow,\n propsCell,\n propsHeaderCell,\n propsGroupHeaderCell,\n propsEmpty,\n propsSkeleton,\n propsSortButton,\n propsResizer,\n propsSortLabel,\n propsHead,\n propsHeadRow,\n propsSelectHeaderCell,\n propsSelectCell,\n propsSelectAll,\n propsSelectCheckbox,\n propsSelectRadio,\n propsLeading,\n propsContent,\n propsProgress,\n propsEmptyCell,\n propsFoot,\n propsSummaryCell,\n propsDetailHeaderCell,\n propsDetailToggleCell,\n propsDetailToggle,\n propsDetailRow,\n propsDetailCell,\n ...rest\n }: DataTableViewProps<T>) => {\n const lang = useLang();\n const columnDisplay = useColumnDisplay<T>();\n const recipe = useRecipe(dataTableRecipe);\n // 表头、表尾、骨架、空状态的部件层:只随密度、样式与主题定制变(行各自按奇偶取,见 DataTableRow)\n const s = _derived(recipe({ density, variant }));\n // 骨架、进度条防闪烁;aria-busy 与空状态按真实的 loading\n const indicator = useDelayedLoading(() => loading);\n const selectedSet = _derived.by(() => new Set(selectedKeys));\n const partialSet = _derived.by(() => new Set(partialKeys));\n // 单选:各行的 Radio 接入这一组(同一个 name,方向键在可见的行之间移动),选中即写回\n const radioName = useId();\n RadioGroupContext.provide({\n get value() {\n return selectedKeys[0] ?? null;\n },\n name: radioName,\n disabled: false,\n readonly: false,\n required: false,\n invalid: false,\n size: undefined,\n tone: 'accent',\n select: (key) => onToggleRow?.(key),\n });\n // 遍历全部行:放在派生里,滚动时的重新渲染不必再算一遍;全选只看能勾选的行\n const selectableRows = _derived(\n isRowSelectable ? rows.filter((row) => isRowSelectable(row.data)) : rows,\n );\n const allSelected = _derived(\n selectableRows.length > 0 && selectableRows.every((row) => selectedSet.has(row.key)),\n );\n const someSelected = _derived(\n !allSelected && selectableRows.some((row) => selectedSet.has(row.key)),\n );\n const hidden = _derived.by(() => new Set(hiddenColumns ?? []));\n const visibleColumns = _derived(\n hidden.size > 0 ? columns.filter((column) => !hidden.has(column.key)) : columns,\n );\n let viewport = _state.raw<HTMLElement | null>(null);\n let body = _state.raw<HTMLElement | null>(null);\n // 单元格导航:表体里的数据格之间用方向键走(虚拟滚动下聚焦的格滚进视口,后面的行随之渲染出来)\n _effect(() =>\n body && cellNavigation\n ? gridFocus(body, { rows: 'tr[data-key]', cells: 'td[data-column]' })\n : undefined,\n );\n let head = _state.raw<HTMLElement | null>(null);\n let foot = _state.raw<HTMLElement | null>(null);\n // 骨架铺满表体到窗口底边(第一次加载时表格还没有高度,只放几行显得没铺开);\n // 行高量已经画出来的第一行骨架,估计值与实际差几 px,几十行下来就差出一截\n let skeletonRows = _state(SKELETON_ROWS.min);\n _effect(() => {\n if (!indicator.value || !body || rows.length > 0) return;\n const drawn = (body.firstElementChild as HTMLElement | null)?.offsetHeight;\n const rowHeight = drawn || (estimateRowHeight ?? ROW_HEIGHT[density]);\n const space = window.innerHeight - body.getBoundingClientRect().top;\n skeletonRows = clamp(Math.ceil(space / rowHeight), SKELETON_ROWS.min, SKELETON_ROWS.max);\n });\n\n const detailIdPrefix = useId();\n const detailId = (index: number) => `${detailIdPrefix}-detail-${index}`;\n const expandedSet = _derived.by(() => new Set(expandedRows ?? []));\n /** 表体里的各行:展开了详情的行后面跟它的详情;没有展开的详情时为 null,直接用 rows */\n const entries = _derived.by((): BodyEntry<T>[] | null => {\n if (!renderDetail || expandedSet.size === 0) return null;\n const list: BodyEntry<T>[] = [];\n rows.forEach((row, index) => {\n list.push({ row, index, detail: false });\n // 展开记录里可能留着已经没有详情的行(数据变了):只给还有详情的行出详情\n if (expandedSet.has(row.key) && (hasDetail?.(row.data) ?? true)) {\n list.push({ row, index, detail: true });\n }\n });\n return list;\n });\n const entryAt = (position: number): BodyEntry<T> =>\n entries ? entries[position]! : { row: rows[position]!, index: position, detail: false };\n\n const virtual = useVirtualizer(() => {\n const current = rows;\n const list = entries;\n // 先读出来:估计行高对每一行都要调用一次(几万行),每次都经过 props 的响应式读取很慢\n const rowHeight = estimateRowHeight ?? ROW_HEIGHT[density];\n return {\n count: list?.length ?? current.length,\n scrollElement: viewport,\n list: body,\n estimateSize: (position: number) => (list?.[position]?.detail ? DETAIL_HEIGHT : rowHeight),\n // 详情的 key 是行的 key 加一个不会出现在 key 里的分隔:与数据行的 key 不会重复\n getItemKey: (position: number) => {\n if (!list) return current[position]!.key;\n const entry = list[position]!;\n return entry.detail ? `${entry.row.key}\\u0000detail` : entry.row.key;\n },\n overscan: 8,\n onRangeChange,\n // 表头吸顶、合计行吸底:滚动到某一行时停在它们之间,不被挡住\n scrollPaddingStart: () => head?.offsetHeight ?? 0,\n scrollPaddingEnd: () => foot?.offsetHeight ?? 0,\n };\n });\n\n // 挂载之后才交出 handle:使用方在回调里立即滚动(打开页面就定位到某一行)也能生效\n const api: DataTableHandle = {\n scrollToRow(key, options) {\n const position = entries\n ? entries.findIndex((entry) => !entry.detail && entry.row.key === key)\n : rows.findIndex((row) => row.key === key);\n if (position < 0) return false;\n virtual.scrollToIndex(position, options);\n return true;\n },\n };\n watch(\n () => viewport,\n (element) => {\n if (element) handle?.(api);\n },\n { flush: 'post' },\n );\n\n // 每列的值类型(没写 type 时看第一个非空值)拼成字符串:类型没变时 shown 保持同一个引用,行组件不必重渲\n const types = _derived(\n visibleColumns\n .map((column) =>\n columnType(\n column,\n (function* () {\n for (const row of rows) yield row.data;\n })(),\n ),\n )\n .join('|'),\n );\n /** 补上默认对齐与格式化的列:没写 align、cell 的列按值类型来 */\n const shown = _derived.by(() =>\n columnDisplay.columns(visibleColumns, types.split('|') as (keyof ColumnTypes)[]),\n );\n const hasSummary = _derived(visibleColumns.some((column) => column.summary != null));\n // 有可见的分组时表头两行:第一行是分组标题与没分组的列(跨两行),第二行是组里的列\n const layout = _derived.by(() =>\n columnGroups?.length ? headerLayout(shown, columnGroups) : null,\n );\n const headerRows = _derived(layout?.some((cell) => cell.kind === 'group') ? 2 : 1);\n\n // 合计只随数据与列变:放在派生值里,滚动时(虚拟列表每换一次可见范围都重新渲染)不再逐行重算\n const rowData = _derived.by(() => rows.map((row) => row.data));\n const sums = _derived.by(() =>\n hasSummary\n ? shown.map((column) => (column.summary === 'sum' ? sumColumn(column, rowData) : null))\n : [],\n );\n\n /** 合计行里一列的内容 */\n function summaryOf(column: DataTableColumn<T>, position: number): VNodeChild {\n if (column.summary === 'sum') {\n const type = (types.split('|')[position] ?? 'number') as keyof ColumnTypes;\n const total = sums[position];\n return total == null\n ? (column.empty ?? lang.emptyValue)\n : columnDisplay.value(column, type, total);\n }\n if (column.summary) return column.summary(rowData);\n return position === 0 ? (summaryLabel ?? lang.tableSummary) : null;\n }\n\n /** 列的宽度:调整过的、列定义里的,或者没有(与其他没写宽度的列平分) */\n const widthOf = (column: DataTableColumn<T>) => widths[column.key] ?? column.width;\n\n const leadingWidth = () =>\n (selectionMode ? SELECT_WIDTH : 0) + (renderDetail ? DETAIL_WIDTH : 0);\n const bodyRowCount = () => entries?.length ?? rows.length;\n // 偏移没变时沿用上一次的对象:它交给每一行,调整非固定列的宽度(每次指针移动)时各行不必重渲染\n let lastOffsets: StickyOffsets | undefined;\n const offsets = _derived.by(() => {\n const next = stickyOffsets(shown, widthOf, leadingWidth());\n if (lastOffsets && sameStickyOffsets(lastOffsets, next)) return lastOffsets;\n return (lastOffsets = next);\n });\n const minWidth = () => tableMinWidth(shown, widthOf, leadingWidth());\n\n const sorts = _derived(sortList(sort));\n\n /** 列标题结尾的筛选按钮与列菜单 */\n function renderHeaderActions(\n column: DataTableColumn<T>,\n label: string,\n cell: () => HTMLElement | null,\n ) {\n const filter = columnFilter(column);\n if (!filter && !columnMenu) return null;\n const position = shown.findIndex((item) => item.key === column.key);\n const neighbour = (step: 1 | -1) => shown[position + step];\n return (\n <>\n {filter && (\n <ColumnFilterButton\n label={label}\n options={filter.options === 'text' ? 'text' : (filterOptionsOf?.(column) ?? [])}\n values={filters?.[column.key] ?? []}\n onChange={(values) => onFilterChange?.(column.key, values)}\n />\n )}\n {columnMenu && (\n <ColumnMenuButton\n label={label}\n sortable={!!column.sortable}\n sorted={sorts.find((item) => item.key === column.key)?.direction}\n pinned={column.sticky}\n // 固定列与不固定的列各自一段,只在段内移动\n canMove={{\n backward: neighbour(-1)?.sticky === column.sticky,\n forward: neighbour(1)?.sticky === column.sticky,\n }}\n canHide={shown.length > 1}\n onAction={(action) => onColumnAction?.(column.key, action, cell()?.offsetWidth ?? 0)}\n />\n )}\n </>\n );\n }\n\n /** 一个列标题;rowspan 是没分组的列在两行表头里跨两行,divider 是与分组相邻的竖线 */\n function renderHeaderCell(column: DataTableColumn<T>, rowspan = 1, divider = false) {\n const own = typeof propsHeaderCell === 'function' ? propsHeaderCell(column) : propsHeaderCell;\n const priority = sorts.findIndex((item) => item.key === column.key);\n const sorted = priority >= 0 ? sorts[priority]!.direction : undefined;\n const label = plainText(column.header) ?? column.key;\n const canResize = column.resizable ?? resizable;\n let cell: HTMLElement | null = null;\n const actions = renderHeaderActions(column, label, () => cell);\n const sortButton = column.sortable && (\n <ButtonBase\n {...mergePartProps<ButtonBaseProps>(s.sortButton, propsSortButton, {\n onClick: (event: MouseEvent) => onSortClick?.(column.key, event),\n })}\n >\n <span {...mergeAttrs<'span'>(s.sortLabel, propsSortLabel)}>{column.header}</span>\n <Icon\n {...mergePartProps<IconProps>({\n ...s.sortIcon,\n icon:\n sorted === 'ascending'\n ? ArrowUp\n : sorted === 'descending'\n ? ArrowDown\n : ArrowUpDown,\n sx: [s.sortIcon.sx, sorted && dataTableStateStyles.sortActive],\n })}\n />\n {sorts.length > 1 && priority >= 0 && (\n <>\n <span {...mergeAttrs<'span'>(s.sortPriority)} aria-hidden=\"true\">\n {priority + 1}\n </span>\n {/* aria-sort 只放在第一排序列上(ARIA 的要求),其余列的次序与方向写给读屏 */}\n {priority > 0 && (\n <VisuallyHidden>\n {lang.tableSortPriority(\n priority + 1,\n sorted === 'ascending' ? lang.tableSortAscending : lang.tableSortDescending,\n )}\n </VisuallyHidden>\n )}\n </>\n )}\n </ButtonBase>\n );\n const content = sortButton || column.header;\n return (\n <th\n key={column.key}\n {...mergeAttrs<'th'>(\n {\n ...s.headerCell,\n sx: [\n s.headerCell.sx,\n dataTableStateStyles[column.align ?? 'start'],\n stickyCellSx(column, offsets),\n divider && dataTableStateStyles.groupDivider,\n ],\n },\n own,\n {\n ref: (element: unknown) => (cell = element as HTMLElement | null),\n scope: 'col',\n rowspan: rowspan > 1 ? rowspan : undefined,\n 'aria-sort': column.sortable ? (priority === 0 ? sorted : 'none') : undefined,\n },\n )}\n data-sticky={column.sticky}\n >\n {actions ? (\n <div {...mergeAttrs<'div'>(s.headerContent)}>\n <span\n {...mergeAttrs<'span'>({\n ...s.headerMain,\n sx: [\n s.headerMain.sx,\n column.align === 'end' && dataTableStateStyles.headerMainEnd,\n ],\n })}\n >\n {content}\n </span>\n {actions}\n </div>\n ) : (\n content\n )}\n {canResize && (\n <ColumnResizer\n {...mergePartProps<ColumnResizerProps>(\n {\n label,\n width: widthOf(column),\n minWidth: column.minWidth,\n onWidthChange: (width: number) => onResize?.(column.key, width),\n },\n propsResizer,\n )}\n />\n )}\n </th>\n );\n }\n\n /** 一个分组标题:跨组里的几列 */\n function renderGroupCell(\n group: DataTableColumnGroup,\n members: DataTableColumn<T>[],\n key: string,\n divider: boolean,\n ) {\n return (\n <th\n key={key}\n {...mergeAttrs<'th'>(\n {\n ...s.groupHeaderCell,\n sx: [\n s.headerCell.sx,\n s.groupHeaderCell.sx,\n groupStickySx(members, offsets),\n divider && dataTableStateStyles.groupDivider,\n ],\n },\n typeof propsGroupHeaderCell === 'function'\n ? propsGroupHeaderCell(group)\n : propsGroupHeaderCell,\n { scope: 'colgroup', colspan: members.length },\n )}\n >\n {group.header}\n </th>\n );\n }\n\n /** 表头的列标题:一行;有分组时两行 */\n function renderHeaderRows(selectHeader: VNodeChild, detailHeader: VNodeChild) {\n const cells = layout;\n if (!cells || headerRows === 1)\n return (\n <tr {...mergeAttrs<'tr'>(s.headRow, propsHeadRow, { 'aria-rowindex': 1 })}>\n {selectHeader}\n {detailHeader}\n {shown.map((column) => renderHeaderCell(column))}\n </tr>\n );\n const nextToGroup = (position: number) =>\n position > 0 &&\n (cells[position]!.kind === 'group' || cells[position - 1]!.kind === 'group');\n return [\n <tr key=\"groups\" {...mergeAttrs<'tr'>(s.headRow, propsHeadRow, { 'aria-rowindex': 1 })}>\n {selectHeader}\n {detailHeader}\n {cells.map((cell, position) =>\n cell.kind === 'group'\n ? renderGroupCell(\n cell.group,\n cell.columns,\n `${cell.group.key}-${position}`,\n nextToGroup(position),\n )\n : renderHeaderCell(cell.column, 2, nextToGroup(position)),\n )}\n </tr>,\n <tr key=\"columns\" {...mergeAttrs<'tr'>(s.headRow, propsHeadRow, { 'aria-rowindex': 2 })}>\n {cells.flatMap((cell, position) =>\n cell.kind === 'group'\n ? cell.columns.map((column, index) =>\n renderHeaderCell(column, 1, index === 0 && position > 0),\n )\n : [],\n )}\n </tr>,\n ];\n }\n\n return () => {\n const span = shown.length + (selectionMode ? 1 : 0) + (renderDetail ? 1 : 0);\n const items = virtual.items;\n const top = items[0]?.start ?? 0;\n const bottom = items.length ? virtual.total - items.at(-1)!.end : 0;\n return (\n <ScrollArea\n {...mergePartProps<ScrollAreaProps>(\n {\n ...s.root,\n axis: 'both',\n sx: [s.root.sx, flexible && dataTableStateStyles.flexible],\n },\n propsRoot,\n { propsViewport: { ref: _toRef(viewport) } },\n )}\n >\n <table\n {...mergeAttrs<'table'>(\n { ...s.table, sx: [s.table.sx, dataTableDynamicStyles.minWidth(minWidth())] },\n rest,\n {\n // 合计行只在有数据时渲染(见 tfoot),没渲染时不算进总行数\n 'aria-rowcount':\n bodyRowCount() + headerRows + (hasSummary && rows.length > 0 ? 1 : 0),\n 'aria-busy': loading || undefined,\n // 单元格导航:读屏按网格念,方向键在格之间走\n role: cellNavigation ? 'grid' : undefined,\n },\n )}\n >\n <colgroup>\n {selectionMode && <col {...css.attrs(dataTableDynamicStyles.width(SELECT_WIDTH))} />}\n {renderDetail && <col {...css.attrs(dataTableDynamicStyles.width(DETAIL_WIDTH))} />}\n {shown.map((column) => {\n const width = widthOf(column);\n return (\n <col\n key={column.key}\n {...(width != null ? css.attrs(dataTableDynamicStyles.width(width)) : {})}\n />\n );\n })}\n </colgroup>\n <thead {...mergeAttrs<'thead'>(s.head, propsHead, { ref: _toRef(head) })}>\n {renderHeaderRows(\n selectionMode && (\n <th\n {...mergeAttrs<'th'>(\n {\n ...s.selectHeaderCell,\n sx: [\n s.headerCell.sx,\n s.selectHeaderCell.sx,\n offsets.start.size > 0 && dataTableStateStyles.stickySelect,\n ],\n },\n propsSelectHeaderCell,\n { scope: 'col', rowspan: headerRows > 1 ? headerRows : undefined },\n )}\n >\n {selectionMode === 'single' && (\n // 单选没有全选:这一列的标题只给读屏\n <VisuallyHidden>{lang.tableSelectColumn}</VisuallyHidden>\n )}\n {selectionMode === 'multiple' && (\n <Checkbox\n {...mergePartProps<CheckboxProps>(\n { ...s.selectAll, 'aria-label': lang.tableSelectAll },\n propsSelectAll,\n {\n _checked: allSelected,\n indeterminate: someSelected,\n disabled: selectableRows.length === 0,\n onChange: () => onToggleAll?.(),\n },\n )}\n />\n )}\n </th>\n ),\n renderDetail && (\n <th\n {...mergeAttrs<'th'>(\n {\n ...s.detailHeaderCell,\n sx: [\n s.headerCell.sx,\n s.detailHeaderCell.sx,\n leadingStickySx(offsets.start.size > 0, selectionMode ? SELECT_WIDTH : 0),\n ],\n },\n propsDetailHeaderCell,\n { scope: 'col', rowspan: headerRows > 1 ? headerRows : undefined },\n )}\n >\n <span {...css.attrs(visuallyHiddenStyles.hidden)}>{lang.tableDetails}</span>\n </th>\n ),\n )}\n {indicator.value && rows.length > 0 && (\n <tr aria-hidden=\"true\">\n <td colspan={span} {...mergeAttrs<'td'>(s.progressCell)}>\n <div {...mergeAttrs<'div'>(s.progress)}>\n <Progress\n {...mergePartProps<ProgressProps>(\n { size: 'xs', 'aria-label': lang.loading },\n propsProgress,\n )}\n />\n </div>\n </td>\n </tr>\n )}\n </thead>\n <tbody {...mergeAttrs<'tbody'>(s.body)} ref={_toRef(body)}>\n {rows.length === 0 &&\n indicator.value &&\n Array.from({ length: skeletonRows }, (_, index) => (\n <tr key={`skeleton-${index}`} aria-hidden=\"true\" {...mergeAttrs<'tr'>(s.row)}>\n {selectionMode && <td {...mergeAttrs<'td'>(s.cell)} />}\n {renderDetail && <td {...mergeAttrs<'td'>(s.cell)} />}\n {shown.map((column, position) => (\n <td key={column.key} {...mergeAttrs<'td'>(s.cell)}>\n <Skeleton\n {...mergePartProps<SkeletonProps>(\n {\n ...s.skeleton,\n sx: [\n s.skeleton.sx,\n dataTableDynamicStyles.percent(\n `${90 - ((index + position) % 4) * 15}%`,\n ),\n ],\n // 同一行的单元格一起扫,行与行依次错开:一道波从上往下推过表格\n delay: index * SHIMMER_STAGGER,\n },\n propsSkeleton,\n )}\n />\n </td>\n ))}\n </tr>\n ))}\n {rows.length === 0 && !loading && (\n <tr>\n <td\n {...mergeAttrs<'td'>(\n { ...s.emptyCell, sx: [s.cell.sx, s.emptyCell.sx] },\n propsEmptyCell,\n { colspan: span },\n )}\n >\n {empty ?? (\n <Empty\n {...mergePartProps<EmptyProps>(\n { size: 'sm', title: lang.tableEmpty },\n propsEmpty,\n )}\n />\n )}\n </td>\n </tr>\n )}\n {top > 0 && (\n <tr aria-hidden=\"true\">\n <td\n colspan={span}\n {...mergeAttrs<'td'>({\n ...s.spacer,\n sx: [s.spacer.sx, dataTableDynamicStyles.height(top)],\n })}\n />\n </tr>\n )}\n {items.map((item) => {\n const { row, index, detail } = entryAt(item.index);\n if (detail && renderDetail)\n return (\n <DataTableDetailRow\n key={item.key as string}\n row={row}\n position={item.index}\n headerRows={headerRows}\n span={span}\n indent={leadingWidth()}\n id={detailId(index)}\n renderDetail={renderDetail}\n propsDetailRow={propsDetailRow}\n propsDetailCell={propsDetailCell}\n measure={virtual.measure}\n />\n );\n return (\n <DataTableRow\n key={row.key}\n row={row}\n index={index}\n position={item.index}\n detailColumn={renderDetail != null}\n expandable={hasDetail ? hasDetail(row.data) : true}\n expanded={expandedSet.has(row.key)}\n detailId={detailId(index)}\n propsDetailToggleCell={propsDetailToggleCell}\n propsDetailToggle={propsDetailToggle}\n onToggleDetail={onToggleDetail}\n selected={selectionMode != null && selectedSet.has(row.key)}\n partial={partialSet.has(row.key)}\n selectable={isRowSelectable ? isRowSelectable(row.data) : true}\n tone={rowTone?.(row.data)}\n active={activeKey != null && activeKey === row.key}\n onRowClick={onRowClick}\n selectionMode={selectionMode}\n columns={shown}\n density={density}\n variant={variant}\n striped={striped}\n offsets={offsets}\n headerRows={headerRows}\n leading={leading}\n propsRow={propsRow}\n propsCell={propsCell}\n propsSelectCell={propsSelectCell}\n propsSelectCheckbox={propsSelectCheckbox}\n propsSelectRadio={propsSelectRadio}\n propsLeading={propsLeading}\n propsContent={propsContent}\n measure={virtual.measure}\n onToggle={onToggleRow}\n cellNavigation={cellNavigation}\n editingColumn={editing?.row === row.key ? editing.column : undefined}\n renderEditor={renderEditor}\n rowErrors={rowErrors}\n onEditStart={onEditStart}\n onEditKeydown={onEditKeydown}\n />\n );\n })}\n {bottom > 0 && (\n <tr aria-hidden=\"true\">\n <td\n colspan={span}\n {...mergeAttrs<'td'>({\n ...s.spacer,\n sx: [s.spacer.sx, dataTableDynamicStyles.height(bottom)],\n })}\n />\n </tr>\n )}\n </tbody>\n {hasSummary && rows.length > 0 && (\n <tfoot {...mergeAttrs<'tfoot'>(s.foot, propsFoot, { ref: _toRef(foot) })}>\n <tr aria-rowindex={bodyRowCount() + headerRows + 1}>\n {selectionMode && (\n <td\n {...mergeAttrs<'td'>({\n ...s.summaryCell,\n sx: [\n s.cell.sx,\n s.summaryCell.sx,\n offsets.start.size > 0 && dataTableStateStyles.stickySelect,\n ],\n })}\n />\n )}\n {renderDetail && (\n <td\n {...mergeAttrs<'td'>({\n ...s.summaryCell,\n sx: [\n s.cell.sx,\n s.summaryCell.sx,\n leadingStickySx(offsets.start.size > 0, selectionMode ? SELECT_WIDTH : 0),\n ],\n })}\n />\n )}\n {shown.map((column, position) => (\n <td\n key={column.key}\n {...mergeAttrs<'td'>(\n {\n ...s.summaryCell,\n sx: [\n s.cell.sx,\n s.summaryCell.sx,\n dataTableStateStyles[column.align ?? 'start'],\n stickyCellSx(column, offsets),\n ],\n },\n typeof propsSummaryCell === 'function'\n ? propsSummaryCell(column)\n : propsSummaryCell,\n )}\n >\n {summaryOf(column, position)}\n </td>\n ))}\n </tr>\n </tfoot>\n )}\n </table>\n </ScrollArea>\n );\n };\n },\n { name: 'DataTableView' },\n);\n"],"mappings":"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"}
@@ -5,8 +5,8 @@ import { useFormat } from "../config/lang/format.js";
5
5
  import { formatCell } from "./columns.js";
6
6
  import { ColumnTable } from "./ColumnTable.js";
7
7
  import { pivot } from "./pivot.js";
8
- import { computed, createVNode, mergeProps } from "vue";
9
- import { _component, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
8
+ import { computed, createVNode } from "vue";
9
+ import { _component, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
10
10
  import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
11
11
  //#region src/table/PivotTable.tsx
12
12
  /** 一个维度(行或列):取哪个字段、表头、显示与顺序 */
@@ -86,7 +86,7 @@ var PivotTable = /*#__PURE__*/ _component((_props, _ctx) => {
86
86
  summary: () => show(grandTotal)
87
87
  }] : []
88
88
  ];
89
- return createVNode(ColumnTable, mergeProps(rest, {
89
+ return createVNode(ColumnTable, mergeJsxProps(rest, {
90
90
  "rows": tableRows,
91
91
  "columns": tableColumns,
92
92
  "getKey": _cache[0] || (_cache[0] = (row) => row.key),
@@ -1 +1 @@
1
- {"version":3,"file":"PivotTable.js","names":["_vtp_readonlyProp","_vtp_restProps","_vue_computed","_createVNode","_mergeProps"],"sources":["../../src/table/PivotTable.tsx"],"sourcesContent":["/**\n * 透视表:明细按行维度(可以多级,相同的格合并)与列维度交叉汇总,每格是一个聚合值,带合计行与合计列;\n * heatmap 时按数值给格子着色(热力图:一眼看出哪里多、哪里少)。建在 pivot 与 ColumnTable 上。\n *\n * <PivotTable\n * data={records}\n * rows={[{ key: 'region', header: '区域' }, { key: 'supplier', header: '供应商' }]}\n * columns={{ key: 'quarter', header: '季度', order: ['Q1', 'Q2', 'Q3', 'Q4'] }}\n * value={{ key: 'amount', header: '销售额', type: 'currency' }}\n * heatmap\n * aria-label=\"各区域、门店的季度销售额\"\n * />\n *\n * 数值的格式同表格的列(type、format);aggregate 是 sum(默认)、count、avg、min、max。\n * 热力图的颜色是强调色按比例混进底色(最深不超过 45%,文字照常够对比),读屏照常读数字。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { useLang } from '../config/context';\nimport { useFormat, type NumericFormat } from '../config/lang/format';\nimport { t } from '../config/theme/tokens';\nimport type { SortValue } from '../utils/data/collation';\nimport { toNumber, type NumericValue } from '../utils/data/numeric';\nimport type { PartProps } from '../utils/props';\nimport { ColumnTable, type ColumnTableProps } from './ColumnTable';\nimport { formatCell, type ColumnTypes, type DataTableColumn } from './columns';\nimport { pivot, type PivotAggregates } from './pivot';\n\n/** 一个维度(行或列):取哪个字段、表头、显示与顺序 */\nexport interface PivotDimension<T> {\n /** 字段名;写了 value 时只作标识 */\n key: string;\n /** 表头(行维度是这一列的表头;列维度显示在左上角的说明里) */\n header: VNodeChild;\n /** 取值;不写时取 row[key] */\n value?: (row: T) => SortValue;\n /** 显示的文字;不写时是值本身 */\n format?: (value: string) => string;\n /** 顺序:按这个排,没列出的排在后面;不写时按值排序 */\n order?: readonly string[];\n}\n\n/** 聚合的数值 */\nexport interface PivotValue<T> {\n /** 字段名;写了 value 时只作标识 */\n key: string;\n /** 名称:读屏的说明、合计的含义 */\n header: VNodeChild;\n /** 取值;不写时取 row[key] */\n value?: (row: T) => SortValue;\n /** 值的类型(同表格的列),默认 number */\n type?: keyof ColumnTypes;\n /** 数字的格式(同表格的列) */\n format?: NumericFormat;\n}\n\n/** 透视表的一行(交给 ColumnTable 的部件属性):行维度的值 */\nexport interface PivotRow {\n /** 各级维度值连起来的标识 */\n key: string;\n /** 各级行维度的值 */\n dimensions: string[];\n}\n\n/** 未声明的属性落到 table 上;外观(density、variant、striped)同 Table */\nexport interface PivotTableProps<T> extends Omit<\n ColumnTableProps<PivotRow>,\n 'rows' | 'columns' | 'getKey' | 'mergeRepeated'\n> {\n /** 明细 */\n data: readonly T[];\n /** 行维度,可以多级(相同的上级合并成一格) */\n rows: readonly PivotDimension<T>[];\n /** 列维度;不写时只有一列(按行汇总) */\n columns?: PivotDimension<T>;\n /** 聚合的数值;count 时可以不写 */\n value?: PivotValue<T>;\n /** 聚合方式,默认 sum */\n aggregate?: keyof PivotAggregates;\n /** 合计行与合计列,默认 true */\n totals?: boolean;\n /** 按数值给格子着色(热力图);合计不着色 */\n heatmap?: boolean;\n /** 没有明细的格子显示的内容,默认 — */\n empty?: VNodeChild;\n}\n\n/** PivotTable 的样式:heat(按比例的底色) */\nexport const pivotTableStyles = css.create({\n heat: (percent: number) => ({\n backgroundColor: `color-mix(in srgb, ${t.colors.accent} ${percent}%, transparent)`,\n }),\n total: { fontWeight: '_semibold' },\n});\n\nconst fieldOf =\n <T,>(dimension: { key: string; value?: (row: T) => SortValue }) =>\n (row: T) =>\n dimension.value\n ? dimension.value(row)\n : ((row as Record<string, SortValue>)[dimension.key] ?? null);\n\n/** 热力图最深的混色比例:再深时文字的对比度不够 */\nconst MAX_HEAT = 45;\n\n/** 透视表:行维度 × 列维度的聚合,可以着色成热力图 */\nexport const PivotTable = _component(\n <T,>({\n data,\n rows,\n columns,\n value,\n aggregate = 'sum',\n totals = true,\n heatmap = false,\n empty,\n propsCell,\n ...rest\n }: PivotTableProps<T>) => {\n const lang = useLang();\n const format = useFormat();\n const result = _derived(\n pivot(data, {\n rows: rows.map(fieldOf),\n columns: columns && fieldOf(columns),\n value: value && fieldOf(value),\n aggregate,\n rowOrder: rows.map((dimension) => dimension.order),\n columnOrder: columns?.order,\n // 维度值按当前语言排序(中文按拼音),数字按大小\n compare: (a, b) => a.localeCompare(b, lang.code, { numeric: true }),\n }),\n );\n const type = (): keyof ColumnTypes =>\n aggregate === 'count' ? 'number' : (value?.type ?? 'number');\n const show = (number: NumericValue | null): VNodeChild =>\n number == null\n ? (empty ?? lang.emptyValue)\n : formatCell(number, type(), format, aggregate === 'count' ? undefined : value?.format);\n\n return () => {\n const { rowKeys, columnKeys, cell, rowTotal, columnTotal, grandTotal, extent } = result;\n const tableRows: PivotRow[] = rowKeys.map((dimensions) => ({\n key: dimensions.join('\\u0000'),\n dimensions,\n }));\n const heat = (number: NumericValue | null) => {\n if (!heatmap || number == null || !extent) return undefined;\n const [low, high] = extent;\n const ratio = high === low ? 1 : (toNumber(number) - low) / (high - low);\n return pivotTableStyles.heat(Math.round(6 + ratio * (MAX_HEAT - 6)));\n };\n const tableColumns: DataTableColumn<PivotRow>[] = [\n ...rows.map((dimension, level): DataTableColumn<PivotRow> => ({\n key: `row:${level}`,\n header: dimension.header,\n value: (row) => row.dimensions[level] ?? '',\n cell: (row) => {\n const raw = row.dimensions[level] ?? '';\n return dimension.format ? dimension.format(raw) : raw || lang.emptyValue;\n },\n })),\n ...columnKeys.map((column): DataTableColumn<PivotRow> => ({\n key: `column:${column}`,\n header: columns\n ? columns.format\n ? columns.format(column)\n : column || lang.emptyValue\n : (value?.header ?? lang.tableSummary),\n align: 'end',\n value: (row) => {\n const number = cell(row.dimensions, column);\n return number == null ? null : toNumber(number);\n },\n cell: (row) => show(cell(row.dimensions, column)),\n summary: totals ? () => show(columnTotal(column)) : undefined,\n })),\n ...(totals && columns\n ? [\n {\n key: 'total',\n header: lang.tableSummary,\n align: 'end' as const,\n cell: (row: PivotRow) => show(rowTotal(row.dimensions)),\n summary: () => show(grandTotal),\n },\n ]\n : []),\n ];\n return (\n <ColumnTable\n {...rest}\n rows={tableRows}\n columns={tableColumns}\n getKey={(row) => row.key}\n mergeRepeated={rows.slice(0, -1).map((_dimension, level) => `row:${level}`)}\n propsCell={(row, column) => {\n const own = typeof propsCell === 'function' ? propsCell(row, column) : propsCell;\n const columnKey = column.key.startsWith('column:') ? column.key.slice(7) : undefined;\n const sx =\n columnKey !== undefined\n ? heat(cell(row.dimensions, columnKey))\n : column.key === 'total'\n ? pivotTableStyles.total\n : undefined;\n return { ...own, sx: [sx, own?.sx] } as PartProps<\n 'td',\n 'align' | 'rowspan' | 'colspan'\n >;\n }}\n />\n );\n };\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"PivotTable.js","names":["_vtp_readonlyProp","_vtp_restProps","_vue_computed","_createVNode","_mergeProps"],"sources":["../../src/table/PivotTable.tsx"],"sourcesContent":["/**\n * 透视表:明细按行维度(可以多级,相同的格合并)与列维度交叉汇总,每格是一个聚合值,带合计行与合计列;\n * heatmap 时按数值给格子着色(热力图:一眼看出哪里多、哪里少)。建在 pivot 与 ColumnTable 上。\n *\n * <PivotTable\n * data={records}\n * rows={[{ key: 'region', header: '区域' }, { key: 'supplier', header: '供应商' }]}\n * columns={{ key: 'quarter', header: '季度', order: ['Q1', 'Q2', 'Q3', 'Q4'] }}\n * value={{ key: 'amount', header: '销售额', type: 'currency' }}\n * heatmap\n * aria-label=\"各区域、门店的季度销售额\"\n * />\n *\n * 数值的格式同表格的列(type、format);aggregate 是 sum(默认)、count、avg、min、max。\n * 热力图的颜色是强调色按比例混进底色(最深不超过 45%,文字照常够对比),读屏照常读数字。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { useLang } from '../config/context';\nimport { useFormat, type NumericFormat } from '../config/lang/format';\nimport { t } from '../config/theme/tokens';\nimport type { SortValue } from '../utils/data/collation';\nimport { toNumber, type NumericValue } from '../utils/data/numeric';\nimport type { PartProps } from '../utils/props';\nimport { ColumnTable, type ColumnTableProps } from './ColumnTable';\nimport { formatCell, type ColumnTypes, type DataTableColumn } from './columns';\nimport { pivot, type PivotAggregates } from './pivot';\n\n/** 一个维度(行或列):取哪个字段、表头、显示与顺序 */\nexport interface PivotDimension<T> {\n /** 字段名;写了 value 时只作标识 */\n key: string;\n /** 表头(行维度是这一列的表头;列维度显示在左上角的说明里) */\n header: VNodeChild;\n /** 取值;不写时取 row[key] */\n value?: (row: T) => SortValue;\n /** 显示的文字;不写时是值本身 */\n format?: (value: string) => string;\n /** 顺序:按这个排,没列出的排在后面;不写时按值排序 */\n order?: readonly string[];\n}\n\n/** 聚合的数值 */\nexport interface PivotValue<T> {\n /** 字段名;写了 value 时只作标识 */\n key: string;\n /** 名称:读屏的说明、合计的含义 */\n header: VNodeChild;\n /** 取值;不写时取 row[key] */\n value?: (row: T) => SortValue;\n /** 值的类型(同表格的列),默认 number */\n type?: keyof ColumnTypes;\n /** 数字的格式(同表格的列) */\n format?: NumericFormat;\n}\n\n/** 透视表的一行(交给 ColumnTable 的部件属性):行维度的值 */\nexport interface PivotRow {\n /** 各级维度值连起来的标识 */\n key: string;\n /** 各级行维度的值 */\n dimensions: string[];\n}\n\n/** 未声明的属性落到 table 上;外观(density、variant、striped)同 Table */\nexport interface PivotTableProps<T> extends Omit<\n ColumnTableProps<PivotRow>,\n 'rows' | 'columns' | 'getKey' | 'mergeRepeated'\n> {\n /** 明细 */\n data: readonly T[];\n /** 行维度,可以多级(相同的上级合并成一格) */\n rows: readonly PivotDimension<T>[];\n /** 列维度;不写时只有一列(按行汇总) */\n columns?: PivotDimension<T>;\n /** 聚合的数值;count 时可以不写 */\n value?: PivotValue<T>;\n /** 聚合方式,默认 sum */\n aggregate?: keyof PivotAggregates;\n /** 合计行与合计列,默认 true */\n totals?: boolean;\n /** 按数值给格子着色(热力图);合计不着色 */\n heatmap?: boolean;\n /** 没有明细的格子显示的内容,默认 — */\n empty?: VNodeChild;\n}\n\n/** PivotTable 的样式:heat(按比例的底色) */\nexport const pivotTableStyles = css.create({\n heat: (percent: number) => ({\n backgroundColor: `color-mix(in srgb, ${t.colors.accent} ${percent}%, transparent)`,\n }),\n total: { fontWeight: '_semibold' },\n});\n\nconst fieldOf =\n <T,>(dimension: { key: string; value?: (row: T) => SortValue }) =>\n (row: T) =>\n dimension.value\n ? dimension.value(row)\n : ((row as Record<string, SortValue>)[dimension.key] ?? null);\n\n/** 热力图最深的混色比例:再深时文字的对比度不够 */\nconst MAX_HEAT = 45;\n\n/** 透视表:行维度 × 列维度的聚合,可以着色成热力图 */\nexport const PivotTable = _component(\n <T,>({\n data,\n rows,\n columns,\n value,\n aggregate = 'sum',\n totals = true,\n heatmap = false,\n empty,\n propsCell,\n ...rest\n }: PivotTableProps<T>) => {\n const lang = useLang();\n const format = useFormat();\n const result = _derived(\n pivot(data, {\n rows: rows.map(fieldOf),\n columns: columns && fieldOf(columns),\n value: value && fieldOf(value),\n aggregate,\n rowOrder: rows.map((dimension) => dimension.order),\n columnOrder: columns?.order,\n // 维度值按当前语言排序(中文按拼音),数字按大小\n compare: (a, b) => a.localeCompare(b, lang.code, { numeric: true }),\n }),\n );\n const type = (): keyof ColumnTypes =>\n aggregate === 'count' ? 'number' : (value?.type ?? 'number');\n const show = (number: NumericValue | null): VNodeChild =>\n number == null\n ? (empty ?? lang.emptyValue)\n : formatCell(number, type(), format, aggregate === 'count' ? undefined : value?.format);\n\n return () => {\n const { rowKeys, columnKeys, cell, rowTotal, columnTotal, grandTotal, extent } = result;\n const tableRows: PivotRow[] = rowKeys.map((dimensions) => ({\n key: dimensions.join('\\u0000'),\n dimensions,\n }));\n const heat = (number: NumericValue | null) => {\n if (!heatmap || number == null || !extent) return undefined;\n const [low, high] = extent;\n const ratio = high === low ? 1 : (toNumber(number) - low) / (high - low);\n return pivotTableStyles.heat(Math.round(6 + ratio * (MAX_HEAT - 6)));\n };\n const tableColumns: DataTableColumn<PivotRow>[] = [\n ...rows.map((dimension, level): DataTableColumn<PivotRow> => ({\n key: `row:${level}`,\n header: dimension.header,\n value: (row) => row.dimensions[level] ?? '',\n cell: (row) => {\n const raw = row.dimensions[level] ?? '';\n return dimension.format ? dimension.format(raw) : raw || lang.emptyValue;\n },\n })),\n ...columnKeys.map((column): DataTableColumn<PivotRow> => ({\n key: `column:${column}`,\n header: columns\n ? columns.format\n ? columns.format(column)\n : column || lang.emptyValue\n : (value?.header ?? lang.tableSummary),\n align: 'end',\n value: (row) => {\n const number = cell(row.dimensions, column);\n return number == null ? null : toNumber(number);\n },\n cell: (row) => show(cell(row.dimensions, column)),\n summary: totals ? () => show(columnTotal(column)) : undefined,\n })),\n ...(totals && columns\n ? [\n {\n key: 'total',\n header: lang.tableSummary,\n align: 'end' as const,\n cell: (row: PivotRow) => show(rowTotal(row.dimensions)),\n summary: () => show(grandTotal),\n },\n ]\n : []),\n ];\n return (\n <ColumnTable\n {...rest}\n rows={tableRows}\n columns={tableColumns}\n getKey={(row) => row.key}\n mergeRepeated={rows.slice(0, -1).map((_dimension, level) => `row:${level}`)}\n propsCell={(row, column) => {\n const own = typeof propsCell === 'function' ? propsCell(row, column) : propsCell;\n const columnKey = column.key.startsWith('column:') ? column.key.slice(7) : undefined;\n const sx =\n columnKey !== undefined\n ? heat(cell(row.dimensions, columnKey))\n : column.key === 'total'\n ? pivotTableStyles.total\n : undefined;\n return { ...own, sx: [sx, own?.sx] } as PartProps<\n 'td',\n 'align' | 'rowspan' | 'colspan'\n >;\n }}\n />\n );\n };\n },\n);\n"],"mappings":"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"}
@@ -4,8 +4,8 @@ import { presenceStyles } from "../utils/style/transitions.js";
4
4
  import { Button } from "../base/Button.js";
5
5
  import { announce } from "../utils/dom/announcer.js";
6
6
  import { usePresence } from "../utils/motion/presence.js";
7
- import { createVNode, mergeProps, watch } from "vue";
8
- import { _component, childrenProp, readonlyProp, restProps, untrack } from "@zerodep-dev/vue-tsx-pro-tsx";
7
+ import { createVNode, watch } from "vue";
8
+ import { _component, childrenProp, mergeJsxProps, readonlyProp, restProps, untrack } from "@zerodep-dev/vue-tsx-pro-tsx";
9
9
  import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
10
10
  //#region src/table/SelectionBar.tsx
11
11
  /** 未声明的属性落到外层 div 上 */
@@ -53,13 +53,13 @@ var SelectionBar = /*#__PURE__*/ _component((_props, _ctx) => {
53
53
  let shownCount = untrack(() => count.value);
54
54
  return () => {
55
55
  if (count.value > 0) shownCount = count.value;
56
- return presence.mounted && createVNode("div", mergeProps(mergeAttrs({ sx: [
56
+ return presence.mounted && createVNode("div", mergeJsxProps(mergeAttrs({ sx: [
57
57
  selectionBarStyles.root,
58
58
  presenceStyles.fade,
59
59
  presence.state === "closed" && presenceStyles.leaving
60
60
  ] }, rest, { ref: presence.ref }), { "data-state": presence.state }), [
61
61
  createVNode("span", mergeAttrs({ sx: selectionBarStyles.count }, propsCount.value), [label.value ?? lang.tableSelectedCount(shownCount)]),
62
- createVNode(Button, mergeProps(mergePartProps({
62
+ createVNode(Button, mergeJsxProps(mergePartProps({
63
63
  variant: "link",
64
64
  size: "sm"
65
65
  }, propsClear.value, { onClick: () => onClear.value?.() }), { "key": "__site0" }), {