@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,369 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { RiArrowDownSLine, RiArrowLeftSLine, RiArrowRightSLine } from "@remixicon/react";
4
+ import {
5
+ createContext,
6
+ useContext,
7
+ useEffect,
8
+ useMemo,
9
+ useRef,
10
+ useState
11
+ } from "react";
12
+ import {
13
+ DayPicker,
14
+ useDayPicker
15
+ } from "react-day-picker";
16
+ import { cn } from "../../lib/cn.js";
17
+ const DEFAULT_SPAN = 10;
18
+ const YEAR_PAGE = 24;
19
+ const DEFAULT_LABELS = {
20
+ monthPanelLabel: "Month and year",
21
+ yearPanelLabel: "Year",
22
+ previousYearLabel: "Previous year",
23
+ nextYearLabel: "Next year",
24
+ earlierYearsLabel: "Earlier years",
25
+ laterYearsLabel: "Later years"
26
+ };
27
+ const PickerContext = createContext({
28
+ open: null,
29
+ setOpen: () => {
30
+ },
31
+ startMonth: /* @__PURE__ */ new Date(),
32
+ endMonth: /* @__PURE__ */ new Date(),
33
+ labels: DEFAULT_LABELS
34
+ });
35
+ function useLabels() {
36
+ const { dayPickerProps } = useDayPicker();
37
+ const code = dayPickerProps.locale?.code ?? "en-US";
38
+ return useMemo(
39
+ () => ({
40
+ caption: new Intl.DateTimeFormat(code, { month: "long", year: "numeric" }),
41
+ month: new Intl.DateTimeFormat(code, { month: "short" })
42
+ }),
43
+ [code]
44
+ );
45
+ }
46
+ const STEP = "grid size-8 shrink-0 place-items-center rounded-(--radius) text-(--ink-2) transition-colors duration-(--duration-fast) hover:bg-(--stone) hover:text-(--ink) disabled:opacity-(--disabled-opacity) disabled:pointer-events-none";
47
+ const CELL = "rounded-(--radius-row) py-2 text-sm transition-colors duration-(--duration-fast) disabled:opacity-(--disabled-opacity) disabled:pointer-events-none";
48
+ const CELL_ON = "bg-(--accent) text-(--accent-foreground)";
49
+ const CELL_OFF = "text-(--ink-2) hover:bg-(--stone) hover:text-(--ink)";
50
+ function MonthYearPanel({
51
+ index,
52
+ view,
53
+ anchor,
54
+ year: browsing,
55
+ month
56
+ }) {
57
+ const { setOpen, startMonth, endMonth, labels: names } = useContext(PickerContext);
58
+ const { goToMonth } = useDayPicker();
59
+ const labels = useLabels();
60
+ const year = browsing ?? month.getFullYear();
61
+ const showing = year === month.getFullYear() ? month.getMonth() : -1;
62
+ const firstYear = startMonth.getFullYear();
63
+ const lastYear = endMonth.getFullYear();
64
+ const go = (nextYear, nextMonth) => {
65
+ goToMonth(new Date(nextYear, nextMonth - index, 1));
66
+ setOpen(null);
67
+ };
68
+ const inRange = (nextYear, nextMonth) => {
69
+ const value = nextYear * 12 + nextMonth;
70
+ const low = startMonth.getFullYear() * 12 + startMonth.getMonth();
71
+ const high = endMonth.getFullYear() * 12 + endMonth.getMonth();
72
+ return value >= low && value <= high;
73
+ };
74
+ if (view === "years") {
75
+ const page = (candidate) => Math.floor((candidate - firstYear) / YEAR_PAGE) * YEAR_PAGE + firstYear;
76
+ const start = anchor ?? page(year);
77
+ const years = Array.from({ length: YEAR_PAGE }, (_, offset) => start + offset).filter(
78
+ (candidate) => candidate >= firstYear && candidate <= lastYear
79
+ );
80
+ const back = start - YEAR_PAGE >= firstYear;
81
+ const forward = start + YEAR_PAGE <= lastYear;
82
+ const move = (delta) => setOpen({ index, view: "years", anchor: start + delta * YEAR_PAGE });
83
+ return /* @__PURE__ */ jsxs(Panel, { label: names.yearPanelLabel, children: [
84
+ /* @__PURE__ */ jsxs("div", { className: "mb-1 flex items-center justify-between gap-1", children: [
85
+ /* @__PURE__ */ jsx(
86
+ "button",
87
+ {
88
+ type: "button",
89
+ "aria-label": names.earlierYearsLabel,
90
+ disabled: !back,
91
+ onClick: () => move(-1),
92
+ className: STEP,
93
+ children: /* @__PURE__ */ jsx(RiArrowLeftSLine, { size: 16, "aria-hidden": true })
94
+ }
95
+ ),
96
+ /* @__PURE__ */ jsxs("span", { className: "mono-meta tabular-nums text-(--ink-3-aa)", children: [
97
+ years[0],
98
+ " \u2013 ",
99
+ years.at(-1)
100
+ ] }),
101
+ /* @__PURE__ */ jsx(
102
+ "button",
103
+ {
104
+ type: "button",
105
+ "aria-label": names.laterYearsLabel,
106
+ disabled: !forward,
107
+ onClick: () => move(1),
108
+ className: STEP,
109
+ children: /* @__PURE__ */ jsx(RiArrowRightSLine, { size: 16, "aria-hidden": true })
110
+ }
111
+ )
112
+ ] }),
113
+ /* @__PURE__ */ jsx("div", { "data-picker-grid": true, className: "grid grid-cols-4 gap-1", children: years.map((candidate) => /* @__PURE__ */ jsx(
114
+ "button",
115
+ {
116
+ type: "button",
117
+ "aria-current": candidate === year ? "true" : void 0,
118
+ onClick: () => setOpen({ index, view: "months", year: candidate }),
119
+ className: cn(CELL, "tabular-nums", candidate === year ? CELL_ON : CELL_OFF),
120
+ children: candidate
121
+ },
122
+ candidate
123
+ )) })
124
+ ] }, "years");
125
+ }
126
+ return /* @__PURE__ */ jsxs(Panel, { label: names.monthPanelLabel, children: [
127
+ /* @__PURE__ */ jsxs("div", { className: "mb-1 flex items-center justify-between gap-1", children: [
128
+ /* @__PURE__ */ jsx(
129
+ "button",
130
+ {
131
+ type: "button",
132
+ "aria-label": names.previousYearLabel,
133
+ disabled: year <= firstYear,
134
+ onClick: () => setOpen({ index, view: "months", year: year - 1 }),
135
+ className: STEP,
136
+ children: /* @__PURE__ */ jsx(RiArrowLeftSLine, { size: 16, "aria-hidden": true })
137
+ }
138
+ ),
139
+ /* @__PURE__ */ jsx(
140
+ "button",
141
+ {
142
+ type: "button",
143
+ onClick: () => setOpen({ index, view: "years", anchor }),
144
+ className: "rounded-(--radius-row) px-3 py-1 font-heading text-[length:var(--fs-item)] tabular-nums text-(--ink) transition-colors duration-(--duration-fast) hover:bg-(--stone)",
145
+ children: year
146
+ }
147
+ ),
148
+ /* @__PURE__ */ jsx(
149
+ "button",
150
+ {
151
+ type: "button",
152
+ "aria-label": names.nextYearLabel,
153
+ disabled: year >= lastYear,
154
+ onClick: () => setOpen({ index, view: "months", year: year + 1 }),
155
+ className: STEP,
156
+ children: /* @__PURE__ */ jsx(RiArrowRightSLine, { size: 16, "aria-hidden": true })
157
+ }
158
+ )
159
+ ] }),
160
+ /* @__PURE__ */ jsx("div", { "data-picker-grid": true, className: "grid grid-cols-3 gap-1", children: Array.from({ length: 12 }, (_, monthIndex) => /* @__PURE__ */ jsx(
161
+ "button",
162
+ {
163
+ type: "button",
164
+ "aria-current": monthIndex === showing ? "true" : void 0,
165
+ disabled: !inRange(year, monthIndex),
166
+ onClick: () => go(year, monthIndex),
167
+ className: cn(CELL, monthIndex === showing ? CELL_ON : CELL_OFF),
168
+ children: labels.month.format(new Date(year, monthIndex, 1))
169
+ },
170
+ monthIndex
171
+ )) })
172
+ ] }, "months");
173
+ }
174
+ function Panel({ label, children }) {
175
+ const box = useRef(null);
176
+ useEffect(() => {
177
+ const grid = box.current?.querySelector("[data-picker-grid]");
178
+ const target = box.current?.querySelector("[aria-current]") ?? grid?.querySelector("button:not(:disabled)");
179
+ target?.focus();
180
+ }, []);
181
+ const stops = () => Array.from(box.current?.querySelectorAll("button:not([disabled])") ?? []);
182
+ const wrap = (event) => {
183
+ if (event.key !== "Tab") return;
184
+ const buttons = stops();
185
+ const first = buttons[0];
186
+ const last = buttons[buttons.length - 1];
187
+ if (!first || !last) return;
188
+ const [edge, opposite] = event.shiftKey ? [first, last] : [last, first];
189
+ if (document.activeElement !== edge) return;
190
+ event.preventDefault();
191
+ opposite.focus();
192
+ };
193
+ return /* @__PURE__ */ jsx(
194
+ "div",
195
+ {
196
+ ref: box,
197
+ role: "dialog",
198
+ "aria-label": label,
199
+ onKeyDown: wrap,
200
+ className: "absolute inset-x-0 bottom-0 top-12 z-2 flex flex-col justify-center bg-(--paper)",
201
+ children
202
+ }
203
+ );
204
+ }
205
+ function CalendarCaption({ calendarMonth, displayIndex, className, ...rest }) {
206
+ const { open, setOpen } = useContext(PickerContext);
207
+ const labels = useLabels();
208
+ const trigger = useRef(null);
209
+ const mine = open !== null && open.index === displayIndex;
210
+ return /* @__PURE__ */ jsxs(
211
+ "div",
212
+ {
213
+ className,
214
+ onKeyDown: (event) => {
215
+ if (event.key !== "Escape" || !mine) return;
216
+ event.stopPropagation();
217
+ setOpen(null);
218
+ trigger.current?.focus();
219
+ },
220
+ ...rest,
221
+ children: [
222
+ /* @__PURE__ */ jsxs(
223
+ "button",
224
+ {
225
+ ref: trigger,
226
+ type: "button",
227
+ "aria-expanded": mine,
228
+ onClick: () => setOpen(mine ? null : { index: displayIndex, view: "months" }),
229
+ className: "group flex items-center gap-1.5 rounded-(--radius-row) px-2 py-1 font-heading text-[length:var(--fs-item)] text-(--ink) transition-colors duration-(--duration-fast) hover:bg-(--stone)",
230
+ children: [
231
+ labels.caption.format(calendarMonth.date),
232
+ /* @__PURE__ */ jsx(
233
+ RiArrowDownSLine,
234
+ {
235
+ size: 16,
236
+ "aria-hidden": true,
237
+ className: cn(
238
+ "shrink-0 text-(--ink-3-aa) transition-transform duration-(--duration-fast)",
239
+ mine && "rotate-180"
240
+ )
241
+ }
242
+ )
243
+ ]
244
+ }
245
+ ),
246
+ mine && open !== null && /* @__PURE__ */ jsx(
247
+ MonthYearPanel,
248
+ {
249
+ index: displayIndex,
250
+ view: open.view,
251
+ anchor: open.anchor,
252
+ year: open.year,
253
+ month: calendarMonth.date
254
+ }
255
+ )
256
+ ]
257
+ }
258
+ );
259
+ }
260
+ function Calendar({
261
+ className,
262
+ classNames,
263
+ components,
264
+ monthPanelLabel,
265
+ yearPanelLabel,
266
+ previousYearLabel,
267
+ nextYearLabel,
268
+ earlierYearsLabel,
269
+ laterYearsLabel,
270
+ ...props
271
+ }) {
272
+ const now = /* @__PURE__ */ new Date();
273
+ const [open, setOpen] = useState(null);
274
+ const labels = {
275
+ monthPanelLabel: monthPanelLabel ?? DEFAULT_LABELS.monthPanelLabel,
276
+ yearPanelLabel: yearPanelLabel ?? DEFAULT_LABELS.yearPanelLabel,
277
+ previousYearLabel: previousYearLabel ?? DEFAULT_LABELS.previousYearLabel,
278
+ nextYearLabel: nextYearLabel ?? DEFAULT_LABELS.nextYearLabel,
279
+ earlierYearsLabel: earlierYearsLabel ?? DEFAULT_LABELS.earlierYearsLabel,
280
+ laterYearsLabel: laterYearsLabel ?? DEFAULT_LABELS.laterYearsLabel
281
+ };
282
+ const startMonth = props.startMonth ?? new Date(now.getFullYear() - DEFAULT_SPAN, 0);
283
+ const endMonth = props.endMonth ?? new Date(now.getFullYear() + DEFAULT_SPAN, 11);
284
+ const isRange = props.mode === "range";
285
+ const FILL = "[&>button]:bg-(--accent) [&>button]:text-(--accent-foreground) [&>button:hover]:bg-(--accent) [&>button:hover]:text-(--accent-foreground)";
286
+ return /* @__PURE__ */ jsx(PickerContext, { value: { open, setOpen, startMonth, endMonth, labels }, children: /* @__PURE__ */ jsx(
287
+ DayPicker,
288
+ {
289
+ showOutsideDays: true,
290
+ captionLayout: "label",
291
+ startMonth,
292
+ endMonth,
293
+ className: cn("w-fit p-3", className),
294
+ components: {
295
+ Chevron: ({ orientation, ...rest }) => orientation === "left" ? /* @__PURE__ */ jsx(RiArrowLeftSLine, { size: 16, "aria-hidden": true, ...rest }) : /* @__PURE__ */ jsx(RiArrowRightSLine, { size: 16, "aria-hidden": true, ...rest }),
296
+ MonthCaption: CalendarCaption,
297
+ ...components
298
+ },
299
+ classNames: {
300
+ // `rdp-root` is kept deliberately. Passing a class for a slot REPLACES
301
+ // the library's own, so overriding `root` silently removed the hook
302
+ // that every `.rdp-*` selector — ours and a consumer's — depends on.
303
+ root: "rdp-root relative",
304
+ // The nav renders BEFORE the months in the DOM, so left in the flow it
305
+ // stacks its two arrows above the grid. Taking it out of the flow puts
306
+ // them where they belong — one at each end of the caption.
307
+ //
308
+ // `h-9` is what makes them line up. The caption is a 36px row and the
309
+ // nav was a 16px glyph pinned at the same top edge, so the arrows sat
310
+ // ten pixels above the month they belong to — close enough to read as
311
+ // a mistake and not close enough to read as a decision. Same height,
312
+ // same centre line.
313
+ //
314
+ // It steps away while the picker is open: two ways to change the
315
+ // month, one of them behind a panel, is one too many.
316
+ //
317
+ // `pointer-events-none` on the STRIP and back on for the two buttons:
318
+ // at the caption's full height it lies across the caption, and a bar
319
+ // with nothing in the middle of it was still eating the click on the
320
+ // month label underneath.
321
+ nav: cn(
322
+ "pointer-events-none absolute inset-x-3 top-3 z-1 flex h-9 items-center justify-between transition-opacity duration-(--duration-fast)",
323
+ open && "opacity-0"
324
+ ),
325
+ // The arrows are pointer targets, not glyphs: a 16px chevron with no
326
+ // box is a 16px hit area, which is under every guideline there is.
327
+ button_previous: cn(STEP, open ? "pointer-events-none" : "pointer-events-auto"),
328
+ button_next: cn(STEP, open ? "pointer-events-none" : "pointer-events-auto"),
329
+ months: "flex flex-col gap-4 sm:flex-row",
330
+ // Positioned, because the month picker covers this month's grid and
331
+ // nothing else — in a two-month range picker each pane opens its own.
332
+ month: "relative flex flex-col gap-3",
333
+ month_caption: "flex h-9 items-center justify-center",
334
+ month_grid: "w-full border-collapse",
335
+ weekdays: "flex",
336
+ weekday: "w-9 mono-meta font-normal text-(--ink-3-aa)",
337
+ week: "mt-1 flex w-full",
338
+ // The band lives on the CELL and the mark lives on the BUTTON. Keeping
339
+ // them apart is what lets a range be one continuous wash while both of
340
+ // its ends stay round — the previous arrangement flattened the corners
341
+ // of whichever day was an end, and a one-day range is BOTH ends, so it
342
+ // came out as a square.
343
+ day: "relative p-0 text-center",
344
+ day_button: "relative z-1 inline-flex size-9 items-center justify-center rounded-(--radius-pill) text-sm text-(--ink-2) transition-colors duration-(--duration-fast) hover:bg-(--stone) hover:text-(--ink)",
345
+ selected: isRange ? "" : FILL,
346
+ // Today is an outline, not a fill — it is a fact about the calendar,
347
+ // not a choice the reader made, and the two must not look alike.
348
+ today: "[&>button]:ring-1 [&>button]:ring-(--rule-hard) [&>button]:ring-inset",
349
+ outside: "[&>button]:text-(--ink-3-aa)",
350
+ disabled: "[&>button]:opacity-(--disabled-opacity) [&>button]:pointer-events-none",
351
+ // The wash lives on the CELL and the mark on the BUTTON, which is what
352
+ // lets a range read as one continuous band while both of its ends stay
353
+ // round. A middle day gets the wash and no fill; the ends get both.
354
+ range_middle: "bg-(--accent-muted) [&>button]:text-(--ink) [&>button:hover]:bg-(--stone)",
355
+ range_start: cn("bg-(--accent-muted) rounded-s-(--radius-pill)", FILL),
356
+ range_end: cn("bg-(--accent-muted) rounded-e-(--radius-pill)", FILL),
357
+ hidden: "invisible",
358
+ ...classNames
359
+ },
360
+ ...props
361
+ }
362
+ ) });
363
+ }
364
+ var Calendar_default = Calendar;
365
+ export {
366
+ Calendar,
367
+ Calendar_default as default
368
+ };
369
+ //# sourceMappingURL=Calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/Calendar/Calendar.tsx"],"sourcesContent":["'use client'\n\nimport { RiArrowDownSLine, RiArrowLeftSLine, RiArrowRightSLine } from '@remixicon/react'\nimport {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\nimport {\n DayPicker,\n useDayPicker,\n type DayPickerProps,\n type MonthCaptionProps,\n} from 'react-day-picker'\nimport { cn } from '../../lib/cn'\n\n/**\n * The strings the month-and-year picker says, none of which react-day-picker\n * knows about — its own `labels` prop covers its own chrome, and this panel is\n * ours. English by default, and exposed for the same reason `AppShell` exposes\n * `openLabel`: every one of these controls is an icon or a bare number, so the\n * string IS the control as far as a screen reader is concerned.\n *\n * The month names already follow `locale`, which is what made the chrome around\n * them read as an oversight rather than as a policy.\n */\nexport interface CalendarLabels {\n /** Names the panel showing twelve months. */\n monthPanelLabel?: string\n /** Names the panel showing a page of years. */\n yearPanelLabel?: string\n /** The two chevrons that browse a year at a time, inside the month panel. */\n previousYearLabel?: string\n nextYearLabel?: string\n /** The two chevrons that page the year grid, twenty-four at a time. */\n earlierYearsLabel?: string\n laterYearsLabel?: string\n}\n\nexport type CalendarProps = DayPickerProps & CalendarLabels\n\n/** Ten years either side of now — see the note on `startMonth` below. */\nconst DEFAULT_SPAN = 10\n\n/** How many years one page of the year grid holds: four columns, six rows. */\nconst YEAR_PAGE = 24\n\ntype View = 'months' | 'years'\n\ninterface PickerOpen {\n /** Which displayed month has its picker open. */\n index: number\n view: View\n /** The first year of the page the year grid is showing, when it is showing. */\n anchor?: number\n /**\n * The year the MONTH grid is showing, when it is not the displayed month's.\n *\n * The picker browses; it does not navigate. Stepping the year used to call\n * `goToMonth` and close the panel, so `‹` on \"2026\" left the reader looking\n * at a different month with the picker gone — one click that did two things,\n * neither of them the one asked for. Now the arrows move this, the grid\n * re-renders under them, and the calendar moves only when a month is chosen.\n */\n year?: number\n}\n\n/** Every label resolved, so nothing downstream has to know the defaults. */\ntype ResolvedLabels = Required<CalendarLabels>\n\nconst DEFAULT_LABELS: ResolvedLabels = {\n monthPanelLabel: 'Month and year',\n yearPanelLabel: 'Year',\n previousYearLabel: 'Previous year',\n nextYearLabel: 'Next year',\n earlierYearsLabel: 'Earlier years',\n laterYearsLabel: 'Later years',\n}\n\ninterface PickerState {\n open: PickerOpen | null\n setOpen: (next: PickerOpen | null) => void\n startMonth: Date\n endMonth: Date\n labels: ResolvedLabels\n}\n\nconst PickerContext = createContext<PickerState>({\n open: null,\n setOpen: () => {},\n startMonth: new Date(),\n endMonth: new Date(),\n labels: DEFAULT_LABELS,\n})\n\n/** `Intl` beats the library's formatter here: it takes a plain BCP 47 tag. */\nfunction useLabels() {\n const { dayPickerProps } = useDayPicker()\n const code = dayPickerProps.locale?.code ?? 'en-US'\n return useMemo(\n () => ({\n caption: new Intl.DateTimeFormat(code, { month: 'long', year: 'numeric' }),\n month: new Intl.DateTimeFormat(code, { month: 'short' }),\n }),\n [code],\n )\n}\n\n/** The calendar's chrome buttons: the same corner every other control draws. */\nconst STEP =\n 'grid size-8 shrink-0 place-items-center rounded-(--radius) text-(--ink-2) transition-colors duration-(--duration-fast) hover:bg-(--stone) hover:text-(--ink) disabled:opacity-(--disabled-opacity) disabled:pointer-events-none'\n\nconst CELL =\n 'rounded-(--radius-row) py-2 text-sm transition-colors duration-(--duration-fast) disabled:opacity-(--disabled-opacity) disabled:pointer-events-none'\n/** The one that is showing, marked the way a chosen day is marked. */\nconst CELL_ON = 'bg-(--accent) text-(--accent-foreground)'\nconst CELL_OFF = 'text-(--ink-2) hover:bg-(--stone) hover:text-(--ink)'\n\n/**\n * The month and year picker, drawn IN PLACE of the day grid.\n *\n * The previous arrangement was two `Select`s in the caption, which portalled\n * their option lists over the grid — a ten-rem box showing three months at a\n * time with a scroll arrow at each end, floating on top of the calendar the\n * reader opened it to change. Three visible options out of twelve is not a\n * picker, and it covered the thing being picked for.\n *\n * Twelve months fit in a 3×4 grid at the exact size of the grid they replace,\n * so nothing overlaps, nothing scrolls, and the panel is the same shape as the\n * surface underneath it. Twenty years fit the same box in 4×5, which is why the\n * default span is ten years either side: one page, no paging.\n */\nfunction MonthYearPanel({\n index,\n view,\n anchor,\n year: browsing,\n month,\n}: {\n index: number\n view: View\n anchor?: number\n year?: number\n month: Date\n}) {\n const { setOpen, startMonth, endMonth, labels: names } = useContext(PickerContext)\n const { goToMonth } = useDayPicker()\n const labels = useLabels()\n\n /** The year being browsed, which is the displayed one until an arrow moves it. */\n const year = browsing ?? month.getFullYear()\n /** The month marked as current — only when the browsed year IS the shown one. */\n const showing = year === month.getFullYear() ? month.getMonth() : -1\n const firstYear = startMonth.getFullYear()\n const lastYear = endMonth.getFullYear()\n\n /**\n * The offset is what makes this work in a two-month range picker: `goToMonth`\n * always sets the FIRST displayed month, so picking September in the\n * right-hand pane has to ask for August.\n */\n const go = (nextYear: number, nextMonth: number) => {\n goToMonth(new Date(nextYear, nextMonth - index, 1))\n setOpen(null)\n }\n\n const inRange = (nextYear: number, nextMonth: number) => {\n const value = nextYear * 12 + nextMonth\n const low = startMonth.getFullYear() * 12 + startMonth.getMonth()\n const high = endMonth.getFullYear() * 12 + endMonth.getMonth()\n return value >= low && value <= high\n }\n\n if (view === 'years') {\n /**\n * Pages TILE the range from its first year, rather than being centred on\n * whichever year is showing. Centring left the first year of a range on no\n * page at all when the range was not a whole number of pages long — the\n * calendar offered a year it could never reach, and nothing said so.\n */\n const page = (candidate: number) =>\n Math.floor((candidate - firstYear) / YEAR_PAGE) * YEAR_PAGE + firstYear\n const start = anchor ?? page(year)\n const years = Array.from({ length: YEAR_PAGE }, (_, offset) => start + offset).filter(\n (candidate) => candidate >= firstYear && candidate <= lastYear,\n )\n const back = start - YEAR_PAGE >= firstYear\n const forward = start + YEAR_PAGE <= lastYear\n const move = (delta: number) =>\n setOpen({ index, view: 'years', anchor: start + delta * YEAR_PAGE })\n\n return (\n <Panel key=\"years\" label={names.yearPanelLabel}>\n <div className=\"mb-1 flex items-center justify-between gap-1\">\n <button\n type=\"button\"\n aria-label={names.earlierYearsLabel}\n disabled={!back}\n onClick={() => move(-1)}\n className={STEP}\n >\n <RiArrowLeftSLine size={16} aria-hidden />\n </button>\n <span className=\"mono-meta tabular-nums text-(--ink-3-aa)\">\n {years[0]} – {years.at(-1)}\n </span>\n <button\n type=\"button\"\n aria-label={names.laterYearsLabel}\n disabled={!forward}\n onClick={() => move(1)}\n className={STEP}\n >\n <RiArrowRightSLine size={16} aria-hidden />\n </button>\n </div>\n <div data-picker-grid className=\"grid grid-cols-4 gap-1\">\n {years.map((candidate) => (\n <button\n key={candidate}\n type=\"button\"\n aria-current={candidate === year ? 'true' : undefined}\n onClick={() => setOpen({ index, view: 'months', year: candidate })}\n className={cn(CELL, 'tabular-nums', candidate === year ? CELL_ON : CELL_OFF)}\n >\n {candidate}\n </button>\n ))}\n </div>\n </Panel>\n )\n }\n\n return (\n <Panel key=\"months\" label={names.monthPanelLabel}>\n <div className=\"mb-1 flex items-center justify-between gap-1\">\n <button\n type=\"button\"\n aria-label={names.previousYearLabel}\n disabled={year <= firstYear}\n onClick={() => setOpen({ index, view: 'months', year: year - 1 })}\n className={STEP}\n >\n <RiArrowLeftSLine size={16} aria-hidden />\n </button>\n <button\n type=\"button\"\n onClick={() => setOpen({ index, view: 'years', anchor })}\n className=\"rounded-(--radius-row) px-3 py-1 font-heading text-[length:var(--fs-item)] tabular-nums text-(--ink) transition-colors duration-(--duration-fast) hover:bg-(--stone)\"\n >\n {year}\n </button>\n <button\n type=\"button\"\n aria-label={names.nextYearLabel}\n disabled={year >= lastYear}\n onClick={() => setOpen({ index, view: 'months', year: year + 1 })}\n className={STEP}\n >\n <RiArrowRightSLine size={16} aria-hidden />\n </button>\n </div>\n <div data-picker-grid className=\"grid grid-cols-3 gap-1\">\n {Array.from({ length: 12 }, (_, monthIndex) => (\n <button\n key={monthIndex}\n type=\"button\"\n aria-current={monthIndex === showing ? 'true' : undefined}\n disabled={!inRange(year, monthIndex)}\n onClick={() => go(year, monthIndex)}\n className={cn(CELL, monthIndex === showing ? CELL_ON : CELL_OFF)}\n >\n {labels.month.format(new Date(year, monthIndex, 1))}\n </button>\n ))}\n </div>\n </Panel>\n )\n}\n\n/**\n * The panel's box.\n *\n * `top-12` is the caption's own height plus the gap under it, so the panel\n * starts exactly where the weekday row does and ends where the last week does.\n * Sized against the grid rather than given a height of its own, because a fixed\n * height would be wrong in the month that needs a sixth week.\n *\n * Focus moves in when it opens and the month showing is what receives it, so a\n * keyboard reader lands on the current value rather than at the top of a grid\n * they then have to traverse. Tab then WRAPS inside the panel: it is drawn in\n * `--paper` over a day grid that is still mounted and still focusable, so Tab\n * used to leave the reader on a day they could not see, past the caption that\n * owns the Escape handler and therefore with no way back.\n *\n * `dialog` follows from that rather than decorating it. The role was `group`\n * for as long as Tab walked out — announcing a dialog nobody is held inside is\n * worse than announcing nothing — and the same rule, read the other way, is\n * what makes `dialog` correct now. No `aria-modal`: the panel covers this\n * month's grid, not the page, and the rest of the document is still there.\n */\nfunction Panel({ label, children }: { label: string; children: ReactNode }) {\n const box = useRef<HTMLDivElement>(null)\n\n // Keyed by view at the call site, so switching from months to years remounts\n // this and the effect runs again. Without that the year grid replaced the\n // button that had just been clicked, focus fell back to `<body>`, and Escape\n // no longer reached the handler that closes the panel.\n useEffect(() => {\n // The current value if the panel is showing it, and otherwise the first\n // cell in the grid. Browsing to another year leaves nothing marked current,\n // and a panel that focuses nothing drops focus to `<body>` — where Escape\n // no longer reaches the handler that closes it.\n const grid = box.current?.querySelector('[data-picker-grid]')\n const target =\n box.current?.querySelector<HTMLButtonElement>('[aria-current]') ??\n grid?.querySelector<HTMLButtonElement>('button:not(:disabled)')\n target?.focus()\n }, [])\n\n // Every stop in here is a button; there is nothing else to collect, and a\n // general focusable-element query would be a guess about markup this file\n // writes itself. Disabled months are out of range and out of the tab order.\n const stops = () =>\n Array.from(box.current?.querySelectorAll<HTMLButtonElement>('button:not([disabled])') ?? [])\n\n const wrap = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key !== 'Tab') return\n const buttons = stops()\n const first = buttons[0]\n const last = buttons[buttons.length - 1]\n if (!first || !last) return\n\n const [edge, opposite] = event.shiftKey ? [first, last] : [last, first]\n if (document.activeElement !== edge) return\n\n event.preventDefault()\n opposite.focus()\n }\n\n return (\n <div\n ref={box}\n role=\"dialog\"\n aria-label={label}\n onKeyDown={wrap}\n className=\"absolute inset-x-0 bottom-0 top-12 z-2 flex flex-col justify-center bg-(--paper)\"\n >\n {children}\n </div>\n )\n}\n\n/**\n * The caption: the month and year, as one control that opens the picker.\n *\n * One button rather than two dropdowns. \"September 2026\" is how the date is\n * said, and splitting it into two controls with a chevron each put four\n * interactive things in a 250px caption that also has to hold two arrows.\n */\nfunction CalendarCaption({ calendarMonth, displayIndex, className, ...rest }: MonthCaptionProps) {\n const { open, setOpen } = useContext(PickerContext)\n const labels = useLabels()\n const trigger = useRef<HTMLButtonElement>(null)\n const mine = open !== null && open.index === displayIndex\n\n return (\n <div\n className={className}\n // Escape closes the picker and puts focus back where it came from. A\n // panel that covers the grid and cannot be dismissed from the keyboard is\n // a trap, however briefly.\n onKeyDown={(event) => {\n if (event.key !== 'Escape' || !mine) return\n event.stopPropagation()\n setOpen(null)\n trigger.current?.focus()\n }}\n {...rest}\n >\n <button\n ref={trigger}\n type=\"button\"\n aria-expanded={mine}\n onClick={() => setOpen(mine ? null : { index: displayIndex, view: 'months' })}\n className=\"group flex items-center gap-1.5 rounded-(--radius-row) px-2 py-1 font-heading text-[length:var(--fs-item)] text-(--ink) transition-colors duration-(--duration-fast) hover:bg-(--stone)\"\n >\n {labels.caption.format(calendarMonth.date)}\n <RiArrowDownSLine\n size={16}\n aria-hidden\n className={cn(\n 'shrink-0 text-(--ink-3-aa) transition-transform duration-(--duration-fast)',\n mine && 'rotate-180',\n )}\n />\n </button>\n {mine && open !== null && (\n <MonthYearPanel\n index={displayIndex}\n view={open.view}\n anchor={open.anchor}\n year={open.year}\n month={calendarMonth.date}\n />\n )}\n </div>\n )\n}\n\n/**\n * A month, as a grid of days.\n *\n * Wraps react-day-picker rather than building a calendar, and the reason is the\n * long tail: a month grid is easy, and everything around it is not — the\n * keyboard contract (arrows move a day, Page moves a month, Home and End reach\n * the week's ends), the `aria-live` announcement when the month changes, week\n * numbering, the first day of the week varying by locale, and the fact that\n * \"today\" and \"selected\" are different states a screen reader must hear apart.\n *\n * Every class is replaced rather than layered over the library's stylesheet, so\n * nothing here depends on a CSS file this package does not control — but the\n * library's OWN class is kept on each slot, because passing a class REPLACES it\n * and every `.rdp-*` selector downstream depends on those.\n *\n * The month names follow `locale`. The picker's own chrome — the two panels and\n * the four chevrons that browse them — follows `CalendarLabels`, because\n * `locale` cannot supply strings this package invented.\n *\n * @example\n * <Calendar mode=\"single\" selected={date} onSelect={setDate} />\n * @example\n * // A birth date: widen the years, since the default span is deliberately short.\n * <Calendar mode=\"single\" startMonth={new Date(1920, 0)} endMonth={new Date()} />\n */\nexport function Calendar({\n className,\n classNames,\n components,\n monthPanelLabel,\n yearPanelLabel,\n previousYearLabel,\n nextYearLabel,\n earlierYearsLabel,\n laterYearsLabel,\n ...props\n}: CalendarProps) {\n const now = new Date()\n const [open, setOpen] = useState<PickerState['open']>(null)\n\n // Destructured out of `props` above rather than forwarded: everything left in\n // `props` goes to DayPicker, and these six are this package's own.\n const labels: ResolvedLabels = {\n monthPanelLabel: monthPanelLabel ?? DEFAULT_LABELS.monthPanelLabel,\n yearPanelLabel: yearPanelLabel ?? DEFAULT_LABELS.yearPanelLabel,\n previousYearLabel: previousYearLabel ?? DEFAULT_LABELS.previousYearLabel,\n nextYearLabel: nextYearLabel ?? DEFAULT_LABELS.nextYearLabel,\n earlierYearsLabel: earlierYearsLabel ?? DEFAULT_LABELS.earlierYearsLabel,\n laterYearsLabel: laterYearsLabel ?? DEFAULT_LABELS.laterYearsLabel,\n }\n\n // Ten years either side, NOT a century. A hundred-and-eleven-row year list is\n // a scroll, not a choice — and the case that needs one (a birth date) is rare\n // enough to ask for it explicitly. Both ends are props, so widening is one\n // line at the call site.\n const startMonth = props.startMonth ?? new Date(now.getFullYear() - DEFAULT_SPAN, 0)\n const endMonth = props.endMonth ?? new Date(now.getFullYear() + DEFAULT_SPAN, 11)\n\n /**\n * A one-day range is marked start AND end AND middle, all three.\n *\n * That is what made the earlier arrangement collapse: `range_middle` cleared\n * the button's fill so a middle day would not look chosen, and on a one-day\n * range that same rule cleared the fill of the only day there was. Deciding\n * by mode instead of fighting it with `!important` means the two never\n * describe the same button — in a range the fill belongs to the ends, and in\n * single mode it belongs to `selected`.\n */\n const isRange = props.mode === 'range'\n const FILL =\n '[&>button]:bg-(--accent) [&>button]:text-(--accent-foreground) [&>button:hover]:bg-(--accent) [&>button:hover]:text-(--accent-foreground)'\n\n return (\n <PickerContext value={{ open, setOpen, startMonth, endMonth, labels }}>\n <DayPicker\n showOutsideDays\n // The caption is one control that swaps the grid for a month picker, so\n // the library's own dropdown layout is not wanted.\n captionLayout=\"label\"\n startMonth={startMonth}\n endMonth={endMonth}\n className={cn('w-fit p-3', className)}\n components={{\n Chevron: ({ orientation, ...rest }) =>\n orientation === 'left' ? (\n <RiArrowLeftSLine size={16} aria-hidden {...rest} />\n ) : (\n <RiArrowRightSLine size={16} aria-hidden {...rest} />\n ),\n MonthCaption: CalendarCaption,\n ...components,\n }}\n classNames={{\n // `rdp-root` is kept deliberately. Passing a class for a slot REPLACES\n // the library's own, so overriding `root` silently removed the hook\n // that every `.rdp-*` selector — ours and a consumer's — depends on.\n root: 'rdp-root relative',\n // The nav renders BEFORE the months in the DOM, so left in the flow it\n // stacks its two arrows above the grid. Taking it out of the flow puts\n // them where they belong — one at each end of the caption.\n //\n // `h-9` is what makes them line up. The caption is a 36px row and the\n // nav was a 16px glyph pinned at the same top edge, so the arrows sat\n // ten pixels above the month they belong to — close enough to read as\n // a mistake and not close enough to read as a decision. Same height,\n // same centre line.\n //\n // It steps away while the picker is open: two ways to change the\n // month, one of them behind a panel, is one too many.\n //\n // `pointer-events-none` on the STRIP and back on for the two buttons:\n // at the caption's full height it lies across the caption, and a bar\n // with nothing in the middle of it was still eating the click on the\n // month label underneath.\n nav: cn(\n 'pointer-events-none absolute inset-x-3 top-3 z-1 flex h-9 items-center justify-between transition-opacity duration-(--duration-fast)',\n open && 'opacity-0',\n ),\n // The arrows are pointer targets, not glyphs: a 16px chevron with no\n // box is a 16px hit area, which is under every guideline there is.\n button_previous: cn(STEP, open ? 'pointer-events-none' : 'pointer-events-auto'),\n button_next: cn(STEP, open ? 'pointer-events-none' : 'pointer-events-auto'),\n months: 'flex flex-col gap-4 sm:flex-row',\n // Positioned, because the month picker covers this month's grid and\n // nothing else — in a two-month range picker each pane opens its own.\n month: 'relative flex flex-col gap-3',\n month_caption: 'flex h-9 items-center justify-center',\n month_grid: 'w-full border-collapse',\n weekdays: 'flex',\n weekday: 'w-9 mono-meta font-normal text-(--ink-3-aa)',\n week: 'mt-1 flex w-full',\n // The band lives on the CELL and the mark lives on the BUTTON. Keeping\n // them apart is what lets a range be one continuous wash while both of\n // its ends stay round — the previous arrangement flattened the corners\n // of whichever day was an end, and a one-day range is BOTH ends, so it\n // came out as a square.\n day: 'relative p-0 text-center',\n day_button:\n 'relative z-1 inline-flex size-9 items-center justify-center rounded-(--radius-pill) text-sm text-(--ink-2) transition-colors duration-(--duration-fast) hover:bg-(--stone) hover:text-(--ink)',\n selected: isRange ? '' : FILL,\n // Today is an outline, not a fill — it is a fact about the calendar,\n // not a choice the reader made, and the two must not look alike.\n today: '[&>button]:ring-1 [&>button]:ring-(--rule-hard) [&>button]:ring-inset',\n outside: '[&>button]:text-(--ink-3-aa)',\n disabled: '[&>button]:opacity-(--disabled-opacity) [&>button]:pointer-events-none',\n // The wash lives on the CELL and the mark on the BUTTON, which is what\n // lets a range read as one continuous band while both of its ends stay\n // round. A middle day gets the wash and no fill; the ends get both.\n range_middle: 'bg-(--accent-muted) [&>button]:text-(--ink) [&>button:hover]:bg-(--stone)',\n range_start: cn('bg-(--accent-muted) rounded-s-(--radius-pill)', FILL),\n range_end: cn('bg-(--accent-muted) rounded-e-(--radius-pill)', FILL),\n hidden: 'invisible',\n ...classNames,\n }}\n {...props}\n />\n </PickerContext>\n )\n}\n\nexport default Calendar\n"],"mappings":"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","names":[]}
@@ -0,0 +1,55 @@
1
+ import * as react from 'react';
2
+ import { HTMLAttributes } from 'react';
3
+
4
+ interface CardProps extends HTMLAttributes<HTMLDivElement> {
5
+ /**
6
+ * `outline` is a hairline box on the page ground — the default, and correct
7
+ * for a card sitting among other cards. `plate` fills with the one reversed
8
+ * surface and is for a card that IS the point of its band; use at most one
9
+ * per screen. `flat` drops the border entirely, for a card whose grid already
10
+ * draws the rules between cells.
11
+ */
12
+ variant?: 'outline' | 'plate' | 'flat';
13
+ }
14
+ /**
15
+ * A bounded surface.
16
+ *
17
+ * No shadow, by law: depth in this system is a hairline and a change of ground,
18
+ * never a blur. A card that needs to read as raised is a `plate`, which
19
+ * separates by reversal instead.
20
+ *
21
+ * It clips to its own corner. A card that rounds and does not clip lays a
22
+ * full-bleed image's square corners over its round ones at all four corners,
23
+ * and the same goes for a filled first child — a defect that is invisible until
24
+ * the first card with an image at the top of it. Pass `overflow-visible` for
25
+ * the rarer card that deliberately overhangs.
26
+ *
27
+ * Compose with the named sub-parts, or drop children straight in when the card
28
+ * has no header or footer to speak of.
29
+ *
30
+ * @example
31
+ * <Card>
32
+ * <CardHeader><CardTitle>Recent deploys</CardTitle><Badge>12</Badge></CardHeader>
33
+ * <CardBody>…</CardBody>
34
+ * <CardFooter>Updated just now</CardFooter>
35
+ * </Card>
36
+ */
37
+ declare function Card({ variant, className, children, ...rest }: CardProps): react.JSX.Element;
38
+ /** Header row — title on the left, an action or marker on the right. */
39
+ declare function CardHeader({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>): react.JSX.Element;
40
+ /**
41
+ * The card's title, in the editorial serif.
42
+ *
43
+ * An `<h3>` by default, which is right inside a section with its own `<h2>` and
44
+ * wrong nearly everywhere else — pass `as` rather than leaving a page with a
45
+ * heading order that jumps.
46
+ */
47
+ declare function CardTitle({ as: Comp, className, children, ...rest }: HTMLAttributes<HTMLHeadingElement> & {
48
+ as?: 'h2' | 'h3' | 'h4';
49
+ }): react.JSX.Element;
50
+ /** The content well. */
51
+ declare function CardBody({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>): react.JSX.Element;
52
+ /** A quiet strip for metadata or secondary actions. */
53
+ declare function CardFooter({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>): react.JSX.Element;
54
+
55
+ export { Card, CardBody, CardFooter, CardHeader, type CardProps, CardTitle, Card as default };
@@ -0,0 +1,64 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { cn } from "../../lib/cn.js";
3
+ const VARIANT = {
4
+ outline: "border border-(--rule) bg-(--paper)",
5
+ plate: "border border-(--feature-surface) bg-(--feature-surface) text-(--on-feature) [--card-title:var(--on-feature)]",
6
+ flat: "border border-transparent bg-transparent"
7
+ };
8
+ function Card({ variant = "outline", className, children, ...rest }) {
9
+ return /* @__PURE__ */ jsx("div", { className: cn("overflow-hidden rounded-(--radius-lg)", VARIANT[variant], className), ...rest, children });
10
+ }
11
+ function CardHeader({ className, children, ...rest }) {
12
+ return /* @__PURE__ */ jsx(
13
+ "div",
14
+ {
15
+ className: cn(
16
+ "flex items-center justify-between gap-4 border-b border-(--rule) px-5 py-4",
17
+ className
18
+ ),
19
+ ...rest,
20
+ children
21
+ }
22
+ );
23
+ }
24
+ function CardTitle({
25
+ as: Comp = "h3",
26
+ className,
27
+ children,
28
+ ...rest
29
+ }) {
30
+ return /* @__PURE__ */ jsx(
31
+ Comp,
32
+ {
33
+ className: cn(
34
+ "m-0 font-heading text-[length:var(--fs-item)] font-normal text-[var(--card-title,var(--ink))]",
35
+ className
36
+ ),
37
+ ...rest,
38
+ children
39
+ }
40
+ );
41
+ }
42
+ function CardBody({ className, children, ...rest }) {
43
+ return /* @__PURE__ */ jsx("div", { className: cn("p-5 text-sm leading-relaxed text-(--ink-2)", className), ...rest, children });
44
+ }
45
+ function CardFooter({ className, children, ...rest }) {
46
+ return /* @__PURE__ */ jsx(
47
+ "div",
48
+ {
49
+ className: cn("border-t border-(--rule) px-5 py-4 mono-meta text-(--ink-3-aa)", className),
50
+ ...rest,
51
+ children
52
+ }
53
+ );
54
+ }
55
+ var Card_default = Card;
56
+ export {
57
+ Card,
58
+ CardBody,
59
+ CardFooter,
60
+ CardHeader,
61
+ CardTitle,
62
+ Card_default as default
63
+ };
64
+ //# sourceMappingURL=Card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/Card/Card.tsx"],"sourcesContent":["import type { HTMLAttributes } from 'react'\nimport { cn } from '../../lib/cn'\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * `outline` is a hairline box on the page ground — the default, and correct\n * for a card sitting among other cards. `plate` fills with the one reversed\n * surface and is for a card that IS the point of its band; use at most one\n * per screen. `flat` drops the border entirely, for a card whose grid already\n * draws the rules between cells.\n */\n variant?: 'outline' | 'plate' | 'flat'\n}\n\nconst VARIANT = {\n outline: 'border border-(--rule) bg-(--paper)',\n plate:\n 'border border-(--feature-surface) bg-(--feature-surface) text-(--on-feature) [--card-title:var(--on-feature)]',\n flat: 'border border-transparent bg-transparent',\n} as const\n\n/**\n * A bounded surface.\n *\n * No shadow, by law: depth in this system is a hairline and a change of ground,\n * never a blur. A card that needs to read as raised is a `plate`, which\n * separates by reversal instead.\n *\n * It clips to its own corner. A card that rounds and does not clip lays a\n * full-bleed image's square corners over its round ones at all four corners,\n * and the same goes for a filled first child — a defect that is invisible until\n * the first card with an image at the top of it. Pass `overflow-visible` for\n * the rarer card that deliberately overhangs.\n *\n * Compose with the named sub-parts, or drop children straight in when the card\n * has no header or footer to speak of.\n *\n * @example\n * <Card>\n * <CardHeader><CardTitle>Recent deploys</CardTitle><Badge>12</Badge></CardHeader>\n * <CardBody>…</CardBody>\n * <CardFooter>Updated just now</CardFooter>\n * </Card>\n */\nexport function Card({ variant = 'outline', className, children, ...rest }: CardProps) {\n return (\n <div className={cn('overflow-hidden rounded-(--radius-lg)', VARIANT[variant], className)} {...rest}>\n {children}\n </div>\n )\n}\n\n/** Header row — title on the left, an action or marker on the right. */\nexport function CardHeader({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\n 'flex items-center justify-between gap-4 border-b border-(--rule) px-5 py-4',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\n/**\n * The card's title, in the editorial serif.\n *\n * An `<h3>` by default, which is right inside a section with its own `<h2>` and\n * wrong nearly everywhere else — pass `as` rather than leaving a page with a\n * heading order that jumps.\n */\nexport function CardTitle({\n as: Comp = 'h3',\n className,\n children,\n ...rest\n}: HTMLAttributes<HTMLHeadingElement> & { as?: 'h2' | 'h3' | 'h4' }) {\n return (\n <Comp\n // Reads the card's own title colour rather than --ink directly. A plate\n // is a reversed surface, and a hardcoded ink title on it came out at\n // 1.25:1 — invisible, and invisible only on the one variant whose whole\n // job is to be different.\n className={cn(\n 'm-0 font-heading text-[length:var(--fs-item)] font-normal text-[var(--card-title,var(--ink))]',\n className,\n )}\n {...rest}\n >\n {children}\n </Comp>\n )\n}\n\n/** The content well. */\nexport function CardBody({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('p-5 text-sm leading-relaxed text-(--ink-2)', className)} {...rest}>\n {children}\n </div>\n )\n}\n\n/** A quiet strip for metadata or secondary actions. */\nexport function CardFooter({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('border-t border-(--rule) px-5 py-4 mono-meta text-(--ink-3-aa)', className)}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nexport default Card\n"],"mappings":"AA8CI;AA7CJ,SAAS,UAAU;AAanB,MAAM,UAAU;AAAA,EACd,SAAS;AAAA,EACT,OACE;AAAA,EACF,MAAM;AACR;AAyBO,SAAS,KAAK,EAAE,UAAU,WAAW,WAAW,UAAU,GAAG,KAAK,GAAc;AACrF,SACE,oBAAC,SAAI,WAAW,GAAG,yCAAyC,QAAQ,OAAO,GAAG,SAAS,GAAI,GAAG,MAC3F,UACH;AAEJ;AAGO,SAAS,WAAW,EAAE,WAAW,UAAU,GAAG,KAAK,GAAmC;AAC3F,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;AASO,SAAS,UAAU;AAAA,EACxB,IAAI,OAAO;AAAA,EACX;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAqE;AACnE,SACE;AAAA,IAAC;AAAA;AAAA,MAKC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;AAGO,SAAS,SAAS,EAAE,WAAW,UAAU,GAAG,KAAK,GAAmC;AACzF,SACE,oBAAC,SAAI,WAAW,GAAG,8CAA8C,SAAS,GAAI,GAAG,MAC9E,UACH;AAEJ;AAGO,SAAS,WAAW,EAAE,WAAW,UAAU,GAAG,KAAK,GAAmC;AAC3F,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,kEAAkE,SAAS;AAAA,MACxF,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;AAEA,IAAO,eAAQ;","names":[]}
@@ -0,0 +1,26 @@
1
+ import * as react from 'react';
2
+ import { ComponentProps } from 'react';
3
+ import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
4
+
5
+ type CheckboxProps = ComponentProps<typeof CheckboxPrimitive.Root>;
6
+ /**
7
+ * A choice that takes effect when the form is submitted.
8
+ *
9
+ * Supports the indeterminate state (`checked="indeterminate"`), which is what a
10
+ * "select all" header needs when only some rows are selected — a plain
11
+ * unchecked box there tells the reader the opposite of the truth. Controlled or
12
+ * not: the glyph follows the state the box is actually in, so an uncontrolled
13
+ * `defaultChecked="indeterminate"` draws the dash rather than the tick that says
14
+ * the opposite.
15
+ *
16
+ * Pair with `Field`, or wrap it in a `<label>` at the call site so the words
17
+ * beside it are part of the click target.
18
+ *
19
+ * @example
20
+ * <label className="flex items-center gap-2.5 text-sm">
21
+ * <Checkbox defaultChecked /> Subscribe to updates
22
+ * </label>
23
+ */
24
+ declare function Checkbox({ className, onCheckedChange, ...props }: CheckboxProps): react.JSX.Element;
25
+
26
+ export { Checkbox, type CheckboxProps, Checkbox as default };
@@ -0,0 +1,34 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
4
+ import { RiCheckLine, RiSubtractLine } from "@remixicon/react";
5
+ import { useState } from "react";
6
+ import { cn } from "../../lib/cn.js";
7
+ function Checkbox({ className, onCheckedChange, ...props }) {
8
+ const [uncontrolled, setUncontrolled] = useState(
9
+ props.defaultChecked ?? false
10
+ );
11
+ const state = props.checked ?? uncontrolled;
12
+ const handleChange = (next) => {
13
+ if (props.checked === void 0) setUncontrolled(next);
14
+ onCheckedChange?.(next);
15
+ };
16
+ return /* @__PURE__ */ jsx(
17
+ CheckboxPrimitive.Root,
18
+ {
19
+ onCheckedChange: handleChange,
20
+ className: cn(
21
+ "inline-flex size-[18px] shrink-0 items-center justify-center rounded-(--radius-xs) border border-(--rule-2) bg-(--paper) text-(--accent-foreground) transition-colors duration-(--duration-fast) data-[state=checked]:border-(--accent) data-[state=checked]:bg-(--accent) data-[state=indeterminate]:border-(--accent) data-[state=indeterminate]:bg-(--accent) disabled:opacity-(--disabled-opacity) disabled:pointer-events-none",
22
+ className
23
+ ),
24
+ ...props,
25
+ children: /* @__PURE__ */ jsx(CheckboxPrimitive.Indicator, { className: "flex items-center justify-center text-current", children: state === "indeterminate" ? /* @__PURE__ */ jsx(RiSubtractLine, { className: "size-3", "aria-hidden": true }) : /* @__PURE__ */ jsx(RiCheckLine, { className: "size-3", "aria-hidden": true }) })
26
+ }
27
+ );
28
+ }
29
+ var Checkbox_default = Checkbox;
30
+ export {
31
+ Checkbox,
32
+ Checkbox_default as default
33
+ };
34
+ //# sourceMappingURL=Checkbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/Checkbox/Checkbox.tsx"],"sourcesContent":["'use client'\n\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox'\nimport { RiCheckLine, RiSubtractLine } from '@remixicon/react'\nimport { useState, type ComponentProps } from 'react'\nimport { cn } from '../../lib/cn'\n\nexport type CheckboxProps = ComponentProps<typeof CheckboxPrimitive.Root>\n\n/**\n * A choice that takes effect when the form is submitted.\n *\n * Supports the indeterminate state (`checked=\"indeterminate\"`), which is what a\n * \"select all\" header needs when only some rows are selected — a plain\n * unchecked box there tells the reader the opposite of the truth. Controlled or\n * not: the glyph follows the state the box is actually in, so an uncontrolled\n * `defaultChecked=\"indeterminate\"` draws the dash rather than the tick that says\n * the opposite.\n *\n * Pair with `Field`, or wrap it in a `<label>` at the call site so the words\n * beside it are part of the click target.\n *\n * @example\n * <label className=\"flex items-center gap-2.5 text-sm\">\n * <Checkbox defaultChecked /> Subscribe to updates\n * </label>\n */\nexport function Checkbox({ className, onCheckedChange, ...props }: CheckboxProps) {\n // Tracked here rather than read off `props.checked`, which is set only by a\n // CONTROLLED box: an uncontrolled `defaultChecked=\"indeterminate\"` drew the\n // tick — the \"all of them\" picture on a partly selected list, which is the one\n // thing this state exists to avoid saying.\n const [uncontrolled, setUncontrolled] = useState<CheckboxProps['checked']>(\n props.defaultChecked ?? false,\n )\n const state = props.checked ?? uncontrolled\n\n const handleChange = (next: NonNullable<CheckboxProps['checked']>) => {\n if (props.checked === undefined) setUncontrolled(next)\n onCheckedChange?.(next)\n }\n\n return (\n <CheckboxPrimitive.Root\n onCheckedChange={handleChange}\n className={cn(\n 'inline-flex size-[18px] shrink-0 items-center justify-center rounded-(--radius-xs) border border-(--rule-2) bg-(--paper) text-(--accent-foreground) transition-colors duration-(--duration-fast) data-[state=checked]:border-(--accent) data-[state=checked]:bg-(--accent) data-[state=indeterminate]:border-(--accent) data-[state=indeterminate]:bg-(--accent) disabled:opacity-(--disabled-opacity) disabled:pointer-events-none',\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator className=\"flex items-center justify-center text-current\">\n {state === 'indeterminate' ? (\n <RiSubtractLine className=\"size-3\" aria-hidden />\n ) : (\n <RiCheckLine className=\"size-3\" aria-hidden />\n )}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n )\n}\n\nexport default Checkbox\n"],"mappings":";AAqDU;AAnDV,YAAY,uBAAuB;AACnC,SAAS,aAAa,sBAAsB;AAC5C,SAAS,gBAAqC;AAC9C,SAAS,UAAU;AAsBZ,SAAS,SAAS,EAAE,WAAW,iBAAiB,GAAG,MAAM,GAAkB;AAKhF,QAAM,CAAC,cAAc,eAAe,IAAI;AAAA,IACtC,MAAM,kBAAkB;AAAA,EAC1B;AACA,QAAM,QAAQ,MAAM,WAAW;AAE/B,QAAM,eAAe,CAAC,SAAgD;AACpE,QAAI,MAAM,YAAY,OAAW,iBAAgB,IAAI;AACrD,sBAAkB,IAAI;AAAA,EACxB;AAEA,SACE;AAAA,IAAC,kBAAkB;AAAA,IAAlB;AAAA,MACC,iBAAiB;AAAA,MACjB,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEJ,8BAAC,kBAAkB,WAAlB,EAA4B,WAAU,iDACpC,oBAAU,kBACT,oBAAC,kBAAe,WAAU,UAAS,eAAW,MAAC,IAE/C,oBAAC,eAAY,WAAU,UAAS,eAAW,MAAC,GAEhD;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,mBAAQ;","names":[]}