@jcsoftdev/ui 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1626) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +132 -2
  3. package/bin/ui-theme.mjs +45 -0
  4. package/dist/ai/attachment/attachment.d.ts +19 -0
  5. package/dist/ai/attachment/attachment.js +87 -0
  6. package/dist/ai/attachment/index.d.ts +1 -0
  7. package/dist/ai/attachment/index.js +1 -0
  8. package/dist/ai/chain-of-thought/chain-of-thought.d.ts +21 -0
  9. package/dist/ai/chain-of-thought/chain-of-thought.js +88 -0
  10. package/dist/ai/chain-of-thought/index.d.ts +1 -0
  11. package/dist/ai/chain-of-thought/index.js +1 -0
  12. package/dist/ai/chat-list/chat-list.d.ts +24 -0
  13. package/dist/ai/chat-list/chat-list.js +94 -0
  14. package/dist/ai/chat-list/group.d.ts +12 -0
  15. package/dist/ai/chat-list/group.js +37 -0
  16. package/dist/ai/chat-list/index.d.ts +2 -0
  17. package/dist/ai/chat-list/index.js +7 -0
  18. package/dist/ai/chat-message/chat-message.d.ts +23 -0
  19. package/dist/ai/chat-message/chat-message.js +91 -0
  20. package/dist/ai/chat-message/index.d.ts +1 -0
  21. package/dist/ai/chat-message/index.js +1 -0
  22. package/dist/ai/code-block/code-block.d.ts +12 -0
  23. package/dist/ai/code-block/code-block.js +80 -0
  24. package/dist/ai/code-block/highlight.d.ts +9 -0
  25. package/dist/ai/code-block/highlight.js +160 -0
  26. package/dist/ai/code-block/index.d.ts +2 -0
  27. package/dist/ai/code-block/index.js +9 -0
  28. package/dist/ai/conversation/conversation.d.ts +12 -0
  29. package/dist/ai/conversation/conversation.js +87 -0
  30. package/dist/ai/conversation/index.d.ts +2 -0
  31. package/dist/ai/conversation/index.js +15 -0
  32. package/dist/ai/conversation/stick.d.ts +18 -0
  33. package/dist/ai/conversation/stick.js +22 -0
  34. package/dist/ai/index.d.ts +14 -0
  35. package/dist/ai/index.js +14 -0
  36. package/dist/ai/internal/disclosure.d.ts +13 -0
  37. package/dist/ai/internal/disclosure.js +62 -0
  38. package/dist/ai/internal/icon-action.d.ts +7 -0
  39. package/dist/ai/internal/icon-action.js +21 -0
  40. package/dist/ai/internal/keyframes.d.ts +5 -0
  41. package/dist/ai/internal/keyframes.js +7 -0
  42. package/dist/ai/internal/use-copy.d.ts +5 -0
  43. package/dist/ai/internal/use-copy.js +35 -0
  44. package/dist/ai/loader/index.d.ts +1 -0
  45. package/dist/ai/loader/index.js +1 -0
  46. package/dist/ai/loader/loader.d.ts +12 -0
  47. package/dist/ai/loader/loader.js +41 -0
  48. package/dist/ai/markdown/index.d.ts +2 -0
  49. package/dist/ai/markdown/index.js +6 -0
  50. package/dist/ai/markdown/markdown.d.ts +12 -0
  51. package/dist/ai/markdown/markdown.js +159 -0
  52. package/dist/ai/markdown/parse.d.ts +56 -0
  53. package/dist/ai/markdown/parse.js +229 -0
  54. package/dist/ai/message-actions/index.d.ts +1 -0
  55. package/dist/ai/message-actions/index.js +1 -0
  56. package/dist/ai/message-actions/message-actions.d.ts +15 -0
  57. package/dist/ai/message-actions/message-actions.js +72 -0
  58. package/dist/ai/prompt-input/index.d.ts +2 -0
  59. package/dist/ai/prompt-input/index.js +5 -0
  60. package/dist/ai/prompt-input/keys.d.ts +8 -0
  61. package/dist/ai/prompt-input/keys.js +6 -0
  62. package/dist/ai/prompt-input/prompt-input.d.ts +29 -0
  63. package/dist/ai/prompt-input/prompt-input.js +110 -0
  64. package/dist/ai/prompt-suggestion/index.d.ts +1 -0
  65. package/dist/ai/prompt-suggestion/index.js +1 -0
  66. package/dist/ai/prompt-suggestion/prompt-suggestion.d.ts +13 -0
  67. package/dist/ai/prompt-suggestion/prompt-suggestion.js +44 -0
  68. package/dist/ai/source/index.d.ts +1 -0
  69. package/dist/ai/source/index.js +1 -0
  70. package/dist/ai/source/source.d.ts +12 -0
  71. package/dist/ai/source/source.js +48 -0
  72. package/dist/ai/text-shimmer/index.d.ts +1 -0
  73. package/dist/ai/text-shimmer/index.js +1 -0
  74. package/dist/ai/text-shimmer/text-shimmer.d.ts +11 -0
  75. package/dist/ai/text-shimmer/text-shimmer.js +28 -0
  76. package/dist/ai/tool-call/index.d.ts +1 -0
  77. package/dist/ai/tool-call/index.js +1 -0
  78. package/dist/ai/tool-call/tool-call.d.ts +18 -0
  79. package/dist/ai/tool-call/tool-call.js +84 -0
  80. package/dist/atoms/avatar/avatar.d.ts +11 -0
  81. package/dist/atoms/avatar/avatar.js +39 -0
  82. package/dist/atoms/avatar/index.d.ts +1 -0
  83. package/dist/atoms/avatar/index.js +4 -0
  84. package/dist/atoms/avatar-group/avatar-group.d.ts +7 -0
  85. package/dist/atoms/avatar-group/avatar-group.js +8 -0
  86. package/dist/atoms/avatar-group/index.d.ts +1 -0
  87. package/dist/atoms/avatar-group/index.js +4 -0
  88. package/dist/atoms/big-date/big-date.d.ts +7 -0
  89. package/dist/atoms/big-date/big-date.js +18 -0
  90. package/dist/atoms/big-date/index.d.ts +1 -0
  91. package/dist/atoms/big-date/index.js +4 -0
  92. package/dist/atoms/button/button.d.ts +11 -0
  93. package/dist/atoms/button/button.js +60 -0
  94. package/dist/atoms/button/index.d.ts +1 -0
  95. package/dist/atoms/button/index.js +6 -0
  96. package/dist/atoms/checkbox/checkbox.d.ts +5 -0
  97. package/dist/atoms/checkbox/checkbox.js +18 -0
  98. package/dist/atoms/checkbox/index.d.ts +1 -0
  99. package/dist/atoms/checkbox/index.js +4 -0
  100. package/dist/atoms/chip/chip.d.ts +8 -0
  101. package/dist/atoms/chip/chip.js +28 -0
  102. package/dist/atoms/chip/index.d.ts +1 -0
  103. package/dist/atoms/chip/index.js +4 -0
  104. package/dist/atoms/icon/icon-map.d.ts +42 -0
  105. package/dist/atoms/icon/icon-map.js +81 -0
  106. package/dist/atoms/icon/icon.d.ts +12 -0
  107. package/dist/atoms/icon/icon.js +13 -0
  108. package/dist/atoms/icon/index.d.ts +2 -0
  109. package/dist/atoms/icon/index.js +6 -0
  110. package/dist/atoms/index.d.ts +16 -0
  111. package/dist/atoms/index.js +16 -0
  112. package/dist/atoms/led/index.d.ts +1 -0
  113. package/dist/atoms/led/index.js +4 -0
  114. package/dist/atoms/led/led.d.ts +9 -0
  115. package/dist/atoms/led/led.js +23 -0
  116. package/dist/atoms/number-value/format.d.ts +10 -0
  117. package/dist/atoms/number-value/format.js +19 -0
  118. package/dist/atoms/number-value/index.d.ts +2 -0
  119. package/dist/atoms/number-value/index.js +14 -0
  120. package/dist/atoms/number-value/number-value.d.ts +18 -0
  121. package/dist/atoms/number-value/number-value.js +42 -0
  122. package/dist/atoms/pressable-feedback/index.d.ts +1 -0
  123. package/dist/atoms/pressable-feedback/index.js +4 -0
  124. package/dist/atoms/pressable-feedback/pressable-feedback.d.ts +14 -0
  125. package/dist/atoms/pressable-feedback/pressable-feedback.js +66 -0
  126. package/dist/atoms/progress/index.d.ts +1 -0
  127. package/dist/atoms/progress/index.js +5 -0
  128. package/dist/atoms/progress/progress.d.ts +9 -0
  129. package/dist/atoms/progress/progress.js +29 -0
  130. package/dist/atoms/radio-group/index.d.ts +1 -0
  131. package/dist/atoms/radio-group/index.js +6 -0
  132. package/dist/atoms/radio-group/radio-group.d.ts +11 -0
  133. package/dist/atoms/radio-group/radio-group.js +47 -0
  134. package/dist/atoms/status-dot/index.d.ts +1 -0
  135. package/dist/atoms/status-dot/index.js +6 -0
  136. package/dist/atoms/status-dot/status-dot.d.ts +13 -0
  137. package/dist/atoms/status-dot/status-dot.js +39 -0
  138. package/dist/atoms/status-pill/index.d.ts +1 -0
  139. package/dist/atoms/status-pill/index.js +4 -0
  140. package/dist/atoms/status-pill/status-pill.d.ts +10 -0
  141. package/dist/atoms/status-pill/status-pill.js +25 -0
  142. package/dist/atoms/switch/index.d.ts +1 -0
  143. package/dist/atoms/switch/index.js +4 -0
  144. package/dist/atoms/switch/switch.d.ts +5 -0
  145. package/dist/atoms/switch/switch.js +17 -0
  146. package/dist/atoms/trend-chip/index.d.ts +2 -0
  147. package/dist/atoms/trend-chip/index.js +12 -0
  148. package/dist/atoms/trend-chip/trend-chip.d.ts +14 -0
  149. package/dist/atoms/trend-chip/trend-chip.js +58 -0
  150. package/dist/atoms/trend-chip/trend.d.ts +8 -0
  151. package/dist/atoms/trend-chip/trend.js +21 -0
  152. package/dist/brand/export.d.ts +7 -0
  153. package/dist/brand/export.js +62 -0
  154. package/dist/brand/generate.d.ts +65 -0
  155. package/dist/brand/generate.js +409 -0
  156. package/dist/brand/glyphs.d.ts +16 -0
  157. package/dist/brand/glyphs.js +91 -0
  158. package/dist/brand/index.d.ts +8 -0
  159. package/dist/brand/index.js +8 -0
  160. package/dist/brand/initials.d.ts +6 -0
  161. package/dist/brand/initials.js +41 -0
  162. package/dist/brand/logo-forge.d.ts +42 -0
  163. package/dist/brand/logo-forge.js +441 -0
  164. package/dist/brand/logo-mark.d.ts +8 -0
  165. package/dist/brand/logo-mark.js +34 -0
  166. package/dist/brand/palettes.d.ts +23 -0
  167. package/dist/brand/palettes.js +47 -0
  168. package/dist/brand/rng.d.ts +5 -0
  169. package/dist/brand/rng.js +26 -0
  170. package/dist/calendar/day-chip/day-chip.d.ts +8 -0
  171. package/dist/calendar/day-chip/day-chip.js +34 -0
  172. package/dist/calendar/day-chip/index.d.ts +2 -0
  173. package/dist/calendar/day-chip/index.js +4 -0
  174. package/dist/calendar/event-block/event-block.d.ts +9 -0
  175. package/dist/calendar/event-block/event-block.js +74 -0
  176. package/dist/calendar/event-block/index.d.ts +2 -0
  177. package/dist/calendar/event-block/index.js +4 -0
  178. package/dist/calendar/index.d.ts +5 -0
  179. package/dist/calendar/index.js +5 -0
  180. package/dist/calendar/internal/date-utils.d.ts +18 -0
  181. package/dist/calendar/internal/date-utils.js +66 -0
  182. package/dist/calendar/internal/index.d.ts +3 -0
  183. package/dist/calendar/internal/index.js +3 -0
  184. package/dist/calendar/internal/layout.d.ts +14 -0
  185. package/dist/calendar/internal/layout.js +42 -0
  186. package/dist/calendar/internal/styles.d.ts +2 -0
  187. package/dist/calendar/internal/styles.js +4 -0
  188. package/dist/calendar/internal/types.d.ts +29 -0
  189. package/dist/calendar/internal/types.js +0 -0
  190. package/dist/calendar/month-view/index.d.ts +1 -0
  191. package/dist/calendar/month-view/index.js +4 -0
  192. package/dist/calendar/month-view/month-view.d.ts +24 -0
  193. package/dist/calendar/month-view/month-view.js +110 -0
  194. package/dist/calendar/timeline-view/index.d.ts +1 -0
  195. package/dist/calendar/timeline-view/index.js +4 -0
  196. package/dist/calendar/timeline-view/timeline-view.d.ts +19 -0
  197. package/dist/calendar/timeline-view/timeline-view.js +64 -0
  198. package/dist/calendar/week-view/index.d.ts +1 -0
  199. package/dist/calendar/week-view/index.js +4 -0
  200. package/dist/calendar/week-view/week-view.d.ts +26 -0
  201. package/dist/calendar/week-view/week-view.js +172 -0
  202. package/dist/charts/area-chart/area-chart.d.ts +10 -0
  203. package/dist/charts/area-chart/area-chart.js +14 -0
  204. package/dist/charts/area-chart/index.d.ts +1 -0
  205. package/dist/charts/area-chart/index.js +1 -0
  206. package/dist/charts/bar-chart/bar-chart.d.ts +35 -0
  207. package/dist/charts/bar-chart/bar-chart.js +29 -0
  208. package/dist/charts/bar-chart/bar-race-chart.d.ts +41 -0
  209. package/dist/charts/bar-chart/bar-race-chart.js +252 -0
  210. package/dist/charts/bar-chart/bar-race.d.ts +23 -0
  211. package/dist/charts/bar-chart/bar-race.js +42 -0
  212. package/dist/charts/bar-chart/drilldown-bar-chart.d.ts +18 -0
  213. package/dist/charts/bar-chart/drilldown-bar-chart.js +69 -0
  214. package/dist/charts/bar-chart/index.d.ts +4 -0
  215. package/dist/charts/bar-chart/index.js +4 -0
  216. package/dist/charts/beeswarm-chart/beeswarm-chart.d.ts +53 -0
  217. package/dist/charts/beeswarm-chart/beeswarm-chart.js +356 -0
  218. package/dist/charts/beeswarm-chart/index.d.ts +1 -0
  219. package/dist/charts/beeswarm-chart/index.js +1 -0
  220. package/dist/charts/box-plot/box-plot.d.ts +48 -0
  221. package/dist/charts/box-plot/box-plot.js +330 -0
  222. package/dist/charts/box-plot/index.d.ts +1 -0
  223. package/dist/charts/box-plot/index.js +1 -0
  224. package/dist/charts/bubble-chart/bubble-chart.d.ts +8 -0
  225. package/dist/charts/bubble-chart/bubble-chart.js +9 -0
  226. package/dist/charts/bubble-chart/index.d.ts +1 -0
  227. package/dist/charts/bubble-chart/index.js +1 -0
  228. package/dist/charts/bubble-map/bubble-map.d.ts +94 -0
  229. package/dist/charts/bubble-map/bubble-map.js +520 -0
  230. package/dist/charts/bubble-map/index.d.ts +1 -0
  231. package/dist/charts/bubble-map/index.js +1 -0
  232. package/dist/charts/bullet-chart/bullet-chart.d.ts +49 -0
  233. package/dist/charts/bullet-chart/bullet-chart.js +478 -0
  234. package/dist/charts/bullet-chart/bullet-layout.d.ts +21 -0
  235. package/dist/charts/bullet-chart/bullet-layout.js +30 -0
  236. package/dist/charts/bullet-chart/index.d.ts +2 -0
  237. package/dist/charts/bullet-chart/index.js +2 -0
  238. package/dist/charts/candlestick-chart/candlestick-chart.d.ts +59 -0
  239. package/dist/charts/candlestick-chart/candlestick-chart.js +514 -0
  240. package/dist/charts/candlestick-chart/index.d.ts +1 -0
  241. package/dist/charts/candlestick-chart/index.js +1 -0
  242. package/dist/charts/chart-grid/chart-grid.d.ts +72 -0
  243. package/dist/charts/chart-grid/chart-grid.js +114 -0
  244. package/dist/charts/chart-grid/grid-math.d.ts +26 -0
  245. package/dist/charts/chart-grid/grid-math.js +37 -0
  246. package/dist/charts/chart-grid/index.d.ts +2 -0
  247. package/dist/charts/chart-grid/index.js +2 -0
  248. package/dist/charts/chord-chart/chord-chart.d.ts +59 -0
  249. package/dist/charts/chord-chart/chord-chart.js +427 -0
  250. package/dist/charts/chord-chart/index.d.ts +1 -0
  251. package/dist/charts/chord-chart/index.js +1 -0
  252. package/dist/charts/choropleth-map/choropleth-drilldown.d.ts +36 -0
  253. package/dist/charts/choropleth-map/choropleth-drilldown.js +60 -0
  254. package/dist/charts/choropleth-map/choropleth-map.d.ts +69 -0
  255. package/dist/charts/choropleth-map/choropleth-map.js +304 -0
  256. package/dist/charts/choropleth-map/index.d.ts +2 -0
  257. package/dist/charts/choropleth-map/index.js +2 -0
  258. package/dist/charts/combo-chart/combo-chart.d.ts +15 -0
  259. package/dist/charts/combo-chart/combo-chart.js +14 -0
  260. package/dist/charts/combo-chart/index.d.ts +1 -0
  261. package/dist/charts/combo-chart/index.js +1 -0
  262. package/dist/charts/core/a11y.d.ts +4 -0
  263. package/dist/charts/core/a11y.js +4 -0
  264. package/dist/charts/core/axes.d.ts +41 -0
  265. package/dist/charts/core/axes.js +128 -0
  266. package/dist/charts/core/breadcrumb.d.ts +17 -0
  267. package/dist/charts/core/breadcrumb.js +43 -0
  268. package/dist/charts/core/cartesian/annotations.d.ts +10 -0
  269. package/dist/charts/core/cartesian/annotations.js +139 -0
  270. package/dist/charts/core/cartesian/axis-stack.d.ts +43 -0
  271. package/dist/charts/core/cartesian/axis-stack.js +40 -0
  272. package/dist/charts/core/cartesian/brush.d.ts +31 -0
  273. package/dist/charts/core/cartesian/brush.js +211 -0
  274. package/dist/charts/core/cartesian/cartesian-chart.d.ts +8 -0
  275. package/dist/charts/core/cartesian/cartesian-chart.js +1068 -0
  276. package/dist/charts/core/cartesian/category-group-axis.d.ts +6 -0
  277. package/dist/charts/core/cartesian/category-group-axis.js +39 -0
  278. package/dist/charts/core/cartesian/category-groups.d.ts +15 -0
  279. package/dist/charts/core/cartesian/category-groups.js +23 -0
  280. package/dist/charts/core/cartesian/ink-layer.d.ts +63 -0
  281. package/dist/charts/core/cartesian/ink-layer.js +371 -0
  282. package/dist/charts/core/cartesian/layout.d.ts +164 -0
  283. package/dist/charts/core/cartesian/layout.js +550 -0
  284. package/dist/charts/core/cartesian/marks.d.ts +33 -0
  285. package/dist/charts/core/cartesian/marks.js +110 -0
  286. package/dist/charts/core/cartesian/sync-store.d.ts +34 -0
  287. package/dist/charts/core/cartesian/sync-store.js +61 -0
  288. package/dist/charts/core/cartesian/sync.d.ts +20 -0
  289. package/dist/charts/core/cartesian/sync.js +50 -0
  290. package/dist/charts/core/cartesian/types.d.ts +156 -0
  291. package/dist/charts/core/cartesian/types.js +0 -0
  292. package/dist/charts/core/category-axis.d.ts +37 -0
  293. package/dist/charts/core/category-axis.js +78 -0
  294. package/dist/charts/core/category-explorer.d.ts +48 -0
  295. package/dist/charts/core/category-explorer.js +88 -0
  296. package/dist/charts/core/chart-frame.d.ts +40 -0
  297. package/dist/charts/core/chart-frame.js +63 -0
  298. package/dist/charts/core/chart-states.d.ts +16 -0
  299. package/dist/charts/core/chart-states.js +79 -0
  300. package/dist/charts/core/chord.d.ts +59 -0
  301. package/dist/charts/core/chord.js +104 -0
  302. package/dist/charts/core/color-scale.d.ts +50 -0
  303. package/dist/charts/core/color-scale.js +59 -0
  304. package/dist/charts/core/data-table.d.ts +17 -0
  305. package/dist/charts/core/data-table.js +28 -0
  306. package/dist/charts/core/distribution/brush.d.ts +44 -0
  307. package/dist/charts/core/distribution/brush.js +89 -0
  308. package/dist/charts/core/distribution/dot-stack.d.ts +39 -0
  309. package/dist/charts/core/distribution/dot-stack.js +40 -0
  310. package/dist/charts/core/distribution/explorer.d.ts +23 -0
  311. package/dist/charts/core/distribution/explorer.js +73 -0
  312. package/dist/charts/core/distribution/geometry.d.ts +38 -0
  313. package/dist/charts/core/distribution/geometry.js +37 -0
  314. package/dist/charts/core/distribution/index.d.ts +11 -0
  315. package/dist/charts/core/distribution/index.js +11 -0
  316. package/dist/charts/core/distribution/labels.d.ts +28 -0
  317. package/dist/charts/core/distribution/labels.js +29 -0
  318. package/dist/charts/core/distribution/layout.d.ts +103 -0
  319. package/dist/charts/core/distribution/layout.js +183 -0
  320. package/dist/charts/core/distribution/marks.d.ts +57 -0
  321. package/dist/charts/core/distribution/marks.js +269 -0
  322. package/dist/charts/core/distribution/observations.d.ts +19 -0
  323. package/dist/charts/core/distribution/observations.js +46 -0
  324. package/dist/charts/core/distribution/point-index.d.ts +20 -0
  325. package/dist/charts/core/distribution/point-index.js +47 -0
  326. package/dist/charts/core/distribution/points.d.ts +15 -0
  327. package/dist/charts/core/distribution/points.js +18 -0
  328. package/dist/charts/core/distribution/stats.d.ts +132 -0
  329. package/dist/charts/core/distribution/stats.js +281 -0
  330. package/dist/charts/core/distribution/use-legend.d.ts +31 -0
  331. package/dist/charts/core/distribution/use-legend.js +43 -0
  332. package/dist/charts/core/distribution/xy-points.d.ts +109 -0
  333. package/dist/charts/core/distribution/xy-points.js +968 -0
  334. package/dist/charts/core/downsample.d.ts +21 -0
  335. package/dist/charts/core/downsample.js +65 -0
  336. package/dist/charts/core/drawing-height.d.ts +14 -0
  337. package/dist/charts/core/drawing-height.js +11 -0
  338. package/dist/charts/core/export-menu.d.ts +20 -0
  339. package/dist/charts/core/export-menu.js +52 -0
  340. package/dist/charts/core/export.d.ts +45 -0
  341. package/dist/charts/core/export.js +162 -0
  342. package/dist/charts/core/format.d.ts +48 -0
  343. package/dist/charts/core/format.js +88 -0
  344. package/dist/charts/core/gantt.d.ts +136 -0
  345. package/dist/charts/core/gantt.js +362 -0
  346. package/dist/charts/core/hierarchy-chart.d.ts +76 -0
  347. package/dist/charts/core/hierarchy-chart.js +158 -0
  348. package/dist/charts/core/hierarchy.d.ts +118 -0
  349. package/dist/charts/core/hierarchy.js +229 -0
  350. package/dist/charts/core/index.d.ts +54 -0
  351. package/dist/charts/core/index.js +54 -0
  352. package/dist/charts/core/indicators.d.ts +55 -0
  353. package/dist/charts/core/indicators.js +125 -0
  354. package/dist/charts/core/ink.d.ts +127 -0
  355. package/dist/charts/core/ink.js +178 -0
  356. package/dist/charts/core/legend.d.ts +23 -0
  357. package/dist/charts/core/legend.js +79 -0
  358. package/dist/charts/core/motion.d.ts +33 -0
  359. package/dist/charts/core/motion.js +81 -0
  360. package/dist/charts/core/palette.d.ts +38 -0
  361. package/dist/charts/core/palette.js +52 -0
  362. package/dist/charts/core/path.d.ts +40 -0
  363. package/dist/charts/core/path.js +141 -0
  364. package/dist/charts/core/pattern-defs.d.ts +15 -0
  365. package/dist/charts/core/pattern-defs.js +83 -0
  366. package/dist/charts/core/patterns.d.ts +49 -0
  367. package/dist/charts/core/patterns.js +93 -0
  368. package/dist/charts/core/plot-overlay.d.ts +36 -0
  369. package/dist/charts/core/plot-overlay.js +68 -0
  370. package/dist/charts/core/polar.d.ts +111 -0
  371. package/dist/charts/core/polar.js +173 -0
  372. package/dist/charts/core/sankey.d.ts +168 -0
  373. package/dist/charts/core/sankey.js +354 -0
  374. package/dist/charts/core/scales/band.d.ts +34 -0
  375. package/dist/charts/core/scales/band.js +58 -0
  376. package/dist/charts/core/scales/index.d.ts +4 -0
  377. package/dist/charts/core/scales/index.js +4 -0
  378. package/dist/charts/core/scales/linear.d.ts +27 -0
  379. package/dist/charts/core/scales/linear.js +73 -0
  380. package/dist/charts/core/scales/log.d.ts +8 -0
  381. package/dist/charts/core/scales/log.js +30 -0
  382. package/dist/charts/core/scales/time.d.ts +26 -0
  383. package/dist/charts/core/scales/time.js +98 -0
  384. package/dist/charts/core/shape-morph.d.ts +29 -0
  385. package/dist/charts/core/shape-morph.js +60 -0
  386. package/dist/charts/core/stack.d.ts +14 -0
  387. package/dist/charts/core/stack.js +27 -0
  388. package/dist/charts/core/time-range.d.ts +23 -0
  389. package/dist/charts/core/time-range.js +27 -0
  390. package/dist/charts/core/tooltip.d.ts +38 -0
  391. package/dist/charts/core/tooltip.js +83 -0
  392. package/dist/charts/core/tree-fit.d.ts +29 -0
  393. package/dist/charts/core/tree-fit.js +53 -0
  394. package/dist/charts/core/tree-layout.d.ts +85 -0
  395. package/dist/charts/core/tree-layout.js +237 -0
  396. package/dist/charts/core/tree-radial.d.ts +59 -0
  397. package/dist/charts/core/tree-radial.js +209 -0
  398. package/dist/charts/core/types.d.ts +106 -0
  399. package/dist/charts/core/types.js +18 -0
  400. package/dist/charts/core/unit-glyph.d.ts +40 -0
  401. package/dist/charts/core/unit-glyph.js +61 -0
  402. package/dist/charts/core/unit-icons.d.ts +132 -0
  403. package/dist/charts/core/unit-icons.js +157 -0
  404. package/dist/charts/core/units.d.ts +101 -0
  405. package/dist/charts/core/units.js +161 -0
  406. package/dist/charts/core/use-canvas.d.ts +24 -0
  407. package/dist/charts/core/use-canvas.js +50 -0
  408. package/dist/charts/core/use-chart-size.d.ts +19 -0
  409. package/dist/charts/core/use-chart-size.js +43 -0
  410. package/dist/charts/core/use-drill.d.ts +26 -0
  411. package/dist/charts/core/use-drill.js +67 -0
  412. package/dist/charts/core/use-index-navigation.d.ts +30 -0
  413. package/dist/charts/core/use-index-navigation.js +47 -0
  414. package/dist/charts/core/use-pan-zoom.d.ts +56 -0
  415. package/dist/charts/core/use-pan-zoom.js +163 -0
  416. package/dist/charts/core/use-series-state.d.ts +13 -0
  417. package/dist/charts/core/use-series-state.js +26 -0
  418. package/dist/charts/crossfilter/crossfilter-engine.d.ts +54 -0
  419. package/dist/charts/crossfilter/crossfilter-engine.js +125 -0
  420. package/dist/charts/crossfilter/crossfilter.d.ts +140 -0
  421. package/dist/charts/crossfilter/crossfilter.js +333 -0
  422. package/dist/charts/crossfilter/index.d.ts +2 -0
  423. package/dist/charts/crossfilter/index.js +2 -0
  424. package/dist/charts/donut-chart/center-fit.d.ts +14 -0
  425. package/dist/charts/donut-chart/center-fit.js +29 -0
  426. package/dist/charts/donut-chart/donut-chart.d.ts +73 -0
  427. package/dist/charts/donut-chart/donut-chart.js +639 -0
  428. package/dist/charts/donut-chart/index.d.ts +1 -0
  429. package/dist/charts/donut-chart/index.js +1 -0
  430. package/dist/charts/dumbbell-chart/dumbbell-chart.d.ts +68 -0
  431. package/dist/charts/dumbbell-chart/dumbbell-chart.js +585 -0
  432. package/dist/charts/dumbbell-chart/index.d.ts +1 -0
  433. package/dist/charts/dumbbell-chart/index.js +1 -0
  434. package/dist/charts/fill-gauge-chart/fill-gauge-chart.d.ts +42 -0
  435. package/dist/charts/fill-gauge-chart/fill-gauge-chart.js +259 -0
  436. package/dist/charts/fill-gauge-chart/index.d.ts +1 -0
  437. package/dist/charts/fill-gauge-chart/index.js +1 -0
  438. package/dist/charts/funnel-chart/funnel-chart.d.ts +48 -0
  439. package/dist/charts/funnel-chart/funnel-chart.js +423 -0
  440. package/dist/charts/funnel-chart/index.d.ts +1 -0
  441. package/dist/charts/funnel-chart/index.js +1 -0
  442. package/dist/charts/gantt-chart/gantt-chart.d.ts +120 -0
  443. package/dist/charts/gantt-chart/gantt-chart.js +1144 -0
  444. package/dist/charts/gantt-chart/gantt-export.d.ts +26 -0
  445. package/dist/charts/gantt-chart/gantt-export.js +103 -0
  446. package/dist/charts/gantt-chart/gantt-marks.d.ts +125 -0
  447. package/dist/charts/gantt-chart/gantt-marks.js +602 -0
  448. package/dist/charts/gantt-chart/index.d.ts +1 -0
  449. package/dist/charts/gantt-chart/index.js +1 -0
  450. package/dist/charts/gauge-chart/gauge-chart.d.ts +71 -0
  451. package/dist/charts/gauge-chart/gauge-chart.js +458 -0
  452. package/dist/charts/gauge-chart/index.d.ts +1 -0
  453. package/dist/charts/gauge-chart/index.js +1 -0
  454. package/dist/charts/globe-chart/globe-chart.d.ts +75 -0
  455. package/dist/charts/globe-chart/globe-chart.js +618 -0
  456. package/dist/charts/globe-chart/index.d.ts +1 -0
  457. package/dist/charts/globe-chart/index.js +1 -0
  458. package/dist/charts/heatmap-chart/calendar-heatmap.d.ts +47 -0
  459. package/dist/charts/heatmap-chart/calendar-heatmap.js +159 -0
  460. package/dist/charts/heatmap-chart/calendar-layout.d.ts +27 -0
  461. package/dist/charts/heatmap-chart/calendar-layout.js +47 -0
  462. package/dist/charts/heatmap-chart/datetime-columns.d.ts +8 -0
  463. package/dist/charts/heatmap-chart/datetime-columns.js +29 -0
  464. package/dist/charts/heatmap-chart/drilldown-heatmap.d.ts +33 -0
  465. package/dist/charts/heatmap-chart/drilldown-heatmap.js +58 -0
  466. package/dist/charts/heatmap-chart/heatmap-chart.d.ts +59 -0
  467. package/dist/charts/heatmap-chart/heatmap-chart.js +127 -0
  468. package/dist/charts/heatmap-chart/heatmap-grid.d.ts +75 -0
  469. package/dist/charts/heatmap-chart/heatmap-grid.js +494 -0
  470. package/dist/charts/heatmap-chart/heatmap-scale.d.ts +19 -0
  471. package/dist/charts/heatmap-chart/heatmap-scale.js +38 -0
  472. package/dist/charts/heatmap-chart/hex-layout.d.ts +35 -0
  473. package/dist/charts/heatmap-chart/hex-layout.js +58 -0
  474. package/dist/charts/heatmap-chart/index.d.ts +9 -0
  475. package/dist/charts/heatmap-chart/index.js +12 -0
  476. package/dist/charts/hex-tile-map/hex-layout.d.ts +40 -0
  477. package/dist/charts/hex-tile-map/hex-layout.js +96 -0
  478. package/dist/charts/hex-tile-map/hex-tile-map.d.ts +41 -0
  479. package/dist/charts/hex-tile-map/hex-tile-map.js +307 -0
  480. package/dist/charts/hex-tile-map/index.d.ts +2 -0
  481. package/dist/charts/hex-tile-map/index.js +2 -0
  482. package/dist/charts/hierarchy-morph/hierarchy-morph.d.ts +47 -0
  483. package/dist/charts/hierarchy-morph/hierarchy-morph.js +355 -0
  484. package/dist/charts/hierarchy-morph/index.d.ts +1 -0
  485. package/dist/charts/hierarchy-morph/index.js +1 -0
  486. package/dist/charts/histogram/histogram.d.ts +55 -0
  487. package/dist/charts/histogram/histogram.js +444 -0
  488. package/dist/charts/histogram/index.d.ts +1 -0
  489. package/dist/charts/histogram/index.js +1 -0
  490. package/dist/charts/icicle-chart/icicle-chart.d.ts +41 -0
  491. package/dist/charts/icicle-chart/icicle-chart.js +360 -0
  492. package/dist/charts/icicle-chart/index.d.ts +1 -0
  493. package/dist/charts/icicle-chart/index.js +1 -0
  494. package/dist/charts/index.d.ts +50 -0
  495. package/dist/charts/index.js +50 -0
  496. package/dist/charts/isotype-rows/index.d.ts +1 -0
  497. package/dist/charts/isotype-rows/index.js +1 -0
  498. package/dist/charts/isotype-rows/isotype-rows.d.ts +42 -0
  499. package/dist/charts/isotype-rows/isotype-rows.js +274 -0
  500. package/dist/charts/line-chart/index.d.ts +2 -0
  501. package/dist/charts/line-chart/index.js +2 -0
  502. package/dist/charts/line-chart/line-chart.d.ts +15 -0
  503. package/dist/charts/line-chart/line-chart.js +19 -0
  504. package/dist/charts/line-chart/line-drilldown.d.ts +18 -0
  505. package/dist/charts/line-chart/line-drilldown.js +51 -0
  506. package/dist/charts/lollipop-chart/index.d.ts +1 -0
  507. package/dist/charts/lollipop-chart/index.js +1 -0
  508. package/dist/charts/lollipop-chart/lollipop-chart.d.ts +45 -0
  509. package/dist/charts/lollipop-chart/lollipop-chart.js +325 -0
  510. package/dist/charts/maps/data/peru/index.d.ts +2 -0
  511. package/dist/charts/maps/data/peru/index.js +4 -0
  512. package/dist/charts/maps/data/world/index.d.ts +2 -0
  513. package/dist/charts/maps/data/world/index.js +4 -0
  514. package/dist/charts/maps/geo/build-topology.d.ts +20 -0
  515. package/dist/charts/maps/geo/build-topology.js +175 -0
  516. package/dist/charts/maps/geo/cluster.d.ts +22 -0
  517. package/dist/charts/maps/geo/cluster.js +58 -0
  518. package/dist/charts/maps/geo/geo-path.d.ts +20 -0
  519. package/dist/charts/maps/geo/geo-path.js +132 -0
  520. package/dist/charts/maps/geo/globe.d.ts +72 -0
  521. package/dist/charts/maps/geo/globe.js +223 -0
  522. package/dist/charts/maps/geo/index.d.ts +7 -0
  523. package/dist/charts/maps/geo/index.js +7 -0
  524. package/dist/charts/maps/geo/map-data-table.d.ts +25 -0
  525. package/dist/charts/maps/geo/map-data-table.js +99 -0
  526. package/dist/charts/maps/geo/map-labels.d.ts +33 -0
  527. package/dist/charts/maps/geo/map-labels.js +30 -0
  528. package/dist/charts/maps/geo/map-legend.d.ts +19 -0
  529. package/dist/charts/maps/geo/map-legend.js +70 -0
  530. package/dist/charts/maps/geo/map-viewport.d.ts +69 -0
  531. package/dist/charts/maps/geo/map-viewport.js +326 -0
  532. package/dist/charts/maps/geo/match.d.ts +9 -0
  533. package/dist/charts/maps/geo/match.js +12 -0
  534. package/dist/charts/maps/geo/projection.d.ts +47 -0
  535. package/dist/charts/maps/geo/projection.js +118 -0
  536. package/dist/charts/maps/geo/pure.d.ts +11 -0
  537. package/dist/charts/maps/geo/pure.js +11 -0
  538. package/dist/charts/maps/geo/routes.d.ts +19 -0
  539. package/dist/charts/maps/geo/routes.js +63 -0
  540. package/dist/charts/maps/geo/simplify.d.ts +11 -0
  541. package/dist/charts/maps/geo/simplify.js +49 -0
  542. package/dist/charts/maps/geo/topojson.d.ts +18 -0
  543. package/dist/charts/maps/geo/topojson.js +74 -0
  544. package/dist/charts/maps/geo/types.d.ts +54 -0
  545. package/dist/charts/maps/geo/types.js +0 -0
  546. package/dist/charts/maps/geo/use-map-geometry.d.ts +31 -0
  547. package/dist/charts/maps/geo/use-map-geometry.js +100 -0
  548. package/dist/charts/maps/geo/use-map-view.d.ts +44 -0
  549. package/dist/charts/maps/geo/use-map-view.js +199 -0
  550. package/dist/charts/maps/geo/view.d.ts +30 -0
  551. package/dist/charts/maps/geo/view.js +55 -0
  552. package/dist/charts/maps/index.d.ts +1 -0
  553. package/dist/charts/maps/index.js +1 -0
  554. package/dist/charts/parliament-chart/index.d.ts +1 -0
  555. package/dist/charts/parliament-chart/index.js +1 -0
  556. package/dist/charts/parliament-chart/parliament-chart.d.ts +40 -0
  557. package/dist/charts/parliament-chart/parliament-chart.js +325 -0
  558. package/dist/charts/pictogram-chart/index.d.ts +1 -0
  559. package/dist/charts/pictogram-chart/index.js +1 -0
  560. package/dist/charts/pictogram-chart/pictogram-chart.d.ts +43 -0
  561. package/dist/charts/pictogram-chart/pictogram-chart.js +319 -0
  562. package/dist/charts/pie-chart/index.d.ts +1 -0
  563. package/dist/charts/pie-chart/index.js +1 -0
  564. package/dist/charts/pie-chart/pie-chart.d.ts +7 -0
  565. package/dist/charts/pie-chart/pie-chart.js +9 -0
  566. package/dist/charts/polar-area-chart/index.d.ts +1 -0
  567. package/dist/charts/polar-area-chart/index.js +1 -0
  568. package/dist/charts/polar-area-chart/polar-area-chart.d.ts +46 -0
  569. package/dist/charts/polar-area-chart/polar-area-chart.js +389 -0
  570. package/dist/charts/progress-units/index.d.ts +1 -0
  571. package/dist/charts/progress-units/index.js +1 -0
  572. package/dist/charts/progress-units/progress-units.d.ts +39 -0
  573. package/dist/charts/progress-units/progress-units.js +154 -0
  574. package/dist/charts/radar-chart/index.d.ts +1 -0
  575. package/dist/charts/radar-chart/index.js +1 -0
  576. package/dist/charts/radar-chart/radar-chart.d.ts +44 -0
  577. package/dist/charts/radar-chart/radar-chart.js +434 -0
  578. package/dist/charts/radial-bar-chart/index.d.ts +1 -0
  579. package/dist/charts/radial-bar-chart/index.js +1 -0
  580. package/dist/charts/radial-bar-chart/radial-bar-chart.d.ts +53 -0
  581. package/dist/charts/radial-bar-chart/radial-bar-chart.js +430 -0
  582. package/dist/charts/raincloud-chart/index.d.ts +1 -0
  583. package/dist/charts/raincloud-chart/index.js +1 -0
  584. package/dist/charts/raincloud-chart/raincloud-chart.d.ts +39 -0
  585. package/dist/charts/raincloud-chart/raincloud-chart.js +363 -0
  586. package/dist/charts/range-area-chart/index.d.ts +1 -0
  587. package/dist/charts/range-area-chart/index.js +1 -0
  588. package/dist/charts/range-area-chart/range-area-chart.d.ts +52 -0
  589. package/dist/charts/range-area-chart/range-area-chart.js +414 -0
  590. package/dist/charts/sankey-chart/alluvial-chart.d.ts +11 -0
  591. package/dist/charts/sankey-chart/alluvial-chart.js +45 -0
  592. package/dist/charts/sankey-chart/index.d.ts +2 -0
  593. package/dist/charts/sankey-chart/index.js +2 -0
  594. package/dist/charts/sankey-chart/sankey-chart.d.ts +91 -0
  595. package/dist/charts/sankey-chart/sankey-chart.js +868 -0
  596. package/dist/charts/scatter-chart/index.d.ts +1 -0
  597. package/dist/charts/scatter-chart/index.js +1 -0
  598. package/dist/charts/scatter-chart/scatter-chart.d.ts +7 -0
  599. package/dist/charts/scatter-chart/scatter-chart.js +9 -0
  600. package/dist/charts/slope-chart/index.d.ts +2 -0
  601. package/dist/charts/slope-chart/index.js +2 -0
  602. package/dist/charts/slope-chart/label-layout.d.ts +10 -0
  603. package/dist/charts/slope-chart/label-layout.js +35 -0
  604. package/dist/charts/slope-chart/slope-chart.d.ts +43 -0
  605. package/dist/charts/slope-chart/slope-chart.js +421 -0
  606. package/dist/charts/sparkline/index.d.ts +1 -0
  607. package/dist/charts/sparkline/index.js +1 -0
  608. package/dist/charts/sparkline/sparkline.d.ts +30 -0
  609. package/dist/charts/sparkline/sparkline.js +227 -0
  610. package/dist/charts/stock-chart/index.d.ts +1 -0
  611. package/dist/charts/stock-chart/index.js +1 -0
  612. package/dist/charts/stock-chart/stock-chart.d.ts +103 -0
  613. package/dist/charts/stock-chart/stock-chart.js +552 -0
  614. package/dist/charts/stock-chart/stock-drawing-layer.d.ts +66 -0
  615. package/dist/charts/stock-chart/stock-drawing-layer.js +338 -0
  616. package/dist/charts/stock-chart/stock-drawings.d.ts +68 -0
  617. package/dist/charts/stock-chart/stock-drawings.js +74 -0
  618. package/dist/charts/stock-chart/stock-model.d.ts +87 -0
  619. package/dist/charts/stock-chart/stock-model.js +83 -0
  620. package/dist/charts/stock-chart/stock-plot.d.ts +84 -0
  621. package/dist/charts/stock-chart/stock-plot.js +1005 -0
  622. package/dist/charts/stock-chart/stock-stats.d.ts +49 -0
  623. package/dist/charts/stock-chart/stock-stats.js +68 -0
  624. package/dist/charts/stock-chart/stock-transforms.d.ts +19 -0
  625. package/dist/charts/stock-chart/stock-transforms.js +72 -0
  626. package/dist/charts/stock-chart/use-stock-stream.d.ts +16 -0
  627. package/dist/charts/stock-chart/use-stock-stream.js +16 -0
  628. package/dist/charts/stream-graph/index.d.ts +2 -0
  629. package/dist/charts/stream-graph/index.js +2 -0
  630. package/dist/charts/stream-graph/stream-graph.d.ts +38 -0
  631. package/dist/charts/stream-graph/stream-graph.js +415 -0
  632. package/dist/charts/stream-graph/stream-layout.d.ts +34 -0
  633. package/dist/charts/stream-graph/stream-layout.js +89 -0
  634. package/dist/charts/sunburst-chart/index.d.ts +1 -0
  635. package/dist/charts/sunburst-chart/index.js +1 -0
  636. package/dist/charts/sunburst-chart/sunburst-chart.d.ts +44 -0
  637. package/dist/charts/sunburst-chart/sunburst-chart.js +437 -0
  638. package/dist/charts/timeline-chart/index.d.ts +2 -0
  639. package/dist/charts/timeline-chart/index.js +2 -0
  640. package/dist/charts/timeline-chart/timeline-chart.d.ts +70 -0
  641. package/dist/charts/timeline-chart/timeline-chart.js +524 -0
  642. package/dist/charts/timeline-chart/timeline-lanes.d.ts +43 -0
  643. package/dist/charts/timeline-chart/timeline-lanes.js +65 -0
  644. package/dist/charts/tree-chart/index.d.ts +3 -0
  645. package/dist/charts/tree-chart/index.js +3 -0
  646. package/dist/charts/tree-chart/tree-card.d.ts +37 -0
  647. package/dist/charts/tree-chart/tree-card.js +94 -0
  648. package/dist/charts/tree-chart/tree-chart.d.ts +118 -0
  649. package/dist/charts/tree-chart/tree-chart.js +850 -0
  650. package/dist/charts/tree-chart/tree-model.d.ts +87 -0
  651. package/dist/charts/tree-chart/tree-model.js +116 -0
  652. package/dist/charts/tree-chart/use-tree-transition.d.ts +16 -0
  653. package/dist/charts/tree-chart/use-tree-transition.js +84 -0
  654. package/dist/charts/treemap-chart/index.d.ts +1 -0
  655. package/dist/charts/treemap-chart/index.js +1 -0
  656. package/dist/charts/treemap-chart/treemap-chart.d.ts +44 -0
  657. package/dist/charts/treemap-chart/treemap-chart.js +347 -0
  658. package/dist/charts/violin-chart/index.d.ts +1 -0
  659. package/dist/charts/violin-chart/index.js +1 -0
  660. package/dist/charts/violin-chart/violin-chart.d.ts +53 -0
  661. package/dist/charts/violin-chart/violin-chart.js +406 -0
  662. package/dist/charts/waffle-chart/index.d.ts +1 -0
  663. package/dist/charts/waffle-chart/index.js +1 -0
  664. package/dist/charts/waffle-chart/waffle-chart.d.ts +40 -0
  665. package/dist/charts/waffle-chart/waffle-chart.js +273 -0
  666. package/dist/charts/waterfall-chart/index.d.ts +2 -0
  667. package/dist/charts/waterfall-chart/index.js +2 -0
  668. package/dist/charts/waterfall-chart/waterfall-chart.d.ts +38 -0
  669. package/dist/charts/waterfall-chart/waterfall-chart.js +531 -0
  670. package/dist/charts/waterfall-chart/waterfall-layout.d.ts +51 -0
  671. package/dist/charts/waterfall-chart/waterfall-layout.js +54 -0
  672. package/dist/containers/action-bar/action-bar.d.ts +18 -0
  673. package/dist/containers/action-bar/action-bar.js +63 -0
  674. package/dist/containers/action-bar/index.d.ts +1 -0
  675. package/dist/containers/action-bar/index.js +4 -0
  676. package/dist/containers/banner/banner.d.ts +10 -0
  677. package/dist/containers/banner/banner.js +49 -0
  678. package/dist/containers/banner/index.d.ts +1 -0
  679. package/dist/containers/banner/index.js +1 -0
  680. package/dist/containers/card/card.d.ts +6 -0
  681. package/dist/containers/card/card.js +47 -0
  682. package/dist/containers/card/index.d.ts +1 -0
  683. package/dist/containers/card/index.js +1 -0
  684. package/dist/containers/carousel/carousel.d.ts +19 -0
  685. package/dist/containers/carousel/carousel.js +178 -0
  686. package/dist/containers/carousel/index.d.ts +2 -0
  687. package/dist/containers/carousel/index.js +7 -0
  688. package/dist/containers/carousel/model.d.ts +4 -0
  689. package/dist/containers/carousel/model.js +22 -0
  690. package/dist/containers/cell/cell.d.ts +44 -0
  691. package/dist/containers/cell/cell.js +83 -0
  692. package/dist/containers/cell/index.d.ts +1 -0
  693. package/dist/containers/cell/index.js +6 -0
  694. package/dist/containers/cols/cols.d.ts +15 -0
  695. package/dist/containers/cols/cols.js +46 -0
  696. package/dist/containers/cols/index.d.ts +1 -0
  697. package/dist/containers/cols/index.js +1 -0
  698. package/dist/containers/comment/comment.d.ts +14 -0
  699. package/dist/containers/comment/comment.js +44 -0
  700. package/dist/containers/comment/index.d.ts +1 -0
  701. package/dist/containers/comment/index.js +1 -0
  702. package/dist/containers/data-grid/chart-panel.d.ts +24 -0
  703. package/dist/containers/data-grid/chart-panel.js +114 -0
  704. package/dist/containers/data-grid/chart-range.d.ts +46 -0
  705. package/dist/containers/data-grid/chart-range.js +73 -0
  706. package/dist/containers/data-grid/column-groups.d.ts +15 -0
  707. package/dist/containers/data-grid/column-groups.js +29 -0
  708. package/dist/containers/data-grid/column-menu.d.ts +28 -0
  709. package/dist/containers/data-grid/column-menu.js +361 -0
  710. package/dist/containers/data-grid/data-grid.d.ts +199 -0
  711. package/dist/containers/data-grid/data-grid.demos.d.ts +15 -0
  712. package/dist/containers/data-grid/data-grid.demos.js +578 -0
  713. package/dist/containers/data-grid/data-grid.fixtures.d.ts +61 -0
  714. package/dist/containers/data-grid/data-grid.fixtures.js +316 -0
  715. package/dist/containers/data-grid/data-grid.js +2850 -0
  716. package/dist/containers/data-grid/data-grid.samples.d.ts +81 -0
  717. package/dist/containers/data-grid/data-grid.samples.js +345 -0
  718. package/dist/containers/data-grid/data-source.d.ts +56 -0
  719. package/dist/containers/data-grid/data-source.js +90 -0
  720. package/dist/containers/data-grid/fill-series.d.ts +97 -0
  721. package/dist/containers/data-grid/fill-series.js +168 -0
  722. package/dist/containers/data-grid/filter-builder-editor.d.ts +18 -0
  723. package/dist/containers/data-grid/filter-builder-editor.js +207 -0
  724. package/dist/containers/data-grid/filter-builder.d.ts +47 -0
  725. package/dist/containers/data-grid/filter-builder.js +227 -0
  726. package/dist/containers/data-grid/formula-bar.d.ts +18 -0
  727. package/dist/containers/data-grid/formula-bar.js +68 -0
  728. package/dist/containers/data-grid/formula-sheet.d.ts +48 -0
  729. package/dist/containers/data-grid/formula-sheet.js +175 -0
  730. package/dist/containers/data-grid/formula.d.ts +86 -0
  731. package/dist/containers/data-grid/formula.js +580 -0
  732. package/dist/containers/data-grid/grid-edit.d.ts +52 -0
  733. package/dist/containers/data-grid/grid-edit.js +99 -0
  734. package/dist/containers/data-grid/grid-toolbar.d.ts +53 -0
  735. package/dist/containers/data-grid/grid-toolbar.js +266 -0
  736. package/dist/containers/data-grid/history.d.ts +61 -0
  737. package/dist/containers/data-grid/history.js +84 -0
  738. package/dist/containers/data-grid/index.d.ts +18 -0
  739. package/dist/containers/data-grid/index.js +18 -0
  740. package/dist/containers/data-grid/labels.d.ts +141 -0
  741. package/dist/containers/data-grid/labels.js +157 -0
  742. package/dist/containers/data-grid/model.d.ts +93 -0
  743. package/dist/containers/data-grid/model.js +481 -0
  744. package/dist/containers/data-grid/pivot.d.ts +36 -0
  745. package/dist/containers/data-grid/pivot.js +126 -0
  746. package/dist/containers/data-grid/range.d.ts +41 -0
  747. package/dist/containers/data-grid/range.js +78 -0
  748. package/dist/containers/data-grid/rows.d.ts +26 -0
  749. package/dist/containers/data-grid/rows.js +67 -0
  750. package/dist/containers/data-grid/spreadsheet.demos.d.ts +75 -0
  751. package/dist/containers/data-grid/spreadsheet.demos.js +423 -0
  752. package/dist/containers/data-grid/tool-panel.d.ts +31 -0
  753. package/dist/containers/data-grid/tool-panel.js +222 -0
  754. package/dist/containers/data-grid/tree.d.ts +25 -0
  755. package/dist/containers/data-grid/tree.js +65 -0
  756. package/dist/containers/data-grid/types.d.ts +154 -0
  757. package/dist/containers/data-grid/types.js +0 -0
  758. package/dist/containers/data-grid/use-data-source.d.ts +31 -0
  759. package/dist/containers/data-grid/use-data-source.js +77 -0
  760. package/dist/containers/data-grid/use-grid-layout.d.ts +25 -0
  761. package/dist/containers/data-grid/use-grid-layout.js +99 -0
  762. package/dist/containers/data-grid/virtual.d.ts +53 -0
  763. package/dist/containers/data-grid/virtual.js +90 -0
  764. package/dist/containers/data-grid/xlsx-export.d.ts +9 -0
  765. package/dist/containers/data-grid/xlsx-export.js +39 -0
  766. package/dist/containers/description-list/description-list.d.ts +8 -0
  767. package/dist/containers/description-list/description-list.js +19 -0
  768. package/dist/containers/description-list/index.d.ts +1 -0
  769. package/dist/containers/description-list/index.js +1 -0
  770. package/dist/containers/facts/facts.d.ts +8 -0
  771. package/dist/containers/facts/facts.js +20 -0
  772. package/dist/containers/facts/index.d.ts +1 -0
  773. package/dist/containers/facts/index.js +1 -0
  774. package/dist/containers/file-tree/file-tree.d.ts +18 -0
  775. package/dist/containers/file-tree/file-tree.js +154 -0
  776. package/dist/containers/file-tree/index.d.ts +2 -0
  777. package/dist/containers/file-tree/index.js +16 -0
  778. package/dist/containers/file-tree/model.d.ts +37 -0
  779. package/dist/containers/file-tree/model.js +83 -0
  780. package/dist/containers/generic-row/generic-row.d.ts +16 -0
  781. package/dist/containers/generic-row/generic-row.js +29 -0
  782. package/dist/containers/generic-row/index.d.ts +1 -0
  783. package/dist/containers/generic-row/index.js +1 -0
  784. package/dist/containers/hbars/hbars.d.ts +57 -0
  785. package/dist/containers/hbars/hbars.js +124 -0
  786. package/dist/containers/hbars/index.d.ts +1 -0
  787. package/dist/containers/hbars/index.js +1 -0
  788. package/dist/containers/highlight-line/highlight-line.d.ts +7 -0
  789. package/dist/containers/highlight-line/highlight-line.js +14 -0
  790. package/dist/containers/highlight-line/index.d.ts +1 -0
  791. package/dist/containers/highlight-line/index.js +1 -0
  792. package/dist/containers/index.d.ts +26 -0
  793. package/dist/containers/index.js +26 -0
  794. package/dist/containers/item-card-group/index.d.ts +1 -0
  795. package/dist/containers/item-card-group/index.js +6 -0
  796. package/dist/containers/item-card-group/item-card-group.d.ts +22 -0
  797. package/dist/containers/item-card-group/item-card-group.js +66 -0
  798. package/dist/containers/kanban/index.d.ts +2 -0
  799. package/dist/containers/kanban/index.js +16 -0
  800. package/dist/containers/kanban/kanban.d.ts +22 -0
  801. package/dist/containers/kanban/kanban.js +329 -0
  802. package/dist/containers/kanban/model.d.ts +49 -0
  803. package/dist/containers/kanban/model.js +77 -0
  804. package/dist/containers/kpi/index.d.ts +1 -0
  805. package/dist/containers/kpi/index.js +1 -0
  806. package/dist/containers/kpi/kpi.d.ts +15 -0
  807. package/dist/containers/kpi/kpi.js +40 -0
  808. package/dist/containers/kpi-group/index.d.ts +1 -0
  809. package/dist/containers/kpi-group/index.js +4 -0
  810. package/dist/containers/kpi-group/kpi-group.d.ts +25 -0
  811. package/dist/containers/kpi-group/kpi-group.js +40 -0
  812. package/dist/containers/page-header/index.d.ts +1 -0
  813. package/dist/containers/page-header/index.js +1 -0
  814. package/dist/containers/page-header/page-header.d.ts +17 -0
  815. package/dist/containers/page-header/page-header.js +42 -0
  816. package/dist/containers/resizable/index.d.ts +2 -0
  817. package/dist/containers/resizable/index.js +14 -0
  818. package/dist/containers/resizable/model.d.ts +18 -0
  819. package/dist/containers/resizable/model.js +62 -0
  820. package/dist/containers/resizable/resizable.d.ts +27 -0
  821. package/dist/containers/resizable/resizable.js +234 -0
  822. package/dist/containers/scrolly/index.d.ts +2 -0
  823. package/dist/containers/scrolly/index.js +9 -0
  824. package/dist/containers/scrolly/scrolly-logic.d.ts +16 -0
  825. package/dist/containers/scrolly/scrolly-logic.js +29 -0
  826. package/dist/containers/scrolly/scrolly.d.ts +45 -0
  827. package/dist/containers/scrolly/scrolly.js +154 -0
  828. package/dist/containers/settings-layout/index.d.ts +1 -0
  829. package/dist/containers/settings-layout/index.js +1 -0
  830. package/dist/containers/settings-layout/settings-layout.d.ts +21 -0
  831. package/dist/containers/settings-layout/settings-layout.js +71 -0
  832. package/dist/containers/settings-row/index.d.ts +1 -0
  833. package/dist/containers/settings-row/index.js +1 -0
  834. package/dist/containers/settings-row/settings-row.d.ts +10 -0
  835. package/dist/containers/settings-row/settings-row.js +31 -0
  836. package/dist/containers/table/index.d.ts +1 -0
  837. package/dist/containers/table/index.js +1 -0
  838. package/dist/containers/table/pin.d.ts +33 -0
  839. package/dist/containers/table/pin.js +56 -0
  840. package/dist/containers/table/table.d.ts +60 -0
  841. package/dist/containers/table/table.js +325 -0
  842. package/dist/containers/timeline/index.d.ts +1 -0
  843. package/dist/containers/timeline/index.js +6 -0
  844. package/dist/containers/timeline/timeline.d.ts +25 -0
  845. package/dist/containers/timeline/timeline.js +56 -0
  846. package/dist/containers/toolbar/index.d.ts +1 -0
  847. package/dist/containers/toolbar/index.js +1 -0
  848. package/dist/containers/toolbar/toolbar.d.ts +7 -0
  849. package/dist/containers/toolbar/toolbar.js +18 -0
  850. package/dist/dashboards/data.d.ts +29 -0
  851. package/dist/dashboards/data.js +42 -0
  852. package/dist/dashboards/inicio-dashboard.d.ts +1 -0
  853. package/dist/dashboards/inicio-dashboard.js +200 -0
  854. package/dist/dashboards/layout.d.ts +33 -0
  855. package/dist/dashboards/layout.js +55 -0
  856. package/dist/forms/accent-picker/accent-picker.d.ts +20 -0
  857. package/dist/forms/accent-picker/accent-picker.js +51 -0
  858. package/dist/forms/accent-picker/index.d.ts +1 -0
  859. package/dist/forms/accent-picker/index.js +6 -0
  860. package/dist/forms/checkbox-button-group/checkbox-button-group.d.ts +16 -0
  861. package/dist/forms/checkbox-button-group/checkbox-button-group.js +52 -0
  862. package/dist/forms/checkbox-button-group/index.d.ts +1 -0
  863. package/dist/forms/checkbox-button-group/index.js +6 -0
  864. package/dist/forms/dropzone/dropzone.d.ts +19 -0
  865. package/dist/forms/dropzone/dropzone.js +103 -0
  866. package/dist/forms/dropzone/index.d.ts +1 -0
  867. package/dist/forms/dropzone/index.js +6 -0
  868. package/dist/forms/emoji-picker/emoji-data.d.ts +14 -0
  869. package/dist/forms/emoji-picker/emoji-data.js +160 -0
  870. package/dist/forms/emoji-picker/emoji-picker.d.ts +16 -0
  871. package/dist/forms/emoji-picker/emoji-picker.js +124 -0
  872. package/dist/forms/emoji-picker/index.d.ts +3 -0
  873. package/dist/forms/emoji-picker/index.js +9 -0
  874. package/dist/forms/emoji-picker/model.d.ts +8 -0
  875. package/dist/forms/emoji-picker/model.js +44 -0
  876. package/dist/forms/emoji-reaction-button/emoji-reaction-button.d.ts +28 -0
  877. package/dist/forms/emoji-reaction-button/emoji-reaction-button.js +95 -0
  878. package/dist/forms/emoji-reaction-button/index.d.ts +1 -0
  879. package/dist/forms/emoji-reaction-button/index.js +8 -0
  880. package/dist/forms/field/field.d.ts +16 -0
  881. package/dist/forms/field/field.js +26 -0
  882. package/dist/forms/field/index.d.ts +1 -0
  883. package/dist/forms/field/index.js +4 -0
  884. package/dist/forms/form-grid/form-grid.d.ts +7 -0
  885. package/dist/forms/form-grid/form-grid.js +17 -0
  886. package/dist/forms/form-grid/index.d.ts +1 -0
  887. package/dist/forms/form-grid/index.js +4 -0
  888. package/dist/forms/index.d.ts +20 -0
  889. package/dist/forms/index.js +20 -0
  890. package/dist/forms/inline-select/index.d.ts +1 -0
  891. package/dist/forms/inline-select/index.js +6 -0
  892. package/dist/forms/inline-select/inline-select.d.ts +14 -0
  893. package/dist/forms/inline-select/inline-select.js +28 -0
  894. package/dist/forms/input/index.d.ts +1 -0
  895. package/dist/forms/input/index.js +4 -0
  896. package/dist/forms/input/input.d.ts +4 -0
  897. package/dist/forms/input/input.js +17 -0
  898. package/dist/forms/input-icon/index.d.ts +1 -0
  899. package/dist/forms/input-icon/index.js +4 -0
  900. package/dist/forms/input-icon/input-icon.d.ts +7 -0
  901. package/dist/forms/input-icon/input-icon.js +19 -0
  902. package/dist/forms/internal/button-option.d.ts +18 -0
  903. package/dist/forms/internal/button-option.js +29 -0
  904. package/dist/forms/label/index.d.ts +1 -0
  905. package/dist/forms/label/index.js +4 -0
  906. package/dist/forms/label/label.d.ts +4 -0
  907. package/dist/forms/label/label.js +11 -0
  908. package/dist/forms/native-select/index.d.ts +1 -0
  909. package/dist/forms/native-select/index.js +6 -0
  910. package/dist/forms/native-select/native-select.d.ts +23 -0
  911. package/dist/forms/native-select/native-select.js +52 -0
  912. package/dist/forms/number-stepper/index.d.ts +1 -0
  913. package/dist/forms/number-stepper/index.js +4 -0
  914. package/dist/forms/number-stepper/number-stepper.d.ts +17 -0
  915. package/dist/forms/number-stepper/number-stepper.js +108 -0
  916. package/dist/forms/pin-input/index.d.ts +1 -0
  917. package/dist/forms/pin-input/index.js +4 -0
  918. package/dist/forms/pin-input/pin-input.d.ts +16 -0
  919. package/dist/forms/pin-input/pin-input.js +61 -0
  920. package/dist/forms/radio-button-group/index.d.ts +1 -0
  921. package/dist/forms/radio-button-group/index.js +6 -0
  922. package/dist/forms/radio-button-group/radio-button-group.d.ts +19 -0
  923. package/dist/forms/radio-button-group/radio-button-group.js +52 -0
  924. package/dist/forms/rating/index.d.ts +2 -0
  925. package/dist/forms/rating/index.js +9 -0
  926. package/dist/forms/rating/model.d.ts +8 -0
  927. package/dist/forms/rating/model.js +37 -0
  928. package/dist/forms/rating/rating.d.ts +20 -0
  929. package/dist/forms/rating/rating.js +114 -0
  930. package/dist/forms/select/index.d.ts +1 -0
  931. package/dist/forms/select/index.js +4 -0
  932. package/dist/forms/select/select.d.ts +8 -0
  933. package/dist/forms/select/select.js +28 -0
  934. package/dist/forms/slider/index.d.ts +2 -0
  935. package/dist/forms/slider/index.js +22 -0
  936. package/dist/forms/slider/model.d.ts +16 -0
  937. package/dist/forms/slider/model.js +65 -0
  938. package/dist/forms/slider/slider.d.ts +43 -0
  939. package/dist/forms/slider/slider.js +180 -0
  940. package/dist/forms/textarea/index.d.ts +1 -0
  941. package/dist/forms/textarea/index.js +4 -0
  942. package/dist/forms/textarea/textarea.d.ts +4 -0
  943. package/dist/forms/textarea/textarea.js +17 -0
  944. package/dist/forms/time-input/index.d.ts +1 -0
  945. package/dist/forms/time-input/index.js +4 -0
  946. package/dist/forms/time-input/time-input.d.ts +15 -0
  947. package/dist/forms/time-input/time-input.js +87 -0
  948. package/dist/navigation/floating-toc/floating-toc.d.ts +21 -0
  949. package/dist/navigation/floating-toc/floating-toc.js +86 -0
  950. package/dist/navigation/floating-toc/index.d.ts +2 -0
  951. package/dist/navigation/floating-toc/index.js +6 -0
  952. package/dist/navigation/floating-toc/model.d.ts +13 -0
  953. package/dist/navigation/floating-toc/model.js +9 -0
  954. package/dist/navigation/index.d.ts +4 -0
  955. package/dist/navigation/index.js +4 -0
  956. package/dist/navigation/segmented/index.d.ts +1 -0
  957. package/dist/navigation/segmented/index.js +8 -0
  958. package/dist/navigation/segmented/segmented.d.ts +9 -0
  959. package/dist/navigation/segmented/segmented.js +33 -0
  960. package/dist/navigation/stepper/index.d.ts +1 -0
  961. package/dist/navigation/stepper/index.js +4 -0
  962. package/dist/navigation/stepper/stepper.d.ts +11 -0
  963. package/dist/navigation/stepper/stepper.js +58 -0
  964. package/dist/navigation/tabs/index.d.ts +1 -0
  965. package/dist/navigation/tabs/index.js +12 -0
  966. package/dist/navigation/tabs/tabs.d.ts +20 -0
  967. package/dist/navigation/tabs/tabs.js +44 -0
  968. package/dist/overlays/context-menu/context-menu.d.ts +40 -0
  969. package/dist/overlays/context-menu/context-menu.js +201 -0
  970. package/dist/overlays/context-menu/index.d.ts +1 -0
  971. package/dist/overlays/context-menu/index.js +20 -0
  972. package/dist/overlays/dialog/dialog.d.ts +27 -0
  973. package/dist/overlays/dialog/dialog.js +128 -0
  974. package/dist/overlays/dialog/index.d.ts +1 -0
  975. package/dist/overlays/dialog/index.js +20 -0
  976. package/dist/overlays/drawer/drawer.d.ts +18 -0
  977. package/dist/overlays/drawer/drawer.js +82 -0
  978. package/dist/overlays/drawer/index.d.ts +1 -0
  979. package/dist/overlays/drawer/index.js +14 -0
  980. package/dist/overlays/dropdown-menu/dropdown-menu.d.ts +19 -0
  981. package/dist/overlays/dropdown-menu/dropdown-menu.js +72 -0
  982. package/dist/overlays/dropdown-menu/index.d.ts +1 -0
  983. package/dist/overlays/dropdown-menu/index.js +20 -0
  984. package/dist/overlays/focus-return/focus-return.d.ts +30 -0
  985. package/dist/overlays/focus-return/focus-return.js +36 -0
  986. package/dist/overlays/focus-return/index.d.ts +1 -0
  987. package/dist/overlays/focus-return/index.js +12 -0
  988. package/dist/overlays/hover-card/hover-card.d.ts +28 -0
  989. package/dist/overlays/hover-card/hover-card.js +133 -0
  990. package/dist/overlays/hover-card/index.d.ts +1 -0
  991. package/dist/overlays/hover-card/index.js +10 -0
  992. package/dist/overlays/index.d.ts +8 -0
  993. package/dist/overlays/index.js +8 -0
  994. package/dist/overlays/popover/index.d.ts +1 -0
  995. package/dist/overlays/popover/index.js +14 -0
  996. package/dist/overlays/popover/popover.d.ts +10 -0
  997. package/dist/overlays/popover/popover.js +34 -0
  998. package/dist/overlays/toaster/index.d.ts +1 -0
  999. package/dist/overlays/toaster/index.js +5 -0
  1000. package/dist/overlays/toaster/toaster.d.ts +10 -0
  1001. package/dist/overlays/toaster/toaster.js +30 -0
  1002. package/dist/palette/command-palette/command-palette.d.ts +32 -0
  1003. package/dist/palette/command-palette/command-palette.js +95 -0
  1004. package/dist/palette/command-palette/index.d.ts +1 -0
  1005. package/dist/palette/command-palette/index.js +6 -0
  1006. package/dist/palette/index.d.ts +1 -0
  1007. package/dist/palette/index.js +1 -0
  1008. package/dist/rich-text/index.d.ts +2 -0
  1009. package/dist/rich-text/index.js +14 -0
  1010. package/dist/rich-text/rich-text-editor.d.ts +31 -0
  1011. package/dist/rich-text/rich-text-editor.js +364 -0
  1012. package/dist/rich-text/sanitize.d.ts +17 -0
  1013. package/dist/rich-text/sanitize.js +215 -0
  1014. package/dist/shell/app-shell/app-shell.d.ts +24 -0
  1015. package/dist/shell/app-shell/app-shell.js +42 -0
  1016. package/dist/shell/app-shell/index.d.ts +1 -0
  1017. package/dist/shell/app-shell/index.js +10 -0
  1018. package/dist/shell/index.d.ts +3 -0
  1019. package/dist/shell/index.js +3 -0
  1020. package/dist/shell/sidebar/index.d.ts +1 -0
  1021. package/dist/shell/sidebar/index.js +6 -0
  1022. package/dist/shell/sidebar/sidebar.d.ts +48 -0
  1023. package/dist/shell/sidebar/sidebar.js +110 -0
  1024. package/dist/shell/topbar/index.d.ts +1 -0
  1025. package/dist/shell/topbar/index.js +4 -0
  1026. package/dist/shell/topbar/topbar.d.ts +22 -0
  1027. package/dist/shell/topbar/topbar.js +93 -0
  1028. package/dist/showcase/analytics-bento.d.ts +2 -0
  1029. package/dist/showcase/analytics-bento.js +336 -0
  1030. package/dist/showcase/bento.d.ts +43 -0
  1031. package/dist/showcase/bento.js +131 -0
  1032. package/dist/showcase/controls-bento.d.ts +2 -0
  1033. package/dist/showcase/controls-bento.js +264 -0
  1034. package/dist/showcase/dataviz-bento.d.ts +2 -0
  1035. package/dist/showcase/dataviz-bento.js +444 -0
  1036. package/dist/showcase/kit-tiles.d.ts +15 -0
  1037. package/dist/showcase/kit-tiles.js +192 -0
  1038. package/dist/showcase/operations-bento.d.ts +2 -0
  1039. package/dist/showcase/operations-bento.js +450 -0
  1040. package/dist/showcase/shell.d.ts +8 -0
  1041. package/dist/showcase/shell.js +115 -0
  1042. package/dist/states/empty-state/empty-state.d.ts +11 -0
  1043. package/dist/states/empty-state/empty-state.js +22 -0
  1044. package/dist/states/empty-state/index.d.ts +1 -0
  1045. package/dist/states/empty-state/index.js +1 -0
  1046. package/dist/states/error-state/error-state.d.ts +12 -0
  1047. package/dist/states/error-state/error-state.js +42 -0
  1048. package/dist/states/error-state/index.d.ts +1 -0
  1049. package/dist/states/error-state/index.js +1 -0
  1050. package/dist/states/forbidden-state/forbidden-state.d.ts +8 -0
  1051. package/dist/states/forbidden-state/forbidden-state.js +21 -0
  1052. package/dist/states/forbidden-state/index.d.ts +1 -0
  1053. package/dist/states/forbidden-state/index.js +1 -0
  1054. package/dist/states/index.d.ts +5 -0
  1055. package/dist/states/index.js +5 -0
  1056. package/dist/states/offline-banner/index.d.ts +1 -0
  1057. package/dist/states/offline-banner/index.js +1 -0
  1058. package/dist/states/offline-banner/offline-banner.d.ts +10 -0
  1059. package/dist/states/offline-banner/offline-banner.js +24 -0
  1060. package/dist/states/skeleton/index.d.ts +1 -0
  1061. package/dist/states/skeleton/index.js +1 -0
  1062. package/dist/states/skeleton/skeleton.d.ts +12 -0
  1063. package/dist/states/skeleton/skeleton.js +35 -0
  1064. package/dist/utils/cn.d.ts +3 -0
  1065. package/dist/utils/cn.js +86 -0
  1066. package/dist/utils/index.d.ts +2 -0
  1067. package/dist/utils/index.js +6 -0
  1068. package/dist/utils/reduced-motion.d.ts +2 -0
  1069. package/dist/utils/reduced-motion.js +18 -0
  1070. package/dist/xlsx/crc32.d.ts +4 -0
  1071. package/dist/xlsx/crc32.js +19 -0
  1072. package/dist/xlsx/index.d.ts +3 -0
  1073. package/dist/xlsx/index.js +21 -0
  1074. package/dist/xlsx/xlsx.d.ts +42 -0
  1075. package/dist/xlsx/xlsx.js +242 -0
  1076. package/dist/xlsx/zip.d.ts +16 -0
  1077. package/dist/xlsx/zip.js +98 -0
  1078. package/package.json +116 -4
  1079. package/scripts/build-theme.mjs +423 -0
  1080. package/src/ai/attachment/attachment.tsx +111 -0
  1081. package/src/ai/attachment/index.ts +1 -0
  1082. package/src/ai/chain-of-thought/chain-of-thought.tsx +120 -0
  1083. package/src/ai/chain-of-thought/index.ts +1 -0
  1084. package/src/ai/chat-list/chat-list.tsx +124 -0
  1085. package/src/ai/chat-list/group.ts +48 -0
  1086. package/src/ai/chat-list/index.ts +2 -0
  1087. package/src/ai/chat-message/chat-message.tsx +116 -0
  1088. package/src/ai/chat-message/index.ts +1 -0
  1089. package/src/ai/code-block/code-block.tsx +91 -0
  1090. package/src/ai/code-block/highlight.ts +195 -0
  1091. package/src/ai/code-block/index.ts +8 -0
  1092. package/src/ai/conversation/conversation.tsx +97 -0
  1093. package/src/ai/conversation/index.ts +9 -0
  1094. package/src/ai/conversation/stick.ts +40 -0
  1095. package/src/ai/index.ts +14 -0
  1096. package/src/ai/internal/disclosure.tsx +65 -0
  1097. package/src/ai/internal/icon-action.tsx +25 -0
  1098. package/src/ai/internal/keyframes.tsx +13 -0
  1099. package/src/ai/internal/use-copy.ts +38 -0
  1100. package/src/ai/loader/index.ts +1 -0
  1101. package/src/ai/loader/loader.tsx +60 -0
  1102. package/src/ai/markdown/index.ts +2 -0
  1103. package/src/ai/markdown/markdown.tsx +211 -0
  1104. package/src/ai/markdown/parse.ts +276 -0
  1105. package/src/ai/message-actions/index.ts +1 -0
  1106. package/src/ai/message-actions/message-actions.tsx +85 -0
  1107. package/src/ai/prompt-input/index.ts +2 -0
  1108. package/src/ai/prompt-input/keys.ts +11 -0
  1109. package/src/ai/prompt-input/prompt-input.tsx +148 -0
  1110. package/src/ai/prompt-suggestion/index.ts +1 -0
  1111. package/src/ai/prompt-suggestion/prompt-suggestion.tsx +54 -0
  1112. package/src/ai/source/index.ts +1 -0
  1113. package/src/ai/source/source.tsx +73 -0
  1114. package/src/ai/text-shimmer/index.ts +1 -0
  1115. package/src/ai/text-shimmer/text-shimmer.tsx +42 -0
  1116. package/src/ai/tool-call/index.ts +1 -0
  1117. package/src/ai/tool-call/tool-call.tsx +108 -0
  1118. package/src/atoms/avatar/avatar.tsx +51 -0
  1119. package/src/atoms/avatar/index.ts +1 -0
  1120. package/src/atoms/avatar-group/avatar-group.tsx +16 -0
  1121. package/src/atoms/avatar-group/index.ts +1 -0
  1122. package/src/atoms/big-date/big-date.tsx +23 -0
  1123. package/src/atoms/big-date/index.ts +1 -0
  1124. package/src/atoms/button/button.tsx +76 -0
  1125. package/src/atoms/button/index.ts +6 -0
  1126. package/src/atoms/checkbox/checkbox.tsx +23 -0
  1127. package/src/atoms/checkbox/index.ts +1 -0
  1128. package/src/atoms/chip/chip.tsx +41 -0
  1129. package/src/atoms/chip/index.ts +1 -0
  1130. package/src/atoms/icon/icon-map.ts +83 -0
  1131. package/src/atoms/icon/icon.tsx +23 -0
  1132. package/src/atoms/icon/index.ts +2 -0
  1133. package/src/atoms/index.ts +16 -0
  1134. package/src/atoms/led/index.ts +1 -0
  1135. package/src/atoms/led/led.tsx +30 -0
  1136. package/src/atoms/number-value/format.ts +28 -0
  1137. package/src/atoms/number-value/index.ts +8 -0
  1138. package/src/atoms/number-value/number-value.tsx +60 -0
  1139. package/src/atoms/pressable-feedback/index.ts +1 -0
  1140. package/src/atoms/pressable-feedback/pressable-feedback.tsx +79 -0
  1141. package/src/atoms/progress/index.ts +1 -0
  1142. package/src/atoms/progress/progress.tsx +32 -0
  1143. package/src/atoms/radio-group/index.ts +5 -0
  1144. package/src/atoms/radio-group/radio-group.tsx +52 -0
  1145. package/src/atoms/status-dot/index.ts +6 -0
  1146. package/src/atoms/status-dot/status-dot.tsx +52 -0
  1147. package/src/atoms/status-pill/index.ts +1 -0
  1148. package/src/atoms/status-pill/status-pill.tsx +32 -0
  1149. package/src/atoms/switch/index.ts +1 -0
  1150. package/src/atoms/switch/switch.tsx +20 -0
  1151. package/src/atoms/trend-chip/index.ts +8 -0
  1152. package/src/atoms/trend-chip/trend-chip.tsx +73 -0
  1153. package/src/atoms/trend-chip/trend.ts +24 -0
  1154. package/src/brand/export.ts +67 -0
  1155. package/src/brand/generate.ts +531 -0
  1156. package/src/brand/glyphs.ts +113 -0
  1157. package/src/brand/index.ts +8 -0
  1158. package/src/brand/initials.ts +51 -0
  1159. package/src/brand/logo-forge.tsx +523 -0
  1160. package/src/brand/logo-mark.tsx +40 -0
  1161. package/src/brand/palettes.ts +69 -0
  1162. package/src/brand/rng.ts +25 -0
  1163. package/src/calendar/day-chip/day-chip.tsx +34 -0
  1164. package/src/calendar/day-chip/index.ts +2 -0
  1165. package/src/calendar/event-block/event-block.tsx +74 -0
  1166. package/src/calendar/event-block/index.ts +2 -0
  1167. package/src/calendar/index.ts +5 -0
  1168. package/src/calendar/internal/date-utils.ts +78 -0
  1169. package/src/calendar/internal/index.ts +3 -0
  1170. package/src/calendar/internal/layout.ts +60 -0
  1171. package/src/calendar/internal/styles.ts +3 -0
  1172. package/src/calendar/internal/types.ts +32 -0
  1173. package/src/calendar/month-view/index.ts +1 -0
  1174. package/src/calendar/month-view/month-view.tsx +157 -0
  1175. package/src/calendar/timeline-view/index.ts +1 -0
  1176. package/src/calendar/timeline-view/timeline-view.tsx +100 -0
  1177. package/src/calendar/week-view/index.ts +1 -0
  1178. package/src/calendar/week-view/week-view.tsx +216 -0
  1179. package/src/charts/README.md +598 -0
  1180. package/src/charts/area-chart/area-chart.tsx +23 -0
  1181. package/src/charts/area-chart/index.ts +1 -0
  1182. package/src/charts/bar-chart/bar-chart.tsx +68 -0
  1183. package/src/charts/bar-chart/bar-race-chart.tsx +303 -0
  1184. package/src/charts/bar-chart/bar-race.ts +67 -0
  1185. package/src/charts/bar-chart/drilldown-bar-chart.tsx +85 -0
  1186. package/src/charts/bar-chart/index.ts +4 -0
  1187. package/src/charts/beeswarm-chart/beeswarm-chart.tsx +470 -0
  1188. package/src/charts/beeswarm-chart/index.ts +1 -0
  1189. package/src/charts/box-plot/box-plot.tsx +417 -0
  1190. package/src/charts/box-plot/index.ts +1 -0
  1191. package/src/charts/bubble-chart/bubble-chart.tsx +14 -0
  1192. package/src/charts/bubble-chart/index.ts +1 -0
  1193. package/src/charts/bubble-map/bubble-map.tsx +678 -0
  1194. package/src/charts/bubble-map/index.ts +1 -0
  1195. package/src/charts/bullet-chart/bullet-chart.tsx +577 -0
  1196. package/src/charts/bullet-chart/bullet-layout.ts +47 -0
  1197. package/src/charts/bullet-chart/index.ts +2 -0
  1198. package/src/charts/candlestick-chart/candlestick-chart.tsx +608 -0
  1199. package/src/charts/candlestick-chart/index.ts +1 -0
  1200. package/src/charts/chart-grid/chart-grid.tsx +197 -0
  1201. package/src/charts/chart-grid/grid-math.ts +69 -0
  1202. package/src/charts/chart-grid/index.ts +2 -0
  1203. package/src/charts/chord-chart/chord-chart.tsx +551 -0
  1204. package/src/charts/chord-chart/index.ts +1 -0
  1205. package/src/charts/choropleth-map/choropleth-drilldown.tsx +98 -0
  1206. package/src/charts/choropleth-map/choropleth-map.tsx +425 -0
  1207. package/src/charts/choropleth-map/index.ts +2 -0
  1208. package/src/charts/combo-chart/combo-chart.tsx +29 -0
  1209. package/src/charts/combo-chart/index.ts +1 -0
  1210. package/src/charts/core/a11y.ts +2 -0
  1211. package/src/charts/core/axes.tsx +176 -0
  1212. package/src/charts/core/breadcrumb.tsx +68 -0
  1213. package/src/charts/core/cartesian/annotations.tsx +161 -0
  1214. package/src/charts/core/cartesian/axis-stack.ts +88 -0
  1215. package/src/charts/core/cartesian/brush.tsx +241 -0
  1216. package/src/charts/core/cartesian/cartesian-chart.tsx +1239 -0
  1217. package/src/charts/core/cartesian/category-group-axis.tsx +43 -0
  1218. package/src/charts/core/cartesian/category-groups.ts +40 -0
  1219. package/src/charts/core/cartesian/ink-layer.tsx +463 -0
  1220. package/src/charts/core/cartesian/layout.ts +796 -0
  1221. package/src/charts/core/cartesian/marks.tsx +158 -0
  1222. package/src/charts/core/cartesian/sync-store.ts +103 -0
  1223. package/src/charts/core/cartesian/sync.tsx +68 -0
  1224. package/src/charts/core/cartesian/types.ts +169 -0
  1225. package/src/charts/core/category-axis.ts +120 -0
  1226. package/src/charts/core/category-explorer.tsx +132 -0
  1227. package/src/charts/core/chart-frame.tsx +119 -0
  1228. package/src/charts/core/chart-states.tsx +89 -0
  1229. package/src/charts/core/chord.ts +176 -0
  1230. package/src/charts/core/color-scale.ts +117 -0
  1231. package/src/charts/core/data-table.tsx +49 -0
  1232. package/src/charts/core/distribution/brush.ts +151 -0
  1233. package/src/charts/core/distribution/dot-stack.ts +78 -0
  1234. package/src/charts/core/distribution/explorer.tsx +96 -0
  1235. package/src/charts/core/distribution/geometry.ts +76 -0
  1236. package/src/charts/core/distribution/index.ts +11 -0
  1237. package/src/charts/core/distribution/labels.ts +56 -0
  1238. package/src/charts/core/distribution/layout.ts +302 -0
  1239. package/src/charts/core/distribution/marks.tsx +334 -0
  1240. package/src/charts/core/distribution/observations.tsx +61 -0
  1241. package/src/charts/core/distribution/point-index.ts +68 -0
  1242. package/src/charts/core/distribution/points.ts +35 -0
  1243. package/src/charts/core/distribution/stats.ts +426 -0
  1244. package/src/charts/core/distribution/use-legend.tsx +76 -0
  1245. package/src/charts/core/distribution/xy-points.tsx +1202 -0
  1246. package/src/charts/core/downsample.ts +85 -0
  1247. package/src/charts/core/drawing-height.ts +22 -0
  1248. package/src/charts/core/export-menu.tsx +68 -0
  1249. package/src/charts/core/export.ts +217 -0
  1250. package/src/charts/core/format.ts +154 -0
  1251. package/src/charts/core/gantt.ts +531 -0
  1252. package/src/charts/core/hierarchy-chart.tsx +236 -0
  1253. package/src/charts/core/hierarchy.ts +380 -0
  1254. package/src/charts/core/index.ts +54 -0
  1255. package/src/charts/core/indicators.ts +175 -0
  1256. package/src/charts/core/ink.ts +321 -0
  1257. package/src/charts/core/legend.tsx +111 -0
  1258. package/src/charts/core/motion.ts +112 -0
  1259. package/src/charts/core/palette.ts +76 -0
  1260. package/src/charts/core/path.ts +198 -0
  1261. package/src/charts/core/pattern-defs.tsx +87 -0
  1262. package/src/charts/core/patterns.ts +121 -0
  1263. package/src/charts/core/plot-overlay.tsx +106 -0
  1264. package/src/charts/core/polar.ts +316 -0
  1265. package/src/charts/core/sankey.ts +544 -0
  1266. package/src/charts/core/scales/band.ts +90 -0
  1267. package/src/charts/core/scales/index.ts +4 -0
  1268. package/src/charts/core/scales/linear.ts +94 -0
  1269. package/src/charts/core/scales/log.ts +35 -0
  1270. package/src/charts/core/scales/time.ts +136 -0
  1271. package/src/charts/core/shape-morph.ts +101 -0
  1272. package/src/charts/core/stack.ts +41 -0
  1273. package/src/charts/core/time-range.ts +51 -0
  1274. package/src/charts/core/tooltip.tsx +126 -0
  1275. package/src/charts/core/tree-fit.ts +90 -0
  1276. package/src/charts/core/tree-layout.ts +384 -0
  1277. package/src/charts/core/tree-radial.ts +303 -0
  1278. package/src/charts/core/types.ts +105 -0
  1279. package/src/charts/core/unit-glyph.tsx +102 -0
  1280. package/src/charts/core/unit-icons.ts +210 -0
  1281. package/src/charts/core/units.ts +267 -0
  1282. package/src/charts/core/use-canvas.ts +77 -0
  1283. package/src/charts/core/use-chart-size.ts +65 -0
  1284. package/src/charts/core/use-drill.ts +100 -0
  1285. package/src/charts/core/use-index-navigation.ts +68 -0
  1286. package/src/charts/core/use-pan-zoom.ts +219 -0
  1287. package/src/charts/core/use-series-state.ts +40 -0
  1288. package/src/charts/crossfilter/crossfilter-engine.ts +207 -0
  1289. package/src/charts/crossfilter/crossfilter.tsx +494 -0
  1290. package/src/charts/crossfilter/index.ts +2 -0
  1291. package/src/charts/donut-chart/center-fit.ts +53 -0
  1292. package/src/charts/donut-chart/donut-chart.tsx +826 -0
  1293. package/src/charts/donut-chart/index.ts +1 -0
  1294. package/src/charts/dumbbell-chart/dumbbell-chart.tsx +723 -0
  1295. package/src/charts/dumbbell-chart/index.ts +1 -0
  1296. package/src/charts/fill-gauge-chart/fill-gauge-chart.tsx +319 -0
  1297. package/src/charts/fill-gauge-chart/index.ts +1 -0
  1298. package/src/charts/funnel-chart/funnel-chart.tsx +517 -0
  1299. package/src/charts/funnel-chart/index.ts +1 -0
  1300. package/src/charts/gantt-chart/gantt-chart.tsx +1369 -0
  1301. package/src/charts/gantt-chart/gantt-export.ts +139 -0
  1302. package/src/charts/gantt-chart/gantt-marks.tsx +710 -0
  1303. package/src/charts/gantt-chart/index.ts +1 -0
  1304. package/src/charts/gauge-chart/gauge-chart.tsx +594 -0
  1305. package/src/charts/gauge-chart/index.ts +1 -0
  1306. package/src/charts/globe-chart/globe-chart.tsx +744 -0
  1307. package/src/charts/globe-chart/index.ts +1 -0
  1308. package/src/charts/heatmap-chart/calendar-heatmap.tsx +221 -0
  1309. package/src/charts/heatmap-chart/calendar-layout.ts +68 -0
  1310. package/src/charts/heatmap-chart/datetime-columns.ts +38 -0
  1311. package/src/charts/heatmap-chart/drilldown-heatmap.tsx +92 -0
  1312. package/src/charts/heatmap-chart/heatmap-chart.tsx +189 -0
  1313. package/src/charts/heatmap-chart/heatmap-grid.tsx +588 -0
  1314. package/src/charts/heatmap-chart/heatmap-scale.ts +64 -0
  1315. package/src/charts/heatmap-chart/hex-layout.ts +88 -0
  1316. package/src/charts/heatmap-chart/index.ts +9 -0
  1317. package/src/charts/hex-tile-map/hex-layout.ts +147 -0
  1318. package/src/charts/hex-tile-map/hex-tile-map.tsx +361 -0
  1319. package/src/charts/hex-tile-map/index.ts +2 -0
  1320. package/src/charts/hierarchy-morph/hierarchy-morph.tsx +455 -0
  1321. package/src/charts/hierarchy-morph/index.ts +1 -0
  1322. package/src/charts/histogram/histogram.tsx +556 -0
  1323. package/src/charts/histogram/index.ts +1 -0
  1324. package/src/charts/icicle-chart/icicle-chart.tsx +466 -0
  1325. package/src/charts/icicle-chart/index.ts +1 -0
  1326. package/src/charts/index.ts +50 -0
  1327. package/src/charts/isotype-rows/index.ts +1 -0
  1328. package/src/charts/isotype-rows/isotype-rows.tsx +336 -0
  1329. package/src/charts/line-chart/index.ts +2 -0
  1330. package/src/charts/line-chart/line-chart.tsx +36 -0
  1331. package/src/charts/line-chart/line-drilldown.tsx +65 -0
  1332. package/src/charts/lollipop-chart/index.ts +1 -0
  1333. package/src/charts/lollipop-chart/lollipop-chart.tsx +402 -0
  1334. package/src/charts/maps/data/README.md +51 -0
  1335. package/src/charts/maps/data/peru/index.ts +5 -0
  1336. package/src/charts/maps/data/world/index.ts +5 -0
  1337. package/src/charts/maps/geo/build-topology.ts +226 -0
  1338. package/src/charts/maps/geo/cluster.ts +81 -0
  1339. package/src/charts/maps/geo/geo-path.ts +153 -0
  1340. package/src/charts/maps/geo/globe.ts +309 -0
  1341. package/src/charts/maps/geo/index.ts +7 -0
  1342. package/src/charts/maps/geo/map-data-table.tsx +141 -0
  1343. package/src/charts/maps/geo/map-labels.ts +60 -0
  1344. package/src/charts/maps/geo/map-legend.tsx +82 -0
  1345. package/src/charts/maps/geo/map-viewport.tsx +404 -0
  1346. package/src/charts/maps/geo/match.ts +12 -0
  1347. package/src/charts/maps/geo/projection.ts +177 -0
  1348. package/src/charts/maps/geo/pure.ts +12 -0
  1349. package/src/charts/maps/geo/routes.ts +95 -0
  1350. package/src/charts/maps/geo/simplify.ts +57 -0
  1351. package/src/charts/maps/geo/topojson.ts +94 -0
  1352. package/src/charts/maps/geo/types.ts +59 -0
  1353. package/src/charts/maps/geo/use-map-geometry.ts +132 -0
  1354. package/src/charts/maps/geo/use-map-view.ts +253 -0
  1355. package/src/charts/maps/geo/view.ts +100 -0
  1356. package/src/charts/maps/index.ts +1 -0
  1357. package/src/charts/parliament-chart/index.ts +1 -0
  1358. package/src/charts/parliament-chart/parliament-chart.tsx +406 -0
  1359. package/src/charts/pictogram-chart/index.ts +1 -0
  1360. package/src/charts/pictogram-chart/pictogram-chart.tsx +406 -0
  1361. package/src/charts/pie-chart/index.ts +1 -0
  1362. package/src/charts/pie-chart/pie-chart.tsx +16 -0
  1363. package/src/charts/polar-area-chart/index.ts +1 -0
  1364. package/src/charts/polar-area-chart/polar-area-chart.tsx +505 -0
  1365. package/src/charts/progress-units/index.ts +1 -0
  1366. package/src/charts/progress-units/progress-units.tsx +209 -0
  1367. package/src/charts/radar-chart/index.ts +1 -0
  1368. package/src/charts/radar-chart/radar-chart.tsx +550 -0
  1369. package/src/charts/radial-bar-chart/index.ts +1 -0
  1370. package/src/charts/radial-bar-chart/radial-bar-chart.tsx +552 -0
  1371. package/src/charts/raincloud-chart/index.ts +1 -0
  1372. package/src/charts/raincloud-chart/raincloud-chart.tsx +453 -0
  1373. package/src/charts/range-area-chart/index.ts +1 -0
  1374. package/src/charts/range-area-chart/range-area-chart.tsx +516 -0
  1375. package/src/charts/sankey-chart/alluvial-chart.tsx +56 -0
  1376. package/src/charts/sankey-chart/index.ts +2 -0
  1377. package/src/charts/sankey-chart/sankey-chart.tsx +1139 -0
  1378. package/src/charts/scatter-chart/index.ts +1 -0
  1379. package/src/charts/scatter-chart/scatter-chart.tsx +16 -0
  1380. package/src/charts/slope-chart/index.ts +2 -0
  1381. package/src/charts/slope-chart/label-layout.ts +48 -0
  1382. package/src/charts/slope-chart/slope-chart.tsx +484 -0
  1383. package/src/charts/sparkline/index.ts +1 -0
  1384. package/src/charts/sparkline/sparkline.tsx +266 -0
  1385. package/src/charts/stock-chart/index.ts +1 -0
  1386. package/src/charts/stock-chart/stock-chart.tsx +728 -0
  1387. package/src/charts/stock-chart/stock-drawing-layer.tsx +386 -0
  1388. package/src/charts/stock-chart/stock-drawings.ts +121 -0
  1389. package/src/charts/stock-chart/stock-model.ts +167 -0
  1390. package/src/charts/stock-chart/stock-plot.tsx +1133 -0
  1391. package/src/charts/stock-chart/stock-stats.ts +122 -0
  1392. package/src/charts/stock-chart/stock-transforms.ts +86 -0
  1393. package/src/charts/stock-chart/use-stock-stream.ts +28 -0
  1394. package/src/charts/stream-graph/index.ts +2 -0
  1395. package/src/charts/stream-graph/stream-graph.tsx +521 -0
  1396. package/src/charts/stream-graph/stream-layout.ts +131 -0
  1397. package/src/charts/sunburst-chart/index.ts +1 -0
  1398. package/src/charts/sunburst-chart/sunburst-chart.tsx +558 -0
  1399. package/src/charts/timeline-chart/index.ts +2 -0
  1400. package/src/charts/timeline-chart/timeline-chart.tsx +656 -0
  1401. package/src/charts/timeline-chart/timeline-lanes.ts +116 -0
  1402. package/src/charts/tree-chart/index.ts +3 -0
  1403. package/src/charts/tree-chart/tree-card.tsx +132 -0
  1404. package/src/charts/tree-chart/tree-chart.tsx +1071 -0
  1405. package/src/charts/tree-chart/tree-model.ts +217 -0
  1406. package/src/charts/tree-chart/use-tree-transition.ts +116 -0
  1407. package/src/charts/treemap-chart/index.ts +1 -0
  1408. package/src/charts/treemap-chart/treemap-chart.tsx +435 -0
  1409. package/src/charts/violin-chart/index.ts +1 -0
  1410. package/src/charts/violin-chart/violin-chart.tsx +514 -0
  1411. package/src/charts/waffle-chart/index.ts +1 -0
  1412. package/src/charts/waffle-chart/waffle-chart.tsx +354 -0
  1413. package/src/charts/waterfall-chart/index.ts +2 -0
  1414. package/src/charts/waterfall-chart/waterfall-chart.tsx +629 -0
  1415. package/src/charts/waterfall-chart/waterfall-layout.ts +112 -0
  1416. package/src/containers/action-bar/action-bar.tsx +78 -0
  1417. package/src/containers/action-bar/index.ts +1 -0
  1418. package/src/containers/banner/banner.tsx +68 -0
  1419. package/src/containers/banner/index.ts +1 -0
  1420. package/src/containers/card/card.tsx +44 -0
  1421. package/src/containers/card/index.ts +1 -0
  1422. package/src/containers/carousel/carousel.tsx +216 -0
  1423. package/src/containers/carousel/index.ts +2 -0
  1424. package/src/containers/carousel/model.ts +21 -0
  1425. package/src/containers/cell/cell.tsx +127 -0
  1426. package/src/containers/cell/index.ts +8 -0
  1427. package/src/containers/cols/cols.tsx +64 -0
  1428. package/src/containers/cols/index.ts +1 -0
  1429. package/src/containers/comment/comment.tsx +56 -0
  1430. package/src/containers/comment/index.ts +1 -0
  1431. package/src/containers/data-grid/README.md +38 -0
  1432. package/src/containers/data-grid/chart-panel.tsx +141 -0
  1433. package/src/containers/data-grid/chart-range.ts +131 -0
  1434. package/src/containers/data-grid/column-groups.ts +45 -0
  1435. package/src/containers/data-grid/column-menu.tsx +444 -0
  1436. package/src/containers/data-grid/data-grid.demos.tsx +577 -0
  1437. package/src/containers/data-grid/data-grid.fixtures.tsx +358 -0
  1438. package/src/containers/data-grid/data-grid.samples.tsx +441 -0
  1439. package/src/containers/data-grid/data-grid.tsx +3419 -0
  1440. package/src/containers/data-grid/data-source.ts +144 -0
  1441. package/src/containers/data-grid/fill-series.ts +282 -0
  1442. package/src/containers/data-grid/filter-builder-editor.tsx +262 -0
  1443. package/src/containers/data-grid/filter-builder.ts +308 -0
  1444. package/src/containers/data-grid/formula-bar.tsx +80 -0
  1445. package/src/containers/data-grid/formula-sheet.ts +254 -0
  1446. package/src/containers/data-grid/formula.ts +687 -0
  1447. package/src/containers/data-grid/grid-edit.ts +137 -0
  1448. package/src/containers/data-grid/grid-toolbar.tsx +307 -0
  1449. package/src/containers/data-grid/history.ts +137 -0
  1450. package/src/containers/data-grid/index.ts +18 -0
  1451. package/src/containers/data-grid/labels.ts +315 -0
  1452. package/src/containers/data-grid/model.ts +641 -0
  1453. package/src/containers/data-grid/pivot.ts +188 -0
  1454. package/src/containers/data-grid/range.ts +124 -0
  1455. package/src/containers/data-grid/rows.ts +95 -0
  1456. package/src/containers/data-grid/spreadsheet.demos.tsx +520 -0
  1457. package/src/containers/data-grid/tool-panel.tsx +289 -0
  1458. package/src/containers/data-grid/tree.ts +97 -0
  1459. package/src/containers/data-grid/types.ts +166 -0
  1460. package/src/containers/data-grid/use-data-source.ts +124 -0
  1461. package/src/containers/data-grid/use-grid-layout.ts +133 -0
  1462. package/src/containers/data-grid/virtual.ts +158 -0
  1463. package/src/containers/data-grid/xlsx-export.ts +54 -0
  1464. package/src/containers/description-list/description-list.tsx +25 -0
  1465. package/src/containers/description-list/index.ts +1 -0
  1466. package/src/containers/facts/facts.tsx +26 -0
  1467. package/src/containers/facts/index.ts +1 -0
  1468. package/src/containers/file-tree/file-tree.tsx +185 -0
  1469. package/src/containers/file-tree/index.ts +12 -0
  1470. package/src/containers/file-tree/model.ts +111 -0
  1471. package/src/containers/generic-row/generic-row.tsx +41 -0
  1472. package/src/containers/generic-row/index.ts +1 -0
  1473. package/src/containers/hbars/hbars.tsx +204 -0
  1474. package/src/containers/hbars/index.ts +1 -0
  1475. package/src/containers/highlight-line/highlight-line.tsx +17 -0
  1476. package/src/containers/highlight-line/index.ts +1 -0
  1477. package/src/containers/index.ts +26 -0
  1478. package/src/containers/item-card-group/index.ts +5 -0
  1479. package/src/containers/item-card-group/item-card-group.tsx +106 -0
  1480. package/src/containers/kanban/index.ts +14 -0
  1481. package/src/containers/kanban/kanban.tsx +402 -0
  1482. package/src/containers/kanban/model.ts +141 -0
  1483. package/src/containers/kpi/index.ts +1 -0
  1484. package/src/containers/kpi/kpi.tsx +53 -0
  1485. package/src/containers/kpi-group/index.ts +1 -0
  1486. package/src/containers/kpi-group/kpi-group.tsx +71 -0
  1487. package/src/containers/page-header/index.ts +1 -0
  1488. package/src/containers/page-header/page-header.tsx +53 -0
  1489. package/src/containers/resizable/index.ts +9 -0
  1490. package/src/containers/resizable/model.ts +94 -0
  1491. package/src/containers/resizable/resizable.tsx +281 -0
  1492. package/src/containers/scrolly/index.ts +8 -0
  1493. package/src/containers/scrolly/scrolly-logic.ts +41 -0
  1494. package/src/containers/scrolly/scrolly.tsx +206 -0
  1495. package/src/containers/settings-layout/index.ts +1 -0
  1496. package/src/containers/settings-layout/settings-layout.tsx +85 -0
  1497. package/src/containers/settings-row/index.ts +1 -0
  1498. package/src/containers/settings-row/settings-row.tsx +38 -0
  1499. package/src/containers/table/index.ts +1 -0
  1500. package/src/containers/table/pin.ts +91 -0
  1501. package/src/containers/table/table.tsx +406 -0
  1502. package/src/containers/timeline/index.ts +6 -0
  1503. package/src/containers/timeline/timeline.tsx +93 -0
  1504. package/src/containers/toolbar/index.ts +1 -0
  1505. package/src/containers/toolbar/toolbar.tsx +21 -0
  1506. package/src/dashboards/data.ts +40 -0
  1507. package/src/dashboards/inicio-dashboard.tsx +209 -0
  1508. package/src/dashboards/layout.tsx +95 -0
  1509. package/src/forms/accent-picker/accent-picker.tsx +68 -0
  1510. package/src/forms/accent-picker/index.ts +5 -0
  1511. package/src/forms/checkbox-button-group/checkbox-button-group.tsx +66 -0
  1512. package/src/forms/checkbox-button-group/index.ts +5 -0
  1513. package/src/forms/dropzone/dropzone.tsx +127 -0
  1514. package/src/forms/dropzone/index.ts +6 -0
  1515. package/src/forms/emoji-picker/emoji-data.ts +173 -0
  1516. package/src/forms/emoji-picker/emoji-picker.tsx +142 -0
  1517. package/src/forms/emoji-picker/index.ts +3 -0
  1518. package/src/forms/emoji-picker/model.ts +49 -0
  1519. package/src/forms/emoji-reaction-button/emoji-reaction-button.tsx +112 -0
  1520. package/src/forms/emoji-reaction-button/index.ts +7 -0
  1521. package/src/forms/field/field.tsx +53 -0
  1522. package/src/forms/field/index.ts +1 -0
  1523. package/src/forms/form-grid/form-grid.tsx +22 -0
  1524. package/src/forms/form-grid/index.ts +1 -0
  1525. package/src/forms/index.ts +20 -0
  1526. package/src/forms/inline-select/index.ts +5 -0
  1527. package/src/forms/inline-select/inline-select.tsx +41 -0
  1528. package/src/forms/input/index.ts +1 -0
  1529. package/src/forms/input/input.tsx +16 -0
  1530. package/src/forms/input-icon/index.ts +1 -0
  1531. package/src/forms/input-icon/input-icon.tsx +22 -0
  1532. package/src/forms/internal/button-option.tsx +46 -0
  1533. package/src/forms/label/index.ts +1 -0
  1534. package/src/forms/label/label.tsx +11 -0
  1535. package/src/forms/native-select/index.ts +6 -0
  1536. package/src/forms/native-select/native-select.tsx +87 -0
  1537. package/src/forms/number-stepper/index.ts +1 -0
  1538. package/src/forms/number-stepper/number-stepper.tsx +124 -0
  1539. package/src/forms/pin-input/index.ts +1 -0
  1540. package/src/forms/pin-input/pin-input.tsx +79 -0
  1541. package/src/forms/radio-button-group/index.ts +5 -0
  1542. package/src/forms/radio-button-group/radio-button-group.tsx +68 -0
  1543. package/src/forms/rating/index.ts +2 -0
  1544. package/src/forms/rating/model.ts +48 -0
  1545. package/src/forms/rating/rating.tsx +139 -0
  1546. package/src/forms/select/index.ts +1 -0
  1547. package/src/forms/select/select.tsx +29 -0
  1548. package/src/forms/slider/index.ts +17 -0
  1549. package/src/forms/slider/model.ts +89 -0
  1550. package/src/forms/slider/slider.tsx +241 -0
  1551. package/src/forms/textarea/index.ts +1 -0
  1552. package/src/forms/textarea/textarea.tsx +16 -0
  1553. package/src/forms/time-input/index.ts +1 -0
  1554. package/src/forms/time-input/time-input.tsx +116 -0
  1555. package/src/foundations/presets-gallery.mdx +59 -0
  1556. package/src/navigation/floating-toc/floating-toc.tsx +115 -0
  1557. package/src/navigation/floating-toc/index.ts +2 -0
  1558. package/src/navigation/floating-toc/model.ts +23 -0
  1559. package/src/navigation/index.ts +4 -0
  1560. package/src/navigation/segmented/index.ts +6 -0
  1561. package/src/navigation/segmented/segmented.tsx +36 -0
  1562. package/src/navigation/stepper/index.ts +1 -0
  1563. package/src/navigation/stepper/stepper.tsx +60 -0
  1564. package/src/navigation/tabs/index.ts +10 -0
  1565. package/src/navigation/tabs/tabs.tsx +55 -0
  1566. package/src/overlays/context-menu/context-menu.tsx +256 -0
  1567. package/src/overlays/context-menu/index.ts +15 -0
  1568. package/src/overlays/dialog/dialog.tsx +146 -0
  1569. package/src/overlays/dialog/index.ts +12 -0
  1570. package/src/overlays/drawer/drawer.tsx +94 -0
  1571. package/src/overlays/drawer/index.ts +8 -0
  1572. package/src/overlays/dropdown-menu/dropdown-menu.tsx +82 -0
  1573. package/src/overlays/dropdown-menu/index.ts +14 -0
  1574. package/src/overlays/focus-return/focus-return.tsx +60 -0
  1575. package/src/overlays/focus-return/index.ts +7 -0
  1576. package/src/overlays/hover-card/hover-card.tsx +186 -0
  1577. package/src/overlays/hover-card/index.ts +8 -0
  1578. package/src/overlays/index.ts +8 -0
  1579. package/src/overlays/popover/index.ts +8 -0
  1580. package/src/overlays/popover/popover.tsx +35 -0
  1581. package/src/overlays/toaster/index.ts +1 -0
  1582. package/src/overlays/toaster/toaster.tsx +35 -0
  1583. package/src/palette/command-palette/command-palette.tsx +131 -0
  1584. package/src/palette/command-palette/index.ts +5 -0
  1585. package/src/palette/index.ts +1 -0
  1586. package/src/rich-text/index.ts +8 -0
  1587. package/src/rich-text/rich-text-editor.tsx +419 -0
  1588. package/src/rich-text/sanitize.ts +266 -0
  1589. package/src/shell/app-shell/app-shell.tsx +76 -0
  1590. package/src/shell/app-shell/index.ts +6 -0
  1591. package/src/shell/index.ts +3 -0
  1592. package/src/shell/sidebar/index.ts +8 -0
  1593. package/src/shell/sidebar/sidebar.tsx +172 -0
  1594. package/src/shell/topbar/index.ts +1 -0
  1595. package/src/shell/topbar/topbar.tsx +120 -0
  1596. package/src/showcase/analytics-bento.tsx +333 -0
  1597. package/src/showcase/bento.tsx +169 -0
  1598. package/src/showcase/controls-bento.tsx +313 -0
  1599. package/src/showcase/dataviz-bento.tsx +452 -0
  1600. package/src/showcase/kit-tiles.tsx +193 -0
  1601. package/src/showcase/operations-bento.tsx +478 -0
  1602. package/src/showcase/shell.tsx +136 -0
  1603. package/src/states/empty-state/empty-state.tsx +40 -0
  1604. package/src/states/empty-state/index.ts +1 -0
  1605. package/src/states/error-state/error-state.tsx +52 -0
  1606. package/src/states/error-state/index.ts +1 -0
  1607. package/src/states/forbidden-state/forbidden-state.tsx +28 -0
  1608. package/src/states/forbidden-state/index.ts +1 -0
  1609. package/src/states/index.ts +5 -0
  1610. package/src/states/offline-banner/index.ts +1 -0
  1611. package/src/states/offline-banner/offline-banner.tsx +35 -0
  1612. package/src/states/skeleton/index.ts +1 -0
  1613. package/src/states/skeleton/skeleton.tsx +53 -0
  1614. package/src/utils/cn.ts +94 -0
  1615. package/src/utils/index.ts +2 -0
  1616. package/src/utils/reduced-motion.ts +20 -0
  1617. package/src/xlsx/crc32.ts +22 -0
  1618. package/src/xlsx/index.ts +15 -0
  1619. package/src/xlsx/xlsx.ts +390 -0
  1620. package/src/xlsx/zip.ts +117 -0
  1621. package/styles/Theme.kt +246 -0
  1622. package/styles/base.css +45 -0
  1623. package/styles/fonts.css +2 -0
  1624. package/styles/theme.css +272 -0
  1625. package/styles/tokens.css +1109 -0
  1626. package/tokens/default.json +1802 -0
@@ -0,0 +1,2850 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ ArrowDown,
5
+ ArrowDownToLine,
6
+ ArrowUp,
7
+ ArrowUpToLine,
8
+ BarChart3,
9
+ ChevronDown,
10
+ ChevronLeft,
11
+ ChevronRight,
12
+ ChevronsLeft,
13
+ ChevronsRight,
14
+ CircleAlert,
15
+ Copy,
16
+ GripVertical,
17
+ PinOff
18
+ } from "lucide-react";
19
+ import {
20
+ lazy,
21
+ Suspense,
22
+ useCallback,
23
+ useEffect,
24
+ useId,
25
+ useLayoutEffect,
26
+ useMemo,
27
+ useRef,
28
+ useState
29
+ } from "react";
30
+ import { Chip } from "../../atoms/chip/chip.js";
31
+ import { formatCurrency, formatNumber } from "../../charts/core/format.js";
32
+ import { Sparkline } from "../../charts/sparkline/sparkline.js";
33
+ import { cn } from "../../utils/cn.js";
34
+ import { computePinOffsets, sanitizePinned } from "../table/pin.js";
35
+ import { rangeToChart } from "./chart-range.js";
36
+ import { buildHeaderGroups, groupPathOf } from "./column-groups.js";
37
+ import { ColumnMenu } from "./column-menu.js";
38
+ import {
39
+ copyFill,
40
+ edgeScrollStep,
41
+ fillLanes,
42
+ handleExtent,
43
+ isBackward,
44
+ seriesFill
45
+ } from "./fill-series.js";
46
+ import {
47
+ applyAdvancedFilter,
48
+ countConditions,
49
+ emptyGroup
50
+ } from "./filter-builder.js";
51
+ import { FilterBuilder } from "./filter-builder-editor.js";
52
+ import { cellAddress, columnLabel, isFormulaText, shiftFormula } from "./formula.js";
53
+ import { FormulaBar } from "./formula-bar.js";
54
+ import { buildSheet, displayValue, isErrorText } from "./formula-sheet.js";
55
+ import {
56
+ parseLooseNumber,
57
+ parseTSV,
58
+ planFill,
59
+ planPaste,
60
+ sameCellValue
61
+ } from "./grid-edit.js";
62
+ import { GridToolbar } from "./grid-toolbar.js";
63
+ import {
64
+ commandSize,
65
+ createHistory,
66
+ DEFAULT_HISTORY_DEPTH,
67
+ pushCommand,
68
+ redoCommand,
69
+ setHistoryDepth,
70
+ summarizeHistory,
71
+ undoCommand
72
+ } from "./history.js";
73
+ import { DEFAULT_DATA_GRID_LABELS } from "./labels.js";
74
+ import {
75
+ aggregateValues,
76
+ buildDisplayRows,
77
+ columnAlign,
78
+ computeAggregates,
79
+ countActiveFilters,
80
+ distinctValues,
81
+ fillColumnWidths,
82
+ filterRows,
83
+ formatAggregate,
84
+ formatCellValue,
85
+ getCellValue,
86
+ rangeBetween,
87
+ sortRows,
88
+ toCSV,
89
+ toggleSort
90
+ } from "./model.js";
91
+ import {
92
+ buildPivot,
93
+ isPivotValid,
94
+ pivotColumns,
95
+ pivotFooter
96
+ } from "./pivot.js";
97
+ import {
98
+ extendRange,
99
+ inRange,
100
+ rangeBounds,
101
+ rangeStats,
102
+ rangeToTSV
103
+ } from "./range.js";
104
+ import {
105
+ insertDetailRows,
106
+ moveRowBy,
107
+ moveRowTo,
108
+ NO_PINNED_ROWS,
109
+ pinnedSideOf,
110
+ splitPinnedRows,
111
+ togglePinnedRow,
112
+ toggleSetMember
113
+ } from "./rows.js";
114
+ import { EMPTY_PIVOT, GridToolPanel } from "./tool-panel.js";
115
+ import { buildTreeRows, withAncestors } from "./tree.js";
116
+ import { useDataSource } from "./use-data-source.js";
117
+ import { useGridLayout } from "./use-grid-layout.js";
118
+ import {
119
+ computeVariableWindow,
120
+ computeVirtualWindow,
121
+ pageCount,
122
+ pageStep,
123
+ scrollLeftToReveal,
124
+ scrollTopToRevealSpan
125
+ } from "./virtual.js";
126
+ import { gridToSheet, xlsxFilename } from "./xlsx-export.js";
127
+ const ChartPanel = lazy(
128
+ () => import("./chart-panel.js").then((module) => ({ default: module.ChartPanel }))
129
+ );
130
+ const ROW_HEIGHT = { compact: 32, normal: 40, comfortable: 48 };
131
+ const SELECT_ID = "__select";
132
+ const SELECT_WIDTH = 44;
133
+ const TOOLS_ID = "__tools";
134
+ const TOOL_SLOT = 26;
135
+ const GROUP_HEADER_HEIGHT = 32;
136
+ const DEFAULT_DETAIL_HEIGHT = 240;
137
+ const DEFAULT_BLOCK_SIZE = 50;
138
+ const EMPTY_DATA = [];
139
+ const SKELETON_ROWS = 8;
140
+ const EMPTY_SORT = [];
141
+ const EMPTY_FILTERS = {};
142
+ const EMPTY_LIST = [];
143
+ const EMPTY_ADVANCED = emptyGroup("and", "root");
144
+ function idOfColumn(entry) {
145
+ if (entry.kind === "select") return SELECT_ID;
146
+ return entry.kind === "tools" ? TOOLS_ID : entry.column.id;
147
+ }
148
+ function useControllable(value, initial, onChange) {
149
+ const [internal, setInternal] = useState(initial);
150
+ const controlled = value !== void 0;
151
+ const set = useCallback(
152
+ (next) => {
153
+ if (!controlled) setInternal(next);
154
+ onChange?.(next);
155
+ },
156
+ [controlled, onChange]
157
+ );
158
+ return [controlled ? value : internal, set];
159
+ }
160
+ function downloadCSV(filename, csv) {
161
+ downloadFile(filename, csv, "text/csv;charset=utf-8");
162
+ }
163
+ function downloadFile(filename, data, type) {
164
+ if (typeof document === "undefined") return;
165
+ const url = URL.createObjectURL(new Blob([data], { type }));
166
+ const link = document.createElement("a");
167
+ link.href = url;
168
+ link.download = filename;
169
+ document.body.append(link);
170
+ link.click();
171
+ link.remove();
172
+ setTimeout(() => URL.revokeObjectURL(url), 0);
173
+ }
174
+ const ARROW_STEPS = {
175
+ ArrowUp: { dr: -1, dc: 0 },
176
+ ArrowDown: { dr: 1, dc: 0 },
177
+ ArrowLeft: { dr: 0, dc: -1 },
178
+ ArrowRight: { dr: 0, dc: 1 }
179
+ };
180
+ function writeClipboard(text) {
181
+ if (typeof navigator !== "undefined" && navigator.clipboard?.writeText) {
182
+ navigator.clipboard.writeText(text).catch(() => void 0);
183
+ return;
184
+ }
185
+ if (typeof document === "undefined") return;
186
+ const area = document.createElement("textarea");
187
+ area.value = text;
188
+ area.style.position = "fixed";
189
+ area.style.opacity = "0";
190
+ document.body.append(area);
191
+ area.select();
192
+ try {
193
+ document.execCommand("copy");
194
+ } finally {
195
+ area.remove();
196
+ }
197
+ }
198
+ function editorOf(column) {
199
+ if (column.editor) return column.editor;
200
+ if (column.options?.length) return "select";
201
+ return column.type === "number" || column.type === "currency" ? "number" : "text";
202
+ }
203
+ function canEdit(column, row) {
204
+ return typeof column.editable === "function" ? column.editable(row) : column.editable === true;
205
+ }
206
+ const alignClass = { start: "text-left", center: "text-center", end: "text-right" };
207
+ const justifyClass = {
208
+ start: "justify-start",
209
+ center: "justify-center",
210
+ end: "justify-end"
211
+ };
212
+ function DataGrid({
213
+ data: dataProp = EMPTY_DATA,
214
+ columns: columnsProp,
215
+ "aria-label": ariaLabel,
216
+ getRowId: getRowIdProp,
217
+ height = 480,
218
+ pageSize: pageSizeProp,
219
+ pageSizeOptions = [25, 50, 100],
220
+ storageKey,
221
+ sort: sortProp,
222
+ defaultSort = EMPTY_SORT,
223
+ onSortChange,
224
+ filters: filtersProp,
225
+ defaultFilters = EMPTY_FILTERS,
226
+ onFiltersChange,
227
+ groupBy: groupByProp,
228
+ defaultGroupBy = EMPTY_LIST,
229
+ onGroupByChange,
230
+ defaultPinned,
231
+ defaultHidden,
232
+ density: densityProp,
233
+ defaultDensity = "normal",
234
+ onDensityChange,
235
+ selectable = false,
236
+ selectedRowIds,
237
+ defaultSelectedRowIds = EMPTY_LIST,
238
+ onSelectionChange,
239
+ onCellChange,
240
+ onCellsChange,
241
+ formulas = false,
242
+ history: historyEnabled = false,
243
+ historyDepth = DEFAULT_HISTORY_DEPTH,
244
+ onHistoryChange,
245
+ createRow,
246
+ onRowsChange,
247
+ dataSource,
248
+ maxBlocks,
249
+ tree,
250
+ expandedRowIds,
251
+ defaultExpandedRowIds = EMPTY_LIST,
252
+ onExpandedRowsChange,
253
+ renderDetail,
254
+ detailHeight = DEFAULT_DETAIL_HEIGHT,
255
+ rowPinning = false,
256
+ pinnedRows,
257
+ defaultPinnedRows = NO_PINNED_ROWS,
258
+ onPinnedRowsChange,
259
+ rowReorder = false,
260
+ onRowReorder,
261
+ rangeSelection: rangeSelectionProp = false,
262
+ fillSeries: fillSeriesOptions,
263
+ charts = false,
264
+ advancedFilter: advancedFilterProp,
265
+ defaultAdvancedFilter = EMPTY_ADVANCED,
266
+ onAdvancedFilterChange,
267
+ showAdvancedFilter = false,
268
+ toolPanel = false,
269
+ defaultToolPanelOpen = false,
270
+ pivot: pivotProp,
271
+ defaultPivot = EMPTY_PIVOT,
272
+ onPivotChange,
273
+ loading = false,
274
+ emptyMessage,
275
+ showFooter,
276
+ hideToolbar = false,
277
+ exportFilename = "datos.csv",
278
+ onExport,
279
+ exportXlsx = false,
280
+ onExportXlsx,
281
+ toolbarActions,
282
+ labels: labelsProp,
283
+ className
284
+ }) {
285
+ const labels = useMemo(() => ({ ...DEFAULT_DATA_GRID_LABELS, ...labelsProp }), [labelsProp]);
286
+ const helpId = useId();
287
+ const scrollerRef = useRef(null);
288
+ const gridRef = useRef(null);
289
+ const [sort, setSortState] = useControllable(
290
+ sortProp,
291
+ defaultSort,
292
+ onSortChange && ((next) => onSortChange([...next]))
293
+ );
294
+ const [filters, setFiltersState] = useControllable(
295
+ filtersProp,
296
+ defaultFilters,
297
+ onFiltersChange
298
+ );
299
+ const [groupBy, setGroupByState] = useControllable(
300
+ groupByProp,
301
+ defaultGroupBy,
302
+ onGroupByChange && ((next) => onGroupByChange([...next]))
303
+ );
304
+ const [selection, setSelection] = useControllable(
305
+ selectedRowIds,
306
+ defaultSelectedRowIds,
307
+ onSelectionChange && ((next) => onSelectionChange([...next]))
308
+ );
309
+ const [expanded, setExpanded] = useControllable(
310
+ expandedRowIds,
311
+ defaultExpandedRowIds,
312
+ onExpandedRowsChange && ((next) => onExpandedRowsChange([...next]))
313
+ );
314
+ const [pinnedRowIds, setPinnedRowIds] = useControllable(
315
+ pinnedRows,
316
+ defaultPinnedRows,
317
+ onPinnedRowsChange
318
+ );
319
+ const [advanced, setAdvanced] = useControllable(
320
+ advancedFilterProp,
321
+ defaultAdvancedFilter,
322
+ onAdvancedFilterChange
323
+ );
324
+ const [pivotConfig, setPivotConfig] = useControllable(
325
+ pivotProp,
326
+ defaultPivot,
327
+ onPivotChange
328
+ );
329
+ const [search, setSearch] = useState("");
330
+ const [collapsed, setCollapsed] = useState(() => /* @__PURE__ */ new Set());
331
+ const [page, setPage] = useState(0);
332
+ const [pageSize, setPageSize] = useState(pageSizeProp ?? 25);
333
+ const [active, setActive] = useState({ r: 0, c: 0 });
334
+ const [menuColumn, setMenuColumn] = useState(null);
335
+ const [editing, setEditing] = useState(null);
336
+ const [scrollTop, setScrollTop] = useState(0);
337
+ const [scrolled, setScrolled] = useState({ start: false, end: false });
338
+ const [dropTarget, setDropTarget] = useState(
339
+ null
340
+ );
341
+ const [dropRow, setDropRow] = useState(null);
342
+ const [cellRange, setCellRange] = useState(null);
343
+ const rangeB = cellRange ? rangeBounds(cellRange) : null;
344
+ const [fillPreview, setFillPreview] = useState(null);
345
+ const [panelOpen, setPanelOpen] = useState(defaultToolPanelOpen);
346
+ const [announcement, setAnnouncement] = useState("");
347
+ const editingRef = useRef(editing);
348
+ editingRef.current = editing;
349
+ const pendingFocus = useRef(false);
350
+ const anchor = useRef(null);
351
+ const resizing = useRef(false);
352
+ const dragId = useRef(null);
353
+ const rowDrag = useRef(null);
354
+ const rangeSelection = rangeSelectionProp || charts;
355
+ const [chart, setChart] = useState(null);
356
+ const paged = pageSizeProp !== void 0;
357
+ const sourceActive = dataSource !== void 0;
358
+ const pivotResult = useMemo(
359
+ () => !sourceActive && isPivotValid(pivotConfig, columnsProp) ? buildPivot(dataProp, columnsProp, pivotConfig) : null,
360
+ [sourceActive, pivotConfig, columnsProp, dataProp]
361
+ );
362
+ const pivotActive = pivotResult !== null;
363
+ const structured = !sourceActive && !pivotActive;
364
+ const formulasOn = formulas && structured;
365
+ const formulaCache = useRef(/* @__PURE__ */ new Map());
366
+ const sheet = useMemo(
367
+ () => formulasOn && columnsProp.length > 0 ? buildSheet({
368
+ rows: dataProp.length,
369
+ cols: columnsProp.length,
370
+ read: (r, c) => getCellValue(dataProp[r], columnsProp[c]),
371
+ cache: formulaCache.current
372
+ }) : null,
373
+ [formulasOn, dataProp, columnsProp]
374
+ );
375
+ const sourceIndex = useMemo(() => {
376
+ if (!sheet) return null;
377
+ const rows = /* @__PURE__ */ new Map();
378
+ dataProp.forEach((row, index) => {
379
+ rows.set(row, index);
380
+ });
381
+ const cols = new Map(columnsProp.map((column, index) => [column.id, index]));
382
+ return { rows, cols };
383
+ }, [sheet, dataProp, columnsProp]);
384
+ const columns = useMemo(() => {
385
+ if (pivotResult) {
386
+ return pivotColumns(
387
+ columnsProp,
388
+ pivotConfig,
389
+ pivotResult,
390
+ labels.total
391
+ );
392
+ }
393
+ if (!sheet || !sourceIndex) return columnsProp;
394
+ return columnsProp.map((column, c) => ({
395
+ ...column,
396
+ accessor: (row) => {
397
+ const r = sourceIndex.rows.get(row);
398
+ const shown = r === void 0 ? void 0 : displayValue(sheet, r, c);
399
+ return shown === void 0 ? getCellValue(row, column) : shown;
400
+ }
401
+ }));
402
+ }, [pivotResult, columnsProp, pivotConfig, labels.total, sheet, sourceIndex]);
403
+ const data = useMemo(
404
+ () => pivotResult ? pivotResult.rows : dataProp,
405
+ [pivotResult, dataProp]
406
+ );
407
+ const getRowId = useMemo(
408
+ () => pivotResult ? (row) => row.id : getRowIdProp,
409
+ [pivotResult, getRowIdProp]
410
+ );
411
+ const layoutDefaults = useMemo(
412
+ () => ({ pinned: defaultPinned, hidden: defaultHidden, density: defaultDensity }),
413
+ [defaultPinned, defaultHidden, defaultDensity]
414
+ );
415
+ const grid = useGridLayout(columns, layoutDefaults, pivotActive ? void 0 : storageKey);
416
+ const { layout } = grid;
417
+ const density = densityProp ?? layout.density ?? defaultDensity;
418
+ const rowHeight = ROW_HEIGHT[density];
419
+ const headerHeight = Math.max(rowHeight, 36);
420
+ const firstRow = Math.floor(scrollTop / rowHeight);
421
+ const byId = useMemo(() => new Map(columns.map((column) => [column.id, column])), [columns]);
422
+ const { dataColumns, zoneOf, pinned } = useMemo(() => {
423
+ const visible = layout.order.filter((id) => byId.has(id) && !layout.hidden.includes(id));
424
+ const pins = sanitizePinned(layout.pinned, visible);
425
+ const left = visible.filter((id) => pins.left.includes(id));
426
+ const right = visible.filter((id) => pins.right.includes(id));
427
+ const center = visible.filter((id) => !left.includes(id) && !right.includes(id));
428
+ const zones = /* @__PURE__ */ new Map();
429
+ for (const id of left) zones.set(id, "left");
430
+ for (const id of right) zones.set(id, "right");
431
+ for (const id of center) zones.set(id, "center");
432
+ return {
433
+ dataColumns: [...left, ...center, ...right].map((id) => byId.get(id)),
434
+ zoneOf: zones,
435
+ pinned: { left, right }
436
+ };
437
+ }, [layout.order, layout.hidden, layout.pinned, byId]);
438
+ const detailEnabled = !!renderDetail && structured && !tree;
439
+ const reorderEnabled = rowReorder && structured;
440
+ const pinningEnabled = rowPinning && structured;
441
+ const toolSlots = (detailEnabled ? 1 : 0) + (reorderEnabled ? 1 : 0) + (pinningEnabled ? 2 : 0);
442
+ const toolsWidth = toolSlots * TOOL_SLOT + 12;
443
+ const renderColumns = useMemo(
444
+ () => [
445
+ ...selectable ? [{ kind: "select" }] : [],
446
+ ...toolSlots > 0 ? [{ kind: "tools" }] : [],
447
+ ...dataColumns.map((column) => ({ kind: "data", column }))
448
+ ],
449
+ [selectable, toolSlots, dataColumns]
450
+ );
451
+ const leadingCount = renderColumns.length - dataColumns.length;
452
+ const fillerIndex = renderColumns.length - pinned.right.length;
453
+ const [containerWidth, setContainerWidth] = useState(0);
454
+ const reservedWidth = (selectable ? SELECT_WIDTH : 0) + (toolSlots > 0 ? toolsWidth : 0);
455
+ const shownWidths = useMemo(
456
+ () => containerWidth > 0 ? fillColumnWidths(dataColumns, layout.widths, containerWidth, reservedWidth) : layout.widths,
457
+ [containerWidth, dataColumns, layout.widths, reservedWidth]
458
+ );
459
+ const widthOf = useCallback(
460
+ (entry) => entry.kind === "select" ? SELECT_WIDTH : entry.kind === "tools" ? toolsWidth : shownWidths[entry.column.id] ?? 160,
461
+ [shownWidths, toolsWidth]
462
+ );
463
+ const positions = useMemo(() => {
464
+ const widths = {
465
+ [SELECT_ID]: SELECT_WIDTH,
466
+ [TOOLS_ID]: toolsWidth,
467
+ ...shownWidths
468
+ };
469
+ const left = [
470
+ ...selectable ? [SELECT_ID] : [],
471
+ ...toolSlots > 0 ? [TOOLS_ID] : [],
472
+ ...pinned.left
473
+ ];
474
+ return computePinOffsets(widths, { left, right: pinned.right });
475
+ }, [shownWidths, pinned, selectable, toolSlots, toolsWidth]);
476
+ const totalWidth = renderColumns.reduce((sum, entry) => sum + widthOf(entry), 0);
477
+ const headerLevels = useMemo(() => {
478
+ const paths = dataColumns.map((column) => groupPathOf(column));
479
+ const breaks = dataColumns.map(
480
+ (column, index) => index > 0 && zoneOf.get(column.id) !== zoneOf.get(dataColumns[index - 1]?.id ?? "") ? index : -1
481
+ ).filter((index) => index >= 0);
482
+ return buildHeaderGroups(paths, breaks);
483
+ }, [dataColumns, zoneOf]);
484
+ const groupLevels = headerLevels.length;
485
+ const headerTop = groupLevels * GROUP_HEADER_HEIGHT;
486
+ const blockSize = paged ? pageSize : dataSource?.blockSize ?? DEFAULT_BLOCK_SIZE;
487
+ const remoteRange = paged ? { start: page * pageSize, end: (page + 1) * pageSize } : { start: Math.max(0, firstRow - 8), end: firstRow + Math.ceil(height / rowHeight) + 12 };
488
+ const remote = useDataSource(dataSource, {
489
+ sort,
490
+ filters,
491
+ search,
492
+ blockSize,
493
+ maxBlocks,
494
+ range: remoteRange
495
+ });
496
+ const busy = loading || sourceActive && remote.total === null && !remote.failed;
497
+ const localKeys = useMemo(() => {
498
+ const keys = /* @__PURE__ */ new Map();
499
+ data.forEach((row, index) => {
500
+ keys.set(row, getRowId ? getRowId(row, index) : String(index));
501
+ });
502
+ return keys;
503
+ }, [data, getRowId]);
504
+ const rowAt = remote.rowAt;
505
+ const remoteModel = useMemo(() => {
506
+ if (!sourceActive) return null;
507
+ const keys = /* @__PURE__ */ new Map();
508
+ const byKey = /* @__PURE__ */ new Map();
509
+ const rows = [];
510
+ const loaded = [];
511
+ const total = remote.total ?? 0;
512
+ for (let index = 0; index < total; index += 1) {
513
+ const row = rowAt(index);
514
+ if (row === void 0) {
515
+ rows.push({ kind: "placeholder", key: `~${index}`, index });
516
+ continue;
517
+ }
518
+ const key = getRowId ? getRowId(row, index) : String(index);
519
+ keys.set(row, key);
520
+ byKey.set(key, row);
521
+ loaded.push(row);
522
+ rows.push({ kind: "data", key, depth: 0, row });
523
+ }
524
+ return { keys, byKey, rows, loaded };
525
+ }, [sourceActive, remote.total, rowAt, getRowId]);
526
+ const keyOf = useCallback(
527
+ (row) => (remoteModel ? remoteModel.keys : localKeys).get(row) ?? "",
528
+ [remoteModel, localKeys]
529
+ );
530
+ const rowByKey = useMemo(
531
+ () => remoteModel?.byKey ?? new Map(data.map((row) => [keyOf(row), row])),
532
+ [remoteModel, data, keyOf]
533
+ );
534
+ const advancedCount = countConditions(advanced);
535
+ const filterActive = countActiveFilters(filters) > 0 || search.trim() !== "" || advancedCount > 0;
536
+ const filtered = useMemo(() => {
537
+ if (sourceActive) return [];
538
+ const base = filterRows(data, columns, filters, search);
539
+ return advancedCount > 0 ? applyAdvancedFilter(base, columns, advanced) : base;
540
+ }, [sourceActive, data, columns, filters, search, advanced, advancedCount]);
541
+ const treeOptions = useMemo(
542
+ () => tree && structured ? { getKey: keyOf, getParentId: tree.getParentId } : null,
543
+ [tree, structured, keyOf]
544
+ );
545
+ const sorted = useMemo(() => {
546
+ if (remoteModel) return remoteModel.loaded;
547
+ const rows = treeOptions ? withAncestors(data, filtered, treeOptions) : filtered;
548
+ return sortRows(rows, columns, sort);
549
+ }, [remoteModel, treeOptions, data, filtered, columns, sort]);
550
+ const expandedSet = useMemo(() => new Set(expanded), [expanded]);
551
+ const treeResult = useMemo(
552
+ () => treeOptions ? buildTreeRows(sorted, columns, {
553
+ ...treeOptions,
554
+ expanded: expandedSet,
555
+ forceExpand: filterActive
556
+ }) : null,
557
+ [treeOptions, sorted, columns, expandedSet, filterActive]
558
+ );
559
+ const flat = useMemo(() => {
560
+ if (remoteModel) return remoteModel.rows;
561
+ if (treeResult) return treeResult.rows;
562
+ return buildDisplayRows(
563
+ sorted,
564
+ columns,
565
+ structured ? groupBy : EMPTY_LIST,
566
+ collapsed,
567
+ keyOf,
568
+ sort
569
+ );
570
+ }, [remoteModel, treeResult, sorted, columns, structured, groupBy, collapsed, keyOf, sort]);
571
+ const hasAggregates = columns.some((column) => column.aggregate);
572
+ const footer = !sourceActive && (showFooter ?? hasAggregates) && !busy && flat.length > 0;
573
+ const totals = useMemo(() => {
574
+ if (!footer) return {};
575
+ if (pivotResult) return pivotFooter(pivotResult);
576
+ if (treeResult) return computeAggregates(treeResult.leaves, columns);
577
+ const result = {};
578
+ for (const column of columns) {
579
+ if (!column.aggregate) continue;
580
+ const values = filtered.map((row) => getCellValue(row, column));
581
+ result[column.id] = aggregateValues(values, column.aggregate);
582
+ }
583
+ return result;
584
+ }, [footer, pivotResult, treeResult, columns, filtered]);
585
+ const split = useMemo(
586
+ () => pinningEnabled ? splitPinnedRows(flat, pinnedRowIds) : { top: [], middle: flat, bottom: [] },
587
+ [pinningEnabled, flat, pinnedRowIds]
588
+ );
589
+ const pages = pageCount(split.middle.length, pageSize);
590
+ const currentPage = Math.min(page, pages - 1);
591
+ const pageOffset = paged ? currentPage * pageSize : 0;
592
+ const pageRows = paged ? split.middle.slice(pageOffset, pageOffset + pageSize) : split.middle;
593
+ const heightOfDetail = useCallback(
594
+ (row) => typeof detailHeight === "function" ? detailHeight(row) : detailHeight,
595
+ [detailHeight]
596
+ );
597
+ const middle = useMemo(
598
+ () => detailEnabled ? insertDetailRows(pageRows, expandedSet, heightOfDetail) : pageRows,
599
+ [detailEnabled, pageRows, expandedSet, heightOfDetail]
600
+ );
601
+ const bodyRows = useMemo(
602
+ () => split.top.length > 0 || split.bottom.length > 0 ? [...split.top, ...middle, ...split.bottom] : middle,
603
+ [split, middle]
604
+ );
605
+ const topCount = split.top.length;
606
+ const bottomCount = split.bottom.length;
607
+ const variableHeights = detailEnabled && middle.some((row) => row.kind === "detail");
608
+ const bodyViewport = Math.max(
609
+ rowHeight,
610
+ height - headerHeight - headerTop - (footer ? rowHeight : 0)
611
+ );
612
+ const win = useMemo(() => {
613
+ if (paged) return { start: 0, end: bodyRows.length, offsets: null };
614
+ if (variableHeights) {
615
+ return computeVariableWindow({
616
+ heights: bodyRows.map((row) => row.kind === "detail" ? row.height : rowHeight),
617
+ viewportHeight: bodyViewport,
618
+ scrollTop,
619
+ overscan: 8
620
+ });
621
+ }
622
+ const uniform = computeVirtualWindow({
623
+ count: bodyRows.length,
624
+ rowHeight,
625
+ viewportHeight: bodyViewport,
626
+ scrollTop: firstRow * rowHeight,
627
+ overscan: 8
628
+ });
629
+ return { start: uniform.start, end: uniform.end, offsets: null };
630
+ }, [paged, variableHeights, bodyRows, rowHeight, bodyViewport, scrollTop, firstRow]);
631
+ const bodyLength = bodyRows.length;
632
+ const midStart = Math.max(win.start, topCount);
633
+ const midEnd = Math.max(midStart, Math.min(win.end, bodyLength - bottomCount));
634
+ const offsetOf = (index) => win.offsets ? win.offsets[index] ?? 0 : index * rowHeight;
635
+ const gapTop = offsetOf(midStart) - offsetOf(topCount);
636
+ const gapBottom = offsetOf(bodyLength - bottomCount) - offsetOf(midEnd);
637
+ const isRendered = (index) => index < topCount || index >= bodyLength - bottomCount || index >= win.start && index < win.end;
638
+ const selected = useMemo(() => new Set(selection), [selection]);
639
+ const visibleKeys = useMemo(
640
+ () => flat.filter((row) => row.kind === "data").map((row) => row.key),
641
+ [flat]
642
+ );
643
+ const allKeys = useMemo(() => sorted.map(keyOf), [sorted, keyOf]);
644
+ const selectedInView = allKeys.filter((key) => selected.has(key)).length;
645
+ const pivotValid = isPivotValid(pivotConfig, columnsProp);
646
+ const reorderAllowed = reorderEnabled && sort.length === 0 && groupBy.length === 0 && !tree && !filterActive;
647
+ const maxR = busy ? 0 : bodyRows.length;
648
+ const maxC = renderColumns.length - 1;
649
+ const activeR = Math.min(active.r, maxR);
650
+ const activeC = Math.min(active.c, Math.max(0, maxC));
651
+ const activeRendered = activeR === 0 || isRendered(activeR - 1);
652
+ const tabbable = activeRendered ? { r: activeR, c: activeC } : { r: 0, c: activeC };
653
+ const syncScroll = useCallback(() => {
654
+ const scroller = scrollerRef.current;
655
+ if (!scroller) return;
656
+ setScrollTop(Math.floor(scroller.scrollTop / rowHeight) * rowHeight);
657
+ const start = scroller.scrollLeft > 0;
658
+ const end = scroller.scrollLeft + scroller.clientWidth < scroller.scrollWidth - 1;
659
+ setScrolled(
660
+ (previous) => previous.start === start && previous.end === end ? previous : { start, end }
661
+ );
662
+ }, [rowHeight]);
663
+ useLayoutEffect(() => {
664
+ const scroller = scrollerRef.current;
665
+ const measure = () => {
666
+ syncScroll();
667
+ if (scroller) setContainerWidth(scroller.clientWidth);
668
+ };
669
+ measure();
670
+ if (!scroller || typeof ResizeObserver === "undefined") return;
671
+ const observer = new ResizeObserver(measure);
672
+ observer.observe(scroller);
673
+ return () => observer.disconnect();
674
+ }, [syncScroll]);
675
+ useLayoutEffect(() => {
676
+ if (!pendingFocus.current) return;
677
+ pendingFocus.current = false;
678
+ const cell = [
679
+ ...gridRef.current?.querySelectorAll(`[data-r="${tabbable.r}"]`) ?? []
680
+ ].find((node) => {
681
+ const start = Number(node.dataset.c);
682
+ const end = Number(node.dataset.cEnd ?? start);
683
+ return tabbable.c >= start && tabbable.c <= end;
684
+ });
685
+ cell?.focus({ preventScroll: !paged });
686
+ });
687
+ const reveal = useCallback(
688
+ (r, c) => {
689
+ const scroller = scrollerRef.current;
690
+ if (!scroller) return;
691
+ const index = r - 1;
692
+ if (!paged && r > 0 && index >= topCount && index < bodyLength - bottomCount) {
693
+ const item = bodyRows[index];
694
+ const top = scrollTopToRevealSpan(
695
+ win.offsets ? win.offsets[index] ?? 0 : index * rowHeight,
696
+ item?.kind === "detail" ? item.height : rowHeight,
697
+ bodyViewport,
698
+ scroller.scrollTop,
699
+ topCount * rowHeight,
700
+ bottomCount * rowHeight
701
+ );
702
+ if (top !== scroller.scrollTop) {
703
+ scroller.scrollTop = top;
704
+ setScrollTop(Math.floor(top / rowHeight) * rowHeight);
705
+ }
706
+ }
707
+ const entry = renderColumns[c];
708
+ if (!entry || positions[idOfColumn(entry)]) return;
709
+ let left = 0;
710
+ for (let i = 0; i < c; i += 1) left += widthOf(renderColumns[i]);
711
+ const pinnedLeft = renderColumns.filter((x) => positions[idOfColumn(x)]?.side === "left").reduce((sum, x) => sum + widthOf(x), 0);
712
+ const pinnedRight = renderColumns.filter((x) => positions[idOfColumn(x)]?.side === "right").reduce((sum, x) => sum + widthOf(x), 0);
713
+ scroller.scrollLeft = scrollLeftToReveal(
714
+ left,
715
+ widthOf(entry),
716
+ scroller.clientWidth,
717
+ scroller.scrollLeft,
718
+ pinnedLeft,
719
+ pinnedRight
720
+ );
721
+ },
722
+ [
723
+ paged,
724
+ rowHeight,
725
+ bodyViewport,
726
+ renderColumns,
727
+ positions,
728
+ widthOf,
729
+ bodyRows,
730
+ topCount,
731
+ bottomCount,
732
+ bodyLength,
733
+ win.offsets
734
+ ]
735
+ );
736
+ const focusCell = useCallback(
737
+ (r, c, focus = true) => {
738
+ const next = { r: Math.max(0, Math.min(maxR, r)), c: Math.max(0, Math.min(maxC, c)) };
739
+ reveal(next.r, next.c);
740
+ pendingFocus.current = focus;
741
+ setActive(next);
742
+ },
743
+ [maxR, maxC, reveal]
744
+ );
745
+ const resetPage = () => setPage(0);
746
+ const applySort = (next) => {
747
+ setSortState(next);
748
+ resetPage();
749
+ };
750
+ const setFilter = (id, filter) => {
751
+ const next = { ...filters };
752
+ if (filter) next[id] = filter;
753
+ else delete next[id];
754
+ setFiltersState(next);
755
+ resetPage();
756
+ };
757
+ const setGroup = (id, on) => {
758
+ setGroupByState(
759
+ on ? [...groupBy.filter((x) => x !== id), id] : groupBy.filter((x) => x !== id)
760
+ );
761
+ resetPage();
762
+ };
763
+ const setDensity = (next) => {
764
+ grid.setDensity(next);
765
+ onDensityChange?.(next);
766
+ };
767
+ const toggleGroupRow = (key) => {
768
+ setCollapsed((previous) => {
769
+ const next = new Set(previous);
770
+ if (next.has(key)) next.delete(key);
771
+ else next.add(key);
772
+ return next;
773
+ });
774
+ };
775
+ const toggleRow = (key, range) => {
776
+ const willSelect = !selected.has(key);
777
+ const keys = range ? rangeBetween(visibleKeys, anchor.current, key) : [key];
778
+ const next = new Set(selected);
779
+ for (const k of keys) {
780
+ if (willSelect) next.add(k);
781
+ else next.delete(k);
782
+ }
783
+ anchor.current = key;
784
+ setSelection([...next]);
785
+ };
786
+ const toggleAll = () => {
787
+ const next = new Set(selected);
788
+ const everything = allKeys.length > 0 && selectedInView === allKeys.length;
789
+ for (const key of allKeys) {
790
+ if (everything) next.delete(key);
791
+ else next.add(key);
792
+ }
793
+ setSelection([...next]);
794
+ };
795
+ const neighbourOf = (id, delta) => {
796
+ const index = dataColumns.findIndex((column) => column.id === id);
797
+ const neighbour = dataColumns[index + delta];
798
+ return neighbour && zoneOf.get(neighbour.id) === zoneOf.get(id) ? neighbour.id : null;
799
+ };
800
+ const moveColumn = (id, delta) => {
801
+ const neighbour = neighbourOf(id, delta);
802
+ if (!neighbour) return false;
803
+ grid.moveTo(id, neighbour, delta < 0 ? "before" : "after");
804
+ return true;
805
+ };
806
+ const exportCsv = () => {
807
+ if (exportFilename === false) return;
808
+ const rows = selectable && selection.length > 0 ? sorted.filter((row) => selected.has(keyOf(row))) : sorted;
809
+ const csv = toCSV(rows, dataColumns, { bom: true });
810
+ onExport?.({ csv, filename: exportFilename, rowCount: rows.length });
811
+ downloadCSV(exportFilename, csv);
812
+ };
813
+ const xlsxName = exportXlsx === true ? "datos.xlsx" : exportXlsx || null;
814
+ const exportToXlsx = async () => {
815
+ if (!xlsxName) return;
816
+ const rows = selectable && selection.length > 0 ? sorted.filter((row) => selected.has(keyOf(row))) : sorted;
817
+ const filename = xlsxFilename(xlsxName);
818
+ const { buildXlsx, XLSX_MIME } = await import("../../xlsx/index.js");
819
+ const bytes = buildXlsx({
820
+ sheets: [gridToSheet(rows, dataColumns, filename.replace(/\.xlsx$/i, ""))],
821
+ creator: "@jcsoftdev/ui"
822
+ });
823
+ onExportXlsx?.({ bytes, filename, rowCount: rows.length });
824
+ downloadFile(filename, bytes, XLSX_MIME);
825
+ };
826
+ const labelOfRow = (key) => {
827
+ const row = rowByKey.get(key);
828
+ const first = dataColumns[0];
829
+ return row && first ? formatCellValue(getCellValue(row, first), first) || key : key;
830
+ };
831
+ const setExpandedRow = (key, open) => {
832
+ const isOpen = expandedSet.has(key);
833
+ if ((open ?? !isOpen) === isOpen) return;
834
+ setExpanded([...toggleSetMember(expandedSet, key)]);
835
+ };
836
+ const pinRow = (key, side) => {
837
+ setPinnedRowIds(togglePinnedRow(pinnedRowIds, key, side));
838
+ };
839
+ const reorderRow = (key, target) => {
840
+ if (!reorderAllowed) return false;
841
+ const order = data.map(keyOf);
842
+ const next = "delta" in target ? moveRowBy(order, key, target.delta) : moveRowTo(order, key, target.id, target.place);
843
+ const fromIndex = order.indexOf(key);
844
+ const toIndex = next.indexOf(key);
845
+ if (fromIndex === -1 || fromIndex === toIndex) return false;
846
+ onRowReorder?.({ rowId: key, fromIndex, toIndex, order: next });
847
+ setAnnouncement(labels.rowMoved(labelOfRow(key), toIndex + 1, order.length));
848
+ return true;
849
+ };
850
+ const cellAt = (r, c) => {
851
+ const row = bodyRows[r - 1];
852
+ const entry = renderColumns[c];
853
+ return row?.kind === "data" && entry?.kind === "data" ? { row: row.row, column: entry.column } : null;
854
+ };
855
+ const copyRange = () => {
856
+ if (!cellRange) return;
857
+ const bounds = rangeBounds(cellRange);
858
+ const text = rangeToTSV(bounds, (r, c) => {
859
+ const cell = cellAt(r, c);
860
+ return cell ? formatCellValue(getCellValue(cell.row, cell.column), cell.column) : null;
861
+ });
862
+ writeClipboard(text);
863
+ const cells = (bounds.r1 - bounds.r0 + 1) * (bounds.c1 - bounds.c0 + 1);
864
+ setAnnouncement(labels.rangeCopied(cells));
865
+ };
866
+ const openChart = () => {
867
+ if (!cellRange) return;
868
+ const bounds = rangeBounds(cellRange);
869
+ const headers = [];
870
+ const columnIds = [];
871
+ for (let c = bounds.c0; c <= bounds.c1; c += 1) {
872
+ const entry = renderColumns[c];
873
+ headers.push(entry?.kind === "data" ? entry.column.header : "");
874
+ columnIds.push(entry ? idOfColumn(entry) : String(c));
875
+ }
876
+ const cells = [];
877
+ for (let r = bounds.r0; r <= bounds.r1; r += 1) {
878
+ const line = [];
879
+ for (let c = bounds.c0; c <= bounds.c1; c += 1) {
880
+ const cell = cellAt(r, c);
881
+ line.push(
882
+ cell ? {
883
+ value: getCellValue(cell.row, cell.column),
884
+ text: formatCellValue(getCellValue(cell.row, cell.column), cell.column)
885
+ } : null
886
+ );
887
+ }
888
+ cells.push(line);
889
+ }
890
+ const data2 = rangeToChart({ headers, columnIds, cells, rowLabel: labels.chartRow });
891
+ const currency = !!data2 && data2.series.length > 0 && data2.series.every((series) => byId.get(series.id)?.type === "currency");
892
+ setChart({
893
+ data: data2,
894
+ kind: "bar",
895
+ cells: (bounds.r1 - bounds.r0 + 1) * (bounds.c1 - bounds.c0 + 1),
896
+ currency
897
+ });
898
+ setAnnouncement(data2 ? labels.chartTitle(rangeCellCount) : labels.chartNoData);
899
+ };
900
+ const onCellPointerDown = (event, r, c) => {
901
+ if (!rangeSelection || event.button !== 0 || editingRef.current || event.pointerType === "touch")
902
+ return;
903
+ if (event.target.closest("button,input,select,a,textarea,[data-detail-content]"))
904
+ return;
905
+ if (event.shiftKey && cellRange) {
906
+ setCellRange({ anchor: cellRange.anchor, focus: { r, c } });
907
+ return;
908
+ }
909
+ setCellRange({ anchor: { r, c }, focus: { r, c } });
910
+ const move = (moveEvent) => {
911
+ const cell = document.elementFromPoint(moveEvent.clientX, moveEvent.clientY)?.closest("td[data-r]");
912
+ if (!cell || !gridRef.current?.contains(cell)) return;
913
+ const nextR = Number(cell.dataset.r);
914
+ const nextC = Number(cell.dataset.c);
915
+ setCellRange(
916
+ (previous) => previous && (previous.focus.r !== nextR || previous.focus.c !== nextC) ? { anchor: previous.anchor, focus: { r: nextR, c: nextC } } : previous
917
+ );
918
+ };
919
+ const end = () => {
920
+ window.removeEventListener("pointermove", move);
921
+ window.removeEventListener("pointerup", end);
922
+ window.removeEventListener("pointercancel", end);
923
+ };
924
+ window.addEventListener("pointermove", move);
925
+ window.addEventListener("pointerup", end);
926
+ window.addEventListener("pointercancel", end);
927
+ };
928
+ const rawValue = (row, column) => getCellValue(row, columnsProp.find((x) => x.id === column.id) ?? column);
929
+ const coerceDraft = (column, row, draft, loose = false) => {
930
+ let value = draft;
931
+ if (formulasOn && isFormulaText(draft)) return { value: draft.trim() };
932
+ if (editorOf(column) === "number") {
933
+ const number = loose ? parseLooseNumber(draft) : Number.parseFloat(draft.replace(",", "."));
934
+ if (number !== null && Number.isFinite(number)) value = number;
935
+ else return { error: labels.invalidCell };
936
+ }
937
+ const error = column.validate?.(value, row);
938
+ return error ? { error } : { value };
939
+ };
940
+ const historyRef = useRef(createHistory(historyDepth));
941
+ const [historySummary, setHistorySummary] = useState(
942
+ () => summarizeHistory(historyRef.current)
943
+ );
944
+ const syncHistory = (next) => {
945
+ historyRef.current = next;
946
+ const summary = summarizeHistory(next);
947
+ setHistorySummary(summary);
948
+ onHistoryChange?.(summary);
949
+ };
950
+ useEffect(() => {
951
+ if (historyRef.current.depth !== Math.max(1, Math.floor(historyDepth))) {
952
+ syncHistory(setHistoryDepth(historyRef.current, historyDepth));
953
+ }
954
+ }, [historyDepth]);
955
+ const record = (command) => {
956
+ if (historyEnabled) syncHistory(pushCommand(historyRef.current, command));
957
+ };
958
+ const canWrite = !!(onCellChange || onCellsChange);
959
+ const emitChanges = (changes) => {
960
+ if (changes.length === 0) return;
961
+ if (changes.length === 1 && onCellChange) onCellChange(changes[0]);
962
+ else if (onCellsChange) onCellsChange(changes);
963
+ else for (const change of changes) onCellChange?.(change);
964
+ };
965
+ const commitChanges = (items, source) => {
966
+ if (items.length === 0) return;
967
+ emitChanges(
968
+ items.map((item) => ({
969
+ row: item.row,
970
+ rowId: item.rowId,
971
+ columnId: item.column.id,
972
+ value: item.value,
973
+ previous: item.previous,
974
+ source
975
+ }))
976
+ );
977
+ const deltas = items.map((item) => ({
978
+ rowId: item.rowId,
979
+ columnId: item.column.id,
980
+ before: item.previous,
981
+ after: item.value
982
+ }));
983
+ record({ kind: "cells", source, changes: deltas });
984
+ };
985
+ const replay = (command, source) => {
986
+ if (command.kind === "cells") {
987
+ const changes = [];
988
+ for (const delta of command.changes) {
989
+ const row = rowByKey.get(delta.rowId);
990
+ const column = byId.get(delta.columnId);
991
+ if (!row || !column) continue;
992
+ changes.push({
993
+ row,
994
+ rowId: delta.rowId,
995
+ columnId: delta.columnId,
996
+ value: delta.after,
997
+ previous: rawValue(row, column),
998
+ source
999
+ });
1000
+ }
1001
+ emitChanges(changes);
1002
+ return;
1003
+ }
1004
+ const rows = [...command.rows].sort((a, b) => a.index - b.index);
1005
+ onRowsChange?.({ type: command.kind === "rows-add" ? "add" : "remove", rows, source });
1006
+ };
1007
+ const undo = () => {
1008
+ const step = undoCommand(historyRef.current);
1009
+ if (!step) return;
1010
+ syncHistory(step.state);
1011
+ replay(step.apply, "undo");
1012
+ setAnnouncement(labels.undone(commandSize(step.apply)));
1013
+ };
1014
+ const redo = () => {
1015
+ const step = redoCommand(historyRef.current);
1016
+ if (!step) return;
1017
+ syncHistory(step.state);
1018
+ replay(step.apply, "redo");
1019
+ setAnnouncement(labels.redone(commandSize(step.apply)));
1020
+ };
1021
+ const addRow = () => {
1022
+ if (!createRow || !onRowsChange) return;
1023
+ const row = createRow();
1024
+ const index = dataProp.length;
1025
+ const ref = {
1026
+ row,
1027
+ rowId: getRowIdProp ? getRowIdProp(row, index) : String(index),
1028
+ index
1029
+ };
1030
+ onRowsChange({ type: "add", rows: [ref], source: "edit" });
1031
+ record({ kind: "rows-add", rows: [ref] });
1032
+ };
1033
+ const removeSelectedRows = () => {
1034
+ if (!onRowsChange || selection.length === 0) return;
1035
+ const positions2 = /* @__PURE__ */ new Map();
1036
+ dataProp.forEach((row, index) => {
1037
+ positions2.set(row, index);
1038
+ });
1039
+ const rows = [];
1040
+ for (const key of selection) {
1041
+ const row = rowByKey.get(key);
1042
+ const index = row === void 0 ? void 0 : positions2.get(row);
1043
+ if (row !== void 0 && index !== void 0) rows.push({ row, rowId: key, index });
1044
+ }
1045
+ rows.sort((a, b) => a.index - b.index);
1046
+ if (rows.length === 0) return;
1047
+ onRowsChange({ type: "remove", rows, source: "edit" });
1048
+ record({ kind: "rows-remove", rows });
1049
+ setSelection([]);
1050
+ };
1051
+ const onPaste = (event) => {
1052
+ const target = event.target;
1053
+ if (!canWrite || editingRef.current || target.closest("input,textarea,select,[data-detail-content]"))
1054
+ return;
1055
+ const text = event.clipboardData.getData("text/plain");
1056
+ if (!text) return;
1057
+ event.preventDefault();
1058
+ const bounds = cellRange ? rangeBounds(cellRange) : null;
1059
+ const origin = bounds ? { r: bounds.r0, c: bounds.c0 } : { r: activeR, c: activeC };
1060
+ const items = [];
1061
+ for (const cellTarget of planPaste(parseTSV(text), origin, { maxR, maxC }, bounds)) {
1062
+ const cell = cellAt(cellTarget.r, cellTarget.c);
1063
+ if (!cell || !canEdit(cell.column, cell.row)) continue;
1064
+ const result = coerceDraft(cell.column, cell.row, cellTarget.text, true);
1065
+ const previous = rawValue(cell.row, cell.column);
1066
+ if ("error" in result || sameCellValue(result.value, previous)) continue;
1067
+ items.push({
1068
+ row: cell.row,
1069
+ rowId: keyOf(cell.row),
1070
+ column: cell.column,
1071
+ value: result.value,
1072
+ previous
1073
+ });
1074
+ }
1075
+ commitChanges(items, "paste");
1076
+ if (items.length > 0) setAnnouncement(labels.pasted(items.length));
1077
+ };
1078
+ const fillItem = (from, to, source, shift) => {
1079
+ let value = source;
1080
+ if (shift && sourceIndex && isFormulaText(value)) {
1081
+ const dr = (sourceIndex.rows.get(to.row) ?? 0) - (sourceIndex.rows.get(from.row) ?? 0);
1082
+ const dc = (sourceIndex.cols.get(to.column.id) ?? 0) - (sourceIndex.cols.get(from.column.id) ?? 0);
1083
+ value = shiftFormula(value, dr, dc);
1084
+ }
1085
+ const result = typeof value === "string" ? coerceDraft(to.column, to.row, value, true) : { value };
1086
+ const previous = rawValue(to.row, to.column);
1087
+ if ("error" in result || sameCellValue(result.value, previous)) return null;
1088
+ return {
1089
+ row: to.row,
1090
+ rowId: keyOf(to.row),
1091
+ column: to.column,
1092
+ value: result.value,
1093
+ previous
1094
+ };
1095
+ };
1096
+ const fillByHandle = (base, extent, copyOnly) => {
1097
+ const items = [];
1098
+ for (const lane of fillLanes(base, extent)) {
1099
+ const sources = lane.source.map((pos) => cellAt(pos.r, pos.c));
1100
+ if (sources.some((cell) => !cell)) continue;
1101
+ const values = sources.map((cell) => {
1102
+ const known = cell;
1103
+ return rawValue(known.row, known.column);
1104
+ });
1105
+ const plan = copyOnly ? copyFill(lane.targets.length, values.length, isBackward(extent.direction)) : seriesFill(values, lane.targets.length, {
1106
+ backward: isBackward(extent.direction),
1107
+ dateStep: fillSeriesOptions?.dateStep
1108
+ });
1109
+ lane.targets.forEach((pos, i) => {
1110
+ const to = cellAt(pos.r, pos.c);
1111
+ const step = plan[i];
1112
+ if (!to || !step || !canEdit(to.column, to.row)) return;
1113
+ const item = "from" in step ? fillItem(
1114
+ sources[step.from],
1115
+ to,
1116
+ values[step.from],
1117
+ true
1118
+ ) : fillItem(to, to, step.value, false);
1119
+ if (item) items.push(item);
1120
+ });
1121
+ }
1122
+ commitChanges(items, "fill");
1123
+ setCellRange({
1124
+ anchor: { r: extent.bounds.r0, c: extent.bounds.c0 },
1125
+ focus: { r: extent.bounds.r1, c: extent.bounds.c1 }
1126
+ });
1127
+ if (items.length > 0) setAnnouncement(labels.filled(items.length));
1128
+ };
1129
+ const onFillHandleDown = (event) => {
1130
+ if (event.button !== 0 || !cellRange || !canWrite) return;
1131
+ event.preventDefault();
1132
+ event.stopPropagation();
1133
+ const base = rangeBounds(cellRange);
1134
+ let extent = null;
1135
+ let cancelled = false;
1136
+ let pointer = { x: event.clientX, y: event.clientY };
1137
+ let frame = 0;
1138
+ const viewport = () => {
1139
+ const scroller = scrollerRef.current;
1140
+ if (!scroller) return null;
1141
+ const box = scroller.getBoundingClientRect();
1142
+ let head = box.top;
1143
+ for (const th of scroller.querySelectorAll("thead th")) {
1144
+ head = Math.max(head, th.getBoundingClientRect().bottom);
1145
+ }
1146
+ return { left: box.left, right: box.right, top: head, bottom: box.bottom };
1147
+ };
1148
+ const update = () => {
1149
+ const view = viewport();
1150
+ if (!view) return;
1151
+ const x = Math.min(Math.max(pointer.x, view.left + 2), view.right - 2);
1152
+ const y = Math.min(Math.max(pointer.y, view.top + 2), view.bottom - 2);
1153
+ const cell = document.elementFromPoint(x, y)?.closest("td[data-r]");
1154
+ if (!cell || !gridRef.current?.contains(cell)) return;
1155
+ extent = handleExtent(
1156
+ base,
1157
+ { r: Number(cell.dataset.r), c: Number(cell.dataset.c) },
1158
+ { maxR, maxC, minR: 1, minC: 0 }
1159
+ );
1160
+ setFillPreview(extent?.bounds ?? null);
1161
+ };
1162
+ const autoScroll = () => {
1163
+ frame = requestAnimationFrame(autoScroll);
1164
+ const view = viewport();
1165
+ const scroller = scrollerRef.current;
1166
+ if (!view || !scroller) return;
1167
+ const dx = edgeScrollStep(pointer.x, view.left, view.right);
1168
+ const dy = edgeScrollStep(pointer.y, view.top, view.bottom);
1169
+ if (dx === 0 && dy === 0) return;
1170
+ const before = { left: scroller.scrollLeft, top: scroller.scrollTop };
1171
+ scroller.scrollLeft += dx;
1172
+ scroller.scrollTop += dy;
1173
+ if (scroller.scrollLeft !== before.left || scroller.scrollTop !== before.top) update();
1174
+ };
1175
+ const move = (moveEvent) => {
1176
+ pointer = { x: moveEvent.clientX, y: moveEvent.clientY };
1177
+ update();
1178
+ };
1179
+ const key = (keyEvent) => {
1180
+ if (keyEvent.key !== "Escape") return;
1181
+ cancelled = true;
1182
+ finish(false);
1183
+ };
1184
+ const finish = (apply, copyOnly = false) => {
1185
+ window.removeEventListener("pointermove", move);
1186
+ window.removeEventListener("pointerup", up);
1187
+ window.removeEventListener("pointercancel", cancel);
1188
+ window.removeEventListener("keydown", key);
1189
+ cancelAnimationFrame(frame);
1190
+ setFillPreview(null);
1191
+ if (apply && !cancelled && extent) fillByHandle(base, extent, copyOnly);
1192
+ };
1193
+ const up = (upEvent) => finish(true, upEvent.ctrlKey || upEvent.metaKey);
1194
+ const cancel = () => finish(false);
1195
+ window.addEventListener("pointermove", move);
1196
+ window.addEventListener("pointerup", up);
1197
+ window.addEventListener("pointercancel", cancel);
1198
+ window.addEventListener("keydown", key);
1199
+ frame = requestAnimationFrame(autoScroll);
1200
+ };
1201
+ const fillRange = (direction) => {
1202
+ if (!canWrite) return;
1203
+ const bounds = cellRange ? rangeBounds(cellRange) : direction === "down" ? { r0: activeR - 1, r1: activeR, c0: activeC, c1: activeC } : { r0: activeR, r1: activeR, c0: activeC - 1, c1: activeC };
1204
+ if (bounds.r0 < 1 || bounds.c0 < 0) return;
1205
+ const items = [];
1206
+ for (const step of planFill(bounds, direction)) {
1207
+ const from = cellAt(step.from.r, step.from.c);
1208
+ const to = cellAt(step.r, step.c);
1209
+ if (!from || !to || !canEdit(to.column, to.row)) continue;
1210
+ const item = fillItem(from, to, rawValue(from.row, from.column), true);
1211
+ if (item) items.push(item);
1212
+ }
1213
+ commitChanges(items, "fill");
1214
+ if (items.length > 0) setAnnouncement(labels.filled(items.length));
1215
+ };
1216
+ const startEdit = (key, column, typed) => {
1217
+ const row = rowByKey.get(key);
1218
+ if (!row || !canEdit(column, row)) return false;
1219
+ const value = rawValue(row, column);
1220
+ setEditing({
1221
+ key,
1222
+ columnId: column.id,
1223
+ draft: typed ?? (value === null || value === void 0 ? "" : String(value)),
1224
+ caretEnd: typed !== void 0
1225
+ });
1226
+ return true;
1227
+ };
1228
+ const commitEdit = (strict = false) => {
1229
+ const current = editingRef.current;
1230
+ if (!current) return true;
1231
+ const row = rowByKey.get(current.key);
1232
+ const column = byId.get(current.columnId);
1233
+ const close = () => {
1234
+ editingRef.current = null;
1235
+ setEditing(null);
1236
+ };
1237
+ if (!row || !column) {
1238
+ close();
1239
+ return true;
1240
+ }
1241
+ const previous = rawValue(row, column);
1242
+ const result = coerceDraft(column, row, current.draft);
1243
+ if ("error" in result) {
1244
+ if (!strict) {
1245
+ close();
1246
+ return true;
1247
+ }
1248
+ const next = { ...current, error: result.error };
1249
+ editingRef.current = next;
1250
+ setEditing(next);
1251
+ return false;
1252
+ }
1253
+ close();
1254
+ if (!sameCellValue(result.value, previous)) {
1255
+ commitChanges([{ row, rowId: current.key, column, value: result.value, previous }], "edit");
1256
+ }
1257
+ return true;
1258
+ };
1259
+ const cancelEdit = () => {
1260
+ editingRef.current = null;
1261
+ setEditing(null);
1262
+ };
1263
+ const nextEditable = (r, c, step) => {
1264
+ let row = r;
1265
+ let col = c + step;
1266
+ while (row >= 1 && row <= maxR) {
1267
+ const display = bodyRows[row - 1];
1268
+ if (display?.kind === "data") {
1269
+ while (col >= 0 && col <= maxC) {
1270
+ const entry = renderColumns[col];
1271
+ if (entry?.kind === "data" && canEdit(entry.column, display.row))
1272
+ return { r: row, c: col };
1273
+ col += step;
1274
+ }
1275
+ }
1276
+ row += step;
1277
+ col = step > 0 ? 0 : maxC;
1278
+ }
1279
+ return null;
1280
+ };
1281
+ const onEditorKey = (event, r, c) => {
1282
+ event.stopPropagation();
1283
+ if (event.key === "Escape") {
1284
+ event.preventDefault();
1285
+ cancelEdit();
1286
+ focusCell(r, c);
1287
+ } else if (event.key === "Enter") {
1288
+ event.preventDefault();
1289
+ if (!commitEdit(true)) return;
1290
+ focusCell(Math.min(r + 1, maxR), c);
1291
+ } else if (event.key === "Tab") {
1292
+ event.preventDefault();
1293
+ if (!commitEdit(true)) return;
1294
+ const next = nextEditable(r, c, event.shiftKey ? -1 : 1);
1295
+ if (!next) {
1296
+ focusCell(r, c);
1297
+ return;
1298
+ }
1299
+ const target = bodyRows[next.r - 1];
1300
+ const entry = renderColumns[next.c];
1301
+ focusCell(next.r, next.c, false);
1302
+ if (target?.kind === "data" && entry?.kind === "data") startEdit(target.key, entry.column);
1303
+ }
1304
+ };
1305
+ const onGridKeyDown = (event) => {
1306
+ const target = event.target;
1307
+ if (target.closest("[data-detail-content]")) return;
1308
+ const cell = target.closest("[data-r]");
1309
+ if (!cell || !event.currentTarget.contains(cell)) return;
1310
+ const r = Number(cell.dataset.r);
1311
+ const start = Number(cell.dataset.c);
1312
+ const spanEnd = Number(cell.dataset.cEnd ?? start);
1313
+ const c = activeR === r && activeC >= start && activeC <= spanEnd ? activeC : start;
1314
+ const inner = target !== cell;
1315
+ if (inner && (event.key === "Enter" || event.key === " ")) return;
1316
+ const entry = renderColumns[c];
1317
+ const row = r > 0 ? bodyRows[r - 1] : void 0;
1318
+ const handled = () => event.preventDefault();
1319
+ const mod = event.ctrlKey || event.metaKey;
1320
+ if (mod && !event.altKey && !target.closest("input,textarea,select")) {
1321
+ const letter = event.key.toLowerCase();
1322
+ if (historyEnabled && (letter === "z" || letter === "y" && !event.shiftKey)) {
1323
+ handled();
1324
+ if (letter === "y" || event.shiftKey) redo();
1325
+ else undo();
1326
+ return;
1327
+ }
1328
+ if (r > 0 && canWrite && !event.shiftKey && (letter === "d" || letter === "r")) {
1329
+ handled();
1330
+ fillRange(letter === "d" ? "down" : "right");
1331
+ return;
1332
+ }
1333
+ }
1334
+ if (r === 0 && entry?.kind === "data") {
1335
+ const id = entry.column.id;
1336
+ if ((event.key === "ArrowLeft" || event.key === "ArrowRight") && event.shiftKey) {
1337
+ const delta = event.key === "ArrowLeft" ? -1 : 1;
1338
+ handled();
1339
+ if (mod) {
1340
+ if (entry.column.reorderable !== false && moveColumn(id, delta)) focusCell(0, c + delta);
1341
+ } else if (entry.column.resizable !== false) {
1342
+ grid.setWidth(id, (shownWidths[id] ?? 160) + delta * 16);
1343
+ }
1344
+ return;
1345
+ }
1346
+ if (event.key === "ArrowDown" && event.altKey) {
1347
+ handled();
1348
+ setMenuColumn(id);
1349
+ return;
1350
+ }
1351
+ if (event.key === "Enter" || event.key === " ") {
1352
+ handled();
1353
+ if (entry.column.sortable !== false) applySort(toggleSort(sort, id, event.shiftKey));
1354
+ return;
1355
+ }
1356
+ }
1357
+ if (r > 0 && rangeSelection && !event.altKey) {
1358
+ const step = ARROW_STEPS[event.key];
1359
+ if (step && event.shiftKey) {
1360
+ handled();
1361
+ const from = { r, c: Math.max(c, firstDataIndex) };
1362
+ const base = cellRange ?? { anchor: from, focus: from };
1363
+ const next = extendRange(base, step.dr * (mod ? maxR : 1), step.dc * (mod ? maxC : 1), {
1364
+ minR: 1,
1365
+ maxR,
1366
+ minC: Math.max(0, firstDataIndex),
1367
+ maxC
1368
+ });
1369
+ setCellRange(next);
1370
+ focusCell(next.focus.r, next.focus.c);
1371
+ return;
1372
+ }
1373
+ if (mod && event.key.toLowerCase() === "c" && cellRange) {
1374
+ handled();
1375
+ copyRange();
1376
+ return;
1377
+ }
1378
+ if (mod && event.key.toLowerCase() === "a" && !selectable) {
1379
+ handled();
1380
+ setCellRange({
1381
+ anchor: { r: 1, c: Math.max(0, firstDataIndex) },
1382
+ focus: { r: maxR, c: maxC }
1383
+ });
1384
+ return;
1385
+ }
1386
+ if (cellRange && (step || ["Home", "End", "PageUp", "PageDown", "Escape"].includes(event.key))) {
1387
+ setCellRange(null);
1388
+ }
1389
+ }
1390
+ if (r > 0 && row?.kind === "data" && event.altKey && !mod) {
1391
+ const vertical = event.key === "ArrowUp" ? -1 : event.key === "ArrowDown" ? 1 : 0;
1392
+ if (vertical !== 0 && event.shiftKey && pinningEnabled) {
1393
+ handled();
1394
+ pinRow(row.key, vertical < 0 ? "top" : "bottom");
1395
+ return;
1396
+ }
1397
+ if (vertical !== 0 && !event.shiftKey && reorderAllowed && !pinnedSideOf(pinnedRowIds, row.key)) {
1398
+ handled();
1399
+ if (reorderRow(row.key, { delta: vertical })) focusCell(r + vertical, c);
1400
+ return;
1401
+ }
1402
+ if (event.key === "ArrowRight" || event.key === "ArrowLeft") {
1403
+ const expandable = detailEnabled || !!row.tree?.hasChildren;
1404
+ if (expandable) {
1405
+ handled();
1406
+ setExpandedRow(row.key, event.key === "ArrowRight");
1407
+ return;
1408
+ }
1409
+ }
1410
+ }
1411
+ switch (event.key) {
1412
+ case "ArrowRight":
1413
+ handled();
1414
+ focusCell(r, spanEnd > start ? spanEnd + 1 : c + 1);
1415
+ return;
1416
+ case "ArrowLeft":
1417
+ handled();
1418
+ focusCell(r, spanEnd > start ? start - 1 : c - 1);
1419
+ return;
1420
+ case "ArrowDown":
1421
+ handled();
1422
+ focusCell(r + 1, c);
1423
+ return;
1424
+ case "ArrowUp":
1425
+ handled();
1426
+ focusCell(r - 1, c);
1427
+ return;
1428
+ case "Home":
1429
+ handled();
1430
+ if (mod && scrollerRef.current) scrollerRef.current.scrollTop = 0;
1431
+ focusCell(mod ? 0 : r, 0);
1432
+ return;
1433
+ case "End":
1434
+ handled();
1435
+ focusCell(mod ? maxR : r, maxC);
1436
+ return;
1437
+ case "PageDown":
1438
+ case "PageUp": {
1439
+ handled();
1440
+ const step = paged ? 10 : pageStep(rowHeight, bodyViewport);
1441
+ focusCell(Math.max(r === 0 ? 0 : 1, r + (event.key === "PageDown" ? step : -step)), c);
1442
+ return;
1443
+ }
1444
+ }
1445
+ if (mod && event.key.toLowerCase() === "a" && selectable) {
1446
+ handled();
1447
+ toggleAll();
1448
+ return;
1449
+ }
1450
+ if (r === 0 && entry?.kind === "select" && (event.key === " " || event.key === "Enter")) {
1451
+ handled();
1452
+ toggleAll();
1453
+ return;
1454
+ }
1455
+ if (!row || row.kind === "placeholder" || row.kind === "detail") return;
1456
+ if (row.kind === "group") {
1457
+ if (event.key === "Enter" || event.key === " ") {
1458
+ handled();
1459
+ toggleGroupRow(row.key);
1460
+ } else if (event.key === "ArrowRight" && row.collapsed) {
1461
+ handled();
1462
+ toggleGroupRow(row.key);
1463
+ }
1464
+ return;
1465
+ }
1466
+ if ((event.key === "Enter" || event.key === " ") && entry?.kind === "tools") {
1467
+ handled();
1468
+ if (detailEnabled) setExpandedRow(row.key);
1469
+ return;
1470
+ }
1471
+ if (event.key === " " && selectable) {
1472
+ handled();
1473
+ toggleRow(row.key, event.shiftKey);
1474
+ return;
1475
+ }
1476
+ if (formulasOn && event.key === "=" && !mod && !inner && entry?.kind === "data") {
1477
+ if (startEdit(row.key, entry.column, "=")) handled();
1478
+ return;
1479
+ }
1480
+ if ((event.key === "Enter" || event.key === "F2") && entry?.kind === "data") {
1481
+ if (startEdit(row.key, entry.column)) handled();
1482
+ else if (event.key === "Enter" && selectable && entry.kind === "data") return;
1483
+ }
1484
+ if (event.key === "Enter" && entry?.kind === "select") {
1485
+ handled();
1486
+ toggleRow(row.key, event.shiftKey);
1487
+ }
1488
+ };
1489
+ const onGridFocus = (event) => {
1490
+ if (event.target.closest("[data-detail-content]")) return;
1491
+ const cell = event.target.closest("[data-r]");
1492
+ if (!cell || !event.currentTarget.contains(cell)) return;
1493
+ const r = Number(cell.dataset.r);
1494
+ const c = Number(cell.dataset.c);
1495
+ const end = Number(cell.dataset.cEnd ?? c);
1496
+ if (r === active.r && active.c >= c && active.c <= end) return;
1497
+ setActive({ r, c });
1498
+ };
1499
+ const onResizeStart = (event, column) => {
1500
+ event.preventDefault();
1501
+ event.stopPropagation();
1502
+ resizing.current = true;
1503
+ const handle = event.currentTarget;
1504
+ const startX = event.clientX;
1505
+ const startWidth = shownWidths[column.id] ?? 160;
1506
+ const direction = zoneOf.get(column.id) === "right" ? -1 : 1;
1507
+ handle.setPointerCapture(event.pointerId);
1508
+ const move = (moveEvent) => grid.setWidth(column.id, startWidth + direction * (moveEvent.clientX - startX));
1509
+ const end = () => {
1510
+ resizing.current = false;
1511
+ handle.removeEventListener("pointermove", move);
1512
+ handle.removeEventListener("pointerup", end);
1513
+ handle.removeEventListener("pointercancel", end);
1514
+ };
1515
+ handle.addEventListener("pointermove", move);
1516
+ handle.addEventListener("pointerup", end);
1517
+ handle.addEventListener("pointercancel", end);
1518
+ };
1519
+ const onDragStart = (event, id) => {
1520
+ if (resizing.current) {
1521
+ event.preventDefault();
1522
+ return;
1523
+ }
1524
+ dragId.current = id;
1525
+ event.dataTransfer.effectAllowed = "move";
1526
+ event.dataTransfer.setData("text/plain", id);
1527
+ };
1528
+ const onDragOver = (event, id) => {
1529
+ const source = dragId.current;
1530
+ if (!source || source === id || zoneOf.get(source) !== zoneOf.get(id)) return;
1531
+ event.preventDefault();
1532
+ const rect = event.currentTarget.getBoundingClientRect();
1533
+ const place = event.clientX < rect.left + rect.width / 2 ? "before" : "after";
1534
+ setDropTarget(
1535
+ (previous) => previous?.id === id && previous.place === place ? previous : { id, place }
1536
+ );
1537
+ };
1538
+ const onDrop = (event, id) => {
1539
+ event.preventDefault();
1540
+ const source = dragId.current;
1541
+ const rect = event.currentTarget.getBoundingClientRect();
1542
+ const place = event.clientX < rect.left + rect.width / 2 ? "before" : "after";
1543
+ if (source && source !== id && zoneOf.get(source) === zoneOf.get(id)) {
1544
+ grid.moveTo(source, id, place);
1545
+ }
1546
+ dragId.current = null;
1547
+ setDropTarget(null);
1548
+ };
1549
+ const onDragEnd = () => {
1550
+ dragId.current = null;
1551
+ setDropTarget(null);
1552
+ };
1553
+ const onRowDragStart = (event, key) => {
1554
+ if (!reorderAllowed) {
1555
+ event.preventDefault();
1556
+ return;
1557
+ }
1558
+ rowDrag.current = key;
1559
+ event.dataTransfer.effectAllowed = "move";
1560
+ event.dataTransfer.setData("text/plain", key);
1561
+ const row = event.currentTarget.closest("tr");
1562
+ if (row) event.dataTransfer.setDragImage(row, 16, rowHeight / 2);
1563
+ };
1564
+ const dropPlace = (event) => {
1565
+ const rect = event.currentTarget.getBoundingClientRect();
1566
+ return event.clientY < rect.top + rect.height / 2 ? "before" : "after";
1567
+ };
1568
+ const onRowDragOver = (event, key) => {
1569
+ const source = rowDrag.current;
1570
+ if (!source || source === key) return;
1571
+ event.preventDefault();
1572
+ const place = dropPlace(event);
1573
+ setDropRow(
1574
+ (previous) => previous?.key === key && previous.place === place ? previous : { key, place }
1575
+ );
1576
+ };
1577
+ const onRowDrop = (event, key) => {
1578
+ event.preventDefault();
1579
+ const source = rowDrag.current;
1580
+ if (source && source !== key) reorderRow(source, { id: key, place: dropPlace(event) });
1581
+ rowDrag.current = null;
1582
+ setDropRow(null);
1583
+ };
1584
+ const onRowDragEnd = () => {
1585
+ rowDrag.current = null;
1586
+ setDropRow(null);
1587
+ };
1588
+ const pinOf = (entry) => positions[idOfColumn(entry)];
1589
+ const pinStyle = (position) => position ? { [position.side]: position.offset } : void 0;
1590
+ const pinShadow = (position) => position?.edge && (position.side === "left" ? scrolled.start : scrolled.end) && (position.side === "left" ? "shadow-pinned-start" : "shadow-pinned-end");
1591
+ const cellBase = "overflow-hidden border-b-divider px-3 outline-none focus-visible:outline-2 focus-visible:outline-accent focus-visible:-outline-offset-2 @max-sm/grid:px-2";
1592
+ const tabIndexOf = (r, c) => tabbable.r === r && tabbable.c === c ? 0 : -1;
1593
+ const firstDataIndex = renderColumns.findIndex((entry) => entry.kind === "data");
1594
+ const cellLetter = (id) => columnLabel(sourceIndex?.cols.get(id) ?? 0);
1595
+ const sortOf = (id) => {
1596
+ const index = sort.findIndex((rule) => rule.id === id);
1597
+ return index === -1 ? null : { index, direction: sort[index].direction };
1598
+ };
1599
+ const renderHeader = (entry, c) => {
1600
+ const position = pinOf(entry);
1601
+ const common = {
1602
+ "data-r": 0,
1603
+ "data-c": c,
1604
+ tabIndex: tabIndexOf(0, c),
1605
+ style: { ...pinStyle(position), top: headerTop, height: headerHeight }
1606
+ };
1607
+ const sticky = cn("sticky bg-surface", position ? "z-3" : "z-2", pinShadow(position));
1608
+ if (entry.kind === "tools") {
1609
+ return /* @__PURE__ */ jsx("th", { className: cn(cellBase, sticky, "px-0"), ...common, children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: labels.rowActions }) }, TOOLS_ID);
1610
+ }
1611
+ if (entry.kind === "select") {
1612
+ const all = allKeys.length > 0 && selectedInView === allKeys.length;
1613
+ return /* @__PURE__ */ jsx("th", { className: cn(cellBase, sticky, "px-0 text-center"), ...common, children: /* @__PURE__ */ jsx(
1614
+ "input",
1615
+ {
1616
+ type: "checkbox",
1617
+ tabIndex: -1,
1618
+ "aria-label": labels.selectAll,
1619
+ className: "size-4 align-middle accent-accent",
1620
+ checked: all,
1621
+ ref: (node) => {
1622
+ if (node) node.indeterminate = selectedInView > 0 && !all;
1623
+ },
1624
+ onChange: toggleAll
1625
+ }
1626
+ ) }, SELECT_ID);
1627
+ }
1628
+ const { column } = entry;
1629
+ const align = columnAlign(column);
1630
+ const state = sortOf(column.id);
1631
+ const sortable = column.sortable !== false;
1632
+ const reorderable = column.reorderable !== false;
1633
+ const zone = zoneOf.get(column.id) ?? "center";
1634
+ const neighbourLeft = neighbourOf(column.id, -1);
1635
+ const neighbourRight = neighbourOf(column.id, 1);
1636
+ const drop = dropTarget?.id === column.id ? dropTarget.place : null;
1637
+ return /* @__PURE__ */ jsxs(
1638
+ "th",
1639
+ {
1640
+ "aria-sort": state?.index === 0 ? state.direction === "asc" ? "ascending" : "descending" : void 0,
1641
+ draggable: reorderable && !editing,
1642
+ onDragStart: (event) => onDragStart(event, column.id),
1643
+ onDragOver: (event) => onDragOver(event, column.id),
1644
+ onDragLeave: () => setDropTarget(null),
1645
+ onDrop: (event) => onDrop(event, column.id),
1646
+ onDragEnd,
1647
+ onClick: (event) => {
1648
+ if (event.target.closest("button,[data-resize]")) return;
1649
+ if (sortable) applySort(toggleSort(sort, column.id, event.shiftKey));
1650
+ },
1651
+ className: cn(
1652
+ cellBase,
1653
+ sticky,
1654
+ "select-none whitespace-nowrap font-[650] text-[11px] text-ink-3 uppercase tracking-[.07em]",
1655
+ sortable && "cursor-pointer hover:text-ink",
1656
+ drop === "before" && "shadow-[inset_2px_0_0_var(--accent)]",
1657
+ drop === "after" && "shadow-[inset_-2px_0_0_var(--accent)]"
1658
+ ),
1659
+ "data-zone": zone,
1660
+ ...common,
1661
+ children: [
1662
+ /* @__PURE__ */ jsxs(
1663
+ "div",
1664
+ {
1665
+ className: cn("flex min-w-0 items-center gap-1", align === "end" && "flex-row-reverse"),
1666
+ children: [
1667
+ /* @__PURE__ */ jsxs("span", { className: cn("flex min-w-0 flex-1 items-center gap-1", justifyClass[align]), children: [
1668
+ formulasOn ? /* @__PURE__ */ jsx(
1669
+ "span",
1670
+ {
1671
+ "aria-hidden": "true",
1672
+ className: "shrink-0 rounded-xs bg-surface-2 px-1 font-[650] text-[10px] text-ink-3 normal-case tracking-normal",
1673
+ children: cellLetter(column.id)
1674
+ }
1675
+ ) : null,
1676
+ /* @__PURE__ */ jsx("span", { className: "truncate", title: column.header, children: column.header }),
1677
+ state ? /* @__PURE__ */ jsxs("span", { className: "inline-flex shrink-0 items-center text-accent-ink", children: [
1678
+ state.direction === "asc" ? /* @__PURE__ */ jsx(ArrowUp, { "aria-hidden": "true", className: "size-3" }) : /* @__PURE__ */ jsx(ArrowDown, { "aria-hidden": "true", className: "size-3" }),
1679
+ sort.length > 1 ? /* @__PURE__ */ jsx("span", { className: "text-[10px] tabular-nums", children: state.index + 1 }) : null,
1680
+ state.index > 0 ? /* @__PURE__ */ jsx("span", { className: "sr-only", children: state.direction === "asc" ? labels.sortAsc : labels.sortDesc }) : null
1681
+ ] }) : null
1682
+ ] }),
1683
+ /* @__PURE__ */ jsx(
1684
+ ColumnMenu,
1685
+ {
1686
+ column,
1687
+ labels,
1688
+ open: menuColumn === column.id,
1689
+ onOpenChange: (open) => setMenuColumn(open ? column.id : null),
1690
+ onCloseFocus: () => focusCell(0, c),
1691
+ sortDirection: state?.direction ?? null,
1692
+ filter: filters[column.id],
1693
+ values: () => distinctValues(data, column),
1694
+ pinned: zone === "center" ? null : zone,
1695
+ grouped: groupBy.includes(column.id),
1696
+ canMoveLeft: !!neighbourLeft,
1697
+ canMoveRight: !!neighbourRight,
1698
+ canHide: column.hideable !== false && dataColumns.length > 1,
1699
+ onSort: (direction) => applySort(direction ? [{ id: column.id, direction }] : []),
1700
+ onFilter: (filter) => setFilter(column.id, filter),
1701
+ onPin: (side) => grid.pin(column.id, side),
1702
+ onGroup: (on) => setGroup(column.id, on),
1703
+ onMove: (delta) => moveColumn(column.id, delta),
1704
+ onResize: (delta) => delta === null ? grid.resetWidth(column.id) : grid.setWidth(column.id, (shownWidths[column.id] ?? 160) + delta),
1705
+ onHide: () => {
1706
+ setMenuColumn(null);
1707
+ grid.setHidden(column.id, true);
1708
+ }
1709
+ }
1710
+ )
1711
+ ]
1712
+ }
1713
+ ),
1714
+ column.resizable !== false ? /* @__PURE__ */ jsx(
1715
+ "span",
1716
+ {
1717
+ "aria-hidden": "true",
1718
+ "data-resize": "",
1719
+ onPointerDown: (event) => onResizeStart(event, column),
1720
+ onDoubleClick: () => grid.resetWidth(column.id),
1721
+ className: cn(
1722
+ "absolute top-0 z-1 h-full w-2 cursor-col-resize touch-none after:absolute after:inset-y-2 after:left-1/2 after:w-px after:bg-line hover:after:w-0.5 hover:after:bg-accent",
1723
+ zone === "right" ? "left-0" : "right-0"
1724
+ )
1725
+ }
1726
+ ) : null
1727
+ ]
1728
+ },
1729
+ column.id
1730
+ );
1731
+ };
1732
+ const renderValue = (row, key, column) => {
1733
+ const value = getCellValue(row, column);
1734
+ const formatted = formatCellValue(value, column);
1735
+ if (column.cell) return column.cell({ row, rowId: key, value, formatted });
1736
+ if (formulasOn && isErrorText(value) && isFormulaText(rawValue(row, column))) {
1737
+ return /* @__PURE__ */ jsx(
1738
+ "span",
1739
+ {
1740
+ className: "block truncate font-[650] text-danger",
1741
+ title: `${labels.formulaError}: ${value}`,
1742
+ children: value
1743
+ }
1744
+ );
1745
+ }
1746
+ if (column.type === "status" && formatted) {
1747
+ return /* @__PURE__ */ jsx(Chip, { tone: column.statusTones?.[String(value)] ?? "neutral", className: "h-5.5", children: formatted });
1748
+ }
1749
+ if (column.type === "sparkline" && column.sparkline) {
1750
+ const { values, kind, color, label } = column.sparkline;
1751
+ const description = typeof label === "function" ? label(row) : label ?? column.header;
1752
+ return /* @__PURE__ */ jsx("div", { className: "min-w-0 py-1", children: /* @__PURE__ */ jsx(
1753
+ Sparkline,
1754
+ {
1755
+ data: values(row),
1756
+ label: description,
1757
+ type: kind,
1758
+ color,
1759
+ height: 24,
1760
+ animate: false
1761
+ }
1762
+ ) });
1763
+ }
1764
+ if (column.type === "boolean" && formatted) {
1765
+ return /* @__PURE__ */ jsx(Chip, { tone: value === true ? "success" : "neutral", className: "h-5.5", children: formatted });
1766
+ }
1767
+ return /* @__PURE__ */ jsx("span", { className: "block truncate", title: formatted, children: formatted });
1768
+ };
1769
+ const renderEditor = (column, r, c) => {
1770
+ if (!editing) return null;
1771
+ const errorId = `${helpId}-error`;
1772
+ const editorClass = cn(
1773
+ "h-[calc(100%-6px)] w-full min-w-0 rounded-xs border bg-surface px-1.5 text-[13px] text-ink outline-none",
1774
+ editing.error ? "border-danger" : "border-accent"
1775
+ );
1776
+ const common = {
1777
+ autoFocus: true,
1778
+ "aria-label": column.header,
1779
+ "aria-invalid": editing.error ? true : void 0,
1780
+ "aria-describedby": editing.error ? errorId : void 0,
1781
+ value: editing.draft,
1782
+ onBlur: () => commitEdit(),
1783
+ onKeyDown: (event) => onEditorKey(event, r, c)
1784
+ };
1785
+ const change = (draft) => setEditing({ ...editing, draft, error: void 0 });
1786
+ const editor = editorOf(column) === "select" ? /* @__PURE__ */ jsx(
1787
+ "select",
1788
+ {
1789
+ ...common,
1790
+ onChange: (event) => change(event.target.value),
1791
+ className: editorClass,
1792
+ children: (column.options ?? []).map((option) => /* @__PURE__ */ jsx("option", { value: option, children: option }, option))
1793
+ }
1794
+ ) : /* @__PURE__ */ jsx(
1795
+ "input",
1796
+ {
1797
+ ...common,
1798
+ type: "text",
1799
+ inputMode: editorOf(column) === "number" ? "decimal" : void 0,
1800
+ onFocus: (event) => {
1801
+ const input = event.currentTarget;
1802
+ if (editing.caretEnd) input.setSelectionRange(input.value.length, input.value.length);
1803
+ else input.select();
1804
+ },
1805
+ onChange: (event) => change(event.target.value),
1806
+ className: cn(editorClass, columnAlign(column) === "end" && "text-right")
1807
+ }
1808
+ );
1809
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
1810
+ editor,
1811
+ editing.error ? /* @__PURE__ */ jsxs(
1812
+ "span",
1813
+ {
1814
+ id: errorId,
1815
+ role: "alert",
1816
+ className: "absolute top-full left-1 z-5 mt-0.5 flex max-w-64 items-center gap-1.5 rounded-xs border border-danger bg-surface px-2 py-1 text-[12px] text-danger shadow-overlay",
1817
+ children: [
1818
+ /* @__PURE__ */ jsx(CircleAlert, { "aria-hidden": "true", className: "size-3.5 shrink-0" }),
1819
+ editing.error
1820
+ ]
1821
+ }
1822
+ ) : null
1823
+ ] });
1824
+ };
1825
+ const ariaRowOf = (r) => groupLevels + pageOffset + r + 1;
1826
+ const dividerRow = (r) => topCount > 0 && r === topCount ? "top" : null;
1827
+ const renderGroupRow = (row, r) => {
1828
+ const header = byId.get(row.columnId)?.header ?? row.columnId;
1829
+ let spanEnd = Math.max(0, firstDataIndex);
1830
+ while (spanEnd + 1 < fillerIndex) {
1831
+ const next = renderColumns[spanEnd + 1];
1832
+ if (next?.kind !== "data" || next.column.aggregate) break;
1833
+ spanEnd += 1;
1834
+ }
1835
+ const labelActive = tabbable.r === r && tabbable.c <= spanEnd;
1836
+ const cells = renderColumns.map((entry, c) => {
1837
+ if (c > 0 && c <= spanEnd) return null;
1838
+ if (c === 0) {
1839
+ return /* @__PURE__ */ jsx(
1840
+ "td",
1841
+ {
1842
+ "data-r": r,
1843
+ "data-c": 0,
1844
+ "data-c-end": spanEnd,
1845
+ colSpan: spanEnd + 1,
1846
+ tabIndex: labelActive ? 0 : -1,
1847
+ role: "gridcell",
1848
+ "aria-expanded": !row.collapsed,
1849
+ className: cn(cellBase, "cursor-pointer overflow-visible text-[13px]"),
1850
+ children: /* @__PURE__ */ jsxs(
1851
+ "span",
1852
+ {
1853
+ className: "sticky left-3 flex w-fit max-w-full min-w-0 items-center gap-1.5 whitespace-nowrap font-[650] text-ink",
1854
+ style: { paddingLeft: row.depth * 16 },
1855
+ title: `${header}: ${row.label}`,
1856
+ children: [
1857
+ /* @__PURE__ */ jsx(
1858
+ ChevronDown,
1859
+ {
1860
+ "aria-hidden": "true",
1861
+ className: cn(
1862
+ "size-3.5 shrink-0 text-ink-3 transition-transform motion-reduce:transition-none",
1863
+ row.collapsed && "-rotate-90"
1864
+ )
1865
+ }
1866
+ ),
1867
+ /* @__PURE__ */ jsxs("span", { className: "sr-only", children: [
1868
+ row.collapsed ? labels.expandGroup : labels.collapseGroup,
1869
+ ":",
1870
+ " "
1871
+ ] }),
1872
+ /* @__PURE__ */ jsxs("span", { className: "shrink-0 font-normal text-ink-3", children: [
1873
+ header,
1874
+ ":"
1875
+ ] }),
1876
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate", children: row.label }),
1877
+ /* @__PURE__ */ jsx(Chip, { className: "h-5 shrink-0 px-2 text-[11px]", children: row.count })
1878
+ ]
1879
+ }
1880
+ )
1881
+ },
1882
+ "label"
1883
+ );
1884
+ }
1885
+ const position = pinOf(entry);
1886
+ const column = entry.kind === "data" ? entry.column : null;
1887
+ const aggregate = column?.aggregate ? row.aggregates[column.id] ?? null : null;
1888
+ return /* @__PURE__ */ jsx(
1889
+ "td",
1890
+ {
1891
+ "data-r": r,
1892
+ "data-c": c,
1893
+ tabIndex: tabIndexOf(r, c),
1894
+ role: "gridcell",
1895
+ style: pinStyle(position),
1896
+ className: cn(
1897
+ cellBase,
1898
+ "cursor-pointer text-[13px]",
1899
+ position && "sticky z-1 bg-surface-2",
1900
+ pinShadow(position),
1901
+ column && alignClass[columnAlign(column)]
1902
+ ),
1903
+ children: column?.aggregate && aggregate !== null ? /* @__PURE__ */ jsxs("span", { className: "block truncate font-[650] text-ink tabular-nums", children: [
1904
+ /* @__PURE__ */ jsxs("span", { className: "sr-only", children: [
1905
+ labels.aggregate[column.aggregate],
1906
+ ": "
1907
+ ] }),
1908
+ formatAggregate(aggregate, column.aggregate, column)
1909
+ ] }) : null
1910
+ },
1911
+ idOfColumn(entry)
1912
+ );
1913
+ });
1914
+ return /* @__PURE__ */ jsxs(
1915
+ "tr",
1916
+ {
1917
+ "aria-rowindex": ariaRowOf(r),
1918
+ style: { height: rowHeight },
1919
+ className: "group/row bg-surface-2",
1920
+ onClick: () => toggleGroupRow(row.key),
1921
+ children: [
1922
+ cells.slice(0, fillerIndex),
1923
+ /* @__PURE__ */ jsx("td", { "aria-hidden": "true", className: "border-b-divider" }),
1924
+ cells.slice(fillerIndex)
1925
+ ]
1926
+ },
1927
+ row.key
1928
+ );
1929
+ };
1930
+ const rowPinInfo = (r) => {
1931
+ const index = r - 1;
1932
+ if (index < topCount) {
1933
+ return { side: "top", offset: headerTop + headerHeight + index * rowHeight };
1934
+ }
1935
+ if (index >= bodyLength - bottomCount) {
1936
+ const fromEnd = bodyLength - 1 - index;
1937
+ return { side: "bottom", offset: (footer ? rowHeight : 0) + fromEnd * rowHeight };
1938
+ }
1939
+ return null;
1940
+ };
1941
+ const renderToolsCell = (row, r, c, position, pinInfo, sticky) => {
1942
+ const isOpen = expandedSet.has(row.key);
1943
+ const pinSide = pinnedSideOf(pinnedRowIds, row.key);
1944
+ const name = labelOfRow(row.key);
1945
+ const tool = "grid size-6 shrink-0 place-items-center rounded-xs text-ink-3 hover:bg-surface-2 hover:text-ink focus-visible:outline-2 focus-visible:outline-accent disabled:pointer-events-none disabled:opacity-35 [&_svg]:size-3.5";
1946
+ return /* @__PURE__ */ jsx(
1947
+ "td",
1948
+ {
1949
+ "data-r": r,
1950
+ "data-c": c,
1951
+ tabIndex: tabIndexOf(r, c),
1952
+ role: "gridcell",
1953
+ style: { ...pinStyle(position), ...pinInfo ? { [pinInfo.side]: pinInfo.offset } : null },
1954
+ className: cn(cellBase, sticky, pinShadow(position), "px-1"),
1955
+ children: /* @__PURE__ */ jsxs("span", { className: "flex items-center justify-center gap-0.5", children: [
1956
+ reorderEnabled && !pinInfo ? /* @__PURE__ */ jsx(
1957
+ "span",
1958
+ {
1959
+ draggable: reorderAllowed,
1960
+ "aria-hidden": "true",
1961
+ title: reorderAllowed ? labels.dragRow : labels.reorderBlocked,
1962
+ onDragStart: (event) => onRowDragStart(event, row.key),
1963
+ onDragEnd: onRowDragEnd,
1964
+ className: cn(
1965
+ tool,
1966
+ reorderAllowed ? "cursor-grab active:cursor-grabbing" : "cursor-not-allowed opacity-35"
1967
+ ),
1968
+ children: /* @__PURE__ */ jsx(GripVertical, { "aria-hidden": "true" })
1969
+ }
1970
+ ) : reorderEnabled ? /* @__PURE__ */ jsx("span", { className: "size-6 shrink-0", "aria-hidden": "true" }) : null,
1971
+ detailEnabled ? pinInfo ? /* @__PURE__ */ jsx("span", { className: "size-6 shrink-0", "aria-hidden": "true" }) : /* @__PURE__ */ jsx(
1972
+ "button",
1973
+ {
1974
+ type: "button",
1975
+ tabIndex: -1,
1976
+ className: tool,
1977
+ "aria-expanded": isOpen,
1978
+ "aria-label": `${isOpen ? labels.collapseRow : labels.expandRow}: ${name}`,
1979
+ onClick: () => setExpandedRow(row.key),
1980
+ children: /* @__PURE__ */ jsx(
1981
+ ChevronRight,
1982
+ {
1983
+ "aria-hidden": "true",
1984
+ className: cn(
1985
+ "transition-transform motion-reduce:transition-none",
1986
+ isOpen && "rotate-90"
1987
+ )
1988
+ }
1989
+ )
1990
+ }
1991
+ ) : null,
1992
+ pinningEnabled ? pinSide ? /* @__PURE__ */ jsxs(Fragment, { children: [
1993
+ /* @__PURE__ */ jsx(
1994
+ "button",
1995
+ {
1996
+ type: "button",
1997
+ tabIndex: -1,
1998
+ className: cn(tool, "text-accent-ink"),
1999
+ "aria-label": `${labels.unpinRow}: ${name}`,
2000
+ title: labels.unpinRow,
2001
+ onClick: () => pinRow(row.key, pinSide),
2002
+ children: /* @__PURE__ */ jsx(PinOff, { "aria-hidden": "true" })
2003
+ }
2004
+ ),
2005
+ /* @__PURE__ */ jsx("span", { className: "size-6 shrink-0", "aria-hidden": "true" })
2006
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
2007
+ /* @__PURE__ */ jsx(
2008
+ "button",
2009
+ {
2010
+ type: "button",
2011
+ tabIndex: -1,
2012
+ className: tool,
2013
+ "aria-label": `${labels.pinRowTop}: ${name}`,
2014
+ title: labels.pinRowTop,
2015
+ onClick: () => pinRow(row.key, "top"),
2016
+ children: /* @__PURE__ */ jsx(ArrowUpToLine, { "aria-hidden": "true" })
2017
+ }
2018
+ ),
2019
+ /* @__PURE__ */ jsx(
2020
+ "button",
2021
+ {
2022
+ type: "button",
2023
+ tabIndex: -1,
2024
+ className: tool,
2025
+ "aria-label": `${labels.pinRowBottom}: ${name}`,
2026
+ title: labels.pinRowBottom,
2027
+ onClick: () => pinRow(row.key, "bottom"),
2028
+ children: /* @__PURE__ */ jsx(ArrowDownToLine, { "aria-hidden": "true" })
2029
+ }
2030
+ )
2031
+ ] }) : null
2032
+ ] })
2033
+ },
2034
+ TOOLS_ID
2035
+ );
2036
+ };
2037
+ const renderDataRow = (row, r) => {
2038
+ const isSelected = selected.has(row.key);
2039
+ const pinInfo = rowPinInfo(r);
2040
+ const isDropTarget = dropRow?.key === row.key;
2041
+ const cells = renderColumns.map((entry, c) => {
2042
+ const position = pinOf(entry);
2043
+ const stuck = !!position || !!pinInfo;
2044
+ const sticky = stuck && cn(
2045
+ "sticky bg-surface group-hover/row:bg-surface-2 group-aria-selected/row:bg-accent-soft",
2046
+ pinInfo ? position ? "z-3" : "z-2" : "z-1"
2047
+ );
2048
+ const stuckStyle = {
2049
+ ...pinStyle(position),
2050
+ ...pinInfo ? { [pinInfo.side]: pinInfo.offset } : null
2051
+ };
2052
+ if (entry.kind === "select") {
2053
+ return /* @__PURE__ */ jsx(
2054
+ "td",
2055
+ {
2056
+ "data-r": r,
2057
+ "data-c": c,
2058
+ tabIndex: tabIndexOf(r, c),
2059
+ style: stuckStyle,
2060
+ className: cn(cellBase, sticky, pinShadow(position), "px-0 text-center"),
2061
+ children: /* @__PURE__ */ jsx(
2062
+ "input",
2063
+ {
2064
+ type: "checkbox",
2065
+ tabIndex: -1,
2066
+ "aria-label": `${labels.selectRow} ${dataColumns[0] ? formatCellValue(getCellValue(row.row, dataColumns[0]), dataColumns[0]) : row.key}`,
2067
+ className: "size-4 align-middle accent-accent",
2068
+ checked: isSelected,
2069
+ onChange: () => void 0,
2070
+ onClick: (event) => toggleRow(row.key, event.shiftKey)
2071
+ }
2072
+ )
2073
+ },
2074
+ SELECT_ID
2075
+ );
2076
+ }
2077
+ if (entry.kind === "tools") {
2078
+ return renderToolsCell(row, r, c, position, pinInfo, sticky);
2079
+ }
2080
+ const { column } = entry;
2081
+ const isEditing = editing?.key === row.key && editing.columnId === column.id;
2082
+ const editable = canEdit(column, row.row);
2083
+ const value = getCellValue(row.row, column);
2084
+ const invalid = column.validate ? column.validate(value, row.row) : null;
2085
+ const inSelection = rangeSelection && inRange(cellRange, r, c);
2086
+ const inFill = !!fillPreview && !inSelection && r >= fillPreview.r0 && r <= fillPreview.r1 && c >= fillPreview.c0 && c <= fillPreview.c1;
2087
+ const showHandle = canWrite && rangeSelection && !isEditing && !!rangeB && r === rangeB.r1 && c === rangeB.c1;
2088
+ const isTreeCell = !!tree && structured && c === firstDataIndex;
2089
+ const parentAggregate = row.tree?.hasChildren && column.aggregate ? row.tree.aggregates[column.id] ?? null : null;
2090
+ const content = parentAggregate !== null && column.aggregate ? /* @__PURE__ */ jsxs("span", { className: "block truncate font-[650] tabular-nums", children: [
2091
+ /* @__PURE__ */ jsxs("span", { className: "sr-only", children: [
2092
+ labels.aggregate[column.aggregate],
2093
+ ": "
2094
+ ] }),
2095
+ formatAggregate(parentAggregate, column.aggregate, column)
2096
+ ] }) : renderValue(row.row, row.key, column);
2097
+ const body = isTreeCell ? /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 items-center gap-1", style: { paddingLeft: row.depth * 16 }, children: [
2098
+ row.tree?.hasChildren ? /* @__PURE__ */ jsx(
2099
+ "button",
2100
+ {
2101
+ type: "button",
2102
+ tabIndex: -1,
2103
+ "aria-label": `${row.tree.expanded ? labels.collapseRow : labels.expandRow}: ${labelOfRow(row.key)}`,
2104
+ "aria-expanded": row.tree.expanded,
2105
+ onClick: () => setExpandedRow(row.key),
2106
+ className: "grid size-5 shrink-0 place-items-center rounded-xs text-ink-3 hover:bg-surface-2 hover:text-ink",
2107
+ children: /* @__PURE__ */ jsx(
2108
+ ChevronRight,
2109
+ {
2110
+ "aria-hidden": "true",
2111
+ className: cn(
2112
+ "size-3.5 transition-transform motion-reduce:transition-none",
2113
+ row.tree.expanded && "rotate-90"
2114
+ )
2115
+ }
2116
+ )
2117
+ }
2118
+ ) : /* @__PURE__ */ jsx("span", { className: "size-5 shrink-0", "aria-hidden": "true" }),
2119
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1", children: content })
2120
+ ] }) : content;
2121
+ return /* @__PURE__ */ jsxs(
2122
+ "td",
2123
+ {
2124
+ "data-r": r,
2125
+ "data-c": c,
2126
+ tabIndex: tabIndexOf(r, c),
2127
+ role: "gridcell",
2128
+ "aria-readonly": onCellChange && !editable ? true : void 0,
2129
+ "aria-selected": rangeSelection ? inSelection : void 0,
2130
+ "aria-invalid": invalid ? true : void 0,
2131
+ title: invalid ? `${labels.invalidCell}: ${invalid}` : void 0,
2132
+ onPointerDown: rangeSelection ? (event) => onCellPointerDown(event, r, c) : void 0,
2133
+ onDoubleClick: () => {
2134
+ if (startEdit(row.key, column)) setActive({ r, c });
2135
+ },
2136
+ style: {
2137
+ ...stuckStyle,
2138
+ paddingLeft: c === firstDataIndex && row.depth > 0 && !isTreeCell ? 12 + row.depth * 16 : void 0
2139
+ },
2140
+ className: cn(
2141
+ cellBase,
2142
+ sticky,
2143
+ pinShadow(position),
2144
+ alignClass[columnAlign(column)],
2145
+ (column.type === "number" || column.type === "currency") && "tabular-nums",
2146
+ isEditing && "relative overflow-visible px-1",
2147
+ editable && "cursor-text",
2148
+ invalid && "bg-danger-soft",
2149
+ inSelection && "bg-accent-soft",
2150
+ inFill && "bg-accent-soft/60",
2151
+ showHandle && !sticky && "relative"
2152
+ ),
2153
+ children: [
2154
+ showHandle ? /* @__PURE__ */ jsx(
2155
+ "span",
2156
+ {
2157
+ "data-fill-handle": "",
2158
+ role: "presentation",
2159
+ title: labels.fillHandle,
2160
+ onPointerDown: onFillHandleDown,
2161
+ className: "absolute right-0 bottom-0 z-4 size-2.5 cursor-crosshair touch-none rounded-xs border border-surface bg-accent"
2162
+ }
2163
+ ) : null,
2164
+ isEditing ? renderEditor(column, r, c) : invalid ? /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 items-center gap-1.5", children: [
2165
+ /* @__PURE__ */ jsx(CircleAlert, { "aria-hidden": "true", className: "size-3.5 shrink-0 text-danger" }),
2166
+ /* @__PURE__ */ jsxs("span", { className: "sr-only", children: [
2167
+ labels.invalidCell,
2168
+ ": ",
2169
+ invalid.replace(/\.$/, ""),
2170
+ ".",
2171
+ " "
2172
+ ] }),
2173
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1", children: body })
2174
+ ] }) : body
2175
+ ]
2176
+ },
2177
+ column.id
2178
+ );
2179
+ });
2180
+ return /* @__PURE__ */ jsxs(
2181
+ "tr",
2182
+ {
2183
+ "aria-rowindex": ariaRowOf(r),
2184
+ "aria-selected": selectable ? isSelected : void 0,
2185
+ "aria-level": tree && structured ? row.depth + 1 : void 0,
2186
+ "aria-expanded": tree && structured && row.tree?.hasChildren ? row.tree.expanded : detailEnabled ? expandedSet.has(row.key) : void 0,
2187
+ "data-drop": isDropTarget ? dropRow?.place : void 0,
2188
+ "data-pinned": pinInfo?.side,
2189
+ "data-divider": dividerRow(r),
2190
+ style: { height: rowHeight },
2191
+ onDragOver: reorderAllowed ? (event) => onRowDragOver(event, row.key) : void 0,
2192
+ onDrop: reorderAllowed ? (event) => onRowDrop(event, row.key) : void 0,
2193
+ className: cn(
2194
+ "group/row text-[13px] text-ink hover:bg-surface-2 aria-selected:bg-accent-soft",
2195
+ "data-[drop=before]:[&>td]:shadow-[inset_0_2px_0_var(--accent)] data-[drop=after]:[&>td]:shadow-[inset_0_-2px_0_var(--accent)]",
2196
+ "data-[divider=top]:[&>td]:border-b-line-strong"
2197
+ ),
2198
+ children: [
2199
+ cells.slice(0, fillerIndex),
2200
+ /* @__PURE__ */ jsx("td", { "aria-hidden": "true", className: "border-b-divider" }),
2201
+ cells.slice(fillerIndex)
2202
+ ]
2203
+ },
2204
+ row.key
2205
+ );
2206
+ };
2207
+ const renderDetailRow = (row, r) => {
2208
+ const labelled = labels.detailOf(labelOfRow(row.rowKey));
2209
+ return /* @__PURE__ */ jsx("tr", { "aria-rowindex": ariaRowOf(r), style: { height: row.height }, children: /* @__PURE__ */ jsx(
2210
+ "td",
2211
+ {
2212
+ "data-r": r,
2213
+ "data-c": 0,
2214
+ "data-c-end": maxC,
2215
+ colSpan,
2216
+ role: "gridcell",
2217
+ tabIndex: tabbable.r === r ? 0 : -1,
2218
+ "aria-label": labelled,
2219
+ className: cn(cellBase, "overflow-hidden bg-surface-2/50 p-0"),
2220
+ children: /* @__PURE__ */ jsx(
2221
+ "div",
2222
+ {
2223
+ "data-detail-content": "",
2224
+ className: "sticky left-0 box-border overflow-auto p-2",
2225
+ style: { width: containerWidth || "100%", height: row.height - 1 },
2226
+ children: renderDetail?.(row.row, row.rowKey)
2227
+ }
2228
+ )
2229
+ }
2230
+ ) }, row.key);
2231
+ };
2232
+ const renderPlaceholderRow = (row, r) => {
2233
+ const cells = renderColumns.map((entry, c) => {
2234
+ const position = pinOf(entry);
2235
+ return /* @__PURE__ */ jsx(
2236
+ "td",
2237
+ {
2238
+ "data-r": r,
2239
+ "data-c": c,
2240
+ tabIndex: tabIndexOf(r, c),
2241
+ role: "gridcell",
2242
+ style: pinStyle(position),
2243
+ className: cn(cellBase, position && "sticky z-1 bg-surface", pinShadow(position)),
2244
+ children: entry.kind === "data" ? /* @__PURE__ */ jsx("span", { className: "block h-2.5 w-3/4 rounded-pill bg-surface-2 motion-safe:animate-pulse" }) : null
2245
+ },
2246
+ idOfColumn(entry)
2247
+ );
2248
+ });
2249
+ return /* @__PURE__ */ jsxs("tr", { "aria-rowindex": ariaRowOf(r), "aria-busy": "true", style: { height: rowHeight }, children: [
2250
+ cells.slice(0, fillerIndex),
2251
+ /* @__PURE__ */ jsx("td", { "aria-hidden": "true", className: "border-b-divider" }),
2252
+ cells.slice(fillerIndex)
2253
+ ] }, row.key);
2254
+ };
2255
+ const headerCells = renderColumns.map(renderHeader);
2256
+ const footerCells = renderColumns.map((entry, c) => {
2257
+ const position = pinOf(entry);
2258
+ const column = entry.kind === "data" ? entry.column : null;
2259
+ const value = column?.aggregate ? totals[column.id] ?? null : null;
2260
+ return /* @__PURE__ */ jsx(
2261
+ "td",
2262
+ {
2263
+ style: pinStyle(position),
2264
+ className: cn(
2265
+ "sticky bottom-0 overflow-hidden border-t-divider bg-surface px-3 font-[650] text-[13px] text-ink @max-sm/grid:px-2",
2266
+ position ? "z-3" : "z-2",
2267
+ pinShadow(position),
2268
+ column && alignClass[columnAlign(column)],
2269
+ "tabular-nums"
2270
+ ),
2271
+ children: column?.aggregate && value !== null ? /* @__PURE__ */ jsxs("span", { className: "block truncate", children: [
2272
+ /* @__PURE__ */ jsxs("span", { className: "sr-only", children: [
2273
+ labels.aggregate[column.aggregate],
2274
+ ": "
2275
+ ] }),
2276
+ formatAggregate(value, column.aggregate, column)
2277
+ ] }) : c === firstDataIndex ? /* @__PURE__ */ jsx("span", { className: "text-[11px] text-ink-3 uppercase tracking-[.07em]", children: labels.total }) : null
2278
+ },
2279
+ idOfColumn(entry)
2280
+ );
2281
+ });
2282
+ const colSpan = renderColumns.length + 1;
2283
+ const activeFilters = countActiveFilters(filters);
2284
+ const rowCount = bodyLength + groupLevels + 1 + (footer ? 1 : 0);
2285
+ const toolbarRows = sourceActive ? remote.total ?? 0 : sorted.length;
2286
+ useEffect(() => {
2287
+ if (page > pages - 1) setPage(Math.max(0, pages - 1));
2288
+ }, [page, pages]);
2289
+ useEffect(() => {
2290
+ setCellRange(null);
2291
+ }, [sort, filters, search, groupBy, page, advanced, data]);
2292
+ const renderGroupHeaderRow = (level) => {
2293
+ const top = level * GROUP_HEADER_HEIGHT;
2294
+ const labelInset = renderColumns.slice(0, leadingCount + pinned.left.length).reduce((sum, entry) => sum + widthOf(entry), 0);
2295
+ const out = [];
2296
+ let fillerDone = false;
2297
+ const filler = () => {
2298
+ fillerDone = true;
2299
+ out.push(
2300
+ /* @__PURE__ */ jsx(
2301
+ "th",
2302
+ {
2303
+ role: "presentation",
2304
+ className: "sticky z-2 border-b-divider bg-surface",
2305
+ style: { top, height: GROUP_HEADER_HEIGHT }
2306
+ },
2307
+ "filler"
2308
+ )
2309
+ );
2310
+ };
2311
+ if (leadingCount > 0) {
2312
+ out.push(
2313
+ /* @__PURE__ */ jsx(
2314
+ "th",
2315
+ {
2316
+ role: "presentation",
2317
+ colSpan: leadingCount,
2318
+ className: "sticky z-3 border-b-divider bg-surface",
2319
+ style: { left: 0, top, height: GROUP_HEADER_HEIGHT }
2320
+ },
2321
+ "lead"
2322
+ )
2323
+ );
2324
+ }
2325
+ for (const cell of headerLevels[level] ?? []) {
2326
+ const startIndex = cell.start + leadingCount;
2327
+ if (!fillerDone && startIndex >= fillerIndex) filler();
2328
+ const zone = zoneOf.get(dataColumns[cell.start]?.id ?? "") ?? "center";
2329
+ const first = renderColumns[startIndex];
2330
+ const last = renderColumns[startIndex + cell.span - 1];
2331
+ const style = { top, height: GROUP_HEADER_HEIGHT };
2332
+ if (zone === "left" && first) style.left = positions[idOfColumn(first)]?.offset;
2333
+ if (zone === "right" && last) style.right = positions[idOfColumn(last)]?.offset;
2334
+ out.push(
2335
+ /* @__PURE__ */ jsx(
2336
+ "th",
2337
+ {
2338
+ role: cell.label ? "columnheader" : "presentation",
2339
+ colSpan: cell.span,
2340
+ className: cn(
2341
+ "sticky overflow-clip border-b-divider bg-surface px-3 text-center font-[650] text-[11px] text-ink-3 uppercase tracking-[.07em] @max-sm/grid:px-2",
2342
+ zone === "center" ? "z-2" : "z-3",
2343
+ cell.label && "border-x"
2344
+ ),
2345
+ style,
2346
+ children: /* @__PURE__ */ jsx(
2347
+ "span",
2348
+ {
2349
+ className: cn(
2350
+ "block w-fit max-w-full truncate",
2351
+ zone === "center" && "sticky mx-auto @max-sm/grid:mx-0"
2352
+ ),
2353
+ style: zone === "center" ? { left: labelInset + 8 } : void 0,
2354
+ title: cell.label,
2355
+ children: cell.label
2356
+ }
2357
+ )
2358
+ },
2359
+ `${cell.start}-${cell.label}`
2360
+ )
2361
+ );
2362
+ }
2363
+ if (!fillerDone) filler();
2364
+ return /* @__PURE__ */ jsx("tr", { "aria-rowindex": level + 1, children: out }, `group-header-${level}`);
2365
+ };
2366
+ const renderBodyRow = (row, index) => {
2367
+ const r = index + 1;
2368
+ switch (row.kind) {
2369
+ case "group":
2370
+ return renderGroupRow(row, r);
2371
+ case "detail":
2372
+ return renderDetailRow(row, r);
2373
+ case "placeholder":
2374
+ return renderPlaceholderRow(row, r);
2375
+ default:
2376
+ return renderDataRow(row, r);
2377
+ }
2378
+ };
2379
+ const bodyRowsIn = (start, end) => bodyRows.slice(start, end).map((row, offset) => renderBodyRow(row, start + offset));
2380
+ const spacer = (key, px) => px > 0 ? /* @__PURE__ */ jsx("tr", { "aria-hidden": "true", style: { height: px }, children: /* @__PURE__ */ jsx("td", { colSpan, className: "p-0" }) }, key) : null;
2381
+ const stats = cellRange ? rangeStats(rangeBounds(cellRange), (r, c) => {
2382
+ const cell = cellAt(r, c);
2383
+ return cell ? getCellValue(cell.row, cell.column) : void 0;
2384
+ }) : null;
2385
+ const rangeCellCount = cellRange ? (() => {
2386
+ const b = rangeBounds(cellRange);
2387
+ return (b.r1 - b.r0 + 1) * (b.c1 - b.c0 + 1);
2388
+ })() : 0;
2389
+ const rangeIsCurrency = (() => {
2390
+ if (!cellRange) return false;
2391
+ const b = rangeBounds(cellRange);
2392
+ const kinds = /* @__PURE__ */ new Set();
2393
+ for (let c = b.c0; c <= b.c1; c += 1) {
2394
+ const entry = renderColumns[c];
2395
+ if (entry?.kind === "data" && (entry.column.type === "number" || entry.column.type === "currency")) {
2396
+ kinds.add(entry.column.type);
2397
+ }
2398
+ }
2399
+ return kinds.size === 1 && kinds.has("currency");
2400
+ })();
2401
+ const formatStat = (value) => value === null ? "" : rangeIsCurrency ? formatCurrency(value) : formatNumber(value);
2402
+ const barCell = formulasOn ? cellAt(activeR, activeC) : null;
2403
+ const [barError, setBarError] = useState();
2404
+ useEffect(() => {
2405
+ setBarError(void 0);
2406
+ }, [activeR, activeC]);
2407
+ const barRaw = barCell ? rawValue(barCell.row, barCell.column) : null;
2408
+ const commitBar = (text) => {
2409
+ if (!barCell || !canEdit(barCell.column, barCell.row)) return;
2410
+ const result = coerceDraft(barCell.column, barCell.row, text);
2411
+ if ("error" in result) {
2412
+ setBarError(result.error);
2413
+ return;
2414
+ }
2415
+ setBarError(void 0);
2416
+ if (!sameCellValue(result.value, barRaw)) {
2417
+ commitChanges(
2418
+ [
2419
+ {
2420
+ row: barCell.row,
2421
+ rowId: keyOf(barCell.row),
2422
+ column: barCell.column,
2423
+ value: result.value,
2424
+ previous: barRaw
2425
+ }
2426
+ ],
2427
+ "edit"
2428
+ );
2429
+ }
2430
+ focusCell(activeR, activeC);
2431
+ };
2432
+ const emptyFiltered = activeFilters > 0 || search !== "" || advancedCount > 0;
2433
+ return /* @__PURE__ */ jsxs(
2434
+ "div",
2435
+ {
2436
+ className: cn(
2437
+ "@container/grid flex min-w-0 max-w-full flex-col overflow-hidden rounded-card border-card shadow-card surface-card text-ink",
2438
+ className
2439
+ ),
2440
+ children: [
2441
+ hideToolbar ? null : /* @__PURE__ */ jsx(
2442
+ GridToolbar,
2443
+ {
2444
+ labels,
2445
+ search,
2446
+ onSearch: (value) => {
2447
+ setSearch(value);
2448
+ resetPage();
2449
+ },
2450
+ activeFilters,
2451
+ onClearFilters: () => {
2452
+ setFiltersState({});
2453
+ resetPage();
2454
+ },
2455
+ groupBy: structured ? groupBy : EMPTY_LIST,
2456
+ columns,
2457
+ onUngroup: (id) => setGroup(id, false),
2458
+ density,
2459
+ onDensity: setDensity,
2460
+ hidden: layout.hidden,
2461
+ onHidden: grid.setHidden,
2462
+ onResetColumns: grid.reset,
2463
+ onExport: exportFilename === false ? void 0 : exportCsv,
2464
+ onExportXlsx: xlsxName ? exportToXlsx : void 0,
2465
+ exportSelected: selectable && selection.length > 0,
2466
+ rowCount: toolbarRows,
2467
+ selectedCount: selectable ? selection.length : null,
2468
+ actions: toolbarActions,
2469
+ hideColumnPicker: toolPanel,
2470
+ history: historyEnabled ? {
2471
+ canUndo: historySummary.canUndo,
2472
+ canRedo: historySummary.canRedo,
2473
+ onUndo: undo,
2474
+ onRedo: redo
2475
+ } : void 0,
2476
+ rowTools: structured && onRowsChange && (createRow || selectable) ? {
2477
+ onAdd: createRow ? addRow : void 0,
2478
+ onRemove: selectable ? removeSelectedRows : void 0,
2479
+ removeDisabled: selection.length === 0
2480
+ } : void 0,
2481
+ toolPanel: toolPanel ? { open: panelOpen, onToggle: () => setPanelOpen(!panelOpen) } : void 0,
2482
+ advancedFilter: showAdvancedFilter && !sourceActive ? /* @__PURE__ */ jsx(
2483
+ FilterBuilder,
2484
+ {
2485
+ columns,
2486
+ value: advanced,
2487
+ onChange: (next) => {
2488
+ setAdvanced(next);
2489
+ resetPage();
2490
+ },
2491
+ valuesOf: (id) => {
2492
+ const column = byId.get(id);
2493
+ return column ? column.options ? [...column.options] : distinctValues(data, column) : [];
2494
+ },
2495
+ labels: labelsProp
2496
+ }
2497
+ ) : void 0,
2498
+ advancedFilterCount: advancedCount,
2499
+ onClearAdvancedFilter: () => setAdvanced(emptyGroup("and", "root"))
2500
+ }
2501
+ ),
2502
+ formulasOn ? /* @__PURE__ */ jsx(
2503
+ FormulaBar,
2504
+ {
2505
+ address: barCell && sourceIndex ? cellAddress(
2506
+ sourceIndex.rows.get(barCell.row) ?? 0,
2507
+ sourceIndex.cols.get(barCell.column.id) ?? 0
2508
+ ) : "",
2509
+ value: barRaw === null || barRaw === void 0 ? "" : String(barRaw),
2510
+ editable: !!barCell && canWrite && canEdit(barCell.column, barCell.row),
2511
+ error: barError,
2512
+ labels: { bar: labels.formulaBar, cell: labels.formulaCell, empty: labels.formulaEmpty },
2513
+ onCommit: commitBar,
2514
+ onDiscard: () => focusCell(activeR, activeC)
2515
+ }
2516
+ ) : null,
2517
+ sourceActive && remote.failed && remote.total !== null ? /* @__PURE__ */ jsxs(
2518
+ "div",
2519
+ {
2520
+ role: "alert",
2521
+ className: "flex flex-wrap items-center gap-2 border-b-divider bg-danger-soft px-3 py-2 text-[13px] text-danger",
2522
+ children: [
2523
+ /* @__PURE__ */ jsx(CircleAlert, { "aria-hidden": "true", className: "size-4 shrink-0" }),
2524
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1", children: labels.loadError }),
2525
+ /* @__PURE__ */ jsx(
2526
+ "button",
2527
+ {
2528
+ type: "button",
2529
+ className: "rounded-control border border-danger px-2.5 py-1 font-[600] text-[12.5px] hover:bg-surface",
2530
+ onClick: remote.retry,
2531
+ children: labels.retry
2532
+ }
2533
+ )
2534
+ ]
2535
+ }
2536
+ ) : null,
2537
+ /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 min-w-0 flex-col @2xl/grid:flex-row", children: [
2538
+ toolPanel && panelOpen ? /* @__PURE__ */ jsx(
2539
+ GridToolPanel,
2540
+ {
2541
+ labels,
2542
+ columns: columnsProp,
2543
+ shownColumns: columns,
2544
+ order: layout.order,
2545
+ hidden: layout.hidden,
2546
+ onHidden: grid.setHidden,
2547
+ onMove: grid.move,
2548
+ groupBy,
2549
+ onGroup: setGroup,
2550
+ pivot: pivotConfig,
2551
+ onPivot: (next) => {
2552
+ setPivotConfig(next);
2553
+ resetPage();
2554
+ },
2555
+ pivotValid,
2556
+ canGroup: structured && !tree,
2557
+ canPivot: !sourceActive,
2558
+ maxHeight: height,
2559
+ className: "order-first @2xl/grid:order-last"
2560
+ }
2561
+ ) : null,
2562
+ /* @__PURE__ */ jsx(
2563
+ "div",
2564
+ {
2565
+ ref: scrollerRef,
2566
+ onScroll: syncScroll,
2567
+ className: "relative min-h-0 min-w-0 overflow-auto overscroll-contain @2xl/grid:flex-1",
2568
+ style: paged ? void 0 : { maxHeight: height },
2569
+ children: /* @__PURE__ */ jsxs(
2570
+ "table",
2571
+ {
2572
+ ref: gridRef,
2573
+ role: "grid",
2574
+ "aria-label": ariaLabel,
2575
+ "aria-describedby": helpId,
2576
+ "aria-rowcount": busy ? -1 : rowCount,
2577
+ "aria-colcount": renderColumns.length,
2578
+ "aria-multiselectable": selectable || rangeSelection || void 0,
2579
+ "aria-busy": busy || void 0,
2580
+ onKeyDown: onGridKeyDown,
2581
+ onFocus: onGridFocus,
2582
+ onPaste,
2583
+ className: cn(
2584
+ "table-fixed border-separate border-spacing-0",
2585
+ rangeSelection && "select-none"
2586
+ ),
2587
+ style: { width: totalWidth, minWidth: "100%" },
2588
+ children: [
2589
+ /* @__PURE__ */ jsxs("colgroup", { children: [
2590
+ renderColumns.slice(0, fillerIndex).map((entry) => /* @__PURE__ */ jsx("col", { style: { width: widthOf(entry) } }, idOfColumn(entry))),
2591
+ /* @__PURE__ */ jsx("col", {}),
2592
+ renderColumns.slice(fillerIndex).map((entry) => /* @__PURE__ */ jsx("col", { style: { width: widthOf(entry) } }, idOfColumn(entry)))
2593
+ ] }),
2594
+ /* @__PURE__ */ jsxs("thead", { children: [
2595
+ headerLevels.map((_, level) => renderGroupHeaderRow(level)),
2596
+ /* @__PURE__ */ jsxs("tr", { "aria-rowindex": groupLevels + 1, children: [
2597
+ headerCells.slice(0, fillerIndex),
2598
+ /* @__PURE__ */ jsx(
2599
+ "th",
2600
+ {
2601
+ role: "presentation",
2602
+ className: "sticky z-2 border-b-divider bg-surface",
2603
+ style: { top: headerTop, height: headerHeight }
2604
+ }
2605
+ ),
2606
+ headerCells.slice(fillerIndex)
2607
+ ] })
2608
+ ] }),
2609
+ /* @__PURE__ */ jsx("tbody", { children: busy ? Array.from({ length: SKELETON_ROWS }, (_, index) => (
2610
+ // biome-ignore lint/suspicious/noArrayIndexKey: static placeholder rows.
2611
+ /* @__PURE__ */ jsxs("tr", { "aria-hidden": "true", style: { height: rowHeight }, children: [
2612
+ renderColumns.map((entry) => /* @__PURE__ */ jsx("td", { className: cn(cellBase), children: /* @__PURE__ */ jsx("span", { className: "block h-2.5 w-3/4 rounded-pill bg-surface-2 motion-safe:animate-pulse" }) }, idOfColumn(entry))),
2613
+ /* @__PURE__ */ jsx("td", { className: "border-b-divider" })
2614
+ ] }, index)
2615
+ )) : bodyLength === 0 ? /* @__PURE__ */ jsx("tr", { "aria-rowindex": groupLevels + 2, children: /* @__PURE__ */ jsx("td", { colSpan, className: "px-4 py-10 text-center text-[13px] text-ink-3", children: /* @__PURE__ */ jsxs("div", { className: "sticky left-0 inline-flex max-w-[calc(100cqw-2rem)] flex-col items-center gap-2", children: [
2616
+ /* @__PURE__ */ jsx("span", { children: sourceActive && remote.failed ? labels.loadError : emptyFiltered ? labels.emptyFiltered : emptyMessage ?? labels.empty }),
2617
+ sourceActive && remote.failed ? /* @__PURE__ */ jsx(
2618
+ "button",
2619
+ {
2620
+ type: "button",
2621
+ className: "rounded-control border-divider px-2.5 py-1 font-[600] text-[12.5px] text-ink-2 hover:text-ink",
2622
+ onClick: remote.retry,
2623
+ children: labels.retry
2624
+ }
2625
+ ) : emptyFiltered ? /* @__PURE__ */ jsx(
2626
+ "button",
2627
+ {
2628
+ type: "button",
2629
+ className: "rounded-control border-divider px-2.5 py-1 font-[600] text-[12.5px] text-ink-2 hover:text-ink",
2630
+ onClick: () => {
2631
+ setFiltersState({});
2632
+ setSearch("");
2633
+ setAdvanced(emptyGroup("and", "root"));
2634
+ },
2635
+ children: labels.clearFilters
2636
+ }
2637
+ ) : null
2638
+ ] }) }) }) : /* @__PURE__ */ jsxs(Fragment, { children: [
2639
+ bodyRowsIn(0, topCount),
2640
+ spacer("gap-top", gapTop),
2641
+ bodyRowsIn(midStart, midEnd),
2642
+ spacer("gap-bottom", gapBottom),
2643
+ bodyRowsIn(bodyLength - bottomCount, bodyLength)
2644
+ ] }) }),
2645
+ footer ? /* @__PURE__ */ jsx("tfoot", { children: /* @__PURE__ */ jsxs("tr", { "aria-rowindex": rowCount, style: { height: rowHeight }, children: [
2646
+ footerCells.slice(0, fillerIndex),
2647
+ /* @__PURE__ */ jsx(
2648
+ "td",
2649
+ {
2650
+ role: "presentation",
2651
+ className: "sticky bottom-0 z-2 border-t-divider bg-surface"
2652
+ }
2653
+ ),
2654
+ footerCells.slice(fillerIndex)
2655
+ ] }) }) : null
2656
+ ]
2657
+ }
2658
+ )
2659
+ }
2660
+ )
2661
+ ] }),
2662
+ rangeSelection ? /* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center gap-x-4 gap-y-1 border-t-divider px-3 py-1.5 text-[12.5px] text-ink-2", children: stats && cellRange ? /* @__PURE__ */ jsxs(Fragment, { children: [
2663
+ /* @__PURE__ */ jsx("span", { className: "font-[650] text-ink", children: labels.rangeCells(rangeCellCount) }),
2664
+ /* @__PURE__ */ jsxs("span", { children: [
2665
+ labels.rangeCount,
2666
+ ":",
2667
+ " ",
2668
+ /* @__PURE__ */ jsx("b", { className: "font-[650] text-ink tabular-nums", children: stats.count })
2669
+ ] }),
2670
+ stats.numeric > 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [
2671
+ /* @__PURE__ */ jsxs("span", { children: [
2672
+ labels.rangeSum,
2673
+ ":",
2674
+ " ",
2675
+ /* @__PURE__ */ jsx("b", { className: "font-[650] text-ink tabular-nums", children: formatStat(stats.sum) })
2676
+ ] }),
2677
+ /* @__PURE__ */ jsxs("span", { children: [
2678
+ labels.rangeAvg,
2679
+ ":",
2680
+ " ",
2681
+ /* @__PURE__ */ jsx("b", { className: "font-[650] text-ink tabular-nums", children: formatStat(stats.avg) })
2682
+ ] }),
2683
+ /* @__PURE__ */ jsxs("span", { className: "@max-sm/grid:hidden", children: [
2684
+ labels.rangeMin,
2685
+ ":",
2686
+ " ",
2687
+ /* @__PURE__ */ jsx("b", { className: "font-[650] text-ink tabular-nums", children: formatStat(stats.min) })
2688
+ ] }),
2689
+ /* @__PURE__ */ jsxs("span", { className: "@max-sm/grid:hidden", children: [
2690
+ labels.rangeMax,
2691
+ ":",
2692
+ " ",
2693
+ /* @__PURE__ */ jsx("b", { className: "font-[650] text-ink tabular-nums", children: formatStat(stats.max) })
2694
+ ] })
2695
+ ] }) : null,
2696
+ charts ? /* @__PURE__ */ jsxs(
2697
+ "button",
2698
+ {
2699
+ type: "button",
2700
+ onClick: openChart,
2701
+ className: "ml-auto inline-flex h-7 items-center gap-1.5 rounded-control border-divider bg-surface-control px-2 font-[600] text-[12px] text-ink-2 hover:border-line-strong hover:text-ink [&_svg]:size-3.5",
2702
+ children: [
2703
+ /* @__PURE__ */ jsx(BarChart3, { "aria-hidden": "true" }),
2704
+ labels.chart
2705
+ ]
2706
+ }
2707
+ ) : null,
2708
+ /* @__PURE__ */ jsxs(
2709
+ "button",
2710
+ {
2711
+ type: "button",
2712
+ onClick: copyRange,
2713
+ className: cn(
2714
+ "inline-flex h-7 items-center gap-1.5 rounded-control border-divider bg-surface-control px-2 font-[600] text-[12px] text-ink-2 hover:border-line-strong hover:text-ink [&_svg]:size-3.5",
2715
+ !charts && "ml-auto"
2716
+ ),
2717
+ children: [
2718
+ /* @__PURE__ */ jsx(Copy, { "aria-hidden": "true" }),
2719
+ labels.copyRange
2720
+ ]
2721
+ }
2722
+ )
2723
+ ] }) : /* @__PURE__ */ jsx("span", { className: "text-ink-3", children: labels.rangeHint }) }) : null,
2724
+ charts && chart ? /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx("div", { "aria-hidden": "true", className: "h-72 border-t-divider" }), children: /* @__PURE__ */ jsx(
2725
+ ChartPanel,
2726
+ {
2727
+ data: chart.data,
2728
+ kind: chart.kind,
2729
+ onKind: (kind) => setChart({ ...chart, kind }),
2730
+ onClose: () => setChart(null),
2731
+ valueFormat: chart.currency ? "currency" : "number",
2732
+ labels: {
2733
+ title: labels.chartTitle(chart.cells),
2734
+ kinds: labels.chartKinds,
2735
+ kindGroup: labels.chartKindGroup,
2736
+ close: labels.chartClose,
2737
+ noData: labels.chartNoData,
2738
+ other: labels.chartOther
2739
+ }
2740
+ }
2741
+ ) }) : null,
2742
+ /* @__PURE__ */ jsx("p", { id: helpId, className: "sr-only", children: labels.keyboardHelp }),
2743
+ /* @__PURE__ */ jsx("p", { className: "sr-only", role: "status", "aria-live": "polite", children: busy ? labels.loading : announcement }),
2744
+ paged && split.middle.length > 0 ? /* @__PURE__ */ jsx(
2745
+ Pagination,
2746
+ {
2747
+ labels,
2748
+ page: currentPage,
2749
+ pages,
2750
+ pageSize,
2751
+ total: split.middle.length,
2752
+ options: pageSizeOptions,
2753
+ onPage: setPage,
2754
+ onPageSize: (size) => {
2755
+ setPageSize(size);
2756
+ setPage(0);
2757
+ }
2758
+ }
2759
+ ) : null
2760
+ ]
2761
+ }
2762
+ );
2763
+ }
2764
+ function Pagination({
2765
+ labels,
2766
+ page,
2767
+ pages,
2768
+ pageSize,
2769
+ total,
2770
+ options,
2771
+ onPage,
2772
+ onPageSize
2773
+ }) {
2774
+ const first = page * pageSize + 1;
2775
+ const last = Math.min(total, (page + 1) * pageSize);
2776
+ const button = "grid size-8 place-items-center rounded-control text-ink-2 hover:bg-surface-2 hover:text-ink disabled:pointer-events-none disabled:opacity-35 [&_svg]:size-4";
2777
+ return /* @__PURE__ */ jsxs(
2778
+ "nav",
2779
+ {
2780
+ "aria-label": labels.rowsPerPage,
2781
+ className: "flex flex-wrap items-center justify-end gap-x-3 gap-y-1 border-t-divider px-2 py-1.5 text-[12.5px] text-ink-2",
2782
+ children: [
2783
+ /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2", children: [
2784
+ /* @__PURE__ */ jsx("span", { children: labels.rowsPerPage }),
2785
+ /* @__PURE__ */ jsx(
2786
+ "select",
2787
+ {
2788
+ value: pageSize,
2789
+ onChange: (event) => onPageSize(Number(event.target.value)),
2790
+ className: "h-control-sm rounded-input border-control bg-surface-control px-1.5 text-[12.5px] text-ink",
2791
+ children: [.../* @__PURE__ */ new Set([...options, pageSize])].sort((a, b) => a - b).map((size) => /* @__PURE__ */ jsx("option", { value: size, children: size }, size))
2792
+ }
2793
+ )
2794
+ ] }),
2795
+ /* @__PURE__ */ jsx("span", { "aria-live": "polite", className: "tabular-nums", children: labels.pageRange(first, last, total) }),
2796
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center", children: [
2797
+ /* @__PURE__ */ jsx(
2798
+ "button",
2799
+ {
2800
+ type: "button",
2801
+ className: button,
2802
+ "aria-label": labels.firstPage,
2803
+ disabled: page === 0,
2804
+ onClick: () => onPage(0),
2805
+ children: /* @__PURE__ */ jsx(ChevronsLeft, { "aria-hidden": "true" })
2806
+ }
2807
+ ),
2808
+ /* @__PURE__ */ jsx(
2809
+ "button",
2810
+ {
2811
+ type: "button",
2812
+ className: button,
2813
+ "aria-label": labels.previousPage,
2814
+ disabled: page === 0,
2815
+ onClick: () => onPage(page - 1),
2816
+ children: /* @__PURE__ */ jsx(ChevronLeft, { "aria-hidden": "true" })
2817
+ }
2818
+ ),
2819
+ /* @__PURE__ */ jsx(
2820
+ "button",
2821
+ {
2822
+ type: "button",
2823
+ className: button,
2824
+ "aria-label": labels.nextPage,
2825
+ disabled: page >= pages - 1,
2826
+ onClick: () => onPage(page + 1),
2827
+ children: /* @__PURE__ */ jsx(ChevronRight, { "aria-hidden": "true" })
2828
+ }
2829
+ ),
2830
+ /* @__PURE__ */ jsx(
2831
+ "button",
2832
+ {
2833
+ type: "button",
2834
+ className: button,
2835
+ "aria-label": labels.lastPage,
2836
+ disabled: page >= pages - 1,
2837
+ onClick: () => onPage(pages - 1),
2838
+ children: /* @__PURE__ */ jsx(ChevronsRight, { "aria-hidden": "true" })
2839
+ }
2840
+ )
2841
+ ] })
2842
+ ]
2843
+ }
2844
+ );
2845
+ }
2846
+ export {
2847
+ DataGrid,
2848
+ downloadCSV,
2849
+ downloadFile
2850
+ };