@misoto22/folio 0.0.0 → 0.17.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 (721) hide show
  1. package/AGENTS.md +88 -0
  2. package/CLAUDE.md +1 -0
  3. package/LICENSE +21 -0
  4. package/README.md +208 -2
  5. package/bin/folio-design.mjs +277 -0
  6. package/bin/migrate-legacy.mjs +81 -0
  7. package/dist/agent/Accordion.md +65 -0
  8. package/dist/agent/Actions.md +49 -0
  9. package/dist/agent/Alert.md +65 -0
  10. package/dist/agent/AppShell.md +69 -0
  11. package/dist/agent/ArchitectureFigure.md +72 -0
  12. package/dist/agent/AreaChart.md +94 -0
  13. package/dist/agent/Article.md +65 -0
  14. package/dist/agent/AspectRatio.md +58 -0
  15. package/dist/agent/Avatar.md +53 -0
  16. package/dist/agent/Badge.md +62 -0
  17. package/dist/agent/BarChart.md +93 -0
  18. package/dist/agent/BarList.md +67 -0
  19. package/dist/agent/BigNumber.md +70 -0
  20. package/dist/agent/BoxPlot.md +82 -0
  21. package/dist/agent/Breadcrumb.md +55 -0
  22. package/dist/agent/BulletChart.md +71 -0
  23. package/dist/agent/Button.md +81 -0
  24. package/dist/agent/Calendar.md +77 -0
  25. package/dist/agent/CalendarHeatmap.md +75 -0
  26. package/dist/agent/Card.md +72 -0
  27. package/dist/agent/Checkbox.md +57 -0
  28. package/dist/agent/Code.md +51 -0
  29. package/dist/agent/CodeBlock.md +77 -0
  30. package/dist/agent/Collapsible.md +68 -0
  31. package/dist/agent/Collection.md +169 -0
  32. package/dist/agent/ColorPicker.md +76 -0
  33. package/dist/agent/Combobox.md +77 -0
  34. package/dist/agent/Command.md +122 -0
  35. package/dist/agent/ComposedChart.md +82 -0
  36. package/dist/agent/Contact.md +90 -0
  37. package/dist/agent/Content.md +70 -0
  38. package/dist/agent/ContextMenu.md +93 -0
  39. package/dist/agent/Conversation.md +247 -0
  40. package/dist/agent/DataflowFigure.md +49 -0
  41. package/dist/agent/DatePicker.md +104 -0
  42. package/dist/agent/DescriptionList.md +69 -0
  43. package/dist/agent/Diagram.md +71 -0
  44. package/dist/agent/DiagramCanvas.md +71 -0
  45. package/dist/agent/DiagramExportMenu.md +65 -0
  46. package/dist/agent/DiagramInspector.md +73 -0
  47. package/dist/agent/DiagramLegend.md +56 -0
  48. package/dist/agent/DiagramMinimap.md +69 -0
  49. package/dist/agent/DiagramToolbar.md +70 -0
  50. package/dist/agent/Dialog.md +76 -0
  51. package/dist/agent/DropdownMenu.md +110 -0
  52. package/dist/agent/EmptyState.md +63 -0
  53. package/dist/agent/ErrorState.md +67 -0
  54. package/dist/agent/Evidence.md +165 -0
  55. package/dist/agent/Facet.md +107 -0
  56. package/dist/agent/Field.md +79 -0
  57. package/dist/agent/FigureBand.md +49 -0
  58. package/dist/agent/FloatingIconButton.md +61 -0
  59. package/dist/agent/FunnelChart.md +75 -0
  60. package/dist/agent/Heading.md +65 -0
  61. package/dist/agent/Heatmap.md +78 -0
  62. package/dist/agent/Histogram.md +88 -0
  63. package/dist/agent/Input.md +52 -0
  64. package/dist/agent/Kbd.md +48 -0
  65. package/dist/agent/LifecycleFigure.md +50 -0
  66. package/dist/agent/LineChart.md +85 -0
  67. package/dist/agent/LinkArrow.md +49 -0
  68. package/dist/agent/Markdown.md +69 -0
  69. package/dist/agent/Media.md +261 -0
  70. package/dist/agent/Metric.md +70 -0
  71. package/dist/agent/Metrics.md +114 -0
  72. package/dist/agent/Music.md +86 -0
  73. package/dist/agent/NativeSelect.md +62 -0
  74. package/dist/agent/NavItem.md +56 -0
  75. package/dist/agent/NumberField.md +73 -0
  76. package/dist/agent/PageHeader.md +69 -0
  77. package/dist/agent/Pagination.md +70 -0
  78. package/dist/agent/PieChart.md +80 -0
  79. package/dist/agent/Popover.md +80 -0
  80. package/dist/agent/Portfolio.md +93 -0
  81. package/dist/agent/PortfolioIndex.md +34 -0
  82. package/dist/agent/Progress.md +58 -0
  83. package/dist/agent/RadarChart.md +79 -0
  84. package/dist/agent/RadialChart.md +81 -0
  85. package/dist/agent/RadioGroup.md +66 -0
  86. package/dist/agent/Reading.md +233 -0
  87. package/dist/agent/Recovery.md +72 -0
  88. package/dist/agent/SankeyChart.md +85 -0
  89. package/dist/agent/ScatterChart.md +80 -0
  90. package/dist/agent/ScrollArea.md +62 -0
  91. package/dist/agent/SearchPalette.md +51 -0
  92. package/dist/agent/SearchableMenu.md +69 -0
  93. package/dist/agent/Select.md +102 -0
  94. package/dist/agent/Separator.md +60 -0
  95. package/dist/agent/SequenceFigure.md +51 -0
  96. package/dist/agent/Sheet.md +82 -0
  97. package/dist/agent/Sidebar.md +194 -0
  98. package/dist/agent/SiteNavigation.md +62 -0
  99. package/dist/agent/SiteShell.md +67 -0
  100. package/dist/agent/Skeleton.md +96 -0
  101. package/dist/agent/Slider.md +67 -0
  102. package/dist/agent/Sparkline.md +68 -0
  103. package/dist/agent/Spinner.md +62 -0
  104. package/dist/agent/StatusDot.md +56 -0
  105. package/dist/agent/StatusPill.md +55 -0
  106. package/dist/agent/Steps.md +68 -0
  107. package/dist/agent/Switch.md +50 -0
  108. package/dist/agent/Table.md +111 -0
  109. package/dist/agent/Tabs.md +71 -0
  110. package/dist/agent/Tag.md +67 -0
  111. package/dist/agent/Text.md +66 -0
  112. package/dist/agent/Textarea.md +46 -0
  113. package/dist/agent/Timeline.md +114 -0
  114. package/dist/agent/Timestamp.md +65 -0
  115. package/dist/agent/Toast.md +51 -0
  116. package/dist/agent/ToggleGroup.md +67 -0
  117. package/dist/agent/Toolbar.md +72 -0
  118. package/dist/agent/Tooltip.md +74 -0
  119. package/dist/agent/TreemapChart.md +76 -0
  120. package/dist/agent/WaterfallChart.md +86 -0
  121. package/dist/agent/Workbench.md +142 -0
  122. package/dist/agent/WorkflowFigure.md +51 -0
  123. package/dist/agent/catalog.json +8055 -0
  124. package/dist/agent/index.md +185 -0
  125. package/dist/article.css +407 -0
  126. package/dist/charts/AreaChart/AreaChart.d.ts +198 -0
  127. package/dist/charts/AreaChart/AreaChart.js +479 -0
  128. package/dist/charts/AreaChart/AreaChart.js.map +1 -0
  129. package/dist/charts/BarChart/BarChart.d.ts +190 -0
  130. package/dist/charts/BarChart/BarChart.js +599 -0
  131. package/dist/charts/BarChart/BarChart.js.map +1 -0
  132. package/dist/charts/BarList/BarList.d.ts +65 -0
  133. package/dist/charts/BarList/BarList.js +79 -0
  134. package/dist/charts/BarList/BarList.js.map +1 -0
  135. package/dist/charts/BigNumber/BigNumber.d.ts +72 -0
  136. package/dist/charts/BigNumber/BigNumber.js +51 -0
  137. package/dist/charts/BigNumber/BigNumber.js.map +1 -0
  138. package/dist/charts/BoxPlot/BoxPlot.d.ts +177 -0
  139. package/dist/charts/BoxPlot/BoxPlot.js +497 -0
  140. package/dist/charts/BoxPlot/BoxPlot.js.map +1 -0
  141. package/dist/charts/BulletChart/BulletChart.d.ts +100 -0
  142. package/dist/charts/BulletChart/BulletChart.js +197 -0
  143. package/dist/charts/BulletChart/BulletChart.js.map +1 -0
  144. package/dist/charts/CalendarHeatmap/CalendarHeatmap.d.ts +106 -0
  145. package/dist/charts/CalendarHeatmap/CalendarHeatmap.js +103 -0
  146. package/dist/charts/CalendarHeatmap/CalendarHeatmap.js.map +1 -0
  147. package/dist/charts/ComposedChart/ComposedChart.d.ts +178 -0
  148. package/dist/charts/ComposedChart/ComposedChart.js +667 -0
  149. package/dist/charts/ComposedChart/ComposedChart.js.map +1 -0
  150. package/dist/charts/Facet/Facet.d.ts +240 -0
  151. package/dist/charts/Facet/Facet.js +133 -0
  152. package/dist/charts/Facet/Facet.js.map +1 -0
  153. package/dist/charts/Facet/panels.d.ts +187 -0
  154. package/dist/charts/Facet/panels.js +203 -0
  155. package/dist/charts/Facet/panels.js.map +1 -0
  156. package/dist/charts/FunnelChart/FunnelChart.d.ts +106 -0
  157. package/dist/charts/FunnelChart/FunnelChart.js +137 -0
  158. package/dist/charts/FunnelChart/FunnelChart.js.map +1 -0
  159. package/dist/charts/Heatmap/Heatmap.d.ts +101 -0
  160. package/dist/charts/Heatmap/Heatmap.js +125 -0
  161. package/dist/charts/Heatmap/Heatmap.js.map +1 -0
  162. package/dist/charts/Histogram/Histogram.d.ts +188 -0
  163. package/dist/charts/Histogram/Histogram.js +382 -0
  164. package/dist/charts/Histogram/Histogram.js.map +1 -0
  165. package/dist/charts/LineChart/LineChart.d.ts +174 -0
  166. package/dist/charts/LineChart/LineChart.js +485 -0
  167. package/dist/charts/LineChart/LineChart.js.map +1 -0
  168. package/dist/charts/PieChart/PieChart.d.ts +140 -0
  169. package/dist/charts/PieChart/PieChart.js +317 -0
  170. package/dist/charts/PieChart/PieChart.js.map +1 -0
  171. package/dist/charts/RadarChart/RadarChart.d.ts +135 -0
  172. package/dist/charts/RadarChart/RadarChart.js +303 -0
  173. package/dist/charts/RadarChart/RadarChart.js.map +1 -0
  174. package/dist/charts/RadialChart/RadialChart.d.ts +142 -0
  175. package/dist/charts/RadialChart/RadialChart.js +279 -0
  176. package/dist/charts/RadialChart/RadialChart.js.map +1 -0
  177. package/dist/charts/SankeyChart/SankeyChart.d.ts +149 -0
  178. package/dist/charts/SankeyChart/SankeyChart.js +509 -0
  179. package/dist/charts/SankeyChart/SankeyChart.js.map +1 -0
  180. package/dist/charts/ScatterChart/ScatterChart.d.ts +149 -0
  181. package/dist/charts/ScatterChart/ScatterChart.js +275 -0
  182. package/dist/charts/ScatterChart/ScatterChart.js.map +1 -0
  183. package/dist/charts/Sparkline/Sparkline.d.ts +53 -0
  184. package/dist/charts/Sparkline/Sparkline.js +95 -0
  185. package/dist/charts/Sparkline/Sparkline.js.map +1 -0
  186. package/dist/charts/TreemapChart/TreemapChart.d.ts +98 -0
  187. package/dist/charts/TreemapChart/TreemapChart.js +127 -0
  188. package/dist/charts/TreemapChart/TreemapChart.js.map +1 -0
  189. package/dist/charts/WaterfallChart/WaterfallChart.d.ts +164 -0
  190. package/dist/charts/WaterfallChart/WaterfallChart.js +321 -0
  191. package/dist/charts/WaterfallChart/WaterfallChart.js.map +1 -0
  192. package/dist/charts/index.d.ts +43 -0
  193. package/dist/charts/index.js +130 -0
  194. package/dist/charts/index.js.map +1 -0
  195. package/dist/charts/lib/annotations.d.ts +103 -0
  196. package/dist/charts/lib/annotations.js +99 -0
  197. package/dist/charts/lib/annotations.js.map +1 -0
  198. package/dist/charts/lib/axis.d.ts +18 -0
  199. package/dist/charts/lib/axis.js +21 -0
  200. package/dist/charts/lib/axis.js.map +1 -0
  201. package/dist/charts/lib/background.d.ts +33 -0
  202. package/dist/charts/lib/background.js +173 -0
  203. package/dist/charts/lib/background.js.map +1 -0
  204. package/dist/charts/lib/brush.d.ts +94 -0
  205. package/dist/charts/lib/brush.js +535 -0
  206. package/dist/charts/lib/brush.js.map +1 -0
  207. package/dist/charts/lib/chart.d.ts +94 -0
  208. package/dist/charts/lib/chart.js +149 -0
  209. package/dist/charts/lib/chart.js.map +1 -0
  210. package/dist/charts/lib/dot.d.ts +29 -0
  211. package/dist/charts/lib/dot.js +78 -0
  212. package/dist/charts/lib/dot.js.map +1 -0
  213. package/dist/charts/lib/empty.d.ts +31 -0
  214. package/dist/charts/lib/empty.js +24 -0
  215. package/dist/charts/lib/empty.js.map +1 -0
  216. package/dist/charts/lib/export.d.ts +94 -0
  217. package/dist/charts/lib/export.js +62 -0
  218. package/dist/charts/lib/export.js.map +1 -0
  219. package/dist/charts/lib/figure.d.ts +81 -0
  220. package/dist/charts/lib/figure.js +62 -0
  221. package/dist/charts/lib/figure.js.map +1 -0
  222. package/dist/charts/lib/format.d.ts +46 -0
  223. package/dist/charts/lib/format.js +56 -0
  224. package/dist/charts/lib/format.js.map +1 -0
  225. package/dist/charts/lib/legend.d.ts +45 -0
  226. package/dist/charts/lib/legend.js +117 -0
  227. package/dist/charts/lib/legend.js.map +1 -0
  228. package/dist/charts/lib/loading.d.ts +48 -0
  229. package/dist/charts/lib/loading.js +105 -0
  230. package/dist/charts/lib/loading.js.map +1 -0
  231. package/dist/charts/lib/paint.d.ts +154 -0
  232. package/dist/charts/lib/paint.js +551 -0
  233. package/dist/charts/lib/paint.js.map +1 -0
  234. package/dist/charts/lib/scale.d.ts +23 -0
  235. package/dist/charts/lib/scale.js +13 -0
  236. package/dist/charts/lib/scale.js.map +1 -0
  237. package/dist/charts/lib/selection.d.ts +20 -0
  238. package/dist/charts/lib/selection.js +18 -0
  239. package/dist/charts/lib/selection.js.map +1 -0
  240. package/dist/charts/lib/sonify-control.d.ts +163 -0
  241. package/dist/charts/lib/sonify-control.js +172 -0
  242. package/dist/charts/lib/sonify-control.js.map +1 -0
  243. package/dist/charts/lib/sonify.d.ts +248 -0
  244. package/dist/charts/lib/sonify.js +262 -0
  245. package/dist/charts/lib/sonify.js.map +1 -0
  246. package/dist/charts/lib/toolbar.d.ts +144 -0
  247. package/dist/charts/lib/toolbar.js +156 -0
  248. package/dist/charts/lib/toolbar.js.map +1 -0
  249. package/dist/charts/lib/tooltip.d.ts +59 -0
  250. package/dist/charts/lib/tooltip.js +135 -0
  251. package/dist/charts/lib/tooltip.js.map +1 -0
  252. package/dist/charts/lib/values.d.ts +56 -0
  253. package/dist/charts/lib/values.js +71 -0
  254. package/dist/charts/lib/values.js.map +1 -0
  255. package/dist/charts/lib/zoom.d.ts +139 -0
  256. package/dist/charts/lib/zoom.js +314 -0
  257. package/dist/charts/lib/zoom.js.map +1 -0
  258. package/dist/components/Accordion/Accordion.d.ts +34 -0
  259. package/dist/components/Accordion/Accordion.js +43 -0
  260. package/dist/components/Accordion/Accordion.js.map +1 -0
  261. package/dist/components/Alert/Alert.d.ts +32 -0
  262. package/dist/components/Alert/Alert.js +49 -0
  263. package/dist/components/Alert/Alert.js.map +1 -0
  264. package/dist/components/AppShell/AppShell.d.ts +58 -0
  265. package/dist/components/AppShell/AppShell.js +126 -0
  266. package/dist/components/AppShell/AppShell.js.map +1 -0
  267. package/dist/components/Article/Article.d.ts +58 -0
  268. package/dist/components/Article/Article.js +34 -0
  269. package/dist/components/Article/Article.js.map +1 -0
  270. package/dist/components/AspectRatio/AspectRatio.d.ts +46 -0
  271. package/dist/components/AspectRatio/AspectRatio.js +33 -0
  272. package/dist/components/AspectRatio/AspectRatio.js.map +1 -0
  273. package/dist/components/Avatar/Avatar.d.ts +38 -0
  274. package/dist/components/Avatar/Avatar.js +44 -0
  275. package/dist/components/Avatar/Avatar.js.map +1 -0
  276. package/dist/components/Badge/Badge.d.ts +30 -0
  277. package/dist/components/Badge/Badge.js +29 -0
  278. package/dist/components/Badge/Badge.js.map +1 -0
  279. package/dist/components/Breadcrumb/Breadcrumb.d.ts +37 -0
  280. package/dist/components/Breadcrumb/Breadcrumb.js +46 -0
  281. package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -0
  282. package/dist/components/Button/Button.d.ts +70 -0
  283. package/dist/components/Button/Button.js +95 -0
  284. package/dist/components/Button/Button.js.map +1 -0
  285. package/dist/components/Calendar/Calendar.d.ts +54 -0
  286. package/dist/components/Calendar/Calendar.js +369 -0
  287. package/dist/components/Calendar/Calendar.js.map +1 -0
  288. package/dist/components/Card/Card.d.ts +55 -0
  289. package/dist/components/Card/Card.js +64 -0
  290. package/dist/components/Card/Card.js.map +1 -0
  291. package/dist/components/Checkbox/Checkbox.d.ts +26 -0
  292. package/dist/components/Checkbox/Checkbox.js +34 -0
  293. package/dist/components/Checkbox/Checkbox.js.map +1 -0
  294. package/dist/components/Code/Code.d.ts +30 -0
  295. package/dist/components/Code/Code.js +21 -0
  296. package/dist/components/Code/Code.js.map +1 -0
  297. package/dist/components/CodeBlock/CodeBlock.d.ts +145 -0
  298. package/dist/components/CodeBlock/CodeBlock.js +114 -0
  299. package/dist/components/CodeBlock/CodeBlock.js.map +1 -0
  300. package/dist/components/Collapsible/Collapsible.d.ts +45 -0
  301. package/dist/components/Collapsible/Collapsible.js +60 -0
  302. package/dist/components/Collapsible/Collapsible.js.map +1 -0
  303. package/dist/components/ColorPicker/ColorPicker.d.ts +67 -0
  304. package/dist/components/ColorPicker/ColorPicker.js +334 -0
  305. package/dist/components/ColorPicker/ColorPicker.js.map +1 -0
  306. package/dist/components/Combobox/Combobox.d.ts +77 -0
  307. package/dist/components/Combobox/Combobox.js +170 -0
  308. package/dist/components/Combobox/Combobox.js.map +1 -0
  309. package/dist/components/Command/Command.d.ts +125 -0
  310. package/dist/components/Command/Command.js +204 -0
  311. package/dist/components/Command/Command.js.map +1 -0
  312. package/dist/components/ContextMenu/ContextMenu.d.ts +63 -0
  313. package/dist/components/ContextMenu/ContextMenu.js +109 -0
  314. package/dist/components/ContextMenu/ContextMenu.js.map +1 -0
  315. package/dist/components/DatePicker/DatePicker.d.ts +130 -0
  316. package/dist/components/DatePicker/DatePicker.js +257 -0
  317. package/dist/components/DatePicker/DatePicker.js.map +1 -0
  318. package/dist/components/DescriptionList/DescriptionList.d.ts +73 -0
  319. package/dist/components/DescriptionList/DescriptionList.js +35 -0
  320. package/dist/components/DescriptionList/DescriptionList.js.map +1 -0
  321. package/dist/components/Diagram/Diagram.d.ts +86 -0
  322. package/dist/components/Diagram/Diagram.js +211 -0
  323. package/dist/components/Diagram/Diagram.js.map +1 -0
  324. package/dist/components/Dialog/Dialog.d.ts +63 -0
  325. package/dist/components/Dialog/Dialog.js +90 -0
  326. package/dist/components/Dialog/Dialog.js.map +1 -0
  327. package/dist/components/DropdownMenu/DropdownMenu.d.ts +87 -0
  328. package/dist/components/DropdownMenu/DropdownMenu.js +120 -0
  329. package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -0
  330. package/dist/components/EmptyState/EmptyState.d.ts +55 -0
  331. package/dist/components/EmptyState/EmptyState.js +32 -0
  332. package/dist/components/EmptyState/EmptyState.js.map +1 -0
  333. package/dist/components/ErrorState/ErrorState.d.ts +55 -0
  334. package/dist/components/ErrorState/ErrorState.js +41 -0
  335. package/dist/components/ErrorState/ErrorState.js.map +1 -0
  336. package/dist/components/Field/Field.d.ts +111 -0
  337. package/dist/components/Field/Field.js +95 -0
  338. package/dist/components/Field/Field.js.map +1 -0
  339. package/dist/components/Field/field-control.d.ts +31 -0
  340. package/dist/components/Field/field-control.js +12 -0
  341. package/dist/components/Field/field-control.js.map +1 -0
  342. package/dist/components/FigureBand/FigureBand.d.ts +31 -0
  343. package/dist/components/FigureBand/FigureBand.js +51 -0
  344. package/dist/components/FigureBand/FigureBand.js.map +1 -0
  345. package/dist/components/FloatingIconButton/FloatingIconButton.d.ts +29 -0
  346. package/dist/components/FloatingIconButton/FloatingIconButton.js +34 -0
  347. package/dist/components/FloatingIconButton/FloatingIconButton.js.map +1 -0
  348. package/dist/components/Heading/Heading.d.ts +62 -0
  349. package/dist/components/Heading/Heading.js +44 -0
  350. package/dist/components/Heading/Heading.js.map +1 -0
  351. package/dist/components/Input/Input.d.ts +22 -0
  352. package/dist/components/Input/Input.js +21 -0
  353. package/dist/components/Input/Input.js.map +1 -0
  354. package/dist/components/Kbd/Kbd.d.ts +27 -0
  355. package/dist/components/Kbd/Kbd.js +21 -0
  356. package/dist/components/Kbd/Kbd.js.map +1 -0
  357. package/dist/components/LinkArrow/LinkArrow.d.ts +24 -0
  358. package/dist/components/LinkArrow/LinkArrow.js +24 -0
  359. package/dist/components/LinkArrow/LinkArrow.js.map +1 -0
  360. package/dist/components/Markdown/Markdown.d.ts +139 -0
  361. package/dist/components/Markdown/Markdown.js +135 -0
  362. package/dist/components/Markdown/Markdown.js.map +1 -0
  363. package/dist/components/Markdown/inline.d.ts +29 -0
  364. package/dist/components/Markdown/inline.js +74 -0
  365. package/dist/components/Markdown/inline.js.map +1 -0
  366. package/dist/components/Markdown/nodes.d.ts +65 -0
  367. package/dist/components/Markdown/nodes.js +1 -0
  368. package/dist/components/Markdown/nodes.js.map +1 -0
  369. package/dist/components/Markdown/parse.d.ts +24 -0
  370. package/dist/components/Markdown/parse.js +110 -0
  371. package/dist/components/Markdown/parse.js.map +1 -0
  372. package/dist/components/Markdown/slug.d.ts +15 -0
  373. package/dist/components/Markdown/slug.js +7 -0
  374. package/dist/components/Markdown/slug.js.map +1 -0
  375. package/dist/components/Metric/Metric.d.ts +61 -0
  376. package/dist/components/Metric/Metric.js +51 -0
  377. package/dist/components/Metric/Metric.js.map +1 -0
  378. package/dist/components/NativeSelect/NativeSelect.d.ts +33 -0
  379. package/dist/components/NativeSelect/NativeSelect.js +44 -0
  380. package/dist/components/NativeSelect/NativeSelect.js.map +1 -0
  381. package/dist/components/NavItem/NavItem.d.ts +39 -0
  382. package/dist/components/NavItem/NavItem.js +31 -0
  383. package/dist/components/NavItem/NavItem.js.map +1 -0
  384. package/dist/components/NumberField/NumberField.d.ts +69 -0
  385. package/dist/components/NumberField/NumberField.js +162 -0
  386. package/dist/components/NumberField/NumberField.js.map +1 -0
  387. package/dist/components/PageHeader/PageHeader.d.ts +92 -0
  388. package/dist/components/PageHeader/PageHeader.js +37 -0
  389. package/dist/components/PageHeader/PageHeader.js.map +1 -0
  390. package/dist/components/Pagination/Pagination.d.ts +67 -0
  391. package/dist/components/Pagination/Pagination.js +112 -0
  392. package/dist/components/Pagination/Pagination.js.map +1 -0
  393. package/dist/components/Popover/Popover.d.ts +39 -0
  394. package/dist/components/Popover/Popover.js +57 -0
  395. package/dist/components/Popover/Popover.js.map +1 -0
  396. package/dist/components/Progress/Progress.d.ts +43 -0
  397. package/dist/components/Progress/Progress.js +57 -0
  398. package/dist/components/Progress/Progress.js.map +1 -0
  399. package/dist/components/RadioGroup/RadioGroup.d.ts +49 -0
  400. package/dist/components/RadioGroup/RadioGroup.js +53 -0
  401. package/dist/components/RadioGroup/RadioGroup.js.map +1 -0
  402. package/dist/components/ScrollArea/ScrollArea.d.ts +46 -0
  403. package/dist/components/ScrollArea/ScrollArea.js +54 -0
  404. package/dist/components/ScrollArea/ScrollArea.js.map +1 -0
  405. package/dist/components/SearchableMenu/SearchableMenu.d.ts +68 -0
  406. package/dist/components/SearchableMenu/SearchableMenu.js +101 -0
  407. package/dist/components/SearchableMenu/SearchableMenu.js.map +1 -0
  408. package/dist/components/Select/Select.d.ts +87 -0
  409. package/dist/components/Select/Select.js +130 -0
  410. package/dist/components/Select/Select.js.map +1 -0
  411. package/dist/components/Separator/Separator.d.ts +48 -0
  412. package/dist/components/Separator/Separator.js +43 -0
  413. package/dist/components/Separator/Separator.js.map +1 -0
  414. package/dist/components/Sheet/Sheet.d.ts +43 -0
  415. package/dist/components/Sheet/Sheet.js +79 -0
  416. package/dist/components/Sheet/Sheet.js.map +1 -0
  417. package/dist/components/Sidebar/Sidebar.d.ts +357 -0
  418. package/dist/components/Sidebar/Sidebar.js +447 -0
  419. package/dist/components/Sidebar/Sidebar.js.map +1 -0
  420. package/dist/components/Skeleton/Skeleton.d.ts +70 -0
  421. package/dist/components/Skeleton/Skeleton.js +44 -0
  422. package/dist/components/Skeleton/Skeleton.js.map +1 -0
  423. package/dist/components/Slider/Slider.d.ts +74 -0
  424. package/dist/components/Slider/Slider.js +143 -0
  425. package/dist/components/Slider/Slider.js.map +1 -0
  426. package/dist/components/Spinner/Spinner.d.ts +58 -0
  427. package/dist/components/Spinner/Spinner.js +49 -0
  428. package/dist/components/Spinner/Spinner.js.map +1 -0
  429. package/dist/components/StatusDot/StatusDot.d.ts +29 -0
  430. package/dist/components/StatusDot/StatusDot.js +44 -0
  431. package/dist/components/StatusDot/StatusDot.js.map +1 -0
  432. package/dist/components/StatusPill/StatusPill.d.ts +30 -0
  433. package/dist/components/StatusPill/StatusPill.js +37 -0
  434. package/dist/components/StatusPill/StatusPill.js.map +1 -0
  435. package/dist/components/Steps/Steps.d.ts +65 -0
  436. package/dist/components/Steps/Steps.js +25 -0
  437. package/dist/components/Steps/Steps.js.map +1 -0
  438. package/dist/components/Switch/Switch.d.ts +23 -0
  439. package/dist/components/Switch/Switch.js +23 -0
  440. package/dist/components/Switch/Switch.js.map +1 -0
  441. package/dist/components/Table/Table.d.ts +116 -0
  442. package/dist/components/Table/Table.js +137 -0
  443. package/dist/components/Table/Table.js.map +1 -0
  444. package/dist/components/Tabs/Tabs.d.ts +37 -0
  445. package/dist/components/Tabs/Tabs.js +205 -0
  446. package/dist/components/Tabs/Tabs.js.map +1 -0
  447. package/dist/components/Tag/Tag.d.ts +87 -0
  448. package/dist/components/Tag/Tag.js +62 -0
  449. package/dist/components/Tag/Tag.js.map +1 -0
  450. package/dist/components/Text/Text.d.ts +62 -0
  451. package/dist/components/Text/Text.js +30 -0
  452. package/dist/components/Text/Text.js.map +1 -0
  453. package/dist/components/Textarea/Textarea.d.ts +20 -0
  454. package/dist/components/Textarea/Textarea.js +32 -0
  455. package/dist/components/Textarea/Textarea.js.map +1 -0
  456. package/dist/components/Timestamp/Timestamp.d.ts +59 -0
  457. package/dist/components/Timestamp/Timestamp.js +56 -0
  458. package/dist/components/Timestamp/Timestamp.js.map +1 -0
  459. package/dist/components/Toast/Toast.d.ts +32 -0
  460. package/dist/components/Toast/Toast.js +64 -0
  461. package/dist/components/Toast/Toast.js.map +1 -0
  462. package/dist/components/ToggleGroup/ToggleGroup.d.ts +46 -0
  463. package/dist/components/ToggleGroup/ToggleGroup.js +88 -0
  464. package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -0
  465. package/dist/components/Toolbar/Toolbar.d.ts +55 -0
  466. package/dist/components/Toolbar/Toolbar.js +43 -0
  467. package/dist/components/Toolbar/Toolbar.js.map +1 -0
  468. package/dist/components/Tooltip/Tooltip.d.ts +43 -0
  469. package/dist/components/Tooltip/Tooltip.js +40 -0
  470. package/dist/components/Tooltip/Tooltip.js.map +1 -0
  471. package/dist/diagrams/ArchitectureFigure/ArchitectureFigure.d.ts +55 -0
  472. package/dist/diagrams/ArchitectureFigure/ArchitectureFigure.js +175 -0
  473. package/dist/diagrams/ArchitectureFigure/ArchitectureFigure.js.map +1 -0
  474. package/dist/diagrams/DataflowFigure/DataflowFigure.d.ts +28 -0
  475. package/dist/diagrams/DataflowFigure/DataflowFigure.js +148 -0
  476. package/dist/diagrams/DataflowFigure/DataflowFigure.js.map +1 -0
  477. package/dist/diagrams/DiagramCanvas/DiagramCanvas.d.ts +78 -0
  478. package/dist/diagrams/DiagramCanvas/DiagramCanvas.js +229 -0
  479. package/dist/diagrams/DiagramCanvas/DiagramCanvas.js.map +1 -0
  480. package/dist/diagrams/DiagramExportMenu/DiagramExportMenu.d.ts +106 -0
  481. package/dist/diagrams/DiagramExportMenu/DiagramExportMenu.js +123 -0
  482. package/dist/diagrams/DiagramExportMenu/DiagramExportMenu.js.map +1 -0
  483. package/dist/diagrams/DiagramInspector/DiagramInspector.d.ts +70 -0
  484. package/dist/diagrams/DiagramInspector/DiagramInspector.js +94 -0
  485. package/dist/diagrams/DiagramInspector/DiagramInspector.js.map +1 -0
  486. package/dist/diagrams/DiagramLegend/DiagramLegend.d.ts +42 -0
  487. package/dist/diagrams/DiagramLegend/DiagramLegend.js +35 -0
  488. package/dist/diagrams/DiagramLegend/DiagramLegend.js.map +1 -0
  489. package/dist/diagrams/DiagramMinimap/DiagramMinimap.d.ts +77 -0
  490. package/dist/diagrams/DiagramMinimap/DiagramMinimap.js +106 -0
  491. package/dist/diagrams/DiagramMinimap/DiagramMinimap.js.map +1 -0
  492. package/dist/diagrams/DiagramToolbar/DiagramToolbar.d.ts +48 -0
  493. package/dist/diagrams/DiagramToolbar/DiagramToolbar.js +53 -0
  494. package/dist/diagrams/DiagramToolbar/DiagramToolbar.js.map +1 -0
  495. package/dist/diagrams/LifecycleFigure/LifecycleFigure.d.ts +31 -0
  496. package/dist/diagrams/LifecycleFigure/LifecycleFigure.js +234 -0
  497. package/dist/diagrams/LifecycleFigure/LifecycleFigure.js.map +1 -0
  498. package/dist/diagrams/SequenceFigure/SequenceFigure.d.ts +38 -0
  499. package/dist/diagrams/SequenceFigure/SequenceFigure.js +261 -0
  500. package/dist/diagrams/SequenceFigure/SequenceFigure.js.map +1 -0
  501. package/dist/diagrams/WorkflowFigure/WorkflowFigure.d.ts +36 -0
  502. package/dist/diagrams/WorkflowFigure/WorkflowFigure.js +259 -0
  503. package/dist/diagrams/WorkflowFigure/WorkflowFigure.js.map +1 -0
  504. package/dist/diagrams/index.d.ts +17 -0
  505. package/dist/diagrams/index.js +29 -0
  506. package/dist/diagrams/index.js.map +1 -0
  507. package/dist/diagrams/lib/dev.d.ts +61 -0
  508. package/dist/diagrams/lib/dev.js +96 -0
  509. package/dist/diagrams/lib/dev.js.map +1 -0
  510. package/dist/diagrams/lib/frame.d.ts +138 -0
  511. package/dist/diagrams/lib/frame.js +131 -0
  512. package/dist/diagrams/lib/frame.js.map +1 -0
  513. package/dist/diagrams/lib/geometry.d.ts +114 -0
  514. package/dist/diagrams/lib/geometry.js +113 -0
  515. package/dist/diagrams/lib/geometry.js.map +1 -0
  516. package/dist/diagrams/lib/legend.d.ts +32 -0
  517. package/dist/diagrams/lib/legend.js +84 -0
  518. package/dist/diagrams/lib/legend.js.map +1 -0
  519. package/dist/diagrams/lib/marks.d.ts +207 -0
  520. package/dist/diagrams/lib/marks.js +480 -0
  521. package/dist/diagrams/lib/marks.js.map +1 -0
  522. package/dist/diagrams/lib/route.d.ts +106 -0
  523. package/dist/diagrams/lib/route.js +201 -0
  524. package/dist/diagrams/lib/route.js.map +1 -0
  525. package/dist/diagrams/lib/wires.d.ts +59 -0
  526. package/dist/diagrams/lib/wires.js +94 -0
  527. package/dist/diagrams/lib/wires.js.map +1 -0
  528. package/dist/diagrams/spec.d.ts +405 -0
  529. package/dist/diagrams/spec.js +1 -0
  530. package/dist/diagrams/spec.js.map +1 -0
  531. package/dist/fonts/hanken-grotesk-300.woff2 +0 -0
  532. package/dist/fonts/hanken-grotesk-400.woff2 +0 -0
  533. package/dist/fonts/hanken-grotesk-500.woff2 +0 -0
  534. package/dist/fonts/hanken-grotesk-600.woff2 +0 -0
  535. package/dist/fonts/hanken-grotesk-700.woff2 +0 -0
  536. package/dist/fonts/ibm-plex-mono-400.woff2 +0 -0
  537. package/dist/fonts/ibm-plex-mono-500.woff2 +0 -0
  538. package/dist/fonts/ibm-plex-mono-600.woff2 +0 -0
  539. package/dist/fonts/newsreader-300.woff2 +0 -0
  540. package/dist/fonts/newsreader-400.woff2 +0 -0
  541. package/dist/fonts/newsreader-500.woff2 +0 -0
  542. package/dist/fonts/newsreader-600.woff2 +0 -0
  543. package/dist/fonts.css +96 -0
  544. package/dist/index.d.ts +97 -0
  545. package/dist/index.js +80 -0
  546. package/dist/index.js.map +1 -0
  547. package/dist/keyframes.css +300 -0
  548. package/dist/lib/cn.d.ts +21 -0
  549. package/dist/lib/cn.js +9 -0
  550. package/dist/lib/cn.js.map +1 -0
  551. package/dist/lib/color.d.ts +80 -0
  552. package/dist/lib/color.js +189 -0
  553. package/dist/lib/color.js.map +1 -0
  554. package/dist/lib/control.d.ts +32 -0
  555. package/dist/lib/control.js +14 -0
  556. package/dist/lib/control.js.map +1 -0
  557. package/dist/lib/index.d.ts +4 -0
  558. package/dist/lib/index.js +11 -0
  559. package/dist/lib/index.js.map +1 -0
  560. package/dist/lib/numeric.d.ts +35 -0
  561. package/dist/lib/numeric.js +29 -0
  562. package/dist/lib/numeric.js.map +1 -0
  563. package/dist/lib/overlay-container.d.ts +48 -0
  564. package/dist/lib/overlay-container.js +15 -0
  565. package/dist/lib/overlay-container.js.map +1 -0
  566. package/dist/lib/slot-content.d.ts +8 -0
  567. package/dist/lib/slot-content.js +17 -0
  568. package/dist/lib/slot-content.js.map +1 -0
  569. package/dist/lib/step-rail.d.ts +45 -0
  570. package/dist/lib/step-rail.js +47 -0
  571. package/dist/lib/step-rail.js.map +1 -0
  572. package/dist/lib/svg-export.d.ts +138 -0
  573. package/dist/lib/svg-export.js +198 -0
  574. package/dist/lib/svg-export.js.map +1 -0
  575. package/dist/lib/useClipboardCopy.d.ts +30 -0
  576. package/dist/lib/useClipboardCopy.js +37 -0
  577. package/dist/lib/useClipboardCopy.js.map +1 -0
  578. package/dist/lib/useSelectionIndicator.d.ts +29 -0
  579. package/dist/lib/useSelectionIndicator.js +49 -0
  580. package/dist/lib/useSelectionIndicator.js.map +1 -0
  581. package/dist/lib/warn.d.ts +73 -0
  582. package/dist/lib/warn.js +38 -0
  583. package/dist/lib/warn.js.map +1 -0
  584. package/dist/semantic.css +200 -0
  585. package/dist/styles.css +98 -0
  586. package/dist/themes.css +607 -0
  587. package/dist/tokens/brand.d.ts +47 -0
  588. package/dist/tokens/brand.js +38 -0
  589. package/dist/tokens/brand.js.map +1 -0
  590. package/dist/tokens.css +666 -0
  591. package/dist/tokens.d.ts +205 -0
  592. package/dist/tokens.js +1056 -0
  593. package/dist/tokens.json +1055 -0
  594. package/dist/website/Actions/Actions.d.ts +34 -0
  595. package/dist/website/Actions/Actions.js +29 -0
  596. package/dist/website/Actions/Actions.js.map +1 -0
  597. package/dist/website/Collection/Collection.d.ts +128 -0
  598. package/dist/website/Collection/Collection.js +162 -0
  599. package/dist/website/Collection/Collection.js.map +1 -0
  600. package/dist/website/Contact/Contact.d.ts +87 -0
  601. package/dist/website/Contact/Contact.js +94 -0
  602. package/dist/website/Contact/Contact.js.map +1 -0
  603. package/dist/website/Content/CodePanel.d.ts +27 -0
  604. package/dist/website/Content/CodePanel.js +30 -0
  605. package/dist/website/Content/CodePanel.js.map +1 -0
  606. package/dist/website/Content/Content.d.ts +29 -0
  607. package/dist/website/Content/Content.js +38 -0
  608. package/dist/website/Content/Content.js.map +1 -0
  609. package/dist/website/Conversation/Conversation.d.ts +193 -0
  610. package/dist/website/Conversation/Conversation.js +252 -0
  611. package/dist/website/Conversation/Conversation.js.map +1 -0
  612. package/dist/website/Evidence/Evidence.d.ts +116 -0
  613. package/dist/website/Evidence/Evidence.js +142 -0
  614. package/dist/website/Evidence/Evidence.js.map +1 -0
  615. package/dist/website/Media/Media.d.ts +173 -0
  616. package/dist/website/Media/Media.js +225 -0
  617. package/dist/website/Media/Media.js.map +1 -0
  618. package/dist/website/Media/MediaLightbox.d.ts +18 -0
  619. package/dist/website/Media/MediaLightbox.js +38 -0
  620. package/dist/website/Media/MediaLightbox.js.map +1 -0
  621. package/dist/website/Metrics/Metrics.d.ts +74 -0
  622. package/dist/website/Metrics/Metrics.js +96 -0
  623. package/dist/website/Metrics/Metrics.js.map +1 -0
  624. package/dist/website/Music/Music.d.ts +60 -0
  625. package/dist/website/Music/Music.js +80 -0
  626. package/dist/website/Music/Music.js.map +1 -0
  627. package/dist/website/Portfolio/FrameLayout.d.ts +9 -0
  628. package/dist/website/Portfolio/FrameLayout.js +42 -0
  629. package/dist/website/Portfolio/FrameLayout.js.map +1 -0
  630. package/dist/website/Portfolio/Portfolio.d.ts +49 -0
  631. package/dist/website/Portfolio/Portfolio.js +66 -0
  632. package/dist/website/Portfolio/Portfolio.js.map +1 -0
  633. package/dist/website/Portfolio/QuestionCard.d.ts +22 -0
  634. package/dist/website/Portfolio/QuestionCard.js +33 -0
  635. package/dist/website/Portfolio/QuestionCard.js.map +1 -0
  636. package/dist/website/PortfolioIndex/PortfolioIndex.d.ts +21 -0
  637. package/dist/website/PortfolioIndex/PortfolioIndex.js +31 -0
  638. package/dist/website/PortfolioIndex/PortfolioIndex.js.map +1 -0
  639. package/dist/website/Reading/Reading.d.ts +203 -0
  640. package/dist/website/Reading/Reading.js +357 -0
  641. package/dist/website/Reading/Reading.js.map +1 -0
  642. package/dist/website/Recovery/Recovery.d.ts +39 -0
  643. package/dist/website/Recovery/Recovery.js +96 -0
  644. package/dist/website/Recovery/Recovery.js.map +1 -0
  645. package/dist/website/SearchPalette/SearchPalette.d.ts +59 -0
  646. package/dist/website/SearchPalette/SearchPalette.js +120 -0
  647. package/dist/website/SearchPalette/SearchPalette.js.map +1 -0
  648. package/dist/website/SiteNavigation/SiteNavigation.d.ts +46 -0
  649. package/dist/website/SiteNavigation/SiteNavigation.js +101 -0
  650. package/dist/website/SiteNavigation/SiteNavigation.js.map +1 -0
  651. package/dist/website/SiteShell/SiteShell.d.ts +45 -0
  652. package/dist/website/SiteShell/SiteShell.js +46 -0
  653. package/dist/website/SiteShell/SiteShell.js.map +1 -0
  654. package/dist/website/Timeline/Timeline.d.ts +80 -0
  655. package/dist/website/Timeline/Timeline.js +99 -0
  656. package/dist/website/Timeline/Timeline.js.map +1 -0
  657. package/dist/website/Workbench/Chronology.d.ts +32 -0
  658. package/dist/website/Workbench/Chronology.js +32 -0
  659. package/dist/website/Workbench/Chronology.js.map +1 -0
  660. package/dist/website/Workbench/ContactRow.d.ts +13 -0
  661. package/dist/website/Workbench/ContactRow.js +11 -0
  662. package/dist/website/Workbench/ContactRow.js.map +1 -0
  663. package/dist/website/Workbench/PhotoMosaic.d.ts +13 -0
  664. package/dist/website/Workbench/PhotoMosaic.js +15 -0
  665. package/dist/website/Workbench/PhotoMosaic.js.map +1 -0
  666. package/dist/website/Workbench/Reveal.d.ts +19 -0
  667. package/dist/website/Workbench/Reveal.js +29 -0
  668. package/dist/website/Workbench/Reveal.js.map +1 -0
  669. package/dist/website/Workbench/ToolStrip.d.ts +18 -0
  670. package/dist/website/Workbench/ToolStrip.js +15 -0
  671. package/dist/website/Workbench/ToolStrip.js.map +1 -0
  672. package/dist/website/Workbench/Workbench.d.ts +23 -0
  673. package/dist/website/Workbench/Workbench.js +22 -0
  674. package/dist/website/Workbench/Workbench.js.map +1 -0
  675. package/dist/website/Workbench/WorkbenchCard.d.ts +29 -0
  676. package/dist/website/Workbench/WorkbenchCard.js +21 -0
  677. package/dist/website/Workbench/WorkbenchCard.js.map +1 -0
  678. package/dist/website/Workbench/WorkbenchEntries.d.ts +22 -0
  679. package/dist/website/Workbench/WorkbenchEntries.js +24 -0
  680. package/dist/website/Workbench/WorkbenchEntries.js.map +1 -0
  681. package/dist/website/Workbench/WorkbenchFigure.d.ts +20 -0
  682. package/dist/website/Workbench/WorkbenchFigure.js +15 -0
  683. package/dist/website/Workbench/WorkbenchFigure.js.map +1 -0
  684. package/dist/website/Workbench/WorkbenchHero.d.ts +24 -0
  685. package/dist/website/Workbench/WorkbenchHero.js +24 -0
  686. package/dist/website/Workbench/WorkbenchHero.js.map +1 -0
  687. package/dist/website/Workbench/theme.d.ts +22 -0
  688. package/dist/website/Workbench/theme.js +12 -0
  689. package/dist/website/Workbench/theme.js.map +1 -0
  690. package/dist/website/index.d.ts +38 -0
  691. package/dist/website/index.js +32 -0
  692. package/dist/website/index.js.map +1 -0
  693. package/dist/website-actions.css +6 -0
  694. package/dist/website-base.css +46 -0
  695. package/dist/website-collection.css +89 -0
  696. package/dist/website-contact.css +29 -0
  697. package/dist/website-content.css +20 -0
  698. package/dist/website-controls.css +91 -0
  699. package/dist/website-conversation.css +115 -0
  700. package/dist/website-evidence.css +56 -0
  701. package/dist/website-media.css +227 -0
  702. package/dist/website-metrics.css +15 -0
  703. package/dist/website-music.css +27 -0
  704. package/dist/website-portfolio.css +94 -0
  705. package/dist/website-reading.css +159 -0
  706. package/dist/website-recovery.css +28 -0
  707. package/dist/website-search.css +26 -0
  708. package/dist/website-shell.css +89 -0
  709. package/dist/website-timeline.css +43 -0
  710. package/dist/website-workbench.css +162 -0
  711. package/dist/website.css +26 -0
  712. package/llms.txt +35 -0
  713. package/package.json +163 -5
  714. package/skills/folio-design/SKILL.md +228 -0
  715. package/skills/folio-design/evals/claims.json +95 -0
  716. package/skills/folio-design/evals/evals.json +84 -0
  717. package/skills/folio-design/rules/a11y.md +167 -0
  718. package/skills/folio-design/rules/composition.md +108 -0
  719. package/skills/folio-design/rules/forms.md +135 -0
  720. package/skills/folio-design/rules/naming.md +155 -0
  721. package/skills/folio-design/rules/tokens.md +135 -0
@@ -0,0 +1,71 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { Children, isValidElement } from "react";
4
+ import { LabelList } from "recharts";
5
+ import { defaultTick } from "./format.js";
6
+ function findSlot(children, type) {
7
+ let found = null;
8
+ Children.forEach(children, (child) => {
9
+ if (isValidElement(child) && child.type === type) {
10
+ found = child.props;
11
+ }
12
+ });
13
+ return found;
14
+ }
15
+ const Values = () => null;
16
+ function shows(mode, index, count, value, values) {
17
+ switch (mode) {
18
+ case "all":
19
+ return true;
20
+ case "first":
21
+ return index === 0;
22
+ case "first-last":
23
+ return index === 0 || index === count - 1;
24
+ case "extremes": {
25
+ const min = Math.min(...values);
26
+ const max = Math.max(...values);
27
+ return value === min || value === max;
28
+ }
29
+ default:
30
+ return index === count - 1;
31
+ }
32
+ }
33
+ function resolveValues(slot, values, fallbackPosition = "top") {
34
+ if (!slot) return null;
35
+ const mode = slot.show ?? "last";
36
+ const format = slot.formatValue ?? defaultTick;
37
+ const count = values.length;
38
+ return /* @__PURE__ */ jsx(
39
+ LabelList,
40
+ {
41
+ position: slot.position ?? fallbackPosition,
42
+ offset: 8,
43
+ content: (raw) => {
44
+ const props = raw;
45
+ const index = props.index ?? -1;
46
+ const value = Number(props.value);
47
+ if (index < 0 || !Number.isFinite(value)) return null;
48
+ if (!shows(mode, index, count, value, values)) return null;
49
+ const x = Number(props.x ?? 0) + Number(props.width ?? 0) / 2;
50
+ const y = Number(props.y ?? 0) - 6;
51
+ return /* @__PURE__ */ jsx(
52
+ "text",
53
+ {
54
+ x,
55
+ y,
56
+ textAnchor: "middle",
57
+ className: "fill-(--ink) font-mono text-[11px] font-medium tabular-nums",
58
+ style: { pointerEvents: "none" },
59
+ children: format(value)
60
+ }
61
+ );
62
+ }
63
+ }
64
+ );
65
+ }
66
+ export {
67
+ Values,
68
+ findSlot,
69
+ resolveValues
70
+ };
71
+ //# sourceMappingURL=values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/charts/lib/values.tsx"],"sourcesContent":["'use client'\n\nimport { Children, isValidElement, type FC, type ReactElement, type ReactNode } from 'react'\nimport { LabelList } from 'recharts'\nimport { defaultTick } from './format'\n\n/**\n * The props of the first child of a given type, or null.\n *\n * Every configuration slot in the package is read this way — a component that\n * renders nothing, whose PROPS are the configuration. It reads better at the\n * call site than a prop bag (`<Chart.Values show=\"last\" />` beside the mark it\n * labels, rather than `valuesShow=\"last\"` on the mark) and it keeps the marks'\n * prop lists from growing a section per optional decoration.\n */\nexport function findSlot<TProps>(children: ReactNode, type: unknown): TProps | null {\n let found: TProps | null = null\n Children.forEach(children, (child) => {\n if (isValidElement(child) && child.type === type) {\n found = (child as ReactElement<TProps>).props\n }\n })\n return found\n}\n\n/**\n * Which points get their number printed.\n *\n * The default is `last`, and the default matters more here than usual: a\n * number on every point is the most common way a chart is spoiled, because the\n * labels then compete with the shape they are annotating and the reader loses\n * both. What a reader almost always wants is the number they would otherwise\n * have to trace back to the axis for — the latest value, or the two ends.\n *\n * `all` exists for the case it is right for: five or six bars, no line, and the\n * exact figures ARE the point. Past that it is a table wearing a chart.\n */\nexport type ValueLabelMode = 'all' | 'first' | 'last' | 'first-last' | 'extremes'\n\nexport interface ValuesProps {\n /** Which points are labelled. */\n show?: ValueLabelMode\n /** Formats each number. Defaults to the axis's own compact formatting. */\n formatValue?: (value: number) => string\n /** Where the label sits relative to its point. */\n position?: 'top' | 'bottom' | 'inside' | 'right'\n}\n\n/**\n * Prints the numbers on a series.\n *\n * A slot: it renders nothing itself, and the mark it is composed inside reads\n * its props.\n *\n * @example\n * <BarChart.Bar dataKey=\"visitors\">\n * <BarChart.Values show=\"all\" />\n * </BarChart.Bar>\n */\nexport const Values: FC<ValuesProps> = () => null\n\n/** Whether the point at `index` is one of the labelled ones. */\nfunction shows(mode: ValueLabelMode, index: number, count: number, value: number, values: number[]): boolean {\n switch (mode) {\n case 'all':\n return true\n case 'first':\n return index === 0\n case 'first-last':\n return index === 0 || index === count - 1\n case 'extremes': {\n // The min and the max, which is what \"which was the worst month\" asks\n // for and what an axis cannot answer without counting gridlines.\n const min = Math.min(...values)\n const max = Math.max(...values)\n return value === min || value === max\n }\n default:\n return index === count - 1\n }\n}\n\n/**\n * Turns a composed `<Values>` slot into a Recharts label list.\n *\n * `values` is the whole series, needed because `extremes` cannot be decided\n * one point at a time — and Recharts hands a label renderer one point at a\n * time.\n */\nexport function resolveValues(\n slot: ValuesProps | null,\n values: number[],\n fallbackPosition: ValuesProps['position'] = 'top',\n) {\n if (!slot) return null\n\n const mode = slot.show ?? 'last'\n const format = slot.formatValue ?? defaultTick\n const count = values.length\n\n return (\n <LabelList\n position={slot.position ?? fallbackPosition}\n offset={8}\n content={(raw) => {\n // Recharts types x/y/width as `string | number`, because a label can be\n // positioned in percentages. Everything that reaches this renderer is\n // resolved geometry, so the coercion is the honest read.\n const props = raw as {\n index?: number\n value?: unknown\n x?: string | number\n y?: string | number\n width?: string | number\n }\n const index = props.index ?? -1\n const value = Number(props.value)\n if (index < 0 || !Number.isFinite(value)) return null\n if (!shows(mode, index, count, value, values)) return null\n\n const x = Number(props.x ?? 0) + Number(props.width ?? 0) / 2\n const y = Number(props.y ?? 0) - 6\n\n return (\n <text\n x={x}\n y={y}\n textAnchor=\"middle\"\n // Mono and tabular, like every other number in the system: a column\n // of labels that jitters as the digits change reads as noise.\n className=\"fill-(--ink) font-mono text-[11px] font-medium tabular-nums\"\n style={{ pointerEvents: 'none' }}\n >\n {format(value)}\n </text>\n )\n }}\n />\n )\n}\n"],"mappings":";AA4HU;AA1HV,SAAS,UAAU,sBAAkE;AACrF,SAAS,iBAAiB;AAC1B,SAAS,mBAAmB;AAWrB,SAAS,SAAiB,UAAqB,MAA8B;AAClF,MAAI,QAAuB;AAC3B,WAAS,QAAQ,UAAU,CAAC,UAAU;AACpC,QAAI,eAAe,KAAK,KAAK,MAAM,SAAS,MAAM;AAChD,cAAS,MAA+B;AAAA,IAC1C;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAoCO,MAAM,SAA0B,MAAM;AAG7C,SAAS,MAAM,MAAsB,OAAe,OAAe,OAAe,QAA2B;AAC3G,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,UAAU,KAAK,UAAU,QAAQ;AAAA,IAC1C,KAAK,YAAY;AAGf,YAAM,MAAM,KAAK,IAAI,GAAG,MAAM;AAC9B,YAAM,MAAM,KAAK,IAAI,GAAG,MAAM;AAC9B,aAAO,UAAU,OAAO,UAAU;AAAA,IACpC;AAAA,IACA;AACE,aAAO,UAAU,QAAQ;AAAA,EAC7B;AACF;AASO,SAAS,cACd,MACA,QACA,mBAA4C,OAC5C;AACA,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,OAAO,KAAK,QAAQ;AAC1B,QAAM,SAAS,KAAK,eAAe;AACnC,QAAM,QAAQ,OAAO;AAErB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,SAAS,CAAC,QAAQ;AAIhB,cAAM,QAAQ;AAOd,cAAM,QAAQ,MAAM,SAAS;AAC7B,cAAM,QAAQ,OAAO,MAAM,KAAK;AAChC,YAAI,QAAQ,KAAK,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACjD,YAAI,CAAC,MAAM,MAAM,OAAO,OAAO,OAAO,MAAM,EAAG,QAAO;AAEtD,cAAM,IAAI,OAAO,MAAM,KAAK,CAAC,IAAI,OAAO,MAAM,SAAS,CAAC,IAAI;AAC5D,cAAM,IAAI,OAAO,MAAM,KAAK,CAAC,IAAI;AAEjC,eACE;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,YAAW;AAAA,YAGX,WAAU;AAAA,YACV,OAAO,EAAE,eAAe,OAAO;AAAA,YAE9B,iBAAO,KAAK;AAAA;AAAA,QACf;AAAA,MAEJ;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -0,0 +1,139 @@
1
+ import * as react from 'react';
2
+ import { RefObject, ReactNode } from 'react';
3
+ import { ChartBrushRange } from './brush.js';
4
+ import 'recharts';
5
+ import './chart.js';
6
+
7
+ /**
8
+ * A range pulled back inside the data, with the minimum span enforced.
9
+ *
10
+ * Every other function here ends by calling this, so an inverted range, an
11
+ * index past the end and a window narrower than `minSpan` all have exactly one
12
+ * definition of what they become.
13
+ */
14
+ declare function clampWindow(range: ChartBrushRange, total: number, minSpan?: number): ChartBrushRange;
15
+ /**
16
+ * The window after one zoom step.
17
+ *
18
+ * `factor` below 1 closes the window and above 1 opens it. `anchor` is the row
19
+ * index that must stay where it is on screen — the pointer's row for a wheel
20
+ * zoom, the window's own centre for a button — because a zoom that re-centres
21
+ * is a zoom that loses the point the reader was looking at.
22
+ *
23
+ * The span is floored when closing and ceiled when opening rather than rounded
24
+ * in both directions, so a step always moves: rounding leaves a three-row
25
+ * window stuck at three when the step is a half.
26
+ */
27
+ declare function zoomWindow(range: ChartBrushRange, total: number, factor: number, minSpan?: number, anchor?: number): ChartBrushRange;
28
+ /**
29
+ * The window slid along by `delta` rows, keeping its span.
30
+ *
31
+ * At either end it stops rather than shrinking. A pan that narrowed itself
32
+ * against the edge would change the scale under the reader, which is a
33
+ * different gesture from the one they made.
34
+ */
35
+ declare function panWindow(range: ChartBrushRange, total: number, delta: number): ChartBrushRange;
36
+ interface ChartZoomOptions<TData extends Record<string, unknown>> {
37
+ /** The whole dataset. The window is expressed as indexes into it. */
38
+ data: TData[];
39
+ /** The row field behind a row's name, used by the spoken window description. */
40
+ xDataKey?: keyof TData & string;
41
+ /** The fewest rows a zoom will leave on screen. */
42
+ minSpan?: number;
43
+ /** The fraction of the window one zoom step keeps. */
44
+ step?: number;
45
+ /** Fires whenever the window changes, from any of the four inputs. */
46
+ onZoomChange?: (range: ChartBrushRange) => void;
47
+ }
48
+ interface ChartZoom<TData extends Record<string, unknown> = Record<string, unknown>> {
49
+ /** The rows on screen, as indexes into the whole dataset. */
50
+ range: ChartBrushRange;
51
+ /** The rows the plot should draw. */
52
+ visibleData: TData[];
53
+ /** Whether anything is hidden — what "reset zoom" is enabled by. */
54
+ isZoomed: boolean;
55
+ canZoomIn: boolean;
56
+ canZoomOut: boolean;
57
+ /** Closes the window one step around `anchor`, or around its own centre. */
58
+ zoomIn: (anchor?: number) => void;
59
+ /** Opens the window one step around `anchor`, or around its own centre. */
60
+ zoomOut: (anchor?: number) => void;
61
+ /** Back to the whole dataset. */
62
+ reset: () => void;
63
+ /** Slides the window by a number of rows, keeping its span. */
64
+ panBy: (delta: number) => void;
65
+ /** Jumps straight to a window — what a drag across the plot commits. */
66
+ zoomTo: (range: ChartBrushRange) => void;
67
+ /** How many rows there are in total. */
68
+ total: number;
69
+ /** A row's name, for an announcement or a label. */
70
+ labelAt: (index: number) => string;
71
+ /** Spread onto `<ChartBrush>` to make it a controlled view of this window. */
72
+ brushProps: {
73
+ startIndex: number;
74
+ endIndex: number;
75
+ onChange: (range: ChartBrushRange) => void;
76
+ };
77
+ }
78
+ /**
79
+ * A windowed view of a chart's rows, driven by the toolbar, the wheel, a drag
80
+ * across the plot, and the keyboard.
81
+ *
82
+ * ## How this composes with `<Chart.Brush>`
83
+ *
84
+ * They are two views of ONE window, not two windows. This hook owns
85
+ * `{ startIndex, endIndex }`; the brush is rendered controlled from it through
86
+ * `brushProps` and reports back through the same commit path the toolbar
87
+ * buttons use. So dragging a brush handle moves the toolbar's idea of the
88
+ * window, "reset zoom" snaps the handles back to the full range, and neither
89
+ * part has to know the other exists.
90
+ *
91
+ * The alternative — a zoom window layered on top of a brushed slice — was
92
+ * rejected because it needs a composition rule ("zoom is relative to the
93
+ * brush") that nobody can predict from the call site, and because it makes
94
+ * reset ambiguous: reset the zoom, the brush, or both.
95
+ *
96
+ * This is a superset of `useChartBrush`, so a chart that can carry a toolbar
97
+ * uses it in place of that hook rather than running the two side by side.
98
+ *
99
+ * @example
100
+ * const zoom = useChartZoom({ data, xDataKey: 'month' })
101
+ * <ChartBrush data={data} config={config} {...zoom.brushProps} />
102
+ */
103
+ declare function useChartZoom<TData extends Record<string, unknown>>({ data, xDataKey, minSpan, step, onZoomChange, }: ChartZoomOptions<TData>): ChartZoom<TData>;
104
+ interface ChartZoomSurfaceProps {
105
+ /** The window this surface drives. */
106
+ zoom: ChartZoom;
107
+ /** Names the region for a screen reader — pass the figure's title. */
108
+ label: string;
109
+ /**
110
+ * Off leaves the plot inert while the toolbar buttons keep working. Use it
111
+ * for a chart whose only control is export.
112
+ */
113
+ enabled?: boolean;
114
+ /** The plot's box, handed out because the PNG export needs the measured one. */
115
+ ref?: RefObject<HTMLDivElement | null>;
116
+ children: ReactNode;
117
+ }
118
+ /**
119
+ * The plot, made zoomable and pannable by pointer AND by keyboard.
120
+ *
121
+ * The keyboard half is not a nicety. A chart whose only zoom is a drag gesture
122
+ * is a chart a keyboard user can watch and cannot operate, which is the exact
123
+ * failure the brush was rewritten to fix — so the surface is focusable, carries
124
+ * its instructions in an `aria-describedby` note, and announces the window it
125
+ * moved to through a polite live region.
126
+ *
127
+ * Arrow keys pan by a row, `PageUp`/`PageDown` by a screenful, `Home`/`End`
128
+ * jump to the ends, `+`/`-` zoom and `0` resets. `ArrowLeft` means EARLIER in
129
+ * every writing direction, matching the brush: the rendering engine lays a
130
+ * cartesian plot out left-to-right whatever `dir` says, so mirroring the keys
131
+ * would put "earlier" on the side the data does not run to.
132
+ *
133
+ * The wheel is deliberately gated behind Ctrl or Cmd. A chart that swallowed a
134
+ * plain wheel event traps the page's scroll under the pointer, which is the
135
+ * single most complained-about behaviour in an embedded map.
136
+ */
137
+ declare function ChartZoomSurface({ zoom, label, enabled, ref, children, }: ChartZoomSurfaceProps): react.JSX.Element;
138
+
139
+ export { type ChartZoom, type ChartZoomOptions, ChartZoomSurface, type ChartZoomSurfaceProps, clampWindow, panWindow, useChartZoom, zoomWindow };
@@ -0,0 +1,314 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ startTransition,
5
+ useCallback,
6
+ useDeferredValue,
7
+ useEffect,
8
+ useId,
9
+ useMemo,
10
+ useRef,
11
+ useState
12
+ } from "react";
13
+ import { cn } from "../../lib/cn.js";
14
+ const ZOOM_STEP = 0.5;
15
+ const MIN_SPAN = 2;
16
+ const DRAG_THRESHOLD = 8;
17
+ function clamp(value, low, high) {
18
+ return Math.max(low, Math.min(value, high));
19
+ }
20
+ function clampWindow(range, total, minSpan = MIN_SPAN) {
21
+ const maxIndex = Math.max(0, total - 1);
22
+ if (maxIndex === 0) return { startIndex: 0, endIndex: 0 };
23
+ const limit = Math.min(minSpan, maxIndex);
24
+ let startIndex = clamp(Math.round(range.startIndex), 0, maxIndex);
25
+ let endIndex = clamp(Math.round(range.endIndex), 0, maxIndex);
26
+ if (endIndex < startIndex) [startIndex, endIndex] = [endIndex, startIndex];
27
+ if (endIndex - startIndex < limit) {
28
+ endIndex = Math.min(startIndex + limit, maxIndex);
29
+ startIndex = Math.max(0, endIndex - limit);
30
+ }
31
+ return { startIndex, endIndex };
32
+ }
33
+ function zoomWindow(range, total, factor, minSpan = MIN_SPAN, anchor) {
34
+ const maxIndex = Math.max(0, total - 1);
35
+ if (maxIndex === 0) return { startIndex: 0, endIndex: 0 };
36
+ const current = clampWindow(range, total, minSpan);
37
+ const span = current.endIndex - current.startIndex;
38
+ const limit = Math.min(minSpan, maxIndex);
39
+ const raw = span * factor;
40
+ const nextSpan = clamp(factor < 1 ? Math.floor(raw) : Math.ceil(raw), limit, maxIndex);
41
+ const pivot = clamp(anchor ?? (current.startIndex + current.endIndex) / 2, 0, maxIndex);
42
+ const ratio = span > 0 ? (pivot - current.startIndex) / span : 0.5;
43
+ const startIndex = clamp(Math.round(pivot - ratio * nextSpan), 0, maxIndex - nextSpan);
44
+ return { startIndex, endIndex: startIndex + nextSpan };
45
+ }
46
+ function panWindow(range, total, delta) {
47
+ const maxIndex = Math.max(0, total - 1);
48
+ if (maxIndex === 0) return { startIndex: 0, endIndex: 0 };
49
+ const current = clampWindow(range, total, 0);
50
+ const span = current.endIndex - current.startIndex;
51
+ const startIndex = clamp(current.startIndex + Math.round(delta), 0, maxIndex - span);
52
+ return { startIndex, endIndex: startIndex + span };
53
+ }
54
+ function useChartZoom({
55
+ data,
56
+ xDataKey,
57
+ minSpan = MIN_SPAN,
58
+ step = ZOOM_STEP,
59
+ onZoomChange
60
+ }) {
61
+ const total = data.length;
62
+ const maxIndex = Math.max(0, total - 1);
63
+ const [range, setRange] = useState({ startIndex: 0, endIndex: maxIndex });
64
+ const committed = useRef(range);
65
+ useEffect(() => {
66
+ const whole = { startIndex: 0, endIndex: Math.max(0, data.length - 1) };
67
+ committed.current = whole;
68
+ setRange(whole);
69
+ }, [data.length]);
70
+ const commit = useCallback(
71
+ (next) => {
72
+ const clamped = clampWindow(next, total, minSpan);
73
+ const last = committed.current;
74
+ if (last.startIndex === clamped.startIndex && last.endIndex === clamped.endIndex) return;
75
+ committed.current = clamped;
76
+ setRange(clamped);
77
+ startTransition(() => onZoomChange?.(clamped));
78
+ },
79
+ [minSpan, onZoomChange, total]
80
+ );
81
+ const zoomIn = useCallback(
82
+ (anchor) => commit(zoomWindow(committed.current, total, step, minSpan, anchor)),
83
+ [commit, minSpan, step, total]
84
+ );
85
+ const zoomOut = useCallback(
86
+ (anchor) => commit(zoomWindow(committed.current, total, 1 / step, minSpan, anchor)),
87
+ [commit, minSpan, step, total]
88
+ );
89
+ const reset = useCallback(
90
+ () => commit({ startIndex: 0, endIndex: Math.max(0, total - 1) }),
91
+ [commit, total]
92
+ );
93
+ const panBy = useCallback(
94
+ (delta) => commit(panWindow(committed.current, total, delta)),
95
+ [commit, total]
96
+ );
97
+ const zoomTo = useCallback((next) => commit(next), [commit]);
98
+ const labelAt = useCallback(
99
+ (index) => {
100
+ if (!xDataKey) return String(index + 1);
101
+ const value = data[index]?.[xDataKey];
102
+ return value === null || value === void 0 ? String(index + 1) : String(value);
103
+ },
104
+ [data, xDataKey]
105
+ );
106
+ const deferred = useDeferredValue(range);
107
+ const visibleData = useMemo(
108
+ () => data.slice(deferred.startIndex, deferred.endIndex + 1),
109
+ [data, deferred.endIndex, deferred.startIndex]
110
+ );
111
+ const brushProps = useMemo(
112
+ () => ({ startIndex: range.startIndex, endIndex: range.endIndex, onChange: commit }),
113
+ [commit, range.endIndex, range.startIndex]
114
+ );
115
+ const isZoomed = range.startIndex > 0 || range.endIndex < maxIndex;
116
+ return useMemo(
117
+ () => ({
118
+ range,
119
+ visibleData,
120
+ isZoomed,
121
+ canZoomIn: range.endIndex - range.startIndex > Math.min(minSpan, maxIndex),
122
+ canZoomOut: isZoomed,
123
+ zoomIn,
124
+ zoomOut,
125
+ reset,
126
+ panBy,
127
+ zoomTo,
128
+ total,
129
+ labelAt,
130
+ brushProps
131
+ }),
132
+ [
133
+ brushProps,
134
+ isZoomed,
135
+ labelAt,
136
+ maxIndex,
137
+ minSpan,
138
+ panBy,
139
+ range,
140
+ reset,
141
+ total,
142
+ visibleData,
143
+ zoomIn,
144
+ zoomOut,
145
+ zoomTo
146
+ ]
147
+ );
148
+ }
149
+ function ChartZoomSurface({
150
+ zoom,
151
+ label,
152
+ enabled = true,
153
+ ref,
154
+ children
155
+ }) {
156
+ const fallbackRef = useRef(null);
157
+ const surfaceRef = ref ?? fallbackRef;
158
+ const hintId = `chart-zoom-hint-${useId().replace(/:/g, "")}`;
159
+ const drag = useRef(null);
160
+ const [selection, setSelection] = useState(null);
161
+ const indexAt = useCallback(
162
+ (clientX) => {
163
+ const node = surfaceRef.current;
164
+ const box = node ? plotBox(node) : null;
165
+ if (!box) return void 0;
166
+ const fraction = clamp((clientX - box.left) / box.width, 0, 1);
167
+ return zoom.range.startIndex + fraction * (zoom.range.endIndex - zoom.range.startIndex);
168
+ },
169
+ [surfaceRef, zoom.range.endIndex, zoom.range.startIndex]
170
+ );
171
+ useEffect(() => {
172
+ const node = surfaceRef.current;
173
+ if (!node || !enabled) return;
174
+ const onWheel = (event) => {
175
+ if (!event.ctrlKey && !event.metaKey) return;
176
+ event.preventDefault();
177
+ const anchor = indexAt(event.clientX);
178
+ if (event.deltaY < 0) zoom.zoomIn(anchor);
179
+ else zoom.zoomOut(anchor);
180
+ };
181
+ node.addEventListener("wheel", onWheel, { passive: false });
182
+ return () => node.removeEventListener("wheel", onWheel);
183
+ }, [enabled, indexAt, surfaceRef, zoom]);
184
+ const onPointerDown = (event) => {
185
+ if (!enabled || event.button !== 0) return;
186
+ drag.current = { pointerId: event.pointerId, originX: event.clientX };
187
+ };
188
+ const onPointerMove = (event) => {
189
+ const state = drag.current;
190
+ if (!state || state.pointerId !== event.pointerId) return;
191
+ const travelled = Math.abs(event.clientX - state.originX);
192
+ if (travelled < DRAG_THRESHOLD) return;
193
+ const node = surfaceRef.current;
194
+ const box = node ? plotBox(node) : null;
195
+ if (!node || !box) return;
196
+ if (!node.hasPointerCapture(event.pointerId)) node.setPointerCapture(event.pointerId);
197
+ const from = Math.min(state.originX, event.clientX);
198
+ setSelection({ start: from - box.left, width: travelled });
199
+ };
200
+ const endDrag = (event) => {
201
+ const state = drag.current;
202
+ drag.current = null;
203
+ setSelection(null);
204
+ const node = surfaceRef.current;
205
+ if (node?.hasPointerCapture(event.pointerId)) node.releasePointerCapture(event.pointerId);
206
+ if (!state || Math.abs(event.clientX - state.originX) < DRAG_THRESHOLD) return;
207
+ const from = indexAt(Math.min(state.originX, event.clientX));
208
+ const to = indexAt(Math.max(state.originX, event.clientX));
209
+ if (from === void 0 || to === void 0) return;
210
+ zoom.zoomTo({ startIndex: Math.floor(from), endIndex: Math.ceil(to) });
211
+ };
212
+ const onKeyDown = (event) => {
213
+ if (!enabled) return;
214
+ const span = zoom.range.endIndex - zoom.range.startIndex;
215
+ switch (event.key) {
216
+ case "ArrowLeft":
217
+ case "ArrowDown":
218
+ zoom.panBy(-1);
219
+ break;
220
+ case "ArrowRight":
221
+ case "ArrowUp":
222
+ zoom.panBy(1);
223
+ break;
224
+ case "PageDown":
225
+ zoom.panBy(-Math.max(1, span));
226
+ break;
227
+ case "PageUp":
228
+ zoom.panBy(Math.max(1, span));
229
+ break;
230
+ case "Home":
231
+ zoom.panBy(-zoom.total);
232
+ break;
233
+ case "End":
234
+ zoom.panBy(zoom.total);
235
+ break;
236
+ case "+":
237
+ case "=":
238
+ zoom.zoomIn();
239
+ break;
240
+ case "-":
241
+ case "_":
242
+ zoom.zoomOut();
243
+ break;
244
+ case "0":
245
+ zoom.reset();
246
+ break;
247
+ default:
248
+ return;
249
+ }
250
+ event.preventDefault();
251
+ };
252
+ const shown = zoom.range.endIndex - zoom.range.startIndex + 1;
253
+ return /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 w-full flex-1 flex-col", children: [
254
+ /* @__PURE__ */ jsxs(
255
+ "div",
256
+ {
257
+ ref: surfaceRef,
258
+ role: "group",
259
+ "aria-label": `${label} \u2014 plot`,
260
+ "aria-describedby": enabled ? hintId : void 0,
261
+ tabIndex: enabled ? 0 : void 0,
262
+ onKeyDown,
263
+ onPointerDown,
264
+ onPointerMove,
265
+ onPointerUp: endDrag,
266
+ onPointerCancel: endDrag,
267
+ className: cn(
268
+ "relative flex min-h-0 w-full flex-1 flex-col rounded-(--radius-sm)",
269
+ // Vertical scrolling still belongs to the page; horizontal movement
270
+ // is the pan gesture, so the browser must not claim it first.
271
+ enabled && "touch-pan-y",
272
+ selection && "select-none"
273
+ ),
274
+ children: [
275
+ children,
276
+ selection && // Positioned with inline style rather than `start-`/`end-` classes,
277
+ // for the same reason the brush is: the axis being selected along is
278
+ // the DATA's, and a cartesian plot runs left-to-right under
279
+ // `dir="rtl"` too.
280
+ /* @__PURE__ */ jsx(
281
+ "div",
282
+ {
283
+ "aria-hidden": true,
284
+ className: "pointer-events-none absolute inset-y-0 z-(--z-rule) border-x border-(--rule-2) bg-(--ink)/8",
285
+ style: { left: selection.start, width: selection.width }
286
+ }
287
+ )
288
+ ]
289
+ }
290
+ ),
291
+ enabled && /* @__PURE__ */ jsxs(Fragment, { children: [
292
+ /* @__PURE__ */ jsx("p", { id: hintId, className: "sr-only", children: "Arrow keys pan by one point, Page Up and Page Down by a screenful, Home and End jump to the ends. Plus and minus zoom, zero resets. Ctrl and the wheel zoom around the pointer, and dragging across the plot zooms to that span." }),
293
+ /* @__PURE__ */ jsx("p", { "aria-live": "polite", className: "sr-only", children: `Showing ${zoom.labelAt(zoom.range.startIndex)} to ${zoom.labelAt(
294
+ zoom.range.endIndex
295
+ )}, ${shown} of ${zoom.total} points` })
296
+ ] })
297
+ ] });
298
+ }
299
+ function plotBox(surface) {
300
+ const grid = surface.querySelector(".recharts-cartesian-grid");
301
+ const gridBox = grid?.getBoundingClientRect();
302
+ if (gridBox && gridBox.width > 0) return gridBox;
303
+ const svg = surface.querySelector("svg.recharts-surface");
304
+ const svgBox = svg?.getBoundingClientRect();
305
+ return svgBox && svgBox.width > 0 ? svgBox : null;
306
+ }
307
+ export {
308
+ ChartZoomSurface,
309
+ clampWindow,
310
+ panWindow,
311
+ useChartZoom,
312
+ zoomWindow
313
+ };
314
+ //# sourceMappingURL=zoom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/charts/lib/zoom.tsx"],"sourcesContent":["'use client'\n\nimport {\n startTransition,\n useCallback,\n useDeferredValue,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n type RefObject,\n} from 'react'\nimport { cn } from '../../lib/cn'\nimport type { ChartBrushRange } from './brush'\n\n/**\n * How far a single zoom step closes the window. Half is the step every map and\n * every chart toolbar has trained readers to expect from a `+`.\n */\nconst ZOOM_STEP = 0.5\n\n/** The fewest rows a zoom will leave on screen — the brush's floor, so the two agree. */\nconst MIN_SPAN = 2\n\n/**\n * How far the pointer has to travel before a press counts as a region\n * selection. Below this it is a click on the plot, which belongs to the tooltip\n * and to a series' own `isClickable`.\n */\nconst DRAG_THRESHOLD = 8\n\nfunction clamp(value: number, low: number, high: number): number {\n return Math.max(low, Math.min(value, high))\n}\n\n/**\n * A range pulled back inside the data, with the minimum span enforced.\n *\n * Every other function here ends by calling this, so an inverted range, an\n * index past the end and a window narrower than `minSpan` all have exactly one\n * definition of what they become.\n */\nexport function clampWindow(\n range: ChartBrushRange,\n total: number,\n minSpan: number = MIN_SPAN,\n): ChartBrushRange {\n const maxIndex = Math.max(0, total - 1)\n if (maxIndex === 0) return { startIndex: 0, endIndex: 0 }\n\n const limit = Math.min(minSpan, maxIndex)\n let startIndex = clamp(Math.round(range.startIndex), 0, maxIndex)\n let endIndex = clamp(Math.round(range.endIndex), 0, maxIndex)\n if (endIndex < startIndex) [startIndex, endIndex] = [endIndex, startIndex]\n\n if (endIndex - startIndex < limit) {\n endIndex = Math.min(startIndex + limit, maxIndex)\n startIndex = Math.max(0, endIndex - limit)\n }\n\n return { startIndex, endIndex }\n}\n\n/**\n * The window after one zoom step.\n *\n * `factor` below 1 closes the window and above 1 opens it. `anchor` is the row\n * index that must stay where it is on screen — the pointer's row for a wheel\n * zoom, the window's own centre for a button — because a zoom that re-centres\n * is a zoom that loses the point the reader was looking at.\n *\n * The span is floored when closing and ceiled when opening rather than rounded\n * in both directions, so a step always moves: rounding leaves a three-row\n * window stuck at three when the step is a half.\n */\nexport function zoomWindow(\n range: ChartBrushRange,\n total: number,\n factor: number,\n minSpan: number = MIN_SPAN,\n anchor?: number,\n): ChartBrushRange {\n const maxIndex = Math.max(0, total - 1)\n if (maxIndex === 0) return { startIndex: 0, endIndex: 0 }\n\n const current = clampWindow(range, total, minSpan)\n const span = current.endIndex - current.startIndex\n const limit = Math.min(minSpan, maxIndex)\n const raw = span * factor\n const nextSpan = clamp(factor < 1 ? Math.floor(raw) : Math.ceil(raw), limit, maxIndex)\n\n const pivot = clamp(anchor ?? (current.startIndex + current.endIndex) / 2, 0, maxIndex)\n // Where the pivot sits across the window, 0 at the start and 1 at the end.\n // Holding that fraction is what keeps the anchored row under the pointer.\n const ratio = span > 0 ? (pivot - current.startIndex) / span : 0.5\n const startIndex = clamp(Math.round(pivot - ratio * nextSpan), 0, maxIndex - nextSpan)\n\n return { startIndex, endIndex: startIndex + nextSpan }\n}\n\n/**\n * The window slid along by `delta` rows, keeping its span.\n *\n * At either end it stops rather than shrinking. A pan that narrowed itself\n * against the edge would change the scale under the reader, which is a\n * different gesture from the one they made.\n */\nexport function panWindow(range: ChartBrushRange, total: number, delta: number): ChartBrushRange {\n const maxIndex = Math.max(0, total - 1)\n if (maxIndex === 0) return { startIndex: 0, endIndex: 0 }\n\n const current = clampWindow(range, total, 0)\n const span = current.endIndex - current.startIndex\n const startIndex = clamp(current.startIndex + Math.round(delta), 0, maxIndex - span)\n\n return { startIndex, endIndex: startIndex + span }\n}\n\nexport interface ChartZoomOptions<TData extends Record<string, unknown>> {\n /** The whole dataset. The window is expressed as indexes into it. */\n data: TData[]\n /** The row field behind a row's name, used by the spoken window description. */\n xDataKey?: keyof TData & string\n /** The fewest rows a zoom will leave on screen. */\n minSpan?: number\n /** The fraction of the window one zoom step keeps. */\n step?: number\n /** Fires whenever the window changes, from any of the four inputs. */\n onZoomChange?: (range: ChartBrushRange) => void\n}\n\nexport interface ChartZoom<TData extends Record<string, unknown> = Record<string, unknown>> {\n /** The rows on screen, as indexes into the whole dataset. */\n range: ChartBrushRange\n /** The rows the plot should draw. */\n visibleData: TData[]\n /** Whether anything is hidden — what \"reset zoom\" is enabled by. */\n isZoomed: boolean\n canZoomIn: boolean\n canZoomOut: boolean\n /** Closes the window one step around `anchor`, or around its own centre. */\n zoomIn: (anchor?: number) => void\n /** Opens the window one step around `anchor`, or around its own centre. */\n zoomOut: (anchor?: number) => void\n /** Back to the whole dataset. */\n reset: () => void\n /** Slides the window by a number of rows, keeping its span. */\n panBy: (delta: number) => void\n /** Jumps straight to a window — what a drag across the plot commits. */\n zoomTo: (range: ChartBrushRange) => void\n /** How many rows there are in total. */\n total: number\n /** A row's name, for an announcement or a label. */\n labelAt: (index: number) => string\n /** Spread onto `<ChartBrush>` to make it a controlled view of this window. */\n brushProps: {\n startIndex: number\n endIndex: number\n onChange: (range: ChartBrushRange) => void\n }\n}\n\n/**\n * A windowed view of a chart's rows, driven by the toolbar, the wheel, a drag\n * across the plot, and the keyboard.\n *\n * ## How this composes with `<Chart.Brush>`\n *\n * They are two views of ONE window, not two windows. This hook owns\n * `{ startIndex, endIndex }`; the brush is rendered controlled from it through\n * `brushProps` and reports back through the same commit path the toolbar\n * buttons use. So dragging a brush handle moves the toolbar's idea of the\n * window, \"reset zoom\" snaps the handles back to the full range, and neither\n * part has to know the other exists.\n *\n * The alternative — a zoom window layered on top of a brushed slice — was\n * rejected because it needs a composition rule (\"zoom is relative to the\n * brush\") that nobody can predict from the call site, and because it makes\n * reset ambiguous: reset the zoom, the brush, or both.\n *\n * This is a superset of `useChartBrush`, so a chart that can carry a toolbar\n * uses it in place of that hook rather than running the two side by side.\n *\n * @example\n * const zoom = useChartZoom({ data, xDataKey: 'month' })\n * <ChartBrush data={data} config={config} {...zoom.brushProps} />\n */\nexport function useChartZoom<TData extends Record<string, unknown>>({\n data,\n xDataKey,\n minSpan = MIN_SPAN,\n step = ZOOM_STEP,\n onZoomChange,\n}: ChartZoomOptions<TData>): ChartZoom<TData> {\n const total = data.length\n const maxIndex = Math.max(0, total - 1)\n\n const [range, setRange] = useState<ChartBrushRange>({ startIndex: 0, endIndex: maxIndex })\n\n // The committed window, mirrored in a ref so the commands below can stay\n // stable across renders. The wheel listener is attached natively and would\n // otherwise be torn down and re-attached on every step.\n const committed = useRef(range)\n\n useEffect(() => {\n const whole = { startIndex: 0, endIndex: Math.max(0, data.length - 1) }\n committed.current = whole\n setRange(whole)\n }, [data.length])\n\n const commit = useCallback(\n (next: ChartBrushRange) => {\n const clamped = clampWindow(next, total, minSpan)\n const last = committed.current\n if (last.startIndex === clamped.startIndex && last.endIndex === clamped.endIndex) return\n\n committed.current = clamped\n setRange(clamped)\n // The control that moved has to keep up with the pointer; the plot does\n // not. Deferring lets React drop intermediate windows during a drag.\n startTransition(() => onZoomChange?.(clamped))\n },\n [minSpan, onZoomChange, total],\n )\n\n const zoomIn = useCallback(\n (anchor?: number) => commit(zoomWindow(committed.current, total, step, minSpan, anchor)),\n [commit, minSpan, step, total],\n )\n\n const zoomOut = useCallback(\n (anchor?: number) => commit(zoomWindow(committed.current, total, 1 / step, minSpan, anchor)),\n [commit, minSpan, step, total],\n )\n\n const reset = useCallback(\n () => commit({ startIndex: 0, endIndex: Math.max(0, total - 1) }),\n [commit, total],\n )\n\n const panBy = useCallback(\n (delta: number) => commit(panWindow(committed.current, total, delta)),\n [commit, total],\n )\n\n const zoomTo = useCallback((next: ChartBrushRange) => commit(next), [commit])\n\n const labelAt = useCallback(\n (index: number) => {\n if (!xDataKey) return String(index + 1)\n const value = data[index]?.[xDataKey]\n return value === null || value === undefined ? String(index + 1) : String(value)\n },\n [data, xDataKey],\n )\n\n // The slice runs on a deferred copy of the window, so the control that moved\n // re-renders at pointer cadence and the plot at whatever it can manage.\n const deferred = useDeferredValue(range)\n const visibleData = useMemo(\n () => data.slice(deferred.startIndex, deferred.endIndex + 1),\n [data, deferred.endIndex, deferred.startIndex],\n )\n\n const brushProps = useMemo(\n () => ({ startIndex: range.startIndex, endIndex: range.endIndex, onChange: commit }),\n [commit, range.endIndex, range.startIndex],\n )\n\n const isZoomed = range.startIndex > 0 || range.endIndex < maxIndex\n\n return useMemo(\n () => ({\n range,\n visibleData,\n isZoomed,\n canZoomIn: range.endIndex - range.startIndex > Math.min(minSpan, maxIndex),\n canZoomOut: isZoomed,\n zoomIn,\n zoomOut,\n reset,\n panBy,\n zoomTo,\n total,\n labelAt,\n brushProps,\n }),\n [\n brushProps,\n isZoomed,\n labelAt,\n maxIndex,\n minSpan,\n panBy,\n range,\n reset,\n total,\n visibleData,\n zoomIn,\n zoomOut,\n zoomTo,\n ],\n )\n}\n\nexport interface ChartZoomSurfaceProps {\n /** The window this surface drives. */\n zoom: ChartZoom\n /** Names the region for a screen reader — pass the figure's title. */\n label: string\n /**\n * Off leaves the plot inert while the toolbar buttons keep working. Use it\n * for a chart whose only control is export.\n */\n enabled?: boolean\n /** The plot's box, handed out because the PNG export needs the measured one. */\n ref?: RefObject<HTMLDivElement | null>\n children: ReactNode\n}\n\n/**\n * The plot, made zoomable and pannable by pointer AND by keyboard.\n *\n * The keyboard half is not a nicety. A chart whose only zoom is a drag gesture\n * is a chart a keyboard user can watch and cannot operate, which is the exact\n * failure the brush was rewritten to fix — so the surface is focusable, carries\n * its instructions in an `aria-describedby` note, and announces the window it\n * moved to through a polite live region.\n *\n * Arrow keys pan by a row, `PageUp`/`PageDown` by a screenful, `Home`/`End`\n * jump to the ends, `+`/`-` zoom and `0` resets. `ArrowLeft` means EARLIER in\n * every writing direction, matching the brush: the rendering engine lays a\n * cartesian plot out left-to-right whatever `dir` says, so mirroring the keys\n * would put \"earlier\" on the side the data does not run to.\n *\n * The wheel is deliberately gated behind Ctrl or Cmd. A chart that swallowed a\n * plain wheel event traps the page's scroll under the pointer, which is the\n * single most complained-about behaviour in an embedded map.\n */\nexport function ChartZoomSurface({\n zoom,\n label,\n enabled = true,\n ref,\n children,\n}: ChartZoomSurfaceProps) {\n const fallbackRef = useRef<HTMLDivElement>(null)\n const surfaceRef = ref ?? fallbackRef\n const hintId = `chart-zoom-hint-${useId().replace(/:/g, '')}`\n\n const drag = useRef<{ pointerId: number; originX: number } | null>(null)\n const [selection, setSelection] = useState<{ start: number; width: number } | null>(null)\n\n /** The row index under a client x, read from the plot's own measured box. */\n const indexAt = useCallback(\n (clientX: number): number | undefined => {\n const node = surfaceRef.current\n const box = node ? plotBox(node) : null\n if (!box) return undefined\n const fraction = clamp((clientX - box.left) / box.width, 0, 1)\n return zoom.range.startIndex + fraction * (zoom.range.endIndex - zoom.range.startIndex)\n },\n [surfaceRef, zoom.range.endIndex, zoom.range.startIndex],\n )\n\n useEffect(() => {\n const node = surfaceRef.current\n if (!node || !enabled) return\n\n // Attached natively rather than through `onWheel`, because React registers\n // its wheel listener passively — `preventDefault` from a React handler is a\n // console warning and a page that zooms anyway.\n const onWheel = (event: WheelEvent) => {\n if (!event.ctrlKey && !event.metaKey) return\n event.preventDefault()\n const anchor = indexAt(event.clientX)\n if (event.deltaY < 0) zoom.zoomIn(anchor)\n else zoom.zoomOut(anchor)\n }\n\n node.addEventListener('wheel', onWheel, { passive: false })\n return () => node.removeEventListener('wheel', onWheel)\n }, [enabled, indexAt, surfaceRef, zoom])\n\n const onPointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (!enabled || event.button !== 0) return\n // No `preventDefault` here on purpose: it would cancel the compatibility\n // mouse events the tooltip and a mark's own click handler run on.\n drag.current = { pointerId: event.pointerId, originX: event.clientX }\n }\n\n const onPointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n const state = drag.current\n if (!state || state.pointerId !== event.pointerId) return\n\n const travelled = Math.abs(event.clientX - state.originX)\n if (travelled < DRAG_THRESHOLD) return\n\n const node = surfaceRef.current\n const box = node ? plotBox(node) : null\n if (!node || !box) return\n\n if (!node.hasPointerCapture(event.pointerId)) node.setPointerCapture(event.pointerId)\n\n const from = Math.min(state.originX, event.clientX)\n setSelection({ start: from - box.left, width: travelled })\n }\n\n const endDrag = (event: ReactPointerEvent<HTMLDivElement>) => {\n const state = drag.current\n drag.current = null\n setSelection(null)\n\n const node = surfaceRef.current\n if (node?.hasPointerCapture(event.pointerId)) node.releasePointerCapture(event.pointerId)\n if (!state || Math.abs(event.clientX - state.originX) < DRAG_THRESHOLD) return\n\n const from = indexAt(Math.min(state.originX, event.clientX))\n const to = indexAt(Math.max(state.originX, event.clientX))\n if (from === undefined || to === undefined) return\n\n zoom.zoomTo({ startIndex: Math.floor(from), endIndex: Math.ceil(to) })\n }\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (!enabled) return\n const span = zoom.range.endIndex - zoom.range.startIndex\n\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowDown':\n zoom.panBy(-1)\n break\n case 'ArrowRight':\n case 'ArrowUp':\n zoom.panBy(1)\n break\n case 'PageDown':\n zoom.panBy(-Math.max(1, span))\n break\n case 'PageUp':\n zoom.panBy(Math.max(1, span))\n break\n case 'Home':\n zoom.panBy(-zoom.total)\n break\n case 'End':\n zoom.panBy(zoom.total)\n break\n case '+':\n case '=':\n zoom.zoomIn()\n break\n case '-':\n case '_':\n zoom.zoomOut()\n break\n case '0':\n zoom.reset()\n break\n default:\n return\n }\n\n event.preventDefault()\n }\n\n const shown = zoom.range.endIndex - zoom.range.startIndex + 1\n\n return (\n <div className=\"flex min-h-0 w-full flex-1 flex-col\">\n <div\n ref={surfaceRef}\n role=\"group\"\n aria-label={`${label} — plot`}\n aria-describedby={enabled ? hintId : undefined}\n tabIndex={enabled ? 0 : undefined}\n onKeyDown={onKeyDown}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n className={cn(\n 'relative flex min-h-0 w-full flex-1 flex-col rounded-(--radius-sm)',\n // Vertical scrolling still belongs to the page; horizontal movement\n // is the pan gesture, so the browser must not claim it first.\n enabled && 'touch-pan-y',\n selection && 'select-none',\n )}\n >\n {children}\n\n {selection && (\n // Positioned with inline style rather than `start-`/`end-` classes,\n // for the same reason the brush is: the axis being selected along is\n // the DATA's, and a cartesian plot runs left-to-right under\n // `dir=\"rtl\"` too.\n <div\n aria-hidden\n className=\"pointer-events-none absolute inset-y-0 z-(--z-rule) border-x border-(--rule-2) bg-(--ink)/8\"\n style={{ left: selection.start, width: selection.width }}\n />\n )}\n </div>\n\n {enabled && (\n <>\n <p id={hintId} className=\"sr-only\">\n Arrow keys pan by one point, Page Up and Page Down by a screenful, Home and End jump to\n the ends. Plus and minus zoom, zero resets. Ctrl and the wheel zoom around the pointer,\n and dragging across the plot zooms to that span.\n </p>\n <p aria-live=\"polite\" className=\"sr-only\">\n {`Showing ${zoom.labelAt(zoom.range.startIndex)} to ${zoom.labelAt(\n zoom.range.endIndex,\n )}, ${shown} of ${zoom.total} points`}\n </p>\n </>\n )}\n </div>\n )\n}\n\n/**\n * The measured box of the PLOT, not of the wrapper around it.\n *\n * The wrapper carries the toolbar row and the brush footer, and the plot's own\n * `<svg>` carries the axis gutter, so mapping a pointer through either is off\n * by enough to feel wrong at the ends of a drag. The grid is the one element\n * whose box IS the plot area, so it is tried first; the surface is the fallback\n * for a chart composed without `<Chart.Grid>`.\n */\nfunction plotBox(surface: HTMLElement): DOMRect | null {\n const grid = surface.querySelector('.recharts-cartesian-grid')\n const gridBox = grid?.getBoundingClientRect()\n if (gridBox && gridBox.width > 0) return gridBox\n\n const svg = surface.querySelector('svg.recharts-surface')\n const svgBox = svg?.getBoundingClientRect()\n return svgBox && svgBox.width > 0 ? svgBox : null\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,34 @@
1
+ import * as react from 'react';
2
+ import { ComponentProps, ReactNode } from 'react';
3
+ import * as AccordionPrimitive from '@radix-ui/react-accordion';
4
+
5
+ /**
6
+ * Radix root, re-exported. Pass `type="single" collapsible` for an FAQ and
7
+ * `type="multiple"` for a settings stack; Radix's own discriminated union then
8
+ * types `value` correctly for each.
9
+ */
10
+ declare const Accordion: react.ForwardRefExoticComponent<(AccordionPrimitive.AccordionSingleProps | AccordionPrimitive.AccordionMultipleProps) & react.RefAttributes<HTMLDivElement>>;
11
+ interface AccordionItemProps extends Omit<ComponentProps<typeof AccordionPrimitive.Item>, 'children' | 'title'> {
12
+ /** The row's summary — what the reader clicks. Named `title` rather than
13
+ * inherited from the DOM attribute of the same name, which is a tooltip. */
14
+ title: ReactNode;
15
+ children: ReactNode;
16
+ }
17
+ /**
18
+ * One disclosure row: a hairline-ruled trigger and its panel.
19
+ *
20
+ * The marker is a plus that rotates into a minus, not a chevron. A chevron says
21
+ * "there is more below"; a plus says "this opens" — and in a stack of rows the
22
+ * difference decides whether the reader expects navigation or expansion.
23
+ *
24
+ * The panel animates on Radix's own `--radix-accordion-content-height`, so it
25
+ * opens to its real height without measuring anything at the call site.
26
+ *
27
+ * @example
28
+ * <Accordion type="single" collapsible>
29
+ * <AccordionItem value="ship" title="How do I ship it?">Push to main.</AccordionItem>
30
+ * </Accordion>
31
+ */
32
+ declare function AccordionItem({ title, children, className, ...rest }: AccordionItemProps): react.JSX.Element;
33
+
34
+ export { Accordion, AccordionItem, type AccordionItemProps, Accordion as default };