@cronus-ui/ui 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (717) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +262 -0
  3. package/dist/charts/animation.d.ts +11 -0
  4. package/dist/charts/animation.js +29 -0
  5. package/dist/charts/area-chart-loading.d.ts +34 -0
  6. package/dist/charts/area-chart-loading.js +22 -0
  7. package/dist/charts/area-chart.d.ts +48 -0
  8. package/dist/charts/area-chart.js +57 -0
  9. package/dist/charts/area-gradient-defs.d.ts +20 -0
  10. package/dist/charts/area-gradient-defs.js +15 -0
  11. package/dist/charts/area.d.ts +76 -0
  12. package/dist/charts/area.js +104 -0
  13. package/dist/charts/background.d.ts +27 -0
  14. package/dist/charts/background.js +68 -0
  15. package/dist/charts/bar-chart-loading.d.ts +17 -0
  16. package/dist/charts/bar-chart-loading.js +14 -0
  17. package/dist/charts/bar-chart.d.ts +55 -0
  18. package/dist/charts/bar-chart.js +432 -0
  19. package/dist/charts/bar-depth-geometry.d.ts +33 -0
  20. package/dist/charts/bar-depth-geometry.js +38 -0
  21. package/dist/charts/bar-depth.d.ts +157 -0
  22. package/dist/charts/bar-depth.js +586 -0
  23. package/dist/charts/bar-squares-layout.d.ts +28 -0
  24. package/dist/charts/bar-squares-layout.js +47 -0
  25. package/dist/charts/bar-squares.d.ts +49 -0
  26. package/dist/charts/bar-squares.js +207 -0
  27. package/dist/charts/bar-x-axis.d.ts +14 -0
  28. package/dist/charts/bar-x-axis.js +73 -0
  29. package/dist/charts/bar-y-axis.d.ts +12 -0
  30. package/dist/charts/bar-y-axis.js +64 -0
  31. package/dist/charts/bar.d.ts +41 -0
  32. package/dist/charts/bar.js +208 -0
  33. package/dist/charts/candlestick-chart.d.ts +46 -0
  34. package/dist/charts/candlestick-chart.js +203 -0
  35. package/dist/charts/candlestick.d.ts +24 -0
  36. package/dist/charts/candlestick.js +139 -0
  37. package/dist/charts/chart-brush-handle.d.ts +15 -0
  38. package/dist/charts/chart-brush-handle.js +47 -0
  39. package/dist/charts/chart-brush-layout.d.ts +27 -0
  40. package/dist/charts/chart-brush-layout.js +42 -0
  41. package/dist/charts/chart-brush-selection-overlay.d.ts +19 -0
  42. package/dist/charts/chart-brush-selection-overlay.js +44 -0
  43. package/dist/charts/chart-brush-track-overlay.d.ts +23 -0
  44. package/dist/charts/chart-brush-track-overlay.js +65 -0
  45. package/dist/charts/chart-brush.d.ts +32 -0
  46. package/dist/charts/chart-brush.js +116 -0
  47. package/dist/charts/chart-center-typography.d.ts +12 -0
  48. package/dist/charts/chart-center-typography.js +12 -0
  49. package/dist/charts/chart-child-passthrough.d.ts +17 -0
  50. package/dist/charts/chart-child-passthrough.js +74 -0
  51. package/dist/charts/chart-config-context.d.ts +26 -0
  52. package/dist/charts/chart-config-context.js +47 -0
  53. package/dist/charts/chart-context.d.ts +199 -0
  54. package/dist/charts/chart-context.js +201 -0
  55. package/dist/charts/chart-defs.d.ts +13 -0
  56. package/dist/charts/chart-defs.js +49 -0
  57. package/dist/charts/chart-formatters.d.ts +10 -0
  58. package/dist/charts/chart-formatters.js +28 -0
  59. package/dist/charts/chart-legend-hover.d.ts +13 -0
  60. package/dist/charts/chart-legend-hover.js +18 -0
  61. package/dist/charts/chart-legend.d.ts +55 -0
  62. package/dist/charts/chart-legend.js +30 -0
  63. package/dist/charts/chart-loading-label.d.ts +10 -0
  64. package/dist/charts/chart-loading-label.js +21 -0
  65. package/dist/charts/chart-phase.d.ts +31 -0
  66. package/dist/charts/chart-phase.js +21 -0
  67. package/dist/charts/chart-reveal-clip.d.ts +24 -0
  68. package/dist/charts/chart-reveal-clip.js +24 -0
  69. package/dist/charts/chart-scale.d.ts +12 -0
  70. package/dist/charts/chart-scale.js +17 -0
  71. package/dist/charts/chart-stat-flow.d.ts +36 -0
  72. package/dist/charts/chart-stat-flow.js +23 -0
  73. package/dist/charts/choropleth/choropleth-chart.d.ts +43 -0
  74. package/dist/charts/choropleth/choropleth-chart.js +218 -0
  75. package/dist/charts/choropleth/choropleth-context.d.ts +86 -0
  76. package/dist/charts/choropleth/choropleth-context.js +106 -0
  77. package/dist/charts/choropleth/choropleth-feature.d.ts +13 -0
  78. package/dist/charts/choropleth/choropleth-feature.js +125 -0
  79. package/dist/charts/choropleth/choropleth-graticule.d.ts +11 -0
  80. package/dist/charts/choropleth/choropleth-graticule.js +12 -0
  81. package/dist/charts/choropleth/choropleth-tooltip.d.ts +31 -0
  82. package/dist/charts/choropleth/choropleth-tooltip.js +50 -0
  83. package/dist/charts/choropleth/index.d.ts +7 -0
  84. package/dist/charts/choropleth/index.js +6 -0
  85. package/dist/charts/composed-chart.d.ts +36 -0
  86. package/dist/charts/composed-chart.js +152 -0
  87. package/dist/charts/dash-tail-stroke.d.ts +18 -0
  88. package/dist/charts/dash-tail-stroke.js +13 -0
  89. package/dist/charts/decimate-time-series.d.ts +10 -0
  90. package/dist/charts/decimate-time-series.js +112 -0
  91. package/dist/charts/fade-edges.d.ts +34 -0
  92. package/dist/charts/fade-edges.js +35 -0
  93. package/dist/charts/filter-data-by-x-domain.d.ts +5 -0
  94. package/dist/charts/filter-data-by-x-domain.js +42 -0
  95. package/dist/charts/funnel-chart.d.ts +91 -0
  96. package/dist/charts/funnel-chart.js +302 -0
  97. package/dist/charts/gauge-label-layout.d.ts +22 -0
  98. package/dist/charts/gauge-label-layout.js +44 -0
  99. package/dist/charts/gauge.d.ts +56 -0
  100. package/dist/charts/gauge.js +307 -0
  101. package/dist/charts/generate-chart-skeleton-data.d.ts +16 -0
  102. package/dist/charts/generate-chart-skeleton-data.js +25 -0
  103. package/dist/charts/grid.d.ts +58 -0
  104. package/dist/charts/grid.js +80 -0
  105. package/dist/charts/heatmap/generate-heatmap-skeleton-data.d.ts +4 -0
  106. package/dist/charts/heatmap/generate-heatmap-skeleton-data.js +12 -0
  107. package/dist/charts/heatmap/heatmap-animation.d.ts +41 -0
  108. package/dist/charts/heatmap/heatmap-animation.js +85 -0
  109. package/dist/charts/heatmap/heatmap-cells.d.ts +21 -0
  110. package/dist/charts/heatmap/heatmap-cells.js +265 -0
  111. package/dist/charts/heatmap/heatmap-chart-loading.d.ts +21 -0
  112. package/dist/charts/heatmap/heatmap-chart-loading.js +14 -0
  113. package/dist/charts/heatmap/heatmap-chart.d.ts +80 -0
  114. package/dist/charts/heatmap/heatmap-chart.js +275 -0
  115. package/dist/charts/heatmap/heatmap-colors.d.ts +70 -0
  116. package/dist/charts/heatmap/heatmap-colors.js +113 -0
  117. package/dist/charts/heatmap/heatmap-context.d.ts +109 -0
  118. package/dist/charts/heatmap/heatmap-context.js +69 -0
  119. package/dist/charts/heatmap/heatmap-legend-gradient.d.ts +20 -0
  120. package/dist/charts/heatmap/heatmap-legend-gradient.js +44 -0
  121. package/dist/charts/heatmap/heatmap-legend-swatch.d.ts +8 -0
  122. package/dist/charts/heatmap/heatmap-legend-swatch.js +26 -0
  123. package/dist/charts/heatmap/heatmap-legend.d.ts +41 -0
  124. package/dist/charts/heatmap/heatmap-legend.js +68 -0
  125. package/dist/charts/heatmap/heatmap-pattern-defs.d.ts +5 -0
  126. package/dist/charts/heatmap/heatmap-pattern-defs.js +25 -0
  127. package/dist/charts/heatmap/heatmap-resolve-separator.d.ts +8 -0
  128. package/dist/charts/heatmap/heatmap-resolve-separator.js +82 -0
  129. package/dist/charts/heatmap/heatmap-separator.d.ts +63 -0
  130. package/dist/charts/heatmap/heatmap-separator.js +71 -0
  131. package/dist/charts/heatmap/heatmap-tooltip.d.ts +30 -0
  132. package/dist/charts/heatmap/heatmap-tooltip.js +20 -0
  133. package/dist/charts/heatmap/heatmap-utils.d.ts +175 -0
  134. package/dist/charts/heatmap/heatmap-utils.js +595 -0
  135. package/dist/charts/heatmap/heatmap-x-axis.d.ts +7 -0
  136. package/dist/charts/heatmap/heatmap-x-axis.js +54 -0
  137. package/dist/charts/heatmap/heatmap-y-axis.d.ts +14 -0
  138. package/dist/charts/heatmap/heatmap-y-axis.js +37 -0
  139. package/dist/charts/heatmap/index.d.ts +15 -0
  140. package/dist/charts/heatmap/index.js +15 -0
  141. package/dist/charts/heatmap/use-delayed-tooltip-data.d.ts +3 -0
  142. package/dist/charts/heatmap/use-delayed-tooltip-data.js +53 -0
  143. package/dist/charts/highlight-segment-bounds.d.ts +18 -0
  144. package/dist/charts/highlight-segment-bounds.js +36 -0
  145. package/dist/charts/highlight-segment.d.ts +22 -0
  146. package/dist/charts/highlight-segment.js +14 -0
  147. package/dist/charts/index.d.ts +106 -0
  148. package/dist/charts/index.js +133 -0
  149. package/dist/charts/indicator-fade.d.ts +15 -0
  150. package/dist/charts/indicator-fade.js +42 -0
  151. package/dist/charts/legend/index.d.ts +8 -0
  152. package/dist/charts/legend/index.js +10 -0
  153. package/dist/charts/legend/legend-context.d.ts +48 -0
  154. package/dist/charts/legend/legend-context.js +34 -0
  155. package/dist/charts/legend/legend-item.d.ts +12 -0
  156. package/dist/charts/legend/legend-item.js +11 -0
  157. package/dist/charts/legend/legend-label.d.ts +9 -0
  158. package/dist/charts/legend/legend-label.js +10 -0
  159. package/dist/charts/legend/legend-marker.d.ts +9 -0
  160. package/dist/charts/legend/legend-marker.js +11 -0
  161. package/dist/charts/legend/legend-progress.d.ts +13 -0
  162. package/dist/charts/legend/legend-progress.js +15 -0
  163. package/dist/charts/legend/legend-value.d.ts +17 -0
  164. package/dist/charts/legend/legend-value.js +11 -0
  165. package/dist/charts/legend/legend.d.ts +23 -0
  166. package/dist/charts/legend/legend.js +43 -0
  167. package/dist/charts/line-chart-loading.d.ts +34 -0
  168. package/dist/charts/line-chart-loading.js +22 -0
  169. package/dist/charts/line-chart.d.ts +46 -0
  170. package/dist/charts/line-chart.js +91 -0
  171. package/dist/charts/line-loading-pulse.d.ts +20 -0
  172. package/dist/charts/line-loading-pulse.js +124 -0
  173. package/dist/charts/line-loading-timing.d.ts +10 -0
  174. package/dist/charts/line-loading-timing.js +10 -0
  175. package/dist/charts/line-series-terminal-marker.d.ts +16 -0
  176. package/dist/charts/line-series-terminal-marker.js +46 -0
  177. package/dist/charts/line.d.ts +64 -0
  178. package/dist/charts/line.js +96 -0
  179. package/dist/charts/live-line-chart.d.ts +35 -0
  180. package/dist/charts/live-line-chart.js +374 -0
  181. package/dist/charts/live-line.d.ts +39 -0
  182. package/dist/charts/live-line.js +78 -0
  183. package/dist/charts/live-x-axis.d.ts +12 -0
  184. package/dist/charts/live-x-axis.js +85 -0
  185. package/dist/charts/live-y-axis.d.ts +16 -0
  186. package/dist/charts/live-y-axis.js +137 -0
  187. package/dist/charts/loading-sweep.d.ts +66 -0
  188. package/dist/charts/loading-sweep.js +174 -0
  189. package/dist/charts/markers/chart-markers.d.ts +25 -0
  190. package/dist/charts/markers/chart-markers.js +87 -0
  191. package/dist/charts/markers/index.d.ts +3 -0
  192. package/dist/charts/markers/index.js +3 -0
  193. package/dist/charts/markers/marker-group.d.ts +88 -0
  194. package/dist/charts/markers/marker-group.js +171 -0
  195. package/dist/charts/motion-utils.d.ts +9 -0
  196. package/dist/charts/motion-utils.js +28 -0
  197. package/dist/charts/notch-gauge-shared.d.ts +49 -0
  198. package/dist/charts/notch-gauge-shared.js +103 -0
  199. package/dist/charts/path-stroke-utils.d.ts +20 -0
  200. package/dist/charts/path-stroke-utils.js +55 -0
  201. package/dist/charts/pattern-area.d.ts +21 -0
  202. package/dist/charts/pattern-area.js +19 -0
  203. package/dist/charts/pattern-preset.d.ts +26 -0
  204. package/dist/charts/pattern-preset.js +83 -0
  205. package/dist/charts/pie-center-shell.d.ts +24 -0
  206. package/dist/charts/pie-center-shell.js +109 -0
  207. package/dist/charts/pie-center.d.ts +46 -0
  208. package/dist/charts/pie-center.js +46 -0
  209. package/dist/charts/pie-chart.d.ts +50 -0
  210. package/dist/charts/pie-chart.js +248 -0
  211. package/dist/charts/pie-context.d.ts +74 -0
  212. package/dist/charts/pie-context.js +95 -0
  213. package/dist/charts/pie-slice.d.ts +28 -0
  214. package/dist/charts/pie-slice.js +180 -0
  215. package/dist/charts/profit-loss-legend-hover.d.ts +11 -0
  216. package/dist/charts/profit-loss-legend-hover.js +12 -0
  217. package/dist/charts/profit-loss-legend.d.ts +17 -0
  218. package/dist/charts/profit-loss-legend.js +18 -0
  219. package/dist/charts/profit-loss-line.d.ts +27 -0
  220. package/dist/charts/profit-loss-line.js +77 -0
  221. package/dist/charts/profit-loss-segments.d.ts +12 -0
  222. package/dist/charts/profit-loss-segments.js +86 -0
  223. package/dist/charts/projection-config.d.ts +11 -0
  224. package/dist/charts/projection-config.js +80 -0
  225. package/dist/charts/projection-line-end-marker.d.ts +15 -0
  226. package/dist/charts/projection-line-end-marker.js +27 -0
  227. package/dist/charts/projection-line.d.ts +40 -0
  228. package/dist/charts/projection-line.js +79 -0
  229. package/dist/charts/projection-utils.d.ts +46 -0
  230. package/dist/charts/projection-utils.js +253 -0
  231. package/dist/charts/radar-area.d.ts +17 -0
  232. package/dist/charts/radar-area.js +84 -0
  233. package/dist/charts/radar-axis.d.ts +14 -0
  234. package/dist/charts/radar-axis.js +24 -0
  235. package/dist/charts/radar-chart.d.ts +36 -0
  236. package/dist/charts/radar-chart.js +89 -0
  237. package/dist/charts/radar-context.d.ts +68 -0
  238. package/dist/charts/radar-context.js +87 -0
  239. package/dist/charts/radar-grid.d.ts +16 -0
  240. package/dist/charts/radar-grid.js +40 -0
  241. package/dist/charts/radar-labels.d.ts +16 -0
  242. package/dist/charts/radar-labels.js +29 -0
  243. package/dist/charts/reference-area-config.d.ts +10 -0
  244. package/dist/charts/reference-area-config.js +39 -0
  245. package/dist/charts/reference-area-geometry.d.ts +23 -0
  246. package/dist/charts/reference-area-geometry.js +68 -0
  247. package/dist/charts/reference-area-registration-context.d.ts +8 -0
  248. package/dist/charts/reference-area-registration-context.js +7 -0
  249. package/dist/charts/reference-area.d.ts +52 -0
  250. package/dist/charts/reference-area.js +101 -0
  251. package/dist/charts/ring-center.d.ts +46 -0
  252. package/dist/charts/ring-center.js +41 -0
  253. package/dist/charts/ring-chart.d.ts +41 -0
  254. package/dist/charts/ring-chart.js +212 -0
  255. package/dist/charts/ring-context.d.ts +66 -0
  256. package/dist/charts/ring-context.js +92 -0
  257. package/dist/charts/ring.d.ts +11 -0
  258. package/dist/charts/ring.js +104 -0
  259. package/dist/charts/sankey/index.d.ts +6 -0
  260. package/dist/charts/sankey/index.js +6 -0
  261. package/dist/charts/sankey/sankey-chart.d.ts +39 -0
  262. package/dist/charts/sankey/sankey-chart.js +117 -0
  263. package/dist/charts/sankey/sankey-context.d.ts +69 -0
  264. package/dist/charts/sankey/sankey-context.js +23 -0
  265. package/dist/charts/sankey/sankey-link.d.ts +26 -0
  266. package/dist/charts/sankey/sankey-link.js +155 -0
  267. package/dist/charts/sankey/sankey-node.d.ts +29 -0
  268. package/dist/charts/sankey/sankey-node.js +200 -0
  269. package/dist/charts/sankey/sankey-tooltip.d.ts +24 -0
  270. package/dist/charts/sankey/sankey-tooltip.js +70 -0
  271. package/dist/charts/scatter-chart-shell.d.ts +21 -0
  272. package/dist/charts/scatter-chart-shell.js +152 -0
  273. package/dist/charts/scatter-chart.d.ts +32 -0
  274. package/dist/charts/scatter-chart.js +56 -0
  275. package/dist/charts/scatter-svg.d.ts +6 -0
  276. package/dist/charts/scatter-svg.js +16 -0
  277. package/dist/charts/scatter.d.ts +21 -0
  278. package/dist/charts/scatter.js +30 -0
  279. package/dist/charts/segment.d.ts +26 -0
  280. package/dist/charts/segment.js +42 -0
  281. package/dist/charts/series-bar-layout.d.ts +18 -0
  282. package/dist/charts/series-bar-layout.js +31 -0
  283. package/dist/charts/series-bar.d.ts +20 -0
  284. package/dist/charts/series-bar.js +120 -0
  285. package/dist/charts/series-dash-tail-overlay.d.ts +17 -0
  286. package/dist/charts/series-dash-tail-overlay.js +39 -0
  287. package/dist/charts/series-highlight-layer.d.ts +23 -0
  288. package/dist/charts/series-highlight-layer.js +21 -0
  289. package/dist/charts/series-hover-dim.d.ts +29 -0
  290. package/dist/charts/series-hover-dim.js +26 -0
  291. package/dist/charts/series-markers.d.ts +14 -0
  292. package/dist/charts/series-markers.js +98 -0
  293. package/dist/charts/series-path-utils.d.ts +19 -0
  294. package/dist/charts/series-path-utils.js +60 -0
  295. package/dist/charts/series-point-marker.d.ts +48 -0
  296. package/dist/charts/series-point-marker.js +48 -0
  297. package/dist/charts/shimmering-text.d.ts +23 -0
  298. package/dist/charts/shimmering-text.js +31 -0
  299. package/dist/charts/static-chart-preview-context.d.ts +7 -0
  300. package/dist/charts/static-chart-preview-context.js +12 -0
  301. package/dist/charts/sunburst-breadcrumb.d.ts +16 -0
  302. package/dist/charts/sunburst-breadcrumb.js +26 -0
  303. package/dist/charts/sunburst-center.d.ts +5 -0
  304. package/dist/charts/sunburst-center.js +17 -0
  305. package/dist/charts/sunburst-chart.d.ts +30 -0
  306. package/dist/charts/sunburst-chart.js +263 -0
  307. package/dist/charts/sunburst-context.d.ts +61 -0
  308. package/dist/charts/sunburst-context.js +112 -0
  309. package/dist/charts/sunburst-data.d.ts +9 -0
  310. package/dist/charts/sunburst-data.js +2 -0
  311. package/dist/charts/sunburst-hint.d.ts +13 -0
  312. package/dist/charts/sunburst-hint.js +31 -0
  313. package/dist/charts/sunburst-labels.d.ts +9 -0
  314. package/dist/charts/sunburst-labels.js +63 -0
  315. package/dist/charts/sunburst-segment.d.ts +11 -0
  316. package/dist/charts/sunburst-segment.js +78 -0
  317. package/dist/charts/sunburst.d.ts +101 -0
  318. package/dist/charts/sunburst.js +396 -0
  319. package/dist/charts/time-series-chart-shell.d.ts +47 -0
  320. package/dist/charts/time-series-chart-shell.js +390 -0
  321. package/dist/charts/tooltip/chart-tooltip.d.ts +76 -0
  322. package/dist/charts/tooltip/chart-tooltip.js +150 -0
  323. package/dist/charts/tooltip/date-ticker.d.ts +11 -0
  324. package/dist/charts/tooltip/date-ticker.js +77 -0
  325. package/dist/charts/tooltip/index.d.ts +7 -0
  326. package/dist/charts/tooltip/index.js +7 -0
  327. package/dist/charts/tooltip/tooltip-box.d.ts +48 -0
  328. package/dist/charts/tooltip/tooltip-box.js +114 -0
  329. package/dist/charts/tooltip/tooltip-content.d.ts +18 -0
  330. package/dist/charts/tooltip/tooltip-content.js +9 -0
  331. package/dist/charts/tooltip/tooltip-dot.d.ts +28 -0
  332. package/dist/charts/tooltip/tooltip-dot.js +54 -0
  333. package/dist/charts/tooltip/tooltip-indicator.d.ts +45 -0
  334. package/dist/charts/tooltip/tooltip-indicator.js +65 -0
  335. package/dist/charts/use-animated-series-path.d.ts +19 -0
  336. package/dist/charts/use-animated-series-path.js +93 -0
  337. package/dist/charts/use-animated-y-domains.d.ts +14 -0
  338. package/dist/charts/use-animated-y-domains.js +150 -0
  339. package/dist/charts/use-chart-interaction.d.ts +41 -0
  340. package/dist/charts/use-chart-interaction.js +244 -0
  341. package/dist/charts/use-chart-phase-orchestrator.d.ts +23 -0
  342. package/dist/charts/use-chart-phase-orchestrator.js +139 -0
  343. package/dist/charts/use-enter-complete.d.ts +8 -0
  344. package/dist/charts/use-enter-complete.js +23 -0
  345. package/dist/charts/use-grid-shimmer.d.ts +16 -0
  346. package/dist/charts/use-grid-shimmer.js +63 -0
  347. package/dist/charts/use-highlight-segment.d.ts +14 -0
  348. package/dist/charts/use-highlight-segment.js +34 -0
  349. package/dist/charts/use-mount-progress.d.ts +4 -0
  350. package/dist/charts/use-mount-progress.js +22 -0
  351. package/dist/charts/use-scatter-chart-interaction.d.ts +35 -0
  352. package/dist/charts/use-scatter-chart-interaction.js +228 -0
  353. package/dist/charts/use-scheduled-tooltip.d.ts +9 -0
  354. package/dist/charts/use-scheduled-tooltip.js +76 -0
  355. package/dist/charts/visx-pattern.d.ts +19 -0
  356. package/dist/charts/visx-pattern.js +20 -0
  357. package/dist/charts/x-axis.d.ts +27 -0
  358. package/dist/charts/x-axis.js +415 -0
  359. package/dist/charts/y-axis-scales.d.ts +26 -0
  360. package/dist/charts/y-axis-scales.js +72 -0
  361. package/dist/charts/y-axis-ticks.d.ts +12 -0
  362. package/dist/charts/y-axis-ticks.js +24 -0
  363. package/dist/charts/y-axis.d.ts +22 -0
  364. package/dist/charts/y-axis.js +80 -0
  365. package/dist/charts/y-domain-utils.d.ts +27 -0
  366. package/dist/charts/y-domain-utils.js +88 -0
  367. package/dist/components/accordion.d.ts +6 -0
  368. package/dist/components/accordion.js +20 -0
  369. package/dist/components/alert-dialog.d.ts +18 -0
  370. package/dist/components/alert-dialog.js +41 -0
  371. package/dist/components/alert.d.ts +24 -0
  372. package/dist/components/alert.js +46 -0
  373. package/dist/components/animated-button.d.ts +5 -0
  374. package/dist/components/animated-button.js +16 -0
  375. package/dist/components/animated-list.d.ts +26 -0
  376. package/dist/components/animated-list.js +25 -0
  377. package/dist/components/animated-number.d.ts +67 -0
  378. package/dist/components/animated-number.js +131 -0
  379. package/dist/components/app-shell.d.ts +27 -0
  380. package/dist/components/app-shell.js +18 -0
  381. package/dist/components/area-chart.d.ts +11 -0
  382. package/dist/components/area-chart.js +12 -0
  383. package/dist/components/aspect-ratio.d.ts +16 -0
  384. package/dist/components/aspect-ratio.js +14 -0
  385. package/dist/components/aurora-background.d.ts +3 -0
  386. package/dist/components/aurora-background.js +8 -0
  387. package/dist/components/autocomplete.d.ts +55 -0
  388. package/dist/components/autocomplete.js +279 -0
  389. package/dist/components/avatar-group.d.ts +39 -0
  390. package/dist/components/avatar-group.js +50 -0
  391. package/dist/components/avatar.d.ts +5 -0
  392. package/dist/components/avatar.js +17 -0
  393. package/dist/components/badge.d.ts +10 -0
  394. package/dist/components/badge.js +35 -0
  395. package/dist/components/banner.d.ts +45 -0
  396. package/dist/components/banner.js +80 -0
  397. package/dist/components/bar-chart.d.ts +11 -0
  398. package/dist/components/bar-chart.js +9 -0
  399. package/dist/components/border-beam.d.ts +45 -0
  400. package/dist/components/border-beam.js +48 -0
  401. package/dist/components/breadcrumb.d.ts +12 -0
  402. package/dist/components/breadcrumb.js +35 -0
  403. package/dist/components/button-group.d.ts +7 -0
  404. package/dist/components/button-group.js +10 -0
  405. package/dist/components/button.d.ts +12 -0
  406. package/dist/components/button.js +39 -0
  407. package/dist/components/calendar.d.ts +7 -0
  408. package/dist/components/calendar.js +71 -0
  409. package/dist/components/candlestick-chart.d.ts +13 -0
  410. package/dist/components/candlestick-chart.js +66 -0
  411. package/dist/components/card-stack.d.ts +28 -0
  412. package/dist/components/card-stack.js +47 -0
  413. package/dist/components/card.d.ts +9 -0
  414. package/dist/components/card.js +32 -0
  415. package/dist/components/carousel.d.ts +82 -0
  416. package/dist/components/carousel.js +310 -0
  417. package/dist/components/chart.d.ts +100 -0
  418. package/dist/components/chart.js +210 -0
  419. package/dist/components/checkbox.d.ts +3 -0
  420. package/dist/components/checkbox.js +11 -0
  421. package/dist/components/chip.d.ts +80 -0
  422. package/dist/components/chip.js +186 -0
  423. package/dist/components/choropleth-chart.d.ts +12 -0
  424. package/dist/components/choropleth-chart.js +31 -0
  425. package/dist/components/click-spark.d.ts +19 -0
  426. package/dist/components/click-spark.js +51 -0
  427. package/dist/components/code-block.d.ts +13 -0
  428. package/dist/components/code-block.js +20 -0
  429. package/dist/components/code-tabs.d.ts +51 -0
  430. package/dist/components/code-tabs.js +150 -0
  431. package/dist/components/collapsible.d.ts +5 -0
  432. package/dist/components/collapsible.js +12 -0
  433. package/dist/components/color-picker.d.ts +30 -0
  434. package/dist/components/color-picker.js +300 -0
  435. package/dist/components/combobox.d.ts +33 -0
  436. package/dist/components/combobox.js +32 -0
  437. package/dist/components/command.d.ts +87 -0
  438. package/dist/components/command.js +44 -0
  439. package/dist/components/comparison-slider.d.ts +17 -0
  440. package/dist/components/comparison-slider.js +81 -0
  441. package/dist/components/composed-chart.d.ts +13 -0
  442. package/dist/components/composed-chart.js +22 -0
  443. package/dist/components/confetti.d.ts +21 -0
  444. package/dist/components/confetti.js +111 -0
  445. package/dist/components/confirmation-dialog.d.ts +46 -0
  446. package/dist/components/confirmation-dialog.js +102 -0
  447. package/dist/components/context-menu.d.ts +28 -0
  448. package/dist/components/context-menu.js +52 -0
  449. package/dist/components/copy-button.d.ts +13 -0
  450. package/dist/components/copy-button.js +72 -0
  451. package/dist/components/countdown.d.ts +58 -0
  452. package/dist/components/countdown.js +106 -0
  453. package/dist/components/credit-card-input.d.ts +62 -0
  454. package/dist/components/credit-card-input.js +211 -0
  455. package/dist/components/currency-input.d.ts +86 -0
  456. package/dist/components/currency-input.js +215 -0
  457. package/dist/components/data-table.d.ts +232 -0
  458. package/dist/components/data-table.js +359 -0
  459. package/dist/components/date-picker.d.ts +66 -0
  460. package/dist/components/date-picker.js +55 -0
  461. package/dist/components/date-range-picker.d.ts +59 -0
  462. package/dist/components/date-range-picker.js +59 -0
  463. package/dist/components/description-list.d.ts +84 -0
  464. package/dist/components/description-list.js +138 -0
  465. package/dist/components/dialog.d.ts +26 -0
  466. package/dist/components/dialog.js +35 -0
  467. package/dist/components/dock.d.ts +34 -0
  468. package/dist/components/dock.js +61 -0
  469. package/dist/components/dot-pattern.d.ts +24 -0
  470. package/dist/components/dot-pattern.js +19 -0
  471. package/dist/components/drawer.d.ts +22 -0
  472. package/dist/components/drawer.js +37 -0
  473. package/dist/components/dropdown-menu.d.ts +32 -0
  474. package/dist/components/dropdown-menu.js +56 -0
  475. package/dist/components/dynamic-island.d.ts +26 -0
  476. package/dist/components/dynamic-island.js +31 -0
  477. package/dist/components/empty.d.ts +7 -0
  478. package/dist/components/empty.js +24 -0
  479. package/dist/components/expandable-tabs.d.ts +24 -0
  480. package/dist/components/expandable-tabs.js +30 -0
  481. package/dist/components/fab.d.ts +35 -0
  482. package/dist/components/fab.js +36 -0
  483. package/dist/components/field.d.ts +6 -0
  484. package/dist/components/field.js +22 -0
  485. package/dist/components/file-dropzone.d.ts +28 -0
  486. package/dist/components/file-dropzone.js +59 -0
  487. package/dist/components/flickering-grid.d.ts +25 -0
  488. package/dist/components/flickering-grid.js +30 -0
  489. package/dist/components/flip-card.d.ts +70 -0
  490. package/dist/components/flip-card.js +117 -0
  491. package/dist/components/floating-label-input.d.ts +34 -0
  492. package/dist/components/floating-label-input.js +25 -0
  493. package/dist/components/form.d.ts +25 -0
  494. package/dist/components/form.js +68 -0
  495. package/dist/components/frame.d.ts +12 -0
  496. package/dist/components/frame.js +10 -0
  497. package/dist/components/funnel-chart.d.ts +11 -0
  498. package/dist/components/funnel-chart.js +16 -0
  499. package/dist/components/gauge-chart.d.ts +8 -0
  500. package/dist/components/gauge-chart.js +10 -0
  501. package/dist/components/glare-hover.d.ts +15 -0
  502. package/dist/components/glare-hover.js +64 -0
  503. package/dist/components/glass-card.d.ts +3 -0
  504. package/dist/components/glass-card.js +8 -0
  505. package/dist/components/gradient-border.d.ts +7 -0
  506. package/dist/components/gradient-border.js +8 -0
  507. package/dist/components/gradient-text.d.ts +6 -0
  508. package/dist/components/gradient-text.js +10 -0
  509. package/dist/components/grid-pattern.d.ts +23 -0
  510. package/dist/components/grid-pattern.js +18 -0
  511. package/dist/components/heatmap-chart.d.ts +6 -0
  512. package/dist/components/heatmap-chart.js +8 -0
  513. package/dist/components/heatmap.d.ts +28 -0
  514. package/dist/components/heatmap.js +41 -0
  515. package/dist/components/highlighter.d.ts +20 -0
  516. package/dist/components/highlighter.js +19 -0
  517. package/dist/components/hover-card.d.ts +5 -0
  518. package/dist/components/hover-card.js +12 -0
  519. package/dist/components/image-zoom.d.ts +47 -0
  520. package/dist/components/image-zoom.js +125 -0
  521. package/dist/components/input-group.d.ts +10 -0
  522. package/dist/components/input-group.js +12 -0
  523. package/dist/components/input-otp.d.ts +18 -0
  524. package/dist/components/input-otp.js +38 -0
  525. package/dist/components/input.d.ts +6 -0
  526. package/dist/components/input.js +8 -0
  527. package/dist/components/json-viewer.d.ts +43 -0
  528. package/dist/components/json-viewer.js +313 -0
  529. package/dist/components/kanban.d.ts +31 -0
  530. package/dist/components/kanban.js +143 -0
  531. package/dist/components/kbd.d.ts +3 -0
  532. package/dist/components/kbd.js +8 -0
  533. package/dist/components/label.d.ts +3 -0
  534. package/dist/components/label.js +9 -0
  535. package/dist/components/light-rays.d.ts +19 -0
  536. package/dist/components/light-rays.js +20 -0
  537. package/dist/components/lightbox.d.ts +24 -0
  538. package/dist/components/lightbox.js +68 -0
  539. package/dist/components/line-chart.d.ts +10 -0
  540. package/dist/components/line-chart.js +9 -0
  541. package/dist/components/live-line-chart.d.ts +12 -0
  542. package/dist/components/live-line-chart.js +42 -0
  543. package/dist/components/logo-carousel.d.ts +27 -0
  544. package/dist/components/logo-carousel.js +101 -0
  545. package/dist/components/magnetic.d.ts +44 -0
  546. package/dist/components/magnetic.js +172 -0
  547. package/dist/components/marquee.d.ts +71 -0
  548. package/dist/components/marquee.js +141 -0
  549. package/dist/components/masonry.d.ts +16 -0
  550. package/dist/components/masonry.js +84 -0
  551. package/dist/components/menubar.d.ts +33 -0
  552. package/dist/components/menubar.js +56 -0
  553. package/dist/components/meteors.d.ts +20 -0
  554. package/dist/components/meteors.js +39 -0
  555. package/dist/components/metric.d.ts +9 -0
  556. package/dist/components/metric.js +35 -0
  557. package/dist/components/mode-toggle.d.ts +32 -0
  558. package/dist/components/mode-toggle.js +40 -0
  559. package/dist/components/morphing-popover.d.ts +91 -0
  560. package/dist/components/morphing-popover.js +194 -0
  561. package/dist/components/motion-presets.d.ts +9 -0
  562. package/dist/components/motion-presets.js +20 -0
  563. package/dist/components/multi-select.d.ts +54 -0
  564. package/dist/components/multi-select.js +0 -0
  565. package/dist/components/navigation-menu.d.ts +12 -0
  566. package/dist/components/navigation-menu.js +42 -0
  567. package/dist/components/noise.d.ts +19 -0
  568. package/dist/components/noise.js +18 -0
  569. package/dist/components/notification-center.d.ts +68 -0
  570. package/dist/components/notification-center.js +57 -0
  571. package/dist/components/number-input.d.ts +45 -0
  572. package/dist/components/number-input.js +148 -0
  573. package/dist/components/orbit.d.ts +77 -0
  574. package/dist/components/orbit.js +100 -0
  575. package/dist/components/pagination.d.ts +16 -0
  576. package/dist/components/pagination.js +34 -0
  577. package/dist/components/particles.d.ts +18 -0
  578. package/dist/components/particles.js +92 -0
  579. package/dist/components/password-input.d.ts +16 -0
  580. package/dist/components/password-input.js +49 -0
  581. package/dist/components/phone-input.d.ts +67 -0
  582. package/dist/components/phone-input.js +225 -0
  583. package/dist/components/pie-chart.d.ts +12 -0
  584. package/dist/components/pie-chart.js +13 -0
  585. package/dist/components/pill-nav.d.ts +25 -0
  586. package/dist/components/pill-nav.js +66 -0
  587. package/dist/components/popover.d.ts +7 -0
  588. package/dist/components/popover.js +15 -0
  589. package/dist/components/profit-loss-chart.d.ts +10 -0
  590. package/dist/components/profit-loss-chart.js +8 -0
  591. package/dist/components/progress.d.ts +10 -0
  592. package/dist/components/progress.js +17 -0
  593. package/dist/components/progressive-blur.d.ts +24 -0
  594. package/dist/components/progressive-blur.js +43 -0
  595. package/dist/components/radar-chart.d.ts +9 -0
  596. package/dist/components/radar-chart.js +9 -0
  597. package/dist/components/radio-group.d.ts +4 -0
  598. package/dist/components/radio-group.js +15 -0
  599. package/dist/components/rating.d.ts +29 -0
  600. package/dist/components/rating.js +94 -0
  601. package/dist/components/resizable.d.ts +57 -0
  602. package/dist/components/resizable.js +73 -0
  603. package/dist/components/retro-grid.d.ts +25 -0
  604. package/dist/components/retro-grid.js +26 -0
  605. package/dist/components/reveal.d.ts +9 -0
  606. package/dist/components/reveal.js +14 -0
  607. package/dist/components/rich-text-editor.d.ts +28 -0
  608. package/dist/components/rich-text-editor.js +83 -0
  609. package/dist/components/ring-chart.d.ts +13 -0
  610. package/dist/components/ring-chart.js +16 -0
  611. package/dist/components/ripple.d.ts +25 -0
  612. package/dist/components/ripple.js +26 -0
  613. package/dist/components/sankey-chart.d.ts +16 -0
  614. package/dist/components/sankey-chart.js +8 -0
  615. package/dist/components/scatter-chart.d.ts +12 -0
  616. package/dist/components/scatter-chart.js +9 -0
  617. package/dist/components/scheduler.d.ts +50 -0
  618. package/dist/components/scheduler.js +93 -0
  619. package/dist/components/scramble-text.d.ts +39 -0
  620. package/dist/components/scramble-text.js +78 -0
  621. package/dist/components/scroll-area.d.ts +13 -0
  622. package/dist/components/scroll-area.js +14 -0
  623. package/dist/components/scroll-progress.d.ts +19 -0
  624. package/dist/components/scroll-progress.js +67 -0
  625. package/dist/components/segmented-control.d.ts +48 -0
  626. package/dist/components/segmented-control.js +222 -0
  627. package/dist/components/select.d.ts +12 -0
  628. package/dist/components/select.js +43 -0
  629. package/dist/components/separator.d.ts +3 -0
  630. package/dist/components/separator.js +9 -0
  631. package/dist/components/sheet.d.ts +25 -0
  632. package/dist/components/sheet.js +47 -0
  633. package/dist/components/shimmer.d.ts +3 -0
  634. package/dist/components/shimmer.js +8 -0
  635. package/dist/components/shiny-text.d.ts +20 -0
  636. package/dist/components/shiny-text.js +24 -0
  637. package/dist/components/sidebar.d.ts +92 -0
  638. package/dist/components/sidebar.js +290 -0
  639. package/dist/components/signature-pad.d.ts +44 -0
  640. package/dist/components/signature-pad.js +317 -0
  641. package/dist/components/skeleton.d.ts +3 -0
  642. package/dist/components/skeleton.js +8 -0
  643. package/dist/components/slider.d.ts +10 -0
  644. package/dist/components/slider.js +27 -0
  645. package/dist/components/sonner.d.ts +9 -0
  646. package/dist/components/sonner.js +17 -0
  647. package/dist/components/sparkles-text.d.ts +19 -0
  648. package/dist/components/sparkles-text.js +36 -0
  649. package/dist/components/sparkline.d.ts +22 -0
  650. package/dist/components/sparkline.js +100 -0
  651. package/dist/components/spinner.d.ts +10 -0
  652. package/dist/components/spinner.js +20 -0
  653. package/dist/components/spinning-text.d.ts +29 -0
  654. package/dist/components/spinning-text.js +40 -0
  655. package/dist/components/split-button.d.ts +71 -0
  656. package/dist/components/split-button.js +30 -0
  657. package/dist/components/spotlight-card.d.ts +11 -0
  658. package/dist/components/spotlight-card.js +63 -0
  659. package/dist/components/star-border.d.ts +19 -0
  660. package/dist/components/star-border.js +18 -0
  661. package/dist/components/status-dot.d.ts +60 -0
  662. package/dist/components/status-dot.js +76 -0
  663. package/dist/components/stepper.d.ts +98 -0
  664. package/dist/components/stepper.js +164 -0
  665. package/dist/components/sunburst-chart.d.ts +11 -0
  666. package/dist/components/sunburst-chart.js +45 -0
  667. package/dist/components/switch.d.ts +3 -0
  668. package/dist/components/switch.js +10 -0
  669. package/dist/components/table-of-contents.d.ts +64 -0
  670. package/dist/components/table-of-contents.js +0 -0
  671. package/dist/components/table.d.ts +10 -0
  672. package/dist/components/table.js +38 -0
  673. package/dist/components/tabs.d.ts +6 -0
  674. package/dist/components/tabs.js +22 -0
  675. package/dist/components/tags-input.d.ts +39 -0
  676. package/dist/components/tags-input.js +86 -0
  677. package/dist/components/terminal.d.ts +86 -0
  678. package/dist/components/terminal.js +182 -0
  679. package/dist/components/text-effect.d.ts +71 -0
  680. package/dist/components/text-effect.js +166 -0
  681. package/dist/components/textarea.d.ts +6 -0
  682. package/dist/components/textarea.js +8 -0
  683. package/dist/components/tilt-card.d.ts +30 -0
  684. package/dist/components/tilt-card.js +84 -0
  685. package/dist/components/time-picker.d.ts +58 -0
  686. package/dist/components/time-picker.js +245 -0
  687. package/dist/components/timeline.d.ts +81 -0
  688. package/dist/components/timeline.js +165 -0
  689. package/dist/components/toggle-group.d.ts +12 -0
  690. package/dist/components/toggle-group.js +23 -0
  691. package/dist/components/toggle.d.ts +12 -0
  692. package/dist/components/toggle.js +25 -0
  693. package/dist/components/toolbar.d.ts +14 -0
  694. package/dist/components/toolbar.js +89 -0
  695. package/dist/components/tooltip.d.ts +29 -0
  696. package/dist/components/tooltip.js +48 -0
  697. package/dist/components/tree-view.d.ts +45 -0
  698. package/dist/components/tree-view.js +197 -0
  699. package/dist/components/typing-text.d.ts +49 -0
  700. package/dist/components/typing-text.js +90 -0
  701. package/dist/components/usage-meter.d.ts +30 -0
  702. package/dist/components/usage-meter.js +90 -0
  703. package/dist/components/video-player.d.ts +48 -0
  704. package/dist/components/video-player.js +216 -0
  705. package/dist/components/word-rotate.d.ts +40 -0
  706. package/dist/components/word-rotate.js +34 -0
  707. package/dist/index.d.ts +306 -0
  708. package/dist/index.js +179 -0
  709. package/dist/lib/cn.d.ts +7 -0
  710. package/dist/lib/cn.js +10 -0
  711. package/dist/lib/demo-saas.d.ts +171 -0
  712. package/dist/lib/demo-saas.js +210 -0
  713. package/dist/lib/demo-store.d.ts +157 -0
  714. package/dist/lib/demo-store.js +353 -0
  715. package/dist/testing/index.d.ts +76 -0
  716. package/dist/testing/index.js +116 -0
  717. package/package.json +941 -0
@@ -0,0 +1,359 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { flexRender, getCoreRowModel, getFacetedRowModel, getFacetedUniqueValues, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable, } from "@tanstack/react-table";
4
+ import { AlertCircle, ArrowDown, ArrowUp, ChevronDown, ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight, ChevronsUpDown, Columns3, Download, PlusCircle, RefreshCw, Search, SlidersHorizontal, X, } from "lucide-react";
5
+ import { useId, useMemo, useState } from "react";
6
+ import { cn } from "../lib/cn.js";
7
+ import { Badge } from "./badge.js";
8
+ import { Button } from "./button.js";
9
+ import { Checkbox } from "./checkbox.js";
10
+ import { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "./dropdown-menu.js";
11
+ import { Input } from "./input.js";
12
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "./select.js";
13
+ import { Skeleton } from "./skeleton.js";
14
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "./table.js";
15
+ /* -------------------------------------------------------------------------------------------------
16
+ * Constants & helpers
17
+ * -----------------------------------------------------------------------------------------------*/
18
+ const DENSITY_CELL = {
19
+ comfortable: "",
20
+ compact: "py-1.5",
21
+ };
22
+ const DEFAULT_PAGE_SIZE_OPTIONS = [10, 20, 30, 50];
23
+ const DEFAULT_LABELS = {
24
+ selectAllRows: "Select all rows on this page",
25
+ // The index makes each row checkbox distinguishable to assistive tech —
26
+ // a page of identical "Select row" names is not navigable by voice or list.
27
+ selectRow: (rowIndex) => `Select row ${rowIndex + 1}`,
28
+ reset: "Reset",
29
+ densityComfortable: "Comfortable",
30
+ densityCompact: "Compact",
31
+ exportCsv: "Export",
32
+ view: "View",
33
+ toggleColumns: "Toggle columns",
34
+ clearFilter: "Clear filter",
35
+ bulkActions: "Bulk actions",
36
+ selectedCount: (count) => `${count} selected`,
37
+ selectedOfTotal: (selected, total) => `${selected} of ${total} row(s) selected.`,
38
+ rowsPerPage: "Rows per page",
39
+ rowRange: (first, last, total) => `${first}–${last} of ${total}`,
40
+ pageOf: (page, pageCount) => `Page ${page} of ${pageCount}`,
41
+ pagination: "Pagination",
42
+ firstPage: "Go to first page",
43
+ previousPage: "Go to previous page",
44
+ nextPage: "Go to next page",
45
+ lastPage: "Go to last page",
46
+ noResults: "No results.",
47
+ retry: "Retry",
48
+ loadingRows: "Loading rows…",
49
+ };
50
+ /** Reserved column id for the built-in selection checkbox column. */
51
+ export const SELECTION_COLUMN_ID = "__select__";
52
+ /**
53
+ * Case-insensitive "includes" global filter used by the toolbar search. It is
54
+ * exported so server-side callers can reuse the same matching semantics.
55
+ */
56
+ export const fuzzyTextFilter = (row, columnId, filterValue) => {
57
+ const value = row.getValue(columnId);
58
+ if (value == null)
59
+ return false;
60
+ return String(value).toLowerCase().includes(String(filterValue).toLowerCase());
61
+ };
62
+ const arrIncludesSomeFilter = (row, columnId, filterValue) => {
63
+ const selected = filterValue;
64
+ if (!selected?.length)
65
+ return true;
66
+ return selected.includes(String(row.getValue(columnId)));
67
+ };
68
+ /**
69
+ * Resolve the effective TanStack column id for a `ColumnDef`, mirroring
70
+ * table-core's own derivation: explicit `id`, else `accessorKey` (with `.`
71
+ * normalised to `_`), else a string `header`. Used to match a column to a
72
+ * faceted-filter `columnId` so we can attach the correct multi-select filterFn.
73
+ */
74
+ function resolveColumnDefId(column) {
75
+ if (column.id != null)
76
+ return column.id;
77
+ const accessorKey = column.accessorKey;
78
+ if (accessorKey != null)
79
+ return String(accessorKey).replace(/\./g, "_");
80
+ if (typeof column.header === "string")
81
+ return column.header;
82
+ return undefined;
83
+ }
84
+ /**
85
+ * Build the leading checkbox selection column. Exposed so callers who supply
86
+ * their own `columns` can prepend an identical, accessible selection column
87
+ * instead of relying on `enableRowSelection` injection.
88
+ */
89
+ export function createSelectionColumn(options = {}) {
90
+ const { selectAllLabel = DEFAULT_LABELS.selectAllRows, getRowLabel = (row) => DEFAULT_LABELS.selectRow(row.index), } = options;
91
+ return {
92
+ id: SELECTION_COLUMN_ID,
93
+ enableSorting: false,
94
+ enableHiding: false,
95
+ header: ({ table }) => {
96
+ const all = table.getIsAllPageRowsSelected();
97
+ const some = table.getIsSomePageRowsSelected();
98
+ return (_jsx(Checkbox, { checked: all ? true : some ? "indeterminate" : false, onCheckedChange: (checked) => table.toggleAllPageRowsSelected(checked === true), "aria-label": selectAllLabel }));
99
+ },
100
+ cell: ({ row }) => (_jsx(Checkbox, { checked: row.getIsSelected(), disabled: !row.getCanSelect(), onCheckedChange: (checked) => row.toggleSelected(checked === true), "aria-label": getRowLabel(row) })),
101
+ };
102
+ }
103
+ /** Convert the visible (filtered/sorted) rows of a table to a CSV string. */
104
+ export function tableRowsToCsv(table) {
105
+ const visibleLeafColumns = table
106
+ .getVisibleLeafColumns()
107
+ .filter((c) => c.id !== SELECTION_COLUMN_ID);
108
+ const escapeCell = (value) => {
109
+ let str = value == null ? "" : String(value);
110
+ // CSV-injection (formula injection) neutralisation: a leading =, +, -, @,
111
+ // tab, or carriage return makes Excel/Sheets treat the cell as a formula and
112
+ // execute it on open. Prefix such values with a single apostrophe so the
113
+ // spreadsheet renders them as literal text. This intentionally also prefixes
114
+ // negative numbers (leading `-`) — the accepted, standard tradeoff for safety.
115
+ if (/^[=+\-@\t\r]/.test(str))
116
+ str = `'${str}`;
117
+ // Quote per RFC 4180 when the value contains a comma, double-quote, or any
118
+ // line break (LF *or* CR — an unquoted CR also breaks row boundaries).
119
+ return /[",\r\n]/.test(str) ? `"${str.replace(/"/g, '""')}"` : str;
120
+ };
121
+ const header = visibleLeafColumns
122
+ .map((c) => {
123
+ const raw = c.columnDef.header;
124
+ return escapeCell(typeof raw === "string" ? raw : c.id);
125
+ })
126
+ .join(",");
127
+ const selected = table.getFilteredSelectedRowModel().rows;
128
+ const source = selected.length ? selected : table.getFilteredRowModel().rows;
129
+ const body = source
130
+ .map((row) => visibleLeafColumns.map((c) => escapeCell(row.getValue(c.id))).join(","))
131
+ .join("\n");
132
+ return `${header}\n${body}`;
133
+ }
134
+ function downloadCsv(csv, fileName) {
135
+ if (typeof document === "undefined")
136
+ return;
137
+ const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" });
138
+ const url = URL.createObjectURL(blob);
139
+ const link = document.createElement("a");
140
+ link.href = url;
141
+ link.download = `${fileName}.csv`;
142
+ link.style.display = "none";
143
+ document.body.appendChild(link);
144
+ link.click();
145
+ document.body.removeChild(link);
146
+ URL.revokeObjectURL(url);
147
+ }
148
+ const DEFAULT_HEADER_LABELS = {
149
+ sort: (title) => `Sort by ${title}. Activate to sort ascending.`,
150
+ sortedAscending: (title) => `Sorted by ${title} ascending. Activate to sort descending.`,
151
+ sortedDescending: (title) => `Sorted by ${title} descending. Activate to sort ascending.`,
152
+ };
153
+ /**
154
+ * Sortable header cell with a sort-state icon. Falls back to plain text when
155
+ * the column cannot sort, so it is safe to use everywhere.
156
+ */
157
+ export function DataTableColumnHeader({ column, title, className, labels, }) {
158
+ if (!column.getCanSort()) {
159
+ return (_jsx("span", { "data-slot": "data-table-column-header", className: cn("font-medium text-fg-secondary", className), children: title }));
160
+ }
161
+ const sorted = column.getIsSorted();
162
+ const mergedLabels = { ...DEFAULT_HEADER_LABELS, ...labels };
163
+ return (_jsxs(Button, { variant: "ghost", size: "sm", "data-slot": "data-table-column-header",
164
+ // `toggleSorting` receives an explicit direction, so table-core's
165
+ // remove-sort branch (taken only when no manual value is passed) never
166
+ // runs: the real cycle is unsorted → ascending → descending → ascending,
167
+ // forever. The labels below promise exactly that — nothing more.
168
+ onClick: () => column.toggleSorting(sorted === "asc"), "aria-label": sorted === "asc"
169
+ ? mergedLabels.sortedAscending(title)
170
+ : sorted === "desc"
171
+ ? mergedLabels.sortedDescending(title)
172
+ : mergedLabels.sort(title), className: "-ml-3 h-8 text-fg-secondary data-[state=open]:bg-surface-overlay", children: [_jsx("span", { children: title }), sorted === "asc" ? (_jsx(ArrowUp, { "aria-hidden": true })) : sorted === "desc" ? (_jsx(ArrowDown, { "aria-hidden": true })) : (_jsx(ChevronsUpDown, { "aria-hidden": true, className: "opacity-60" }))] }));
173
+ }
174
+ /* -------------------------------------------------------------------------------------------------
175
+ * Faceted filter (opt-in)
176
+ * -----------------------------------------------------------------------------------------------*/
177
+ function DataTableFacetedFilterControl({ column, title, options, clearFilterLabel, }) {
178
+ const facets = column?.getFacetedUniqueValues();
179
+ const selected = new Set(column?.getFilterValue() ?? []);
180
+ return (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(Button, { variant: "outline", size: "sm", "data-slot": "data-table-faceted-filter", className: "border-dashed", children: [_jsx(PlusCircle, { "aria-hidden": true }), title, selected.size > 0 ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "mx-1 h-4 w-px bg-border", "aria-hidden": true }), _jsx(Badge, { variant: "secondary", className: "rounded-sm px-1 font-normal", children: selected.size })] })) : null] }) }), _jsxs(DropdownMenuContent, { align: "start", className: "min-w-[12rem]", children: [_jsx(DropdownMenuLabel, { children: title }), _jsx(DropdownMenuSeparator, {}), options.map((option) => {
181
+ const isSelected = selected.has(option.value);
182
+ const Icon = option.icon;
183
+ return (_jsxs(DropdownMenuCheckboxItem, { checked: isSelected, onSelect: (event) => event.preventDefault(), onCheckedChange: () => {
184
+ const next = new Set(selected);
185
+ if (isSelected)
186
+ next.delete(option.value);
187
+ else
188
+ next.add(option.value);
189
+ const values = Array.from(next);
190
+ column?.setFilterValue(values.length ? values : undefined);
191
+ }, children: [Icon ? _jsx(Icon, { className: "size-4 text-fg-tertiary" }) : null, _jsx("span", { children: option.label }), facets?.get(option.value) ? (_jsx("span", { className: "ml-auto text-xs text-fg-tertiary", children: facets.get(option.value) })) : null] }, option.value));
192
+ }), selected.size > 0 ? (_jsxs(_Fragment, { children: [_jsx(DropdownMenuSeparator, {}), _jsx(DropdownMenuItem, { onSelect: () => column?.setFilterValue(undefined), className: "justify-center", children: clearFilterLabel })] })) : null] })] }));
193
+ }
194
+ function DataTableToolbar({ table, label, labels, searchable, searchPlaceholder, globalFilter, onGlobalFilterChange, facetedFilters, enableColumnVisibility, density, enableDensityToggle, onDensityChange, enableCsvExport, onExportCsv, toolbarStart, toolbarEnd, }) {
195
+ const searchId = useId();
196
+ const isFiltered = table.getState().columnFilters.length > 0 || globalFilter.length > 0;
197
+ return (_jsxs("div", { role: "group", "aria-label": label, "data-slot": "data-table-toolbar", className: "flex flex-wrap items-center gap-2", children: [toolbarStart, searchable ? (_jsxs("div", { className: "relative w-full max-w-[16rem]", children: [_jsx(Search, { "aria-hidden": true, className: "pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-fg-muted" }), _jsx("label", { htmlFor: searchId, className: "sr-only", children: searchPlaceholder }), _jsx(Input, { id: searchId, type: "search", value: globalFilter, onChange: (event) => onGlobalFilterChange(event.target.value), placeholder: searchPlaceholder, className: "h-9 pl-9" })] })) : null, facetedFilters?.map((filter) => (_jsx(DataTableFacetedFilterControl, { column: table.getColumn(filter.columnId), title: filter.title, options: filter.options, clearFilterLabel: labels.clearFilter }, filter.columnId))), isFiltered ? (_jsxs(Button, { variant: "ghost", size: "sm", onClick: () => {
198
+ table.resetColumnFilters();
199
+ onGlobalFilterChange("");
200
+ }, children: [labels.reset, _jsx(X, { "aria-hidden": true })] })) : null, _jsxs("div", { className: "ml-auto flex items-center gap-2", children: [toolbarEnd, enableDensityToggle ? (_jsxs(Button, { variant: "outline", size: "sm", "aria-pressed": density === "compact", onClick: () => onDensityChange(density === "compact" ? "comfortable" : "compact"), children: [_jsx(SlidersHorizontal, { "aria-hidden": true }), density === "compact" ? labels.densityComfortable : labels.densityCompact] })) : null, enableCsvExport ? (_jsxs(Button, { variant: "outline", size: "sm", onClick: onExportCsv, children: [_jsx(Download, { "aria-hidden": true }), labels.exportCsv] })) : null, enableColumnVisibility ? (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(Button, { variant: "outline", size: "sm", children: [_jsx(Columns3, { "aria-hidden": true }), labels.view, _jsx(ChevronDown, { "aria-hidden": true, className: "opacity-60" })] }) }), _jsxs(DropdownMenuContent, { align: "end", className: "min-w-[10rem]", children: [_jsx(DropdownMenuLabel, { children: labels.toggleColumns }), _jsx(DropdownMenuSeparator, {}), table
201
+ .getAllColumns()
202
+ .filter((column) => column.getCanHide())
203
+ .map((column) => (_jsx(DropdownMenuCheckboxItem, { checked: column.getIsVisible(), onSelect: (event) => event.preventDefault(), onCheckedChange: (value) => column.toggleVisibility(value === true), className: "capitalize", children: typeof column.columnDef.header === "string"
204
+ ? column.columnDef.header
205
+ : column.id }, column.id)))] })] })) : null] })] }));
206
+ }
207
+ /* -------------------------------------------------------------------------------------------------
208
+ * Pagination footer (opt-in)
209
+ * -----------------------------------------------------------------------------------------------*/
210
+ function DataTablePagination({ table, pageSizeOptions, labels, }) {
211
+ const pageSizeId = useId();
212
+ const { pageIndex, pageSize } = table.getState().pagination;
213
+ const totalRows = table.getRowCount();
214
+ const pageCount = table.getPageCount();
215
+ const firstRow = totalRows === 0 ? 0 : pageIndex * pageSize + 1;
216
+ const lastRow = Math.min((pageIndex + 1) * pageSize, totalRows);
217
+ return (_jsxs("div", { "data-slot": "data-table-pagination", className: "flex flex-wrap items-center justify-between gap-4 px-1 py-2", children: [_jsx("p", { className: "text-sm text-fg-tertiary", "aria-live": "polite", children: labels.rowRange(firstRow, lastRow, totalRows) }), _jsxs("div", { className: "flex items-center gap-4", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("label", { htmlFor: pageSizeId, className: "text-sm text-fg-secondary", children: labels.rowsPerPage }), _jsxs(Select, { value: String(pageSize), onValueChange: (value) => table.setPageSize(Number(value)), children: [_jsx(SelectTrigger, { id: pageSizeId, className: "h-8 w-[4.5rem]", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: pageSizeOptions.map((size) => (_jsx(SelectItem, { value: String(size), children: size }, size))) })] })] }), _jsx("p", { className: "text-sm text-fg-secondary", children: labels.pageOf(pageCount === 0 ? 0 : pageIndex + 1, pageCount) }), _jsxs("nav", { "aria-label": labels.pagination, className: "flex items-center gap-1", children: [_jsx(Button, { variant: "outline", size: "icon-sm", onClick: () => table.setPageIndex(0), disabled: !table.getCanPreviousPage(), "aria-label": labels.firstPage, children: _jsx(ChevronsLeft, { "aria-hidden": true }) }), _jsx(Button, { variant: "outline", size: "icon-sm", onClick: () => table.previousPage(), disabled: !table.getCanPreviousPage(), "aria-label": labels.previousPage, children: _jsx(ChevronLeft, { "aria-hidden": true }) }), _jsx(Button, { variant: "outline", size: "icon-sm", onClick: () => table.nextPage(), disabled: !table.getCanNextPage(), "aria-label": labels.nextPage, children: _jsx(ChevronRight, { "aria-hidden": true }) }), _jsx(Button, { variant: "outline", size: "icon-sm", onClick: () => table.setPageIndex(pageCount - 1), disabled: !table.getCanNextPage(), "aria-label": labels.lastPage, children: _jsx(ChevronsRight, { "aria-hidden": true }) })] })] })] }));
218
+ }
219
+ /* -------------------------------------------------------------------------------------------------
220
+ * DataTable
221
+ * -----------------------------------------------------------------------------------------------*/
222
+ export function DataTable(props) {
223
+ const { columns, data, searchable = false, searchPlaceholder = "Search…", globalFilter: globalFilterProp, onGlobalFilterChange, facetedFilters, toolbarStart, toolbarEnd, enableColumnVisibility = false, columnVisibility: columnVisibilityProp, onColumnVisibilityChange, sorting: sortingProp, onSortingChange, manualSorting, columnFilters: columnFiltersProp, onColumnFiltersChange, manualFiltering, pagination = false, paginationState: paginationProp, onPaginationChange, manualPagination, pageCount, rowCount, initialPageSize = 10, pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS, enableRowSelection, rowSelection: rowSelectionProp, onRowSelectionChange, bulkActions, density: densityProp, onDensityChange, initialDensity = "comfortable", enableDensityToggle = false, enableCsvExport = false, csvFileName = "export", loading = false, loadingRowCount, error, onRetry, emptyState, className, toolbarLabel = "Table controls", labels: labelsProp, getRowLabel, } = props;
224
+ const labels = useMemo(() => ({ ...DEFAULT_LABELS, ...labelsProp }), [labelsProp]);
225
+ /* ---- Uncontrolled fallbacks (only used when the matching prop is absent) ---- */
226
+ const [sortingState, setSortingState] = useState([]);
227
+ const [columnFiltersState, setColumnFiltersState] = useState([]);
228
+ const [globalFilterState, setGlobalFilterState] = useState("");
229
+ const [columnVisibilityState, setColumnVisibilityState] = useState({});
230
+ const [rowSelectionState, setRowSelectionState] = useState({});
231
+ const [paginationStateInternal, setPaginationStateInternal] = useState({
232
+ pageIndex: 0,
233
+ pageSize: initialPageSize,
234
+ });
235
+ const [densityState, setDensityState] = useState(initialDensity);
236
+ const sorting = sortingProp ?? sortingState;
237
+ const columnFilters = columnFiltersProp ?? columnFiltersState;
238
+ const globalFilter = globalFilterProp ?? globalFilterState;
239
+ const columnVisibility = columnVisibilityProp ?? columnVisibilityState;
240
+ const rowSelection = rowSelectionProp ?? rowSelectionState;
241
+ const paginationStateValue = paginationProp ?? paginationStateInternal;
242
+ const density = densityProp ?? densityState;
243
+ const selectionEnabled = Boolean(enableRowSelection);
244
+ /* ---- Compose columns ---- *
245
+ * 1. For every faceted-filter target, guarantee `filterFn: "arrIncludesSome"`
246
+ * when the author hasn't set one. The toolbar control writes an array of
247
+ * selected values; without this, table-core's `auto` filterFn resolves to
248
+ * `includesString` for string columns, which coerces the array via
249
+ * `toString()` ("active,invited") and filters every row out once 2+ values
250
+ * are selected. We only override the default ("auto"), never an explicit
251
+ * author choice, so this is backward-compatible.
252
+ * 2. Prepend the selection column when row selection is enabled.
253
+ */
254
+ const facetedColumnIds = useMemo(() => new Set((facetedFilters ?? []).map((f) => f.columnId)), [facetedFilters]);
255
+ const resolvedColumns = useMemo(() => {
256
+ const withFacetFilterFn = facetedColumnIds.size === 0
257
+ ? columns
258
+ : columns.map((column) => {
259
+ if (column.filterFn != null && column.filterFn !== "auto")
260
+ return column;
261
+ const id = resolveColumnDefId(column);
262
+ if (id == null || !facetedColumnIds.has(id))
263
+ return column;
264
+ return { ...column, filterFn: "arrIncludesSome" };
265
+ });
266
+ if (!selectionEnabled)
267
+ return withFacetFilterFn;
268
+ const selectionColumn = createSelectionColumn({
269
+ selectAllLabel: labels.selectAllRows,
270
+ getRowLabel: getRowLabel ?? ((row) => labels.selectRow(row.index)),
271
+ });
272
+ return [selectionColumn, ...withFacetFilterFn];
273
+ }, [columns, facetedColumnIds, selectionEnabled, labels, getRowLabel]);
274
+ /* ---- Feature detection: only wire optional models/state when used ---- */
275
+ const filteringEnabled = searchable || Boolean(facetedFilters?.length) || Boolean(columnFiltersProp);
276
+ const paginationEnabled = pagination || Boolean(manualPagination);
277
+ const derivedPageCount = pageCount ??
278
+ (rowCount != null
279
+ ? Math.max(1, Math.ceil(rowCount / Math.max(1, paginationStateValue.pageSize)))
280
+ : undefined);
281
+ const table = useReactTable({
282
+ data,
283
+ columns: resolvedColumns,
284
+ state: {
285
+ sorting,
286
+ ...(filteringEnabled ? { columnFilters, globalFilter } : {}),
287
+ ...(enableColumnVisibility ? { columnVisibility } : {}),
288
+ ...(selectionEnabled ? { rowSelection } : {}),
289
+ ...(paginationEnabled ? { pagination: paginationStateValue } : {}),
290
+ },
291
+ getCoreRowModel: getCoreRowModel(),
292
+ getSortedRowModel: getSortedRowModel(),
293
+ onSortingChange: onSortingChange ?? setSortingState,
294
+ manualSorting,
295
+ ...(filteringEnabled
296
+ ? {
297
+ getFilteredRowModel: getFilteredRowModel(),
298
+ getFacetedRowModel: getFacetedRowModel(),
299
+ getFacetedUniqueValues: getFacetedUniqueValues(),
300
+ onColumnFiltersChange: onColumnFiltersChange ?? setColumnFiltersState,
301
+ onGlobalFilterChange: onGlobalFilterChange ?? setGlobalFilterState,
302
+ globalFilterFn: fuzzyTextFilter,
303
+ manualFiltering,
304
+ }
305
+ : {}),
306
+ ...(enableColumnVisibility
307
+ ? { onColumnVisibilityChange: onColumnVisibilityChange ?? setColumnVisibilityState }
308
+ : {}),
309
+ ...(selectionEnabled
310
+ ? {
311
+ enableRowSelection,
312
+ onRowSelectionChange: onRowSelectionChange ?? setRowSelectionState,
313
+ }
314
+ : {}),
315
+ ...(paginationEnabled
316
+ ? {
317
+ onPaginationChange: onPaginationChange ?? setPaginationStateInternal,
318
+ manualPagination,
319
+ ...(manualPagination
320
+ ? { pageCount: derivedPageCount, rowCount }
321
+ : { getPaginationRowModel: getPaginationRowModel() }),
322
+ }
323
+ : {}),
324
+ filterFns: { arrIncludesSome: arrIncludesSomeFilter },
325
+ });
326
+ /* ---- Derived render state ---- */
327
+ const showToolbar = searchable ||
328
+ Boolean(facetedFilters?.length) ||
329
+ enableColumnVisibility ||
330
+ enableDensityToggle ||
331
+ enableCsvExport ||
332
+ Boolean(toolbarStart) ||
333
+ Boolean(toolbarEnd);
334
+ const rows = table.getRowModel().rows;
335
+ const colSpan = resolvedColumns.length || 1;
336
+ const densityClass = DENSITY_CELL[density];
337
+ const selectedRows = selectionEnabled ? table.getFilteredSelectedRowModel().rows : [];
338
+ const skeletonRows = loadingRowCount ?? (paginationEnabled ? paginationStateValue.pageSize : 5);
339
+ return (_jsxs("div", { "data-slot": "data-table", className: cn("flex flex-col gap-3", className), children: [showToolbar ? (_jsx(DataTableToolbar, { table: table, label: toolbarLabel, labels: labels, searchable: searchable, searchPlaceholder: searchPlaceholder, globalFilter: globalFilter, onGlobalFilterChange: (value) => (onGlobalFilterChange ?? setGlobalFilterState)(value), ...(facetedFilters ? { facetedFilters } : {}), enableColumnVisibility: enableColumnVisibility, density: density, enableDensityToggle: enableDensityToggle, onDensityChange: (value) => {
340
+ // Uncontrolled: drive internal state. Controlled (`density` set):
341
+ // leave state alone so the prop stays the single source of truth.
342
+ if (densityProp == null)
343
+ setDensityState(value);
344
+ onDensityChange?.(value);
345
+ }, enableCsvExport: enableCsvExport, onExportCsv: () => downloadCsv(tableRowsToCsv(table), csvFileName), ...(toolbarStart ? { toolbarStart } : {}), ...(toolbarEnd ? { toolbarEnd } : {}) })) : null, selectionEnabled && bulkActions && selectedRows.length > 0 ? (_jsxs("section", { "aria-label": labels.bulkActions, "data-slot": "data-table-bulk-actions", className: "flex flex-wrap items-center gap-3 rounded-lg border border-border bg-surface-inset px-3 py-2", children: [_jsx("span", { className: "text-sm text-fg-secondary", "aria-live": "polite", children: labels.selectedCount(selectedRows.length) }), _jsx("div", { className: "ml-auto flex items-center gap-2", children: bulkActions(selectedRows) })] })) : null, _jsxs("div", { "data-slot": "data-table-container", "aria-busy": loading || undefined, className: "overflow-hidden rounded-xl border border-border", children: [loading ? (_jsx("span", { role: "status", "data-slot": "data-table-loading", className: "sr-only", children: labels.loadingRows })) : null, _jsxs(Table, { children: [_jsx(TableHeader, { children: table.getHeaderGroups().map((headerGroup) => (_jsx(TableRow, { children: headerGroup.headers.map((header) => {
346
+ const sortable = !header.isPlaceholder && header.column.getCanSort();
347
+ const sorted = header.column.getIsSorted();
348
+ return (_jsx(TableHead, { colSpan: header.colSpan, scope: "col", "aria-sort": sortable
349
+ ? sorted === "asc"
350
+ ? "ascending"
351
+ : sorted === "desc"
352
+ ? "descending"
353
+ : "none"
354
+ : undefined, children: header.isPlaceholder
355
+ ? null
356
+ : flexRender(header.column.columnDef.header, header.getContext()) }, header.id));
357
+ }) }, headerGroup.id))) }), _jsx(TableBody, { children: loading ? (Array.from({ length: skeletonRows }).map((_, rowIndex) => (_jsx(TableRow, { children: resolvedColumns.map((_column, cellIndex) => (_jsx(TableCell, { className: densityClass, children: _jsx(Skeleton, { className: "h-4 w-full" }) }, `skeleton-cell-${cellIndex}`))) }, `skeleton-${rowIndex}`)))) : error != null ? (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: colSpan, className: "h-32 text-center", children: _jsxs("div", { className: "flex flex-col items-center justify-center gap-3 text-fg-secondary", children: [_jsx(AlertCircle, { "aria-hidden": true, className: "size-6 text-error" }), _jsx("div", { role: "alert", className: "text-sm", children: error }), onRetry ? (_jsxs(Button, { variant: "outline", size: "sm", onClick: onRetry, children: [_jsx(RefreshCw, { "aria-hidden": true }), labels.retry] })) : null] }) }) })) : rows.length ? (rows.map((row) => (_jsx(TableRow, { "data-state": row.getIsSelected() ? "selected" : undefined, children: row.getVisibleCells().map((cell) => (_jsx(TableCell, { className: densityClass, children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id))) }, row.id)))) : (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: colSpan, className: "h-24 text-center text-fg-tertiary", children: emptyState ?? labels.noResults }) })) })] })] }), paginationEnabled && !loading && error == null ? (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-4", children: [selectionEnabled ? (_jsx("p", { className: "text-sm text-fg-tertiary", "aria-live": "polite", children: labels.selectedOfTotal(selectedRows.length, table.getFilteredRowModel().rows.length) })) : (_jsx("span", {})), _jsx("div", { className: "ml-auto", children: _jsx(DataTablePagination, { table: table, pageSizeOptions: pageSizeOptions, labels: labels }) })] })) : selectionEnabled && !loading && error == null ? (_jsx("p", { className: "text-sm text-fg-tertiary", "aria-live": "polite", children: labels.selectedOfTotal(selectedRows.length, table.getFilteredRowModel().rows.length) })) : null] }));
358
+ }
359
+ //# sourceMappingURL=data-table.js.map
@@ -0,0 +1,66 @@
1
+ import { type Locale } from "date-fns";
2
+ import { type ButtonHTMLAttributes, type ComponentPropsWithoutRef } from "react";
3
+ import type { Matcher } from "react-day-picker";
4
+ import { PopoverContent } from "./popover.js";
5
+ /**
6
+ * A single-date picker: a button-styled trigger that opens a calendar popover.
7
+ *
8
+ * - **Value** works controlled (`value` + `onValueChange`) or uncontrolled
9
+ * (`defaultValue`). Picking a day commits the value, closes the popover and
10
+ * returns focus to the trigger.
11
+ * - **Open state** follows the same pattern (`open` / `defaultOpen` /
12
+ * `onOpenChange`) so the popover can also be driven externally.
13
+ * - **Forms:** when `name` is set, the selection is mirrored into a hidden
14
+ * input serialized as a local ISO `yyyy-MM-dd` date (no UTC day-shifting).
15
+ * - **Display** is locale-aware via a `date-fns` `locale` and `dateFormat`,
16
+ * with a `formatValue` escape hatch for fully custom labels.
17
+ * - The trigger accepts standard button attributes (`id`, `aria-describedby`,
18
+ * `aria-invalid`, ...) so it composes with `FormControl` Slot injection.
19
+ */
20
+ export interface DatePickerProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "value" | "defaultValue" | "onChange" | "disabled" | "name"> {
21
+ /** Controlled selected date. Pair with `onValueChange`. */
22
+ value?: Date;
23
+ /** Initial date for uncontrolled usage. */
24
+ defaultValue?: Date;
25
+ /** Called with the new date (`undefined` when deselected) on every selection change. */
26
+ onValueChange?: (date: Date | undefined) => void;
27
+ /**
28
+ * Legacy change callback, fired with the same payload as `onValueChange`.
29
+ *
30
+ * @deprecated Use `onValueChange` — this alias matches the family naming
31
+ * (`DateRangePicker`, `CurrencyInput`) and will be removed in a major.
32
+ */
33
+ onChange?: (date: Date | undefined) => void;
34
+ /** Controlled open state of the calendar popover. Pair with `onOpenChange`. */
35
+ open?: boolean;
36
+ /** Initial open state for uncontrolled usage. */
37
+ defaultOpen?: boolean;
38
+ /** Called whenever the popover opens or closes. */
39
+ onOpenChange?: (open: boolean) => void;
40
+ /** Text shown on the trigger when no date is selected. */
41
+ placeholder?: string;
42
+ /** Disables the trigger entirely. */
43
+ disabled?: boolean;
44
+ /** Marks the trigger invalid (error border/ring + `aria-invalid`). */
45
+ invalid?: boolean;
46
+ /** Earliest selectable day (inclusive). */
47
+ min?: Date;
48
+ /** Latest selectable day (inclusive). */
49
+ max?: Date;
50
+ /** Extra non-selectable days, merged with `min`/`max`. */
51
+ disabledDates?: Matcher | Matcher[];
52
+ /** `date-fns` locale used for both the trigger label and the calendar. */
53
+ locale?: Locale;
54
+ /** `date-fns` format token for the trigger label. */
55
+ dateFormat?: string;
56
+ /** Full override for the trigger label. Wins over `dateFormat`/`locale`. */
57
+ formatValue?: (date: Date) => string;
58
+ /** Form field name — renders a hidden input with the local `yyyy-MM-dd` date. */
59
+ name?: string;
60
+ /** Alignment of the popover against the trigger. */
61
+ align?: ComponentPropsWithoutRef<typeof PopoverContent>["align"];
62
+ /** Extra classes for the popover content. */
63
+ contentClassName?: string;
64
+ }
65
+ export declare const DatePicker: import("react").ForwardRefExoticComponent<DatePickerProps & import("react").RefAttributes<HTMLButtonElement>>;
66
+ //# sourceMappingURL=date-picker.d.ts.map
@@ -0,0 +1,55 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { format } from "date-fns";
4
+ import { CalendarIcon } from "lucide-react";
5
+ import { forwardRef, useCallback, useMemo, useState, } from "react";
6
+ import { cn } from "../lib/cn.js";
7
+ import { Button } from "./button.js";
8
+ import { Calendar } from "./calendar.js";
9
+ import { Popover, PopoverContent, PopoverTrigger } from "./popover.js";
10
+ function toMatcherList(min, max, disabledDates) {
11
+ const matchers = [];
12
+ if (min)
13
+ matchers.push({ before: min });
14
+ if (max)
15
+ matchers.push({ after: max });
16
+ if (Array.isArray(disabledDates))
17
+ matchers.push(...disabledDates);
18
+ else if (disabledDates !== undefined)
19
+ matchers.push(disabledDates);
20
+ return matchers;
21
+ }
22
+ export const DatePicker = forwardRef(({ value: valueProp, defaultValue, onValueChange, onChange, open: openProp, defaultOpen = false, onOpenChange, placeholder = "Pick a date", disabled = false, invalid = false, min, max, disabledDates, locale, dateFormat = "PPP", formatValue, name, align = "start", className, contentClassName, "aria-invalid": ariaInvalid, ...props }, ref) => {
23
+ const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);
24
+ const isValueControlled = valueProp !== undefined;
25
+ const value = isValueControlled ? valueProp : uncontrolledValue;
26
+ const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);
27
+ const isOpenControlled = openProp !== undefined;
28
+ const open = isOpenControlled ? openProp : uncontrolledOpen;
29
+ const setOpen = useCallback((next) => {
30
+ if (!isOpenControlled)
31
+ setUncontrolledOpen(next);
32
+ onOpenChange?.(next);
33
+ }, [isOpenControlled, onOpenChange]);
34
+ const commit = useCallback((next) => {
35
+ if (!isValueControlled)
36
+ setUncontrolledValue(next);
37
+ onValueChange?.(next);
38
+ onChange?.(next);
39
+ }, [isValueControlled, onValueChange, onChange]);
40
+ // Committing a day is a terminal action for a single-date picker, so the
41
+ // popover closes right away (Radix then restores focus to the trigger).
42
+ const handleSelect = useCallback((next) => {
43
+ commit(next);
44
+ setOpen(false);
45
+ }, [commit, setOpen]);
46
+ const disabledMatcher = useMemo(() => toMatcherList(min, max, disabledDates), [min, max, disabledDates]);
47
+ const label = useMemo(() => {
48
+ if (!value)
49
+ return placeholder;
50
+ return formatValue ? formatValue(value) : format(value, dateFormat, { locale });
51
+ }, [value, placeholder, formatValue, dateFormat, locale]);
52
+ return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { ref: ref, variant: "outline", disabled: disabled, "aria-invalid": invalid ? true : ariaInvalid, "data-slot": "date-picker-trigger", className: cn("w-[240px] justify-start gap-2 font-normal", "aria-invalid:border-error aria-invalid:ring-2 aria-invalid:ring-error/30", !value && "text-fg-muted", className), ...props, children: [_jsx(CalendarIcon, { className: "size-4 shrink-0 opacity-70", "aria-hidden": "true" }), _jsx("span", { className: "truncate", children: label })] }) }), _jsx(PopoverContent, { align: align, "aria-label": placeholder, "data-slot": "date-picker-content", className: cn("w-auto p-0", contentClassName), children: _jsx(Calendar, { mode: "single", selected: value, onSelect: handleSelect, defaultMonth: value, startMonth: min, endMonth: max, disabled: disabledMatcher.length > 0 ? disabledMatcher : undefined, locale: locale, autoFocus: true }) }), name ? (_jsx("input", { type: "hidden", name: name, value: value ? format(value, "yyyy-MM-dd") : "", readOnly: true })) : null] }));
53
+ });
54
+ DatePicker.displayName = "DatePicker";
55
+ //# sourceMappingURL=date-picker.js.map
@@ -0,0 +1,59 @@
1
+ import { type Locale } from "date-fns";
2
+ import { type ComponentPropsWithoutRef } from "react";
3
+ import type { Matcher } from "react-day-picker";
4
+ import { PopoverContent } from "./popover.js";
5
+ /**
6
+ * A start/end date selection. Both ends are optional so the value can describe
7
+ * an in-progress selection (a `from` with no `to` yet) as well as an empty one.
8
+ */
9
+ export interface DateRange {
10
+ from?: Date;
11
+ to?: Date;
12
+ }
13
+ /** A named shortcut rendered in the presets column. */
14
+ export interface DateRangePreset {
15
+ /** Visible, accessible label for the preset button. */
16
+ label: string;
17
+ /** The range applied when the preset is chosen. */
18
+ range: DateRange;
19
+ }
20
+ export interface DateRangePickerProps {
21
+ /** Controlled value. Pair with `onValueChange`. */
22
+ value?: DateRange;
23
+ /** Initial value for uncontrolled usage. */
24
+ defaultValue?: DateRange;
25
+ /** Called with the new range whenever the selection changes. */
26
+ onValueChange?: (range: DateRange | undefined) => void;
27
+ /** Optional shortcuts shown in a column beside the calendar. */
28
+ presets?: DateRangePreset[];
29
+ /** Text shown on the trigger when no range is selected. */
30
+ placeholder?: string;
31
+ /** Disables the trigger entirely. */
32
+ disabled?: boolean;
33
+ /** Earliest selectable day (inclusive). */
34
+ min?: Date;
35
+ /** Latest selectable day (inclusive). */
36
+ max?: Date;
37
+ /** Extra non-selectable days, merged with `min`/`max`. */
38
+ disabledDates?: Matcher | Matcher[];
39
+ /** `date-fns` locale used for both the trigger label and the calendar. */
40
+ locale?: Locale;
41
+ /** `date-fns` format token for each end of the range. */
42
+ dateFormat?: string;
43
+ /** Full override for the trigger label. Wins over `dateFormat`/`locale`. */
44
+ formatValue?: (range: DateRange) => string;
45
+ /** Alignment of the popover against the trigger. */
46
+ align?: ComponentPropsWithoutRef<typeof PopoverContent>["align"];
47
+ /** Number of months shown on wider viewports. */
48
+ numberOfMonths?: number;
49
+ /** Extra classes for the trigger button. */
50
+ className?: string;
51
+ /** Extra classes for the popover content. */
52
+ contentClassName?: string;
53
+ /** Accessible name for the trigger when there is no visible label. */
54
+ "aria-label"?: string;
55
+ /** ID of an element labelling the trigger. */
56
+ "aria-labelledby"?: string;
57
+ }
58
+ export declare const DateRangePicker: import("react").ForwardRefExoticComponent<DateRangePickerProps & import("react").RefAttributes<HTMLButtonElement>>;
59
+ //# sourceMappingURL=date-range-picker.d.ts.map
@@ -0,0 +1,59 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { format } from "date-fns";
4
+ import { CalendarIcon } from "lucide-react";
5
+ import { forwardRef, useCallback, useMemo, useState } from "react";
6
+ import { cn } from "../lib/cn.js";
7
+ import { Button } from "./button.js";
8
+ import { Calendar } from "./calendar.js";
9
+ import { Popover, PopoverContent, PopoverTrigger } from "./popover.js";
10
+ function hasSelection(range) {
11
+ return Boolean(range?.from || range?.to);
12
+ }
13
+ function toMatcherList(min, max, disabledDates) {
14
+ const matchers = [];
15
+ if (min)
16
+ matchers.push({ before: min });
17
+ if (max)
18
+ matchers.push({ after: max });
19
+ if (Array.isArray(disabledDates))
20
+ matchers.push(...disabledDates);
21
+ else if (disabledDates !== undefined)
22
+ matchers.push(disabledDates);
23
+ return matchers;
24
+ }
25
+ export const DateRangePicker = forwardRef(({ value: valueProp, defaultValue, onValueChange, presets, placeholder = "Pick a date range", disabled = false, min, max, disabledDates, locale, dateFormat = "LLL dd, y", formatValue, align = "start", numberOfMonths = 2, className, contentClassName, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, ...props }, ref) => {
26
+ const [open, setOpen] = useState(false);
27
+ const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);
28
+ const isControlled = valueProp !== undefined;
29
+ const value = isControlled ? valueProp : uncontrolledValue;
30
+ const commit = useCallback((next) => {
31
+ if (!isControlled)
32
+ setUncontrolledValue(next);
33
+ onValueChange?.(next);
34
+ }, [isControlled, onValueChange]);
35
+ // react-day-picker's range selection requires a `from`; surface that as a
36
+ // fully-optional public shape and only feed it a valid selection.
37
+ const handleSelect = useCallback((next) => {
38
+ commit(next ? { from: next.from, to: next.to } : undefined);
39
+ }, [commit]);
40
+ const handlePreset = useCallback((range) => {
41
+ commit(range);
42
+ setOpen(false);
43
+ }, [commit]);
44
+ const selected = useMemo(() => (value?.from ? { from: value.from, to: value.to } : undefined), [value?.from, value?.to]);
45
+ const disabledMatcher = useMemo(() => toMatcherList(min, max, disabledDates), [min, max, disabledDates]);
46
+ const label = useMemo(() => {
47
+ if (!hasSelection(value))
48
+ return placeholder;
49
+ if (formatValue)
50
+ return formatValue(value);
51
+ const from = value.from ? format(value.from, dateFormat, { locale }) : "…";
52
+ if (!value.to)
53
+ return from;
54
+ return `${from} – ${format(value.to, dateFormat, { locale })}`;
55
+ }, [value, placeholder, formatValue, dateFormat, locale]);
56
+ return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { ref: ref, variant: "outline", disabled: disabled, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, "data-slot": "date-range-picker-trigger", className: cn("w-[300px] justify-start gap-2 font-normal", !hasSelection(value) && "text-fg-muted", className), ...props, children: [_jsx(CalendarIcon, { className: "size-4 shrink-0 opacity-70", "aria-hidden": "true" }), _jsx("span", { className: "truncate", children: label })] }) }), _jsx(PopoverContent, { align: align, "aria-label": placeholder, "data-slot": "date-range-picker-content", className: cn("w-auto p-0", contentClassName), children: _jsxs("div", { className: "flex flex-col sm:flex-row", children: [presets && presets.length > 0 ? (_jsxs("fieldset", { "data-slot": "date-range-picker-presets", className: "m-0 flex min-w-0 flex-row gap-1 border-0 border-border border-b p-2 sm:flex-col sm:border-e sm:border-b-0", children: [_jsx("legend", { className: "sr-only", children: "Date range presets" }), presets.map((preset) => (_jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => handlePreset(preset.range), "data-slot": "date-range-picker-preset", className: "justify-start whitespace-nowrap font-normal", children: preset.label }, preset.label)))] })) : null, _jsxs("fieldset", { "data-slot": "date-range-picker-calendar", className: "m-0 min-w-0 border-0 p-0", children: [_jsx("legend", { className: "sr-only", children: placeholder }), _jsx(Calendar, { mode: "range", selected: selected, onSelect: handleSelect, numberOfMonths: numberOfMonths, defaultMonth: value?.from, startMonth: min, endMonth: max, disabled: disabledMatcher.length > 0 ? disabledMatcher : undefined, locale: locale, autoFocus: true })] })] }) })] }));
57
+ });
58
+ DateRangePicker.displayName = "DateRangePicker";
59
+ //# sourceMappingURL=date-range-picker.js.map