@giddaa-housing/ui 1.0.0 → 1.2.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 (331) hide show
  1. package/css/generated/shared.css +1 -1
  2. package/css/giddaa.css +12 -2
  3. package/dist/accordion.d.ts +9 -10
  4. package/dist/accordion.js +41 -87
  5. package/dist/activity-timeline.d.ts +12 -16
  6. package/dist/activity-timeline.js +83 -198
  7. package/dist/alert.d.ts +8 -9
  8. package/dist/alert.js +53 -111
  9. package/dist/auth-layout.d.ts +4 -4
  10. package/dist/auth-layout.js +143 -294
  11. package/dist/avatar.d.ts +6 -6
  12. package/dist/avatar.js +49 -19
  13. package/dist/badge.d.ts +12 -14
  14. package/dist/badge.js +71 -11
  15. package/dist/bar-chart.d.ts +65 -67
  16. package/dist/bar-chart.js +232 -207
  17. package/dist/breadcrumb.d.ts +5 -5
  18. package/dist/breadcrumb.js +56 -118
  19. package/dist/bullet-chart.d.ts +41 -37
  20. package/dist/bullet-chart.js +125 -148
  21. package/dist/button-BZIeyUw6.d.ts +17 -0
  22. package/dist/button-group.d.ts +13 -16
  23. package/dist/button-group.js +39 -88
  24. package/dist/button.d.ts +2 -19
  25. package/dist/button.js +94 -13
  26. package/dist/calendar.d.ts +6 -6
  27. package/dist/calendar.js +138 -17
  28. package/dist/card.d.ts +14 -16
  29. package/dist/card.js +59 -145
  30. package/dist/carousel.d.ts +34 -35
  31. package/dist/carousel.js +335 -20
  32. package/dist/chart.d.ts +90 -63
  33. package/dist/chart.js +573 -28
  34. package/dist/checkbox.d.ts +10 -12
  35. package/dist/checkbox.js +82 -47
  36. package/dist/cn-BI_4DMBf.js +23 -0
  37. package/dist/collapsible.d.ts +7 -8
  38. package/dist/collapsible.js +22 -47
  39. package/dist/combobox.d.ts +10 -10
  40. package/dist/combobox.js +236 -44
  41. package/dist/cta.d.ts +12 -14
  42. package/dist/cta.js +175 -341
  43. package/dist/currency-selector.d.ts +31 -32
  44. package/dist/currency-selector.js +106 -184
  45. package/dist/data-table.d.ts +168 -0
  46. package/dist/data-table.js +676 -0
  47. package/dist/date-picker.d.ts +22 -23
  48. package/dist/date-picker.js +119 -192
  49. package/dist/details-card.d.ts +7 -7
  50. package/dist/details-card.js +104 -253
  51. package/dist/dialog.d.ts +13 -14
  52. package/dist/dialog.js +116 -209
  53. package/dist/dropdown-menu.d.ts +13 -13
  54. package/dist/dropdown-menu.js +180 -37
  55. package/dist/dropzone.d.ts +55 -55
  56. package/dist/dropzone.js +327 -439
  57. package/dist/editorial-card.d.ts +23 -25
  58. package/dist/editorial-card.js +129 -296
  59. package/dist/empty-state.d.ts +8 -9
  60. package/dist/empty-state.js +48 -105
  61. package/dist/field.d.ts +23 -25
  62. package/dist/field.js +110 -221
  63. package/dist/filter.d.ts +118 -0
  64. package/dist/filter.js +775 -0
  65. package/dist/footer.d.ts +8 -15
  66. package/dist/footer.js +197 -400
  67. package/dist/funnel-chart.d.ts +49 -48
  68. package/dist/funnel-chart.js +170 -189
  69. package/dist/gallery-indicator.d.ts +11 -12
  70. package/dist/gallery-indicator.js +75 -12
  71. package/dist/heatmap-chart.d.ts +47 -50
  72. package/dist/heatmap-chart.js +186 -237
  73. package/dist/infotip.d.ts +8 -9
  74. package/dist/infotip.js +33 -59
  75. package/dist/input-CfoEJ8A6.d.ts +12 -0
  76. package/dist/input-group.d.ts +16 -20
  77. package/dist/input-group.js +99 -23
  78. package/dist/input-size-context-C-SFx9sx.d.ts +10 -0
  79. package/dist/input-size-context.d.ts +2 -11
  80. package/dist/input-size-context.js +17 -9
  81. package/dist/input.d.ts +2 -13
  82. package/dist/input.js +27 -11
  83. package/dist/item.d.ts +7 -8
  84. package/dist/item.js +22 -59
  85. package/dist/kpi-card.d.ts +18 -20
  86. package/dist/kpi-card.js +84 -192
  87. package/dist/label.d.ts +6 -6
  88. package/dist/label.js +40 -8
  89. package/dist/line-chart.d.ts +200 -129
  90. package/dist/line-chart.js +330 -105
  91. package/dist/list-item.d.ts +22 -0
  92. package/dist/list-item.js +84 -0
  93. package/dist/logo.d.ts +4 -4
  94. package/dist/logo.js +92 -9
  95. package/dist/map-indicator.d.ts +7 -7
  96. package/dist/map-indicator.js +80 -106
  97. package/dist/match.d.ts +10 -11
  98. package/dist/match.js +62 -107
  99. package/dist/media-gallery-hero.d.ts +40 -42
  100. package/dist/media-gallery-hero.js +182 -343
  101. package/dist/media-player.d.ts +17 -17
  102. package/dist/media-player.js +873 -1348
  103. package/dist/multi-step-form.d.ts +56 -0
  104. package/dist/multi-step-form.js +342 -0
  105. package/dist/number-input.d.ts +34 -34
  106. package/dist/number-input.js +64 -117
  107. package/dist/page-header.d.ts +10 -11
  108. package/dist/page-header.js +34 -79
  109. package/dist/pagination.d.ts +17 -21
  110. package/dist/pagination.js +132 -207
  111. package/dist/password-input.d.ts +5 -13
  112. package/dist/password-input.js +31 -55
  113. package/dist/phone-input.d.ts +19 -20
  114. package/dist/phone-input.js +226 -344
  115. package/dist/photo-gallery.d.ts +19 -19
  116. package/dist/photo-gallery.js +313 -449
  117. package/dist/picker-lzgmsNfG.js +32 -0
  118. package/dist/pie-chart.d.ts +121 -90
  119. package/dist/pie-chart.js +183 -149
  120. package/dist/popover.d.ts +9 -9
  121. package/dist/popover.js +72 -23
  122. package/dist/price-tag.d.ts +26 -27
  123. package/dist/price-tag.js +113 -173
  124. package/dist/progress.d.ts +16 -17
  125. package/dist/progress.js +169 -24
  126. package/dist/property-listing-card.d.ts +14 -17
  127. package/dist/property-listing-card.js +102 -220
  128. package/dist/purchase-option-card.d.ts +79 -0
  129. package/dist/purchase-option-card.js +176 -0
  130. package/dist/radar-chart.d.ts +29 -31
  131. package/dist/radar-chart.js +162 -137
  132. package/dist/radio-group.d.ts +11 -13
  133. package/dist/radio-group.js +46 -60
  134. package/dist/review-block.d.ts +14 -16
  135. package/dist/review-block.js +154 -10
  136. package/dist/rich-text-editor.d.ts +30 -14
  137. package/dist/rich-text-editor.js +592 -716
  138. package/dist/scatter-chart.d.ts +45 -47
  139. package/dist/scatter-chart.js +236 -240
  140. package/dist/search-input.d.ts +8 -16
  141. package/dist/search-input.js +57 -109
  142. package/dist/select.d.ts +8 -8
  143. package/dist/select.js +144 -27
  144. package/dist/separator.d.ts +8 -9
  145. package/dist/separator.js +32 -8
  146. package/dist/sheet.d.ts +11 -11
  147. package/dist/sheet.js +103 -24
  148. package/dist/sidebar.d.ts +32 -37
  149. package/dist/sidebar.js +364 -634
  150. package/dist/size-context-D4mYvcg8.d.ts +10 -0
  151. package/dist/size-context.d.ts +2 -11
  152. package/dist/size-context.js +17 -9
  153. package/dist/skeleton.d.ts +4 -5
  154. package/dist/skeleton.js +12 -8
  155. package/dist/slider.d.ts +8 -9
  156. package/dist/slider.js +64 -135
  157. package/dist/sparkline.d.ts +68 -58
  158. package/dist/sparkline.js +315 -251
  159. package/dist/stepper.d.ts +23 -24
  160. package/dist/stepper.js +149 -246
  161. package/dist/styles.css +1004 -116
  162. package/dist/switch.d.ts +10 -12
  163. package/dist/switch.js +48 -70
  164. package/dist/table-card.d.ts +35 -0
  165. package/dist/table-card.js +125 -0
  166. package/dist/table.d.ts +18 -14
  167. package/dist/table.js +117 -154
  168. package/dist/tabs.d.ts +33 -15
  169. package/dist/tabs.js +110 -18
  170. package/dist/tag.d.ts +21 -23
  171. package/dist/tag.js +103 -159
  172. package/dist/testimonial-block.d.ts +18 -19
  173. package/dist/testimonial-block.js +189 -358
  174. package/dist/textarea-IS_D8pXf.d.ts +11 -0
  175. package/dist/textarea.d.ts +2 -12
  176. package/dist/textarea.js +24 -11
  177. package/dist/time-picker.d.ts +11 -11
  178. package/dist/time-picker.js +245 -302
  179. package/dist/toast.d.ts +16 -18
  180. package/dist/toast.js +154 -205
  181. package/dist/tooltip.d.ts +8 -9
  182. package/dist/tooltip.js +37 -12
  183. package/dist/tree-map.d.ts +59 -62
  184. package/dist/tree-map.js +226 -269
  185. package/dist/use-uncontrolled-CLfM1XbB.js +21 -0
  186. package/dist/waterfall-chart.d.ts +94 -97
  187. package/dist/waterfall-chart.js +455 -552
  188. package/package.json +36 -9
  189. package/dist/accordion.js.map +0 -1
  190. package/dist/activity-timeline.js.map +0 -1
  191. package/dist/alert.js.map +0 -1
  192. package/dist/auth-layout.js.map +0 -1
  193. package/dist/avatar.js.map +0 -1
  194. package/dist/badge.js.map +0 -1
  195. package/dist/bar-chart.js.map +0 -1
  196. package/dist/breadcrumb.js.map +0 -1
  197. package/dist/bullet-chart.js.map +0 -1
  198. package/dist/button-group.js.map +0 -1
  199. package/dist/button.js.map +0 -1
  200. package/dist/calendar.js.map +0 -1
  201. package/dist/card.js.map +0 -1
  202. package/dist/carousel.js.map +0 -1
  203. package/dist/chart.js.map +0 -1
  204. package/dist/checkbox.js.map +0 -1
  205. package/dist/chunk-322YCNVL.js +0 -278
  206. package/dist/chunk-322YCNVL.js.map +0 -1
  207. package/dist/chunk-3ACQVT7A.js +0 -25
  208. package/dist/chunk-3ACQVT7A.js.map +0 -1
  209. package/dist/chunk-3T65TLJX.js +0 -334
  210. package/dist/chunk-3T65TLJX.js.map +0 -1
  211. package/dist/chunk-6ZSGQHH2.js +0 -192
  212. package/dist/chunk-6ZSGQHH2.js.map +0 -1
  213. package/dist/chunk-7TBMLFGW.js +0 -41
  214. package/dist/chunk-7TBMLFGW.js.map +0 -1
  215. package/dist/chunk-B4H6RNDH.js +0 -135
  216. package/dist/chunk-B4H6RNDH.js.map +0 -1
  217. package/dist/chunk-BUXCGZ6X.js +0 -219
  218. package/dist/chunk-BUXCGZ6X.js.map +0 -1
  219. package/dist/chunk-CHII2QHH.js +0 -58
  220. package/dist/chunk-CHII2QHH.js.map +0 -1
  221. package/dist/chunk-DMNOXRRW.js +0 -147
  222. package/dist/chunk-DMNOXRRW.js.map +0 -1
  223. package/dist/chunk-EFSOSSIC.js +0 -130
  224. package/dist/chunk-EFSOSSIC.js.map +0 -1
  225. package/dist/chunk-FZDSVMKY.js +0 -363
  226. package/dist/chunk-FZDSVMKY.js.map +0 -1
  227. package/dist/chunk-GJOFIJS3.js +0 -246
  228. package/dist/chunk-GJOFIJS3.js.map +0 -1
  229. package/dist/chunk-HL3ZSYES.js +0 -23
  230. package/dist/chunk-HL3ZSYES.js.map +0 -1
  231. package/dist/chunk-JVLUBAPB.js +0 -129
  232. package/dist/chunk-JVLUBAPB.js.map +0 -1
  233. package/dist/chunk-KDPYSOYZ.js +0 -64
  234. package/dist/chunk-KDPYSOYZ.js.map +0 -1
  235. package/dist/chunk-KSMDANKI.js +0 -43
  236. package/dist/chunk-KSMDANKI.js.map +0 -1
  237. package/dist/chunk-MEKCCOP5.js +0 -46
  238. package/dist/chunk-MEKCCOP5.js.map +0 -1
  239. package/dist/chunk-NOFXVRWL.js +0 -451
  240. package/dist/chunk-NOFXVRWL.js.map +0 -1
  241. package/dist/chunk-PC5MHNVA.js +0 -171
  242. package/dist/chunk-PC5MHNVA.js.map +0 -1
  243. package/dist/chunk-QKAQZ2GU.js +0 -122
  244. package/dist/chunk-QKAQZ2GU.js.map +0 -1
  245. package/dist/chunk-QZHSHSVV.js +0 -26
  246. package/dist/chunk-QZHSHSVV.js.map +0 -1
  247. package/dist/chunk-RBMK26XD.js +0 -19
  248. package/dist/chunk-RBMK26XD.js.map +0 -1
  249. package/dist/chunk-SFNJGF6M.js +0 -262
  250. package/dist/chunk-SFNJGF6M.js.map +0 -1
  251. package/dist/chunk-UJJNLGTM.js +0 -112
  252. package/dist/chunk-UJJNLGTM.js.map +0 -1
  253. package/dist/chunk-VGR4ZWJ3.js +0 -418
  254. package/dist/chunk-VGR4ZWJ3.js.map +0 -1
  255. package/dist/chunk-XG47P6D4.js +0 -99
  256. package/dist/chunk-XG47P6D4.js.map +0 -1
  257. package/dist/chunk-XZZAHNVM.js +0 -21
  258. package/dist/chunk-XZZAHNVM.js.map +0 -1
  259. package/dist/chunk-Y4TTYVNE.js +0 -36
  260. package/dist/chunk-Y4TTYVNE.js.map +0 -1
  261. package/dist/chunk-YDWIHW6Q.js +0 -69
  262. package/dist/chunk-YDWIHW6Q.js.map +0 -1
  263. package/dist/collapsible.js.map +0 -1
  264. package/dist/combobox.js.map +0 -1
  265. package/dist/cta.js.map +0 -1
  266. package/dist/currency-selector.js.map +0 -1
  267. package/dist/date-picker.js.map +0 -1
  268. package/dist/details-card.js.map +0 -1
  269. package/dist/dialog.js.map +0 -1
  270. package/dist/dropdown-menu.js.map +0 -1
  271. package/dist/dropzone.js.map +0 -1
  272. package/dist/editorial-card.js.map +0 -1
  273. package/dist/empty-state.js.map +0 -1
  274. package/dist/field.js.map +0 -1
  275. package/dist/footer.js.map +0 -1
  276. package/dist/funnel-chart.js.map +0 -1
  277. package/dist/gallery-indicator.js.map +0 -1
  278. package/dist/heatmap-chart.js.map +0 -1
  279. package/dist/infotip.js.map +0 -1
  280. package/dist/input-group.js.map +0 -1
  281. package/dist/input-size-context.js.map +0 -1
  282. package/dist/input.js.map +0 -1
  283. package/dist/item.js.map +0 -1
  284. package/dist/kpi-card.js.map +0 -1
  285. package/dist/label.js.map +0 -1
  286. package/dist/line-chart.js.map +0 -1
  287. package/dist/logo.js.map +0 -1
  288. package/dist/map-indicator.js.map +0 -1
  289. package/dist/match.js.map +0 -1
  290. package/dist/media-gallery-hero.js.map +0 -1
  291. package/dist/media-player.js.map +0 -1
  292. package/dist/number-input.js.map +0 -1
  293. package/dist/page-header.js.map +0 -1
  294. package/dist/pagination.js.map +0 -1
  295. package/dist/password-input.js.map +0 -1
  296. package/dist/phone-input.js.map +0 -1
  297. package/dist/photo-gallery.js.map +0 -1
  298. package/dist/pie-chart.js.map +0 -1
  299. package/dist/popover.js.map +0 -1
  300. package/dist/price-tag.js.map +0 -1
  301. package/dist/progress.js.map +0 -1
  302. package/dist/property-listing-card.js.map +0 -1
  303. package/dist/radar-chart.js.map +0 -1
  304. package/dist/radio-group.js.map +0 -1
  305. package/dist/review-block.js.map +0 -1
  306. package/dist/rich-text-editor.js.map +0 -1
  307. package/dist/scatter-chart.js.map +0 -1
  308. package/dist/search-input.js.map +0 -1
  309. package/dist/select.js.map +0 -1
  310. package/dist/separator.js.map +0 -1
  311. package/dist/sheet.js.map +0 -1
  312. package/dist/sidebar.js.map +0 -1
  313. package/dist/size-context.js.map +0 -1
  314. package/dist/skeleton.js.map +0 -1
  315. package/dist/slider.js.map +0 -1
  316. package/dist/sparkline.js.map +0 -1
  317. package/dist/stepper.js.map +0 -1
  318. package/dist/switch.js.map +0 -1
  319. package/dist/tab-list.d.ts +0 -38
  320. package/dist/tab-list.js +0 -123
  321. package/dist/tab-list.js.map +0 -1
  322. package/dist/table.js.map +0 -1
  323. package/dist/tabs.js.map +0 -1
  324. package/dist/tag.js.map +0 -1
  325. package/dist/testimonial-block.js.map +0 -1
  326. package/dist/textarea.js.map +0 -1
  327. package/dist/time-picker.js.map +0 -1
  328. package/dist/toast.js.map +0 -1
  329. package/dist/tooltip.js.map +0 -1
  330. package/dist/tree-map.js.map +0 -1
  331. package/dist/waterfall-chart.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/radar-chart.tsx"],"sourcesContent":["\"use client\";\n\nimport type * as React from \"react\";\nimport {\n\tPolarAngleAxis,\n\tPolarGrid,\n\tPolarRadiusAxis,\n\tRadar,\n\tRadarChart as RadarChartPrimitive,\n} from \"recharts\";\nimport { type ChartConfig, ChartContainer } from \"./chart\";\nimport { cn } from \"./lib/cn\";\nimport {\n\ttype ComponentSize,\n\tSizeProvider,\n\tuseComponentSize,\n} from \"./size-context\";\n\n/**\n * Radar charts are composable wrappers over the recharts polar primitives.\n * recharts 3 registers graphical items through context when they render, so —\n * unlike the recharts 2 era that shaped `bar-chart`/`line-chart` — the\n * primitives CAN be wrapped in our own components. Each wrapper bakes in the\n * giddaa defaults (tokens, size-scaled type, mark specs) and forwards every\n * recharts prop, so anything can be overridden in place or replaced with the\n * raw recharts element.\n *\n * Anatomy: `RadarChart` is the plot root (frame + responsive box + recharts\n * chart); compose the grid, axes, series, and the shared overlays from\n * `./chart` as children:\n *\n * @example\n * <ChartCard size=\"md\">\n * <ChartHeader>\n * <ChartTitle>Listing scorecard</ChartTitle>\n * <ChartDescription>How this listing scores per criterion</ChartDescription>\n * </ChartHeader>\n * <RadarChart config={config} data={data}>\n * <RadarChartGrid />\n * <RadarChartAngleAxis dataKey=\"criterion\" />\n * <ChartTooltip content={<ChartTooltipContent />} />\n * <RadarChartSeries dataKey=\"score\" name=\"This listing\" />\n * </RadarChart>\n * </ChartCard>\n */\n\n/**\n * Categorical series palette — the theme-aware `chart-1`…`chart-3` tokens\n * (each theme's steps are validated against that theme's chart surface; see\n * `styles/giddaa.css`). Assign colours in this fixed order, never cycled: a\n * fourth series folds into \"Other\" or becomes a second chart.\n */\nconst RADAR_CHART_PALETTE = [\n\t\"var(--color-chart-1)\",\n\t\"var(--color-chart-2)\",\n\t\"var(--color-chart-3)\",\n] as const;\n\nconst DEFAULT_SERIES_COLOR = RADAR_CHART_PALETTE[0];\n\ntype RadarChartLayout = {\n\t/** Plot height in px. Width stays fluid via the ResponsiveContainer. */\n\theight: number;\n\t/** Category (angle) and value (radius) tick label font size. */\n\ttickFontSize: number;\n\t/** Series outline stroke width in px. */\n\tstrokeWidth: number;\n\t/** Radius of the resting data-point dot. */\n\tdotRadius: number;\n\t/** Radius of the active (hover) dot. */\n\tactiveDotRadius: number;\n};\n\nconst RADAR_CHART_LAYOUT: Record<ComponentSize, RadarChartLayout> = {\n\tsm: {\n\t\theight: 180,\n\t\ttickFontSize: 10,\n\t\tstrokeWidth: 2,\n\t\tdotRadius: 2.5,\n\t\tactiveDotRadius: 4,\n\t},\n\tmd: {\n\t\theight: 240,\n\t\ttickFontSize: 11,\n\t\tstrokeWidth: 2,\n\t\tdotRadius: 3,\n\t\tactiveDotRadius: 4.5,\n\t},\n\tlg: {\n\t\theight: 300,\n\t\ttickFontSize: 12,\n\t\tstrokeWidth: 2,\n\t\tdotRadius: 3.5,\n\t\tactiveDotRadius: 5,\n\t},\n};\n\ntype RadarChartProps = Omit<\n\tReact.ComponentProps<typeof RadarChartPrimitive>,\n\t\"width\" | \"height\"\n> & {\n\t/** Series labels/icons for the shared tooltip and legend (see `ChartConfig`). */\n\tconfig?: ChartConfig;\n\t/** Plot scale; inherited from the nearest `SizeProvider` when omitted. */\n\tsize?: ComponentSize;\n\t/** Applied to the responsive plot box, e.g. to override its height. */\n\tclassName?: string;\n};\n\n/**\n * Plot root — wraps the shared `ChartContainer` (tooltip/legend theming,\n * responsive box) around the recharts `RadarChart` with a size-scaled height.\n * `size` also flows to the child primitives through `SizeProvider`. Extra\n * props reach the recharts chart (`outerRadius`, `startAngle`, `margin`, …).\n */\nfunction RadarChart({\n\tconfig = {},\n\tsize,\n\tclassName,\n\tchildren,\n\t...props\n}: RadarChartProps) {\n\tconst resolvedSize = useComponentSize(size);\n\tconst layout = RADAR_CHART_LAYOUT[resolvedSize];\n\n\treturn (\n\t\t<SizeProvider size={resolvedSize}>\n\t\t\t<ChartContainer\n\t\t\t\tconfig={config}\n\t\t\t\tclassName={cn(\"aspect-auto w-full\", className)}\n\t\t\t\tstyle={{ height: layout.height }}\n\t\t\t>\n\t\t\t\t<RadarChartPrimitive accessibilityLayer {...props}>\n\t\t\t\t\t{children}\n\t\t\t\t</RadarChartPrimitive>\n\t\t\t</ChartContainer>\n\t\t</SizeProvider>\n\t);\n}\n\n/**\n * Polygon web behind the series — recharts `PolarGrid` on the recessive\n * `line` token (`line-subtle` matches the ChartCard surface in both themes,\n * so it would vanish). Pass `gridType=\"circle\"` for rings or\n * `radialLines={false}` to keep only the concentric outlines.\n */\nfunction RadarChartGrid(props: React.ComponentProps<typeof PolarGrid>) {\n\treturn <PolarGrid stroke=\"var(--color-line)\" {...props} />;\n}\n\n/**\n * Category labels around the rim — recharts `PolarAngleAxis` with no tick\n * lines and size-scaled secondary-ink labels. Passing your own `tick`\n * replaces the default styling entirely.\n */\nfunction RadarChartAngleAxis({\n\tsize,\n\ttick,\n\t...props\n}: React.ComponentProps<typeof PolarAngleAxis> & { size?: ComponentSize }) {\n\tconst layout = RADAR_CHART_LAYOUT[useComponentSize(size)];\n\tconst defaultTick = {\n\t\tfontSize: layout.tickFontSize,\n\t\tfill: \"var(--color-fg-secondary)\",\n\t};\n\n\treturn (\n\t\t<PolarAngleAxis tickLine={false} tick={tick ?? defaultTick} {...props} />\n\t);\n}\n\n/**\n * Value scale along one spoke — recharts `PolarRadiusAxis`, muted and\n * line-free. Radars are usually read comparatively, so this is opt-in;\n * include it (often with an explicit `domain={[0, max]}`) when the absolute\n * scale matters. If the tick labels collide with a category label, move the\n * scale between two spokes with `angle`.\n */\nfunction RadarChartValueAxis({\n\tsize,\n\ttick,\n\t...props\n}: React.ComponentProps<typeof PolarRadiusAxis> & { size?: ComponentSize }) {\n\tconst layout = RADAR_CHART_LAYOUT[useComponentSize(size)];\n\tconst defaultTick = {\n\t\tfontSize: layout.tickFontSize,\n\t\tfill: \"var(--color-fg-caption-placeholder)\",\n\t};\n\n\treturn (\n\t\t<PolarRadiusAxis\n\t\t\taxisLine={false}\n\t\t\ttickLine={false}\n\t\t\ttick={tick ?? defaultTick}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\ntype RadarChartSeriesProps = React.ComponentProps<typeof Radar> & {\n\t/** Series colour for the outline, wash, and dots. Defaults to brand. */\n\tcolor?: string;\n\t/** Explicit mark scale; otherwise inherited from the chart's `size`. */\n\tsize?: ComponentSize;\n};\n\n/**\n * One data series — recharts `Radar` with the giddaa mark spec: a 2px outline,\n * the series colour washed to 15% inside the shape (matches the line-chart\n * area wash), solid resting dots, and a hover dot ringed in `surface-raised`\n * so overlapping series stay separable. `color` drives all of them at once;\n * `stroke`/`fill`/`dot` still win when passed directly.\n */\nfunction RadarChartSeries({\n\tcolor = DEFAULT_SERIES_COLOR,\n\tsize,\n\tdot,\n\tactiveDot,\n\t...props\n}: RadarChartSeriesProps) {\n\tconst layout = RADAR_CHART_LAYOUT[useComponentSize(size)];\n\tconst defaultDot = {\n\t\tr: layout.dotRadius,\n\t\tfill: color,\n\t\tfillOpacity: 1,\n\t\tstrokeWidth: 0,\n\t};\n\tconst defaultActiveDot = {\n\t\tr: layout.activeDotRadius,\n\t\tfill: color,\n\t\tstroke: \"var(--color-surface-raised)\",\n\t\tstrokeWidth: 2,\n\t};\n\n\treturn (\n\t\t<Radar\n\t\t\tstroke={color}\n\t\t\tfill={color}\n\t\t\tfillOpacity={0.15}\n\t\t\tstrokeWidth={layout.strokeWidth}\n\t\t\tdot={dot ?? defaultDot}\n\t\t\tactiveDot={activeDot ?? defaultActiveDot}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tRADAR_CHART_LAYOUT,\n\tRADAR_CHART_PALETTE,\n\tRadarChart,\n\tRadarChartAngleAxis,\n\tRadarChartGrid,\n\tRadarChartSeries,\n\tRadarChartValueAxis,\n};\nexport type { RadarChartLayout, RadarChartProps, RadarChartSeriesProps };\n"],"mappings":";;;;;;;;;;;;;AAGA;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,OACR;AA2HH;AAhFJ,IAAM,sBAAsB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACD;AAEA,IAAM,uBAAuB,oBAAoB,CAAC;AAelD,IAAM,qBAA8D;AAAA,EACnE,IAAI;AAAA,IACH,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,aAAa;AAAA,IACb,WAAW;AAAA,IACX,iBAAiB;AAAA,EAClB;AAAA,EACA,IAAI;AAAA,IACH,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,aAAa;AAAA,IACb,WAAW;AAAA,IACX,iBAAiB;AAAA,EAClB;AAAA,EACA,IAAI;AAAA,IACH,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,aAAa;AAAA,IACb,WAAW;AAAA,IACX,iBAAiB;AAAA,EAClB;AACD;AAoBA,SAAS,WAAW;AAAA,EACnB,SAAS,CAAC;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAAoB;AACnB,QAAM,eAAe,iBAAiB,IAAI;AAC1C,QAAM,SAAS,mBAAmB,YAAY;AAE9C,SACC,oBAAC,gBAAa,MAAM,cACnB;AAAA,IAAC;AAAA;AAAA,MACA;AAAA,MACA,WAAW,GAAG,sBAAsB,SAAS;AAAA,MAC7C,OAAO,EAAE,QAAQ,OAAO,OAAO;AAAA,MAE/B,8BAAC,uBAAoB,oBAAkB,MAAE,GAAG,OAC1C,UACF;AAAA;AAAA,EACD,GACD;AAEF;AAQA,SAAS,eAAe,OAA+C;AACtE,SAAO,oBAAC,aAAU,QAAO,qBAAqB,GAAG,OAAO;AACzD;AAOA,SAAS,oBAAoB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAA2E;AAC1E,QAAM,SAAS,mBAAmB,iBAAiB,IAAI,CAAC;AACxD,QAAM,cAAc;AAAA,IACnB,UAAU,OAAO;AAAA,IACjB,MAAM;AAAA,EACP;AAEA,SACC,oBAAC,kBAAe,UAAU,OAAO,MAAM,QAAQ,aAAc,GAAG,OAAO;AAEzE;AASA,SAAS,oBAAoB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAA4E;AAC3E,QAAM,SAAS,mBAAmB,iBAAiB,IAAI,CAAC;AACxD,QAAM,cAAc;AAAA,IACnB,UAAU,OAAO;AAAA,IACjB,MAAM;AAAA,EACP;AAEA,SACC;AAAA,IAAC;AAAA;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,MACV,MAAM,QAAQ;AAAA,MACb,GAAG;AAAA;AAAA,EACL;AAEF;AAgBA,SAAS,iBAAiB;AAAA,EACzB,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAA0B;AACzB,QAAM,SAAS,mBAAmB,iBAAiB,IAAI,CAAC;AACxD,QAAM,aAAa;AAAA,IAClB,GAAG,OAAO;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,EACd;AACA,QAAM,mBAAmB;AAAA,IACxB,GAAG,OAAO;AAAA,IACV,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,aAAa;AAAA,EACd;AAEA,SACC;AAAA,IAAC;AAAA;AAAA,MACA,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa,OAAO;AAAA,MACpB,KAAK,OAAO;AAAA,MACZ,WAAW,aAAa;AAAA,MACvB,GAAG;AAAA;AAAA,EACL;AAEF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/radio-group.tsx"],"sourcesContent":["\"use client\";\n\nimport { Radio as RadioPrimitive } from \"@base-ui/react/radio\";\nimport { RadioGroup as RadioGroupPrimitive } from \"@base-ui/react/radio-group\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"./lib/cn\";\nimport { useComponentSize } from \"./size-context\";\n\nfunction RadioGroup({ className, ...props }: RadioGroupPrimitive.Props) {\n\treturn (\n\t\t<RadioGroupPrimitive\n\t\t\tdata-slot=\"radio-group\"\n\t\t\tclassName={cn(\"grid w-full gap-2\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nconst radioVariants = cva(\n\t\"group/radio-group-item peer relative flex aspect-square shrink-0 rounded-full border-2 bg-transparent text-transparent outline-none transition-[background-color,border-color,box-shadow,color] after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-line-focus focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)] aria-invalid:border-line-danger aria-invalid:ring-3 aria-invalid:ring-destructive/20 border-line-strong data-checked:border-action-primary data-checked:text-action-primary data-disabled:cursor-not-allowed data-disabled:border-line-subtle data-disabled:bg-surface data-disabled:text-fg-caption-placeholder size-5 [--radio-dot-size:0.75rem] group-data-[size=sm]/field:size-4 group-data-[size=sm]/field:[--radio-dot-size:0.625rem] group-data-[size=md]/field:size-5 group-data-[size=md]/field:[--radio-dot-size:0.75rem] group-data-[size=lg]/field:size-6 group-data-[size=lg]/field:[--radio-dot-size:0.875rem]\",\n\t{\n\t\tvariants: {\n\t\t\tsize: {\n\t\t\t\tsm: \"size-4 [--radio-dot-size:0.625rem]\",\n\t\t\t\tmd: \"size-5 [--radio-dot-size:0.75rem]\",\n\t\t\t\tlg: \"size-6 [--radio-dot-size:0.875rem]\",\n\t\t\t},\n\t\t},\n\t},\n);\n\ntype RadioGroupItemSize = NonNullable<\n\tVariantProps<typeof radioVariants>[\"size\"]\n>;\ntype RadioGroupItemProps<Value = unknown> = RadioPrimitive.Root.Props<Value> & {\n\tsize?: RadioGroupItemSize;\n};\n\n/**\n * Compose each radio item with the shared field primitives.\n *\n * ```tsx\n * <RadioGroup defaultValue=\"option-1\">\n * <Field orientation=\"horizontal\" size=\"md\">\n * <RadioGroupItem id=\"option-1\" value=\"option-1\" />\n * <FieldContent>\n * <FieldLabel htmlFor=\"option-1\">Radio label</FieldLabel>\n * <FieldDescription>Optional helper description for context.</FieldDescription>\n * </FieldContent>\n * </Field>\n * </RadioGroup>\n * ```\n */\nfunction RadioGroupItem<Value = unknown>({\n\tclassName,\n\tsize,\n\t...props\n}: RadioGroupItemProps<Value>) {\n\tconst resolvedSize = useComponentSize(size);\n\n\treturn (\n\t\t<RadioPrimitive.Root\n\t\t\tdata-slot=\"radio-group-item\"\n\t\t\tdata-size={resolvedSize}\n\t\t\tclassName={cn(radioVariants({ size: resolvedSize }), className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<RadioPrimitive.Indicator\n\t\t\t\tdata-slot=\"radio-group-indicator\"\n\t\t\t\tclassName=\"flex size-full items-center justify-center\"\n\t\t\t>\n\t\t\t\t<span className=\"absolute top-1/2 left-1/2 size-(--radio-dot-size) -translate-x-1/2 -translate-y-1/2 rounded-full bg-current\" />\n\t\t\t</RadioPrimitive.Indicator>\n\t\t</RadioPrimitive.Root>\n\t);\n}\n\nexport { RadioGroup, RadioGroupItem, radioVariants };\n"],"mappings":";;;;;;;;;AAEA,SAAS,SAAS,sBAAsB;AACxC,SAAS,cAAc,2BAA2B;AAClD,SAAS,WAA8B;AAOrC;AAFF,SAAS,WAAW,EAAE,WAAW,GAAG,MAAM,GAA8B;AACvE,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW,GAAG,qBAAqB,SAAS;AAAA,MAC3C,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,IAAM,gBAAgB;AAAA,EACrB;AAAA,EACA;AAAA,IACC,UAAU;AAAA,MACT,MAAM;AAAA,QACL,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACL;AAAA,IACD;AAAA,EACD;AACD;AAwBA,SAAS,eAAgC;AAAA,EACxC;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAA+B;AAC9B,QAAM,eAAe,iBAAiB,IAAI;AAE1C,SACC;AAAA,IAAC,eAAe;AAAA,IAAf;AAAA,MACA,aAAU;AAAA,MACV,aAAW;AAAA,MACX,WAAW,GAAG,cAAc,EAAE,MAAM,aAAa,CAAC,GAAG,SAAS;AAAA,MAC7D,GAAG;AAAA,MAEJ;AAAA,QAAC,eAAe;AAAA,QAAf;AAAA,UACA,aAAU;AAAA,UACV,WAAU;AAAA,UAEV,8BAAC,UAAK,WAAU,+GAA8G;AAAA;AAAA,MAC/H;AAAA;AAAA,EACD;AAEF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/rich-text-editor.tsx"],"sourcesContent":["\"use client\";\n\nimport { Color } from \"@tiptap/extension-color\";\nimport { Image } from \"@tiptap/extension-image\";\nimport { Placeholder } from \"@tiptap/extension-placeholder\";\nimport { TextAlign } from \"@tiptap/extension-text-align\";\nimport { TextStyle } from \"@tiptap/extension-text-style\";\nimport { EditorContent, useEditor, useEditorState } from \"@tiptap/react\";\nimport { StarterKit } from \"@tiptap/starter-kit\";\nimport {\n\tAlignCenter,\n\tAlignJustify,\n\tAlignLeft,\n\tAlignRight,\n\tBaseline,\n\tBold,\n\tChevronDown,\n\tCode2,\n\tImageIcon,\n\tItalic,\n\tLink2,\n\tList,\n\tListOrdered,\n\tQuote,\n\tRedo2,\n\tUnderline,\n\tUndo2,\n} from \"lucide-react\";\nimport * as React from \"react\";\nimport { Button } from \"./button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuRadioGroup,\n\tDropdownMenuRadioItem,\n\tDropdownMenuTrigger,\n} from \"./dropdown-menu\";\nimport { Input } from \"./input\";\nimport { cn } from \"./lib/cn\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\nimport { type ComponentSize, useComponentSize } from \"./size-context\";\n\n// ─── Size configuration ───────────────────────────────────────────────────────\n// Toolbar density, text scale and padding step together across the three sizes.\n\ninterface SizeTokens {\n\twidth: string;\n\tcontent: string;\n\tcontentPad: string;\n\ttext: string;\n\ticon: string;\n\tbutton: string;\n\ttoolbarPad: string;\n\ttoolbarGap: string;\n\tdivider: string;\n}\n\nconst SIZES: Record<ComponentSize, SizeTokens> = {\n\tsm: {\n\t\twidth: \"max-w-[420px]\",\n\t\tcontent: \"min-h-[140px]\",\n\t\tcontentPad: \"px-4 py-3\",\n\t\ttext: \"text-gdt-xs\",\n\t\ticon: \"[&_svg:not([class*='size-'])]:size-3.5\",\n\t\tbutton: \"h-7 min-w-7 px-1\",\n\t\ttoolbarPad: \"px-2 py-1.5\",\n\t\ttoolbarGap: \"gap-0.5\",\n\t\tdivider: \"h-4\",\n\t},\n\tmd: {\n\t\twidth: \"max-w-[520px]\",\n\t\tcontent: \"min-h-[172px]\",\n\t\tcontentPad: \"px-5 py-4\",\n\t\ttext: \"text-gdt-sm\",\n\t\ticon: \"[&_svg:not([class*='size-'])]:size-4\",\n\t\tbutton: \"h-8 min-w-8 px-1.5\",\n\t\ttoolbarPad: \"px-2.5 py-2\",\n\t\ttoolbarGap: \"gap-0.5\",\n\t\tdivider: \"h-5\",\n\t},\n\tlg: {\n\t\twidth: \"max-w-[600px]\",\n\t\tcontent: \"min-h-[206px]\",\n\t\tcontentPad: \"px-6 py-5\",\n\t\ttext: \"text-gdt-md\",\n\t\ticon: \"[&_svg:not([class*='size-'])]:size-[18px]\",\n\t\tbutton: \"h-9 min-w-9 px-2\",\n\t\ttoolbarPad: \"px-3 py-2.5\",\n\t\ttoolbarGap: \"gap-1\",\n\t\tdivider: \"h-6\",\n\t},\n};\n\n// Text-colour swatches. The first entry clears any applied colour.\nconst TEXT_COLORS = [\n\t{ label: \"Default\", value: \"\", swatch: \"\" },\n\t{ label: \"Forest\", value: \"#2f5a2c\", swatch: \"var(--color-forest-500)\" },\n\t{ label: \"Brass\", value: \"#b8861a\", swatch: \"var(--color-brass-400)\" },\n\t{ label: \"Clay\", value: \"#b2542b\", swatch: \"var(--color-clay-500)\" },\n\t{ label: \"Moss\", value: \"#4e4d29\", swatch: \"var(--color-moss-500)\" },\n\t{ label: \"Stone\", value: \"#5c5648\", swatch: \"var(--color-stone-600)\" },\n\t{ label: \"Ink\", value: \"#1f1c18\", swatch: \"var(--color-stone-900)\" },\n] as const;\n\nconst BLOCK_OPTIONS = [\n\t{ value: \"paragraph\", label: \"Normal\" },\n\t{ value: \"h1\", label: \"Heading 1\" },\n\t{ value: \"h2\", label: \"Heading 2\" },\n\t{ value: \"h3\", label: \"Heading 3\" },\n] as const;\n\ntype BlockValue = (typeof BLOCK_OPTIONS)[number][\"value\"];\ntype AlignValue = \"left\" | \"center\" | \"right\" | \"justify\";\n\n// ─── Shared toolbar primitives ──────────────────────────────────────────────────\n\nfunction toolbarControlClass(tokens: SizeTokens, active?: boolean) {\n\treturn cn(\n\t\t\"inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md font-medium text-fg-secondary outline-none transition-colors select-none\",\n\t\t\"hover:bg-action-tertiary-hover hover:text-fg-primary\",\n\t\t\"focus-visible:ring-2 focus-visible:ring-line-focus\",\n\t\t\"disabled:pointer-events-none disabled:opacity-40 data-disabled:pointer-events-none data-disabled:opacity-40\",\n\t\ttokens.button,\n\t\ttokens.icon,\n\t\ttokens.text,\n\t\tactive &&\n\t\t\t\"bg-action-primary text-fg-on-brand hover:bg-action-primary-hover hover:text-fg-on-brand\",\n\t);\n}\n\ninterface ToolbarButtonProps {\n\ttokens: SizeTokens;\n\tlabel: string;\n\tactive?: boolean;\n\tdisabled?: boolean;\n\tonClick: () => void;\n\tchildren: React.ReactNode;\n}\n\nfunction ToolbarButton({\n\ttokens,\n\tlabel,\n\tactive,\n\tdisabled,\n\tonClick,\n\tchildren,\n}: ToolbarButtonProps) {\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\taria-label={label}\n\t\t\ttitle={label}\n\t\t\taria-pressed={active}\n\t\t\tdisabled={disabled}\n\t\t\t// Keep the editor selection intact when interacting with the toolbar.\n\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\tonClick={onClick}\n\t\t\tclassName={toolbarControlClass(tokens, active)}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t);\n}\n\nfunction ToolbarDivider({ tokens }: { tokens: SizeTokens }) {\n\treturn (\n\t\t<span\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={cn(\"mx-1 w-px shrink-0 self-center bg-line\", tokens.divider)}\n\t\t/>\n\t);\n}\n\n// ─── Block / heading select ──────────────────────────────────────────────────────\n\nfunction BlockControl({\n\ttokens,\n\tvalue,\n\tdisabled,\n\tonChange,\n}: {\n\ttokens: SizeTokens;\n\tvalue: BlockValue;\n\tdisabled?: boolean;\n\tonChange: (value: BlockValue) => void;\n}) {\n\tconst current = BLOCK_OPTIONS.find((option) => option.value === value);\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t{/* No mousedown-preventDefault here: base-ui menus track the pointer\n\t\t\t press, and cancelling it strands the popup's inert backdrop. The\n\t\t\t block commands re-focus the editor themselves. */}\n\t\t\t<DropdownMenuTrigger\n\t\t\t\tdisabled={disabled}\n\t\t\t\tclassName={cn(\n\t\t\t\t\ttoolbarControlClass(tokens),\n\t\t\t\t\t\"w-auto justify-between gap-1 px-2\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<span className=\"whitespace-nowrap\">{current?.label ?? \"Normal\"}</span>\n\t\t\t\t<ChevronDown className=\"size-3.5 opacity-70\" />\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent className=\"min-w-40\">\n\t\t\t\t<DropdownMenuRadioGroup\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonValueChange={(next) => onChange(next as BlockValue)}\n\t\t\t\t>\n\t\t\t\t\t{BLOCK_OPTIONS.map((option) => (\n\t\t\t\t\t\t// closeOnClick: radio items keep the menu open by default, which\n\t\t\t\t\t\t// leaves the popup backdrop blocking the toolbar after a pick.\n\t\t\t\t\t\t<DropdownMenuRadioItem\n\t\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t\tvalue={option.value}\n\t\t\t\t\t\t\tcloseOnClick\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t</DropdownMenuRadioItem>\n\t\t\t\t\t))}\n\t\t\t\t</DropdownMenuRadioGroup>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n\n// ─── Text-colour popover ─────────────────────────────────────────────────────────\n\nfunction ColorControl({\n\ttokens,\n\tvalue,\n\tdisabled,\n\tonChange,\n}: {\n\ttokens: SizeTokens;\n\tvalue: string;\n\tdisabled?: boolean;\n\tonChange: (value: string) => void;\n}) {\n\tconst [open, setOpen] = React.useState(false);\n\tconst active = value !== \"\";\n\n\treturn (\n\t\t<Popover open={open} onOpenChange={setOpen}>\n\t\t\t<PopoverTrigger\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-label=\"Text colour\"\n\t\t\t\ttitle=\"Text colour\"\n\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\tclassName={toolbarControlClass(tokens, false)}\n\t\t\t>\n\t\t\t\t<span className=\"relative inline-flex flex-col items-center\">\n\t\t\t\t\t<Baseline className={active ? \"text-fg-brand\" : undefined} />\n\t\t\t\t\t<span\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tclassName=\"mt-px h-0.5 w-3 rounded-full\"\n\t\t\t\t\t\tstyle={{ backgroundColor: active ? value : \"currentColor\" }}\n\t\t\t\t\t/>\n\t\t\t\t</span>\n\t\t\t</PopoverTrigger>\n\t\t\t<PopoverContent\n\t\t\t\tshowArrow={false}\n\t\t\t\talign=\"start\"\n\t\t\t\tsideOffset={8}\n\t\t\t\tclassName=\"w-auto py-3\"\n\t\t\t>\n\t\t\t\t<div className=\"grid grid-cols-4 gap-2 px-4\">\n\t\t\t\t\t{TEXT_COLORS.map((color) => {\n\t\t\t\t\t\tconst isSelected = color.value === value;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tkey={color.label}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\ttitle={color.label}\n\t\t\t\t\t\t\t\taria-label={color.label}\n\t\t\t\t\t\t\t\taria-pressed={isSelected}\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\tonChange(color.value);\n\t\t\t\t\t\t\t\t\tsetOpen(false);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"flex size-7 items-center justify-center rounded-full border transition-[box-shadow,border-color] outline-none\",\n\t\t\t\t\t\t\t\t\t\"hover:border-line-strong focus-visible:ring-2 focus-visible:ring-line-focus\",\n\t\t\t\t\t\t\t\t\tisSelected\n\t\t\t\t\t\t\t\t\t\t? \"border-line-focus ring-2 ring-line-focus/40\"\n\t\t\t\t\t\t\t\t\t\t: \"border-line\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"flex size-5 items-center justify-center rounded-full text-gdt-xs font-bold\",\n\t\t\t\t\t\t\t\t\t\tcolor.value === \"\" && \"text-fg-secondary\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\t\t\tcolor.value\n\t\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\t\tbackgroundColor: color.swatch,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: \"var(--color-stone-0, #fff)\",\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tA\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n\n// ─── Link popover ────────────────────────────────────────────────────────────────\n\nfunction LinkControl({\n\ttokens,\n\tactive,\n\tcurrentHref,\n\tdisabled,\n\tonApply,\n\tonRemove,\n}: {\n\ttokens: SizeTokens;\n\tactive: boolean;\n\tcurrentHref: string;\n\tdisabled?: boolean;\n\tonApply: (href: string) => void;\n\tonRemove: () => void;\n}) {\n\tconst [open, setOpen] = React.useState(false);\n\tconst [href, setHref] = React.useState(\"\");\n\n\tfunction handleOpenChange(next: boolean) {\n\t\tif (next) setHref(currentHref);\n\t\tsetOpen(next);\n\t}\n\n\tfunction handleSubmit(event: React.FormEvent) {\n\t\tevent.preventDefault();\n\t\tconst trimmed = href.trim();\n\t\tif (trimmed) onApply(trimmed);\n\t\telse onRemove();\n\t\tsetOpen(false);\n\t}\n\n\treturn (\n\t\t<Popover open={open} onOpenChange={handleOpenChange}>\n\t\t\t<PopoverTrigger\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-label=\"Insert link\"\n\t\t\t\ttitle=\"Insert link\"\n\t\t\t\taria-pressed={active}\n\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\tclassName={toolbarControlClass(tokens, active)}\n\t\t\t>\n\t\t\t\t<Link2 />\n\t\t\t</PopoverTrigger>\n\t\t\t<PopoverContent showArrow={false} align=\"start\" sideOffset={8}>\n\t\t\t\t<form className=\"flex flex-col gap-3 px-4\" onSubmit={handleSubmit}>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\ttype=\"url\"\n\t\t\t\t\t\tplaceholder=\"https://example.com\"\n\t\t\t\t\t\tvalue={href}\n\t\t\t\t\t\tonChange={(event) => setHref(event.target.value)}\n\t\t\t\t\t/>\n\t\t\t\t\t<div className=\"flex items-center justify-between gap-2\">\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tvariant=\"tertiary-outline\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tdisabled={!active}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tonRemove();\n\t\t\t\t\t\t\t\tsetOpen(false);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tRemove\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button type=\"submit\" size=\"sm\">\n\t\t\t\t\t\t\tApply\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t</form>\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n\n// ─── Image popover ───────────────────────────────────────────────────────────────\n\nfunction ImageControl({\n\ttokens,\n\tdisabled,\n\tonInsert,\n}: {\n\ttokens: SizeTokens;\n\tdisabled?: boolean;\n\tonInsert: (src: string) => void;\n}) {\n\tconst [open, setOpen] = React.useState(false);\n\tconst [src, setSrc] = React.useState(\"\");\n\n\tfunction handleOpenChange(next: boolean) {\n\t\tif (next) setSrc(\"\");\n\t\tsetOpen(next);\n\t}\n\n\tfunction handleSubmit(event: React.FormEvent) {\n\t\tevent.preventDefault();\n\t\tconst trimmed = src.trim();\n\t\tif (trimmed) onInsert(trimmed);\n\t\tsetOpen(false);\n\t}\n\n\treturn (\n\t\t<Popover open={open} onOpenChange={handleOpenChange}>\n\t\t\t<PopoverTrigger\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-label=\"Insert image\"\n\t\t\t\ttitle=\"Insert image\"\n\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\tclassName={toolbarControlClass(tokens, false)}\n\t\t\t>\n\t\t\t\t<ImageIcon />\n\t\t\t</PopoverTrigger>\n\t\t\t<PopoverContent showArrow={false} align=\"start\" sideOffset={8}>\n\t\t\t\t<form className=\"flex flex-col gap-3 px-4\" onSubmit={handleSubmit}>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\ttype=\"url\"\n\t\t\t\t\t\tplaceholder=\"https://example.com/image.jpg\"\n\t\t\t\t\t\tvalue={src}\n\t\t\t\t\t\tonChange={(event) => setSrc(event.target.value)}\n\t\t\t\t\t/>\n\t\t\t\t\t<div className=\"flex items-center justify-end\">\n\t\t\t\t\t\t<Button type=\"submit\" size=\"sm\" disabled={!src.trim()}>\n\t\t\t\t\t\t\tInsert\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t</form>\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n\n// ─── Alignment dropdown ──────────────────────────────────────────────────────────\n\nconst ALIGN_OPTIONS = [\n\t{ value: \"left\", label: \"Left\", Icon: AlignLeft },\n\t{ value: \"center\", label: \"Center\", Icon: AlignCenter },\n\t{ value: \"right\", label: \"Right\", Icon: AlignRight },\n\t{ value: \"justify\", label: \"Justify\", Icon: AlignJustify },\n] as const;\n\nfunction AlignControl({\n\ttokens,\n\tvalue,\n\tdisabled,\n\tonChange,\n}: {\n\ttokens: SizeTokens;\n\tvalue: AlignValue;\n\tdisabled?: boolean;\n\tonChange: (value: AlignValue) => void;\n}) {\n\tconst current = ALIGN_OPTIONS.find((option) => option.value === value);\n\tconst Icon = current?.Icon ?? AlignLeft;\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-label=\"Text alignment\"\n\t\t\t\ttitle=\"Text alignment\"\n\t\t\t\tclassName={toolbarControlClass(tokens, value !== \"left\")}\n\t\t\t>\n\t\t\t\t<Icon />\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent className=\"min-w-36\">\n\t\t\t\t<DropdownMenuRadioGroup\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonValueChange={(next) => onChange(next as AlignValue)}\n\t\t\t\t>\n\t\t\t\t\t{ALIGN_OPTIONS.map(\n\t\t\t\t\t\t({ value: optionValue, label, Icon: OptionIcon }) => (\n\t\t\t\t\t\t\t<DropdownMenuRadioItem\n\t\t\t\t\t\t\t\tkey={optionValue}\n\t\t\t\t\t\t\t\tvalue={optionValue}\n\t\t\t\t\t\t\t\tcloseOnClick\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<OptionIcon />\n\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t</DropdownMenuRadioItem>\n\t\t\t\t\t\t),\n\t\t\t\t\t)}\n\t\t\t\t</DropdownMenuRadioGroup>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n\n// ─── RichTextEditor ──────────────────────────────────────────────────────────────\n\ninterface RichTextEditorProps {\n\tvalue?: string;\n\tdefaultValue?: string;\n\tonChange?: (html: string) => void;\n\tsize?: ComponentSize;\n\tplaceholder?: string;\n\tdisabled?: boolean;\n\tclassName?: string;\n\t\"aria-label\"?: string;\n}\n\nconst EMPTY_STATE = {\n\tblock: \"paragraph\" as BlockValue,\n\talign: \"left\" as AlignValue,\n\tcolor: \"\",\n\tlinkHref: \"\",\n\tisBold: false,\n\tisItalic: false,\n\tisUnderline: false,\n\tisBulletList: false,\n\tisOrderedList: false,\n\tisBlockquote: false,\n\tisCodeBlock: false,\n\tisLink: false,\n\tcanUndo: false,\n\tcanRedo: false,\n};\n\nfunction RichTextEditor({\n\tvalue,\n\tdefaultValue,\n\tonChange,\n\tsize,\n\tplaceholder = \"Start writing, or paste your content here. Format text and add lists, links, and images using the toolbar above.\",\n\tdisabled = false,\n\tclassName,\n\t\"aria-label\": ariaLabel = \"Rich text editor\",\n}: RichTextEditorProps) {\n\tconst resolvedSize = useComponentSize(size);\n\tconst tokens = SIZES[resolvedSize];\n\tconst [focused, setFocused] = React.useState(false);\n\n\tconst editor = useEditor({\n\t\timmediatelyRender: false,\n\t\teditable: !disabled,\n\t\tcontent: value ?? defaultValue ?? \"\",\n\t\textensions: [\n\t\t\tStarterKit.configure({\n\t\t\t\tlink: {\n\t\t\t\t\topenOnClick: false,\n\t\t\t\t\tHTMLAttributes: { rel: \"noopener noreferrer nofollow\" },\n\t\t\t\t},\n\t\t\t}),\n\t\t\tTextStyle,\n\t\t\tColor,\n\t\t\tTextAlign.configure({ types: [\"heading\", \"paragraph\"] }),\n\t\t\tImage.configure({ inline: false, allowBase64: true }),\n\t\t\tPlaceholder.configure({ placeholder }),\n\t\t],\n\t\teditorProps: {\n\t\t\tattributes: {\n\t\t\t\t\"aria-label\": ariaLabel,\n\t\t\t\trole: \"textbox\",\n\t\t\t\t\"aria-multiline\": \"true\",\n\t\t\t\tclass: cn(\"tiptap focus:outline-none\", tokens.text),\n\t\t\t},\n\t\t},\n\t\tonFocus: () => setFocused(true),\n\t\tonBlur: () => setFocused(false),\n\t\tonUpdate: ({ editor: instance }) => onChange?.(instance.getHTML()),\n\t});\n\n\t// Keep editability in sync with the disabled prop.\n\tReact.useEffect(() => {\n\t\teditor?.setEditable(!disabled);\n\t}, [editor, disabled]);\n\n\t// Sync external (controlled) value changes without disturbing the cursor.\n\tReact.useEffect(() => {\n\t\tif (!editor || value === undefined) return;\n\t\tif (value !== editor.getHTML()) {\n\t\t\teditor.commands.setContent(value, { emitUpdate: false });\n\t\t}\n\t}, [editor, value]);\n\n\tconst state = useEditorState({\n\t\teditor,\n\t\tselector: ({ editor: instance }) => {\n\t\t\tif (!instance) return EMPTY_STATE;\n\t\t\tconst block: BlockValue = instance.isActive(\"heading\", { level: 1 })\n\t\t\t\t? \"h1\"\n\t\t\t\t: instance.isActive(\"heading\", { level: 2 })\n\t\t\t\t\t? \"h2\"\n\t\t\t\t\t: instance.isActive(\"heading\", { level: 3 })\n\t\t\t\t\t\t? \"h3\"\n\t\t\t\t\t\t: \"paragraph\";\n\t\t\tconst align: AlignValue = instance.isActive({ textAlign: \"center\" })\n\t\t\t\t? \"center\"\n\t\t\t\t: instance.isActive({ textAlign: \"right\" })\n\t\t\t\t\t? \"right\"\n\t\t\t\t\t: instance.isActive({ textAlign: \"justify\" })\n\t\t\t\t\t\t? \"justify\"\n\t\t\t\t\t\t: \"left\";\n\t\t\treturn {\n\t\t\t\tblock,\n\t\t\t\talign,\n\t\t\t\tcolor: (instance.getAttributes(\"textStyle\").color as string) ?? \"\",\n\t\t\t\tlinkHref: (instance.getAttributes(\"link\").href as string) ?? \"\",\n\t\t\t\tisBold: instance.isActive(\"bold\"),\n\t\t\t\tisItalic: instance.isActive(\"italic\"),\n\t\t\t\tisUnderline: instance.isActive(\"underline\"),\n\t\t\t\tisBulletList: instance.isActive(\"bulletList\"),\n\t\t\t\tisOrderedList: instance.isActive(\"orderedList\"),\n\t\t\t\tisBlockquote: instance.isActive(\"blockquote\"),\n\t\t\t\tisCodeBlock: instance.isActive(\"codeBlock\"),\n\t\t\t\tisLink: instance.isActive(\"link\"),\n\t\t\t\tcanUndo: instance.can().undo(),\n\t\t\t\tcanRedo: instance.can().redo(),\n\t\t\t};\n\t\t},\n\t});\n\n\tconst s = state ?? EMPTY_STATE;\n\n\tfunction setBlock(next: BlockValue) {\n\t\tif (!editor) return;\n\t\tconst chain = editor.chain().focus();\n\t\tif (next === \"paragraph\") chain.setParagraph().run();\n\t\telse chain.toggleHeading({ level: Number(next[1]) as 1 | 2 | 3 }).run();\n\t}\n\n\tfunction setAlign(next: AlignValue) {\n\t\teditor?.chain().focus().setTextAlign(next).run();\n\t}\n\n\tfunction setColor(next: string) {\n\t\tif (!editor) return;\n\t\tif (next) editor.chain().focus().setColor(next).run();\n\t\telse editor.chain().focus().unsetColor().run();\n\t}\n\n\tfunction applyLink(href: string) {\n\t\teditor?.chain().focus().extendMarkRange(\"link\").setLink({ href }).run();\n\t}\n\n\tfunction removeLink() {\n\t\teditor?.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n\t}\n\n\tfunction insertImage(src: string) {\n\t\teditor?.chain().focus().setImage({ src }).run();\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"rich-text-editor\"\n\t\t\tdata-disabled={disabled || undefined}\n\t\t\tdata-focused={focused || undefined}\n\t\t\tclassName={cn(\n\t\t\t\t\"group/editor flex w-full flex-col overflow-hidden rounded-2xl border bg-surface text-fg-primary shadow-1 transition-[border-color,box-shadow]\",\n\t\t\t\tdisabled\n\t\t\t\t\t? \"border-line-subtle opacity-60\"\n\t\t\t\t\t: focused\n\t\t\t\t\t\t? \"border-line-focus ring-2 ring-line-focus/35\"\n\t\t\t\t\t\t: \"border-line hover:border-line-strong\",\n\t\t\t\ttokens.width,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{/* Toolbar — raised strip holding all formatting controls */}\n\t\t\t<div\n\t\t\t\trole=\"toolbar\"\n\t\t\t\taria-label=\"Formatting\"\n\t\t\t\taria-orientation=\"horizontal\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex flex-wrap items-center bg-surface-raised\",\n\t\t\t\t\ttokens.toolbarPad,\n\t\t\t\t\ttokens.toolbarGap,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<BlockControl\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tvalue={s.block}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonChange={setBlock}\n\t\t\t\t/>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Bold\"\n\t\t\t\t\tactive={s.isBold}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => editor?.chain().focus().toggleBold().run()}\n\t\t\t\t>\n\t\t\t\t\t<Bold />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Italic\"\n\t\t\t\t\tactive={s.isItalic}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => editor?.chain().focus().toggleItalic().run()}\n\t\t\t\t>\n\t\t\t\t\t<Italic />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Underline\"\n\t\t\t\t\tactive={s.isUnderline}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => editor?.chain().focus().toggleUnderline().run()}\n\t\t\t\t>\n\t\t\t\t\t<Underline />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<ColorControl\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tvalue={s.color}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonChange={setColor}\n\t\t\t\t/>\n\n\t\t\t\t<ToolbarDivider tokens={tokens} />\n\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Numbered list\"\n\t\t\t\t\tactive={s.isOrderedList}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => editor?.chain().focus().toggleOrderedList().run()}\n\t\t\t\t>\n\t\t\t\t\t<ListOrdered />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Bullet list\"\n\t\t\t\t\tactive={s.isBulletList}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => editor?.chain().focus().toggleBulletList().run()}\n\t\t\t\t>\n\t\t\t\t\t<List />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<AlignControl\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tvalue={s.align}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonChange={setAlign}\n\t\t\t\t/>\n\n\t\t\t\t<ToolbarDivider tokens={tokens} />\n\n\t\t\t\t<LinkControl\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tactive={s.isLink}\n\t\t\t\t\tcurrentHref={s.linkHref}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonApply={applyLink}\n\t\t\t\t\tonRemove={removeLink}\n\t\t\t\t/>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Quote\"\n\t\t\t\t\tactive={s.isBlockquote}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => editor?.chain().focus().toggleBlockquote().run()}\n\t\t\t\t>\n\t\t\t\t\t<Quote />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Code block\"\n\t\t\t\t\tactive={s.isCodeBlock}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => editor?.chain().focus().toggleCodeBlock().run()}\n\t\t\t\t>\n\t\t\t\t\t<Code2 />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<ImageControl\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonInsert={insertImage}\n\t\t\t\t/>\n\n\t\t\t\t<ToolbarDivider tokens={tokens} />\n\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Undo\"\n\t\t\t\t\tdisabled={disabled || !s.canUndo}\n\t\t\t\t\tonClick={() => editor?.chain().focus().undo().run()}\n\t\t\t\t>\n\t\t\t\t\t<Undo2 />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Redo\"\n\t\t\t\t\tdisabled={disabled || !s.canRedo}\n\t\t\t\t\tonClick={() => editor?.chain().focus().redo().run()}\n\t\t\t\t>\n\t\t\t\t\t<Redo2 />\n\t\t\t\t</ToolbarButton>\n\t\t\t</div>\n\n\t\t\t{/* Divider — border-subtle line separating the toolbar from the content */}\n\t\t\t<div className=\"h-px w-full shrink-0 bg-line-subtle\" />\n\n\t\t\t{/* Content area — editable surface */}\n\t\t\t<EditorContent\n\t\t\t\teditor={editor}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"gdt-rich-text min-w-0 flex-1 overflow-y-auto\",\n\t\t\t\t\ttokens.content,\n\t\t\t\t\ttokens.contentPad,\n\t\t\t\t)}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nexport { RichTextEditor };\nexport type { RichTextEditorProps };\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/scatter-chart.tsx"],"sourcesContent":["\"use client\";\n\nimport type * as React from \"react\";\nimport {\n\tCartesianGrid,\n\tScatter,\n\tScatterChart as ScatterChartPrimitive,\n\tXAxis,\n\tYAxis,\n} from \"recharts\";\nimport type { Payload } from \"recharts/types/component/DefaultTooltipContent\";\nimport type { ScatterShapeProps } from \"recharts/types/util/ScatterUtils\";\nimport { type ChartConfig, ChartContainer, cartesianAxisProps } from \"./chart\";\nimport { cn } from \"./lib/cn\";\nimport {\n\ttype ComponentSize,\n\tSizeProvider,\n\tuseComponentSize,\n} from \"./size-context\";\n\n/**\n * Scatter charts are composable wrappers over the recharts cartesian\n * primitives. recharts 3 registers graphical items through context when they\n * render, so the primitives CAN be wrapped in our own components. Each\n * wrapper bakes in the giddaa defaults (tokens, size-scaled type, mark specs)\n * and forwards every recharts prop, so anything can be overridden in place or\n * replaced with the raw recharts element.\n *\n * Anatomy: `ScatterChart` is the plot root (frame + responsive box + recharts\n * chart); compose the grid, axes, series, and the shared overlays from\n * `./chart` as children. Unlike `BarChart`/`RadarChart`, each series carries\n * its own `data` (an array of `{ x, y }` pairs) rather than sharing one row\n * per category.\n *\n * @example\n * <ChartCard size=\"md\">\n * <ChartHeader>\n * <ChartTitle>Price vs. size</ChartTitle>\n * <ChartDescription>Lekki listings · ₦m by sqm</ChartDescription>\n * </ChartHeader>\n * <ScatterChart config={config}>\n * <ScatterChartGrid />\n * <ScatterChartXAxis dataKey=\"size\" name=\"Size\" unit=\"sqm\" />\n * <ScatterChartYAxis dataKey=\"price\" name=\"Price\" unit=\"₦m\" />\n * <ChartTooltip content={<ScatterChartTooltipContent />} />\n * <ScatterChartSeries data={data} name=\"Lekki\" />\n * </ScatterChart>\n * </ChartCard>\n */\n\n/**\n * Categorical series palette — the theme-aware `chart-1`…`chart-3` tokens.\n * Assign colours in this fixed order, never cycled: a fourth series folds into\n * \"Other\" or becomes a second chart.\n */\nconst SCATTER_CHART_PALETTE = [\n\t\"var(--color-chart-1)\",\n\t\"var(--color-chart-2)\",\n\t\"var(--color-chart-3)\",\n] as const;\n\nconst DEFAULT_SERIES_COLOR = SCATTER_CHART_PALETTE[0];\n\ntype ScatterChartLayout = {\n\t/** Plot height in px. Width stays fluid via the ResponsiveContainer. */\n\theight: number;\n\t/** Outer margin around the plot. */\n\tmargin: { top: number; right: number; bottom: number; left: number };\n\t/** Axis tick label font size. */\n\ttickFontSize: number;\n\t/** Space between an axis and its tick labels. */\n\ttickMargin: number;\n\t/** Reserved width for the value axis. */\n\tyAxisWidth: number;\n\t/** Radius of a resting point, in px (r ≥ 4 keeps the ≥8px marker floor). */\n\tdotRadius: number;\n\t/** Radius of the active (hover) point. */\n\tactiveDotRadius: number;\n};\n\nconst SCATTER_CHART_LAYOUT: Record<ComponentSize, ScatterChartLayout> = {\n\tsm: {\n\t\theight: 220,\n\t\tmargin: { top: 16, right: 12, bottom: 0, left: 0 },\n\t\ttickFontSize: 10,\n\t\ttickMargin: 6,\n\t\tyAxisWidth: 32,\n\t\tdotRadius: 4,\n\t\tactiveDotRadius: 6,\n\t},\n\tmd: {\n\t\theight: 260,\n\t\tmargin: { top: 20, right: 16, bottom: 0, left: 0 },\n\t\ttickFontSize: 11,\n\t\ttickMargin: 8,\n\t\tyAxisWidth: 36,\n\t\tdotRadius: 5,\n\t\tactiveDotRadius: 7,\n\t},\n\tlg: {\n\t\theight: 320,\n\t\tmargin: { top: 24, right: 20, bottom: 0, left: 0 },\n\t\ttickFontSize: 12,\n\t\ttickMargin: 10,\n\t\tyAxisWidth: 40,\n\t\tdotRadius: 6,\n\t\tactiveDotRadius: 8,\n\t},\n};\n\ntype ScatterChartProps = Omit<\n\tReact.ComponentProps<typeof ScatterChartPrimitive>,\n\t\"width\" | \"height\"\n> & {\n\t/** Series labels/icons for the shared tooltip and legend (see `ChartConfig`). */\n\tconfig?: ChartConfig;\n\t/** Plot scale; inherited from the nearest `SizeProvider` when omitted. */\n\tsize?: ComponentSize;\n\t/** Applied to the responsive plot box, e.g. to override its height. */\n\tclassName?: string;\n};\n\n/**\n * Plot root — wraps the shared `ChartContainer` (tooltip/legend theming,\n * responsive box) around the recharts `ScatterChart` with a size-scaled\n * height and margin. `size` also flows to the child primitives through\n * `SizeProvider`. Extra props reach the recharts chart (`data`, `syncId`,\n * `margin`, …).\n */\nfunction ScatterChart({\n\tconfig = {},\n\tsize,\n\tclassName,\n\tchildren,\n\t...props\n}: ScatterChartProps) {\n\tconst resolvedSize = useComponentSize(size);\n\tconst layout = SCATTER_CHART_LAYOUT[resolvedSize];\n\n\treturn (\n\t\t<SizeProvider size={resolvedSize}>\n\t\t\t<ChartContainer\n\t\t\t\tconfig={config}\n\t\t\t\tclassName={cn(\"aspect-auto w-full\", className)}\n\t\t\t\tstyle={{ height: layout.height }}\n\t\t\t>\n\t\t\t\t<ScatterChartPrimitive\n\t\t\t\t\taccessibilityLayer\n\t\t\t\t\tmargin={layout.margin}\n\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</ScatterChartPrimitive>\n\t\t\t</ChartContainer>\n\t\t</SizeProvider>\n\t);\n}\n\ntype ScatterChartGridProps = React.ComponentProps<typeof CartesianGrid>;\n\n/**\n * Value reference lines — recharts `CartesianGrid` painted with the `line`\n * token (`line-subtle` matches the chart card surface in both themes, so it\n * would vanish). Both axes are quantitative in a scatter plot, so horizontal\n * and vertical lines render by default; pass `vertical={false}` to thin it out.\n */\nfunction ScatterChartGrid(props: ScatterChartGridProps) {\n\treturn <CartesianGrid stroke=\"var(--color-line)\" {...props} />;\n}\n\ntype ScatterChartXAxisProps = React.ComponentProps<typeof XAxis> & {\n\t/** Explicit axis scale; otherwise inherited from the chart's `size`. */\n\tsize?: ComponentSize;\n};\n\n/**\n * Value axis — recharts `XAxis` defaulting to `type=\"number\"` (a scatter axis\n * is continuous, not categorical), with no axis/tick lines, size-scaled tick\n * margin, and caption-placeholder tick ink. Pass `name`/`unit` to label this\n * axis in the tooltip. Passing your own `tick` replaces the default styling\n * entirely.\n */\nfunction ScatterChartXAxis({\n\tsize,\n\ttype = \"number\",\n\ttick,\n\t...props\n}: ScatterChartXAxisProps) {\n\tconst layout = SCATTER_CHART_LAYOUT[useComponentSize(size)];\n\tconst axes = cartesianAxisProps(layout);\n\tconst defaultTick = {\n\t\t...axes.xAxis.tick,\n\t\tfill: \"var(--color-fg-caption-placeholder)\",\n\t};\n\n\treturn (\n\t\t<XAxis\n\t\t\ttype={type}\n\t\t\ttickLine={axes.xAxis.tickLine}\n\t\t\taxisLine={axes.xAxis.axisLine}\n\t\t\ttickMargin={axes.xAxis.tickMargin}\n\t\t\ttick={tick ?? defaultTick}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\ntype ScatterChartYAxisProps = React.ComponentProps<typeof YAxis> & {\n\t/** Explicit axis scale; otherwise inherited from the chart's `size`. */\n\tsize?: ComponentSize;\n};\n\n/**\n * Value axis — recharts `YAxis` defaulting to `type=\"number\"`, with no\n * axis/tick lines, size-scaled tick type, and reserved width for value\n * labels. Pass `name`/`unit` to label this axis in the tooltip. Override\n * `width` for long tick labels.\n */\nfunction ScatterChartYAxis({\n\tsize,\n\ttype = \"number\",\n\ttick,\n\t...props\n}: ScatterChartYAxisProps) {\n\tconst layout = SCATTER_CHART_LAYOUT[useComponentSize(size)];\n\tconst axes = cartesianAxisProps(layout);\n\tconst defaultTick = {\n\t\t...axes.yAxis.tick,\n\t\tfill: \"var(--color-fg-caption-placeholder)\",\n\t};\n\n\treturn (\n\t\t<YAxis\n\t\t\ttype={type}\n\t\t\ttickLine={axes.yAxis.tickLine}\n\t\t\taxisLine={axes.yAxis.axisLine}\n\t\t\twidth={axes.yAxis.width}\n\t\t\ttick={tick ?? defaultTick}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\ntype ScatterChartTooltipContentProps = {\n\tactive?: boolean;\n\tpayload?: ReadonlyArray<Payload<string | number, string | number>>;\n\tclassName?: string;\n};\n\n/**\n * Hover tooltip for a scatter point. Unlike the shared `ChartTooltipContent`\n * (built for a single hero value), a scatter point carries one value per\n * axis, so this lists every axis entry — each labelled by its `XAxis`/\n * `YAxis` `name` and `unit` — under one series dot, on the same elevated\n * overlay (bg-surface-overlay, shadow-2, border-subtle) as the rest of the\n * chart library.\n */\nfunction ScatterChartTooltipContent({\n\tactive,\n\tpayload,\n\tclassName,\n}: ScatterChartTooltipContentProps) {\n\tif (!active || !payload?.length) {\n\t\treturn null;\n\t}\n\n\tconst points = payload.filter(\n\t\t(entry) => entry.type !== \"none\" && entry.value != null,\n\t);\n\n\tif (!points.length) {\n\t\treturn null;\n\t}\n\n\tconst dotColor = points[0]?.color ?? points[0]?.fill ?? DEFAULT_SERIES_COLOR;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col gap-1 rounded-lg border border-line-subtle bg-surface-overlay p-3 shadow-2\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<span\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tclassName=\"size-2.5 shrink-0 rounded-full\"\n\t\t\t\tstyle={{ backgroundColor: dotColor }}\n\t\t\t/>\n\t\t\t{points.map((point, index) => (\n\t\t\t\t<div\n\t\t\t\t\tkey={`${point.dataKey ?? point.name ?? index}`}\n\t\t\t\t\tclassName=\"flex items-baseline justify-between gap-3 text-gdt-sm\"\n\t\t\t\t>\n\t\t\t\t\t<span className=\"text-fg-secondary\">{point.name}</span>\n\t\t\t\t\t<span className=\"font-extrabold text-fg-primary tabular-nums\">\n\t\t\t\t\t\t{point.value}\n\t\t\t\t\t\t{point.unit != null && point.unit !== \"\" && (\n\t\t\t\t\t\t\t<span className=\"ml-1 font-normal text-fg-caption-placeholder\">\n\t\t\t\t\t\t\t\t{point.unit}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n\n/** Renders one resting or active point as a plain filled/ringed circle. */\nfunction ScatterPoint({\n\tcx,\n\tcy,\n\tr,\n\tcolor,\n\tringed,\n}: {\n\tcx?: number;\n\tcy?: number;\n\tr: number;\n\tcolor: string;\n\tringed?: boolean;\n}) {\n\tif (cx == null || cy == null) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<circle\n\t\t\tcx={cx}\n\t\t\tcy={cy}\n\t\t\tr={r}\n\t\t\tfill={color}\n\t\t\tstroke={ringed ? \"var(--color-surface-raised)\" : \"none\"}\n\t\t\tstrokeWidth={ringed ? 2 : 0}\n\t\t/>\n\t);\n}\n\ntype ScatterChartSeriesProps = React.ComponentProps<typeof Scatter> & {\n\t/** Series colour for the points. Defaults to the first categorical chart token. */\n\tcolor?: string;\n\t/** Explicit mark scale; otherwise inherited from the chart's `size`. */\n\tsize?: ComponentSize;\n};\n\n/**\n * One data series — recharts `Scatter` with the giddaa mark spec: solid\n * resting points at a size-scaled radius (r ≥ 4, the ≥8px marker floor) and a\n * larger active point ringed in `surface-raised` so overlapping series stay\n * separable. `color` drives both shapes at once; `shape`/`activeShape` still\n * win when passed directly.\n */\nfunction ScatterChartSeries({\n\tcolor = DEFAULT_SERIES_COLOR,\n\tsize,\n\tshape,\n\tactiveShape,\n\t...props\n}: ScatterChartSeriesProps) {\n\tconst layout = SCATTER_CHART_LAYOUT[useComponentSize(size)];\n\n\treturn (\n\t\t<Scatter\n\t\t\tshape={\n\t\t\t\tshape ??\n\t\t\t\t((shapeProps: ScatterShapeProps) => (\n\t\t\t\t\t<ScatterPoint\n\t\t\t\t\t\tcx={shapeProps.cx}\n\t\t\t\t\t\tcy={shapeProps.cy}\n\t\t\t\t\t\tr={layout.dotRadius}\n\t\t\t\t\t\tcolor={color}\n\t\t\t\t\t/>\n\t\t\t\t))\n\t\t\t}\n\t\t\tactiveShape={\n\t\t\t\tactiveShape ??\n\t\t\t\t((shapeProps: ScatterShapeProps) => (\n\t\t\t\t\t<ScatterPoint\n\t\t\t\t\t\tcx={shapeProps.cx}\n\t\t\t\t\t\tcy={shapeProps.cy}\n\t\t\t\t\t\tr={layout.activeDotRadius}\n\t\t\t\t\t\tcolor={color}\n\t\t\t\t\t\tringed\n\t\t\t\t\t/>\n\t\t\t\t))\n\t\t\t}\n\t\t\tfill={color}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tSCATTER_CHART_LAYOUT,\n\tSCATTER_CHART_PALETTE,\n\tScatterChart,\n\tScatterChartGrid,\n\tScatterChartSeries,\n\tScatterChartTooltipContent,\n\tScatterChartXAxis,\n\tScatterChartYAxis,\n};\nexport type {\n\tScatterChartGridProps,\n\tScatterChartLayout,\n\tScatterChartProps,\n\tScatterChartSeriesProps,\n\tScatterChartTooltipContentProps,\n\tScatterChartXAxisProps,\n\tScatterChartYAxisProps,\n};\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/search-input.tsx"],"sourcesContent":["import { Search, X } from \"lucide-react\";\nimport * as React from \"react\";\nimport {\n\tInputGroup,\n\tInputGroupAddon,\n\tInputGroupButton,\n\tInputGroupInput,\n} from \"./input-group\";\nimport { cn } from \"./lib/cn\";\n\ntype SearchInputVariant = \"dashboard\" | \"app\";\n\ntype SearchInputProps = React.ComponentProps<typeof InputGroupInput> & {\n\twrapperClassName?: string;\n\tonClear?: () => void;\n\tvariant?: SearchInputVariant;\n};\n\nfunction hasValue(value: React.ComponentProps<\"input\">[\"value\"]) {\n\tif (Array.isArray(value)) {\n\t\treturn value.length > 0;\n\t}\n\n\treturn value !== undefined && value !== null && String(value).length > 0;\n}\n\nexport const SearchInput = React.forwardRef<HTMLInputElement, SearchInputProps>(\n\tfunction SearchInput(\n\t\t{\n\t\t\tclassName,\n\t\t\tsize,\n\t\t\tvalue,\n\t\t\tdefaultValue,\n\t\t\twrapperClassName,\n\t\t\tonChange,\n\t\t\tonClear,\n\t\t\tdisabled,\n\t\t\treadOnly,\n\t\t\tvariant = \"dashboard\",\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) {\n\t\tconst inputRef = React.useRef<HTMLInputElement>(null);\n\t\tconst [hasUncontrolledValue, setHasUncontrolledValue] = React.useState(() =>\n\t\t\thasValue(defaultValue),\n\t\t);\n\t\tconst isControlled = value !== undefined;\n\t\tconst showClearButton = isControlled\n\t\t\t? hasValue(value)\n\t\t\t: hasUncontrolledValue;\n\n\t\tReact.useImperativeHandle(ref, () => inputRef.current as HTMLInputElement);\n\n\t\tfunction handleChange(event: React.ChangeEvent<HTMLInputElement>) {\n\t\t\tif (!isControlled) {\n\t\t\t\tsetHasUncontrolledValue(hasValue(event.currentTarget.value));\n\t\t\t}\n\n\t\t\tonChange?.(event);\n\t\t}\n\n\t\tfunction handleClear() {\n\t\t\tconst input = inputRef.current;\n\n\t\t\tif (!input) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst valueSetter = Object.getOwnPropertyDescriptor(\n\t\t\t\twindow.HTMLInputElement.prototype,\n\t\t\t\t\"value\",\n\t\t\t)?.set;\n\n\t\t\tif (valueSetter) {\n\t\t\t\tvalueSetter.call(input, \"\");\n\t\t\t} else {\n\t\t\t\tinput.value = \"\";\n\t\t\t}\n\t\t\tsetHasUncontrolledValue(false);\n\t\t\tinput.dispatchEvent(new Event(\"input\", { bubbles: true }));\n\t\t\tinput.focus();\n\t\t\tonClear?.();\n\t\t}\n\n\t\treturn (\n\t\t\t<InputGroup\n\t\t\t\tsize={size}\n\t\t\t\tclassName={cn(\n\t\t\t\t\tvariant === \"app\" && \"shadow-4 focus-within:shadow-none\",\n\t\t\t\t\twrapperClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<InputGroupInput\n\t\t\t\t\tref={inputRef}\n\t\t\t\t\tsize={size}\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tdefaultValue={defaultValue}\n\t\t\t\t\tclassName={className}\n\t\t\t\t\t{...props}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\tonChange={handleChange}\n\t\t\t\t/>\n\t\t\t\t<InputGroupAddon>\n\t\t\t\t\t<Search />\n\t\t\t\t</InputGroupAddon>\n\t\t\t\t{showClearButton ? (\n\t\t\t\t\t<InputGroupAddon align=\"inline-end\">\n\t\t\t\t\t\t<InputGroupButton\n\t\t\t\t\t\t\taria-label=\"Clear search\"\n\t\t\t\t\t\t\tdisabled={disabled || readOnly}\n\t\t\t\t\t\t\tonClick={handleClear}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<X className=\"size-3\" />\n\t\t\t\t\t\t</InputGroupButton>\n\t\t\t\t\t</InputGroupAddon>\n\t\t\t\t) : null}\n\t\t\t</InputGroup>\n\t\t);\n\t},\n);\n"],"mappings":";;;;;;;;;;;;;;;;AAAA,SAAS,QAAQ,SAAS;AAC1B,YAAY,WAAW;AAqFpB,SAOC,KAPD;AApEH,SAAS,SAAS,OAA+C;AAChE,MAAI,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO,MAAM,SAAS;AAAA,EACvB;AAEA,SAAO,UAAU,UAAa,UAAU,QAAQ,OAAO,KAAK,EAAE,SAAS;AACxE;AAEO,IAAM,cAAoB;AAAA,EAChC,SAASA,aACR;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,GAAG;AAAA,EACJ,GACA,KACC;AACD,UAAM,WAAiB,aAAyB,IAAI;AACpD,UAAM,CAAC,sBAAsB,uBAAuB,IAAU;AAAA,MAAS,MACtE,SAAS,YAAY;AAAA,IACtB;AACA,UAAM,eAAe,UAAU;AAC/B,UAAM,kBAAkB,eACrB,SAAS,KAAK,IACd;AAEH,IAAM,0BAAoB,KAAK,MAAM,SAAS,OAA2B;AAEzE,aAAS,aAAa,OAA4C;AACjE,UAAI,CAAC,cAAc;AAClB,gCAAwB,SAAS,MAAM,cAAc,KAAK,CAAC;AAAA,MAC5D;AAEA,iBAAW,KAAK;AAAA,IACjB;AAEA,aAAS,cAAc;AACtB,YAAM,QAAQ,SAAS;AAEvB,UAAI,CAAC,OAAO;AACX;AAAA,MACD;AAEA,YAAM,cAAc,OAAO;AAAA,QAC1B,OAAO,iBAAiB;AAAA,QACxB;AAAA,MACD,GAAG;AAEH,UAAI,aAAa;AAChB,oBAAY,KAAK,OAAO,EAAE;AAAA,MAC3B,OAAO;AACN,cAAM,QAAQ;AAAA,MACf;AACA,8BAAwB,KAAK;AAC7B,YAAM,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,KAAK,CAAC,CAAC;AACzD,YAAM,MAAM;AACZ,gBAAU;AAAA,IACX;AAEA,WACC;AAAA,MAAC;AAAA;AAAA,QACA;AAAA,QACA,WAAW;AAAA,UACV,YAAY,SAAS;AAAA,UACrB;AAAA,QACD;AAAA,QAEA;AAAA;AAAA,YAAC;AAAA;AAAA,cACA,KAAK;AAAA,cACL;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACC,GAAG;AAAA,cACJ;AAAA,cACA;AAAA,cACA,UAAU;AAAA;AAAA,UACX;AAAA,UACA,oBAAC,mBACA,8BAAC,UAAO,GACT;AAAA,UACC,kBACA,oBAAC,mBAAgB,OAAM,cACtB;AAAA,YAAC;AAAA;AAAA,cACA,cAAW;AAAA,cACX,UAAU,YAAY;AAAA,cACtB,SAAS;AAAA,cAET,8BAAC,KAAE,WAAU,UAAS;AAAA;AAAA,UACvB,GACD,IACG;AAAA;AAAA;AAAA,IACL;AAAA,EAEF;AACD;","names":["SearchInput"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/sheet.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/sidebar.tsx"],"sourcesContent":["\"use client\";\n\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Menu } from \"lucide-react\";\nimport * as React from \"react\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { cn } from \"./lib/cn\";\nimport { useIsMobile } from \"./lib/use-mobile\";\nimport { useUncontrolled } from \"./lib/use-uncontrolled\";\nimport { Separator } from \"./separator\";\nimport {\n\tSheet,\n\tSheetContent,\n\tSheetDescription,\n\tSheetHeader,\n\tSheetTitle,\n} from \"./sheet\";\nimport { Skeleton } from \"./skeleton\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\";\n\nconst SIDEBAR_LS_KEY = \"sidebar_state\";\nconst SIDEBAR_WIDTH = \"17.5rem\";\nconst SIDEBAR_WIDTH_MOBILE = \"17.5rem\";\nconst SIDEBAR_WIDTH_ICON = \"4.5rem\";\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\";\n\ntype SidebarContextProps = {\n\tstate: \"expanded\" | \"collapsed\";\n\topen: boolean;\n\tsetOpen: (open: boolean) => void;\n\topenMobile: boolean;\n\tsetOpenMobile: (open: boolean) => void;\n\tisMobile: boolean;\n\ttoggleSidebar: () => void;\n};\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null);\n\nfunction useSidebar() {\n\tconst context = React.useContext(SidebarContext);\n\tif (!context) {\n\t\tthrow new Error(\"useSidebar must be used within a SidebarProvider.\");\n\t}\n\n\treturn context;\n}\n\nfunction SidebarProvider({\n\tdefaultOpen = true,\n\topen: openProp,\n\tonOpenChange: setOpenProp,\n\tclassName,\n\tstyle,\n\tchildren,\n\t...props\n}: React.ComponentProps<\"div\"> & {\n\tdefaultOpen?: boolean;\n\topen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n}) {\n\tconst isMobile = useIsMobile();\n\tconst [openMobile, setOpenMobile] = React.useState(false);\n\n\tconst [open, setOpen] = useUncontrolled({\n\t\tvalue: openProp,\n\t\tonChange: (open) => {\n\t\t\tsetOpenProp?.(open);\n\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\twindow.localStorage.setItem(SIDEBAR_LS_KEY, String(open));\n\t\t\t}\n\t\t},\n\t\tdefaultValue: defaultOpen,\n\t});\n\n\tReact.useEffect(() => {\n\t\tif (openProp !== undefined) return;\n\n\t\tconst storedOpen = window.localStorage.getItem(SIDEBAR_LS_KEY);\n\t\tif (storedOpen !== null) {\n\t\t\tsetOpen(storedOpen !== \"false\");\n\t\t}\n\t}, [openProp, setOpen]);\n\n\t// Helper to toggle the sidebar.\n\tconst toggleSidebar = React.useCallback(() => {\n\t\treturn isMobile ? setOpenMobile((open) => !open) : setOpen(!open);\n\t}, [isMobile, open, setOpen]);\n\n\t// Adds a keyboard shortcut to toggle the sidebar.\n\tReact.useEffect(() => {\n\t\tconst handleKeyDown = (event: KeyboardEvent) => {\n\t\t\tif (\n\t\t\t\tevent.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n\t\t\t\t(event.metaKey || event.ctrlKey)\n\t\t\t) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\ttoggleSidebar();\n\t\t\t}\n\t\t};\n\n\t\twindow.addEventListener(\"keydown\", handleKeyDown);\n\t\treturn () => window.removeEventListener(\"keydown\", handleKeyDown);\n\t}, [toggleSidebar]);\n\n\t// We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n\t// This makes it easier to style the sidebar with Tailwind classes.\n\tconst state = open ? \"expanded\" : \"collapsed\";\n\n\tconst contextValue = React.useMemo<SidebarContextProps>(\n\t\t() => ({\n\t\t\tstate,\n\t\t\topen,\n\t\t\tsetOpen,\n\t\t\tisMobile,\n\t\t\topenMobile,\n\t\t\tsetOpenMobile,\n\t\t\ttoggleSidebar,\n\t\t}),\n\t\t[state, open, setOpen, isMobile, openMobile, toggleSidebar],\n\t);\n\n\treturn (\n\t\t<SidebarContext.Provider value={contextValue}>\n\t\t\t<div\n\t\t\t\tdata-slot=\"sidebar-wrapper\"\n\t\t\t\tstyle={\n\t\t\t\t\t{\n\t\t\t\t\t\t\"--layout-nav-width\": SIDEBAR_WIDTH,\n\t\t\t\t\t\t\"--layout-nav-width-icon\": SIDEBAR_WIDTH_ICON,\n\t\t\t\t\t\t...style,\n\t\t\t\t\t} as React.CSSProperties\n\t\t\t\t}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-surface\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</SidebarContext.Provider>\n\t);\n}\n\nfunction Sidebar({\n\tside = \"left\",\n\tvariant = \"sidebar\",\n\tcollapsible = \"offcanvas\",\n\tclassName,\n\tchildren,\n\tdir,\n\t...props\n}: React.ComponentProps<\"div\"> & {\n\tside?: \"left\" | \"right\";\n\tvariant?: \"sidebar\" | \"floating\" | \"inset\";\n\tcollapsible?: \"offcanvas\" | \"icon\" | \"none\";\n}) {\n\tconst { isMobile, state, openMobile, setOpenMobile } = useSidebar();\n\n\tif (collapsible === \"none\") {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tdata-slot=\"sidebar\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex h-full w-(--layout-nav-width) flex-col bg-surface text-fg-secondary\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (isMobile) {\n\t\treturn (\n\t\t\t<Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n\t\t\t\t<SheetContent\n\t\t\t\t\tdir={dir}\n\t\t\t\t\tdata-sidebar=\"sidebar\"\n\t\t\t\t\tdata-slot=\"sidebar\"\n\t\t\t\t\tdata-mobile=\"true\"\n\t\t\t\t\tclassName=\"min-w-10/12 w-(--layout-nav-width) max-w-screen border-none bg-surface p-0 text-fg-secondary [&>button]:hidden\"\n\t\t\t\t\tstyle={\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"--layout-nav-width\": SIDEBAR_WIDTH_MOBILE,\n\t\t\t\t\t\t} as React.CSSProperties\n\t\t\t\t\t}\n\t\t\t\t\tside={\"right\"}\n\t\t\t\t>\n\t\t\t\t\t<SheetHeader className=\"sr-only\">\n\t\t\t\t\t\t<SheetTitle>Sidebar</SheetTitle>\n\t\t\t\t\t\t<SheetDescription>Displays the mobile sidebar.</SheetDescription>\n\t\t\t\t\t</SheetHeader>\n\t\t\t\t\t<div className=\"flex h-full w-full flex-col\">{children}</div>\n\t\t\t\t</SheetContent>\n\t\t\t</Sheet>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"group peer hidden text-fg-secondary lg:block\"\n\t\t\tdata-state={state}\n\t\t\tdata-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n\t\t\tdata-variant={variant}\n\t\t\tdata-side={side}\n\t\t\tdata-slot=\"sidebar\"\n\t\t>\n\t\t\t{/* This is what handles the sidebar gap on desktop */}\n\t\t\t<div\n\t\t\t\tdata-slot=\"sidebar-gap\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative w-(--layout-nav-width) bg-transparent transition-[width] duration-200 ease-out\",\n\t\t\t\t\t\"group-data-[collapsible=offcanvas]:w-0\",\n\t\t\t\t\t\"group-data-[side=right]:rotate-180\",\n\t\t\t\t\tvariant === \"floating\" || variant === \"inset\"\n\t\t\t\t\t\t? \"group-data-[collapsible=icon]:w-[calc(var(--layout-nav-width-icon)+(--spacing(4)))]\"\n\t\t\t\t\t\t: \"group-data-[collapsible=icon]:w-(--layout-nav-width-icon)\",\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t<div\n\t\t\t\tdata-slot=\"sidebar-container\"\n\t\t\t\tdata-side={side}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"fixed inset-y-0 z-10 hidden h-svh w-(--layout-nav-width) transition-[left,right,width] duration-200 ease-out data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--layout-nav-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--layout-nav-width)*-1)] lg:flex\",\n\t\t\t\t\t// Adjust the padding for floating and inset variants.\n\t\t\t\t\tvariant === \"floating\" || variant === \"inset\"\n\t\t\t\t\t\t? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--layout-nav-width-icon)+(--spacing(4))+2px)]\"\n\t\t\t\t\t\t: \"group-data-[collapsible=icon]:w-(--layout-nav-width-icon) group-data-[side=left]:border-r group-data-[side=left]:border-r-line-subtle group-data-[side=right]:border-l group-data-[side=right]:border-l-line-subtle\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tdata-sidebar=\"sidebar\"\n\t\t\t\t\tdata-slot=\"sidebar-inner\"\n\t\t\t\t\tclassName=\"flex size-full flex-col bg-surface group-data-[variant=floating]:rounded-xl group-data-[variant=floating]:border group-data-[variant=floating]:border-line-subtle group-data-[variant=floating]:shadow-[var(--elevation-e1-shadow)]\"\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nfunction SidebarTrigger({\n\tclassName,\n\tonClick,\n\t...props\n}: React.ComponentProps<typeof Button>) {\n\tconst { toggleSidebar } = useSidebar();\n\n\treturn (\n\t\t<Button\n\t\t\tdata-sidebar=\"trigger\"\n\t\t\tdata-slot=\"sidebar-trigger\"\n\t\t\tvariant=\"ghost\"\n\t\t\tsize=\"icon-sm\"\n\t\t\tclassName={cn(className)}\n\t\t\tonClick={(event) => {\n\t\t\t\tonClick?.(event);\n\t\t\t\ttoggleSidebar();\n\t\t\t}}\n\t\t\t{...props}\n\t\t>\n\t\t\t<Menu className=\"cn-rtl-flip\" />\n\t\t\t<span className=\"sr-only\">Toggle Sidebar</span>\n\t\t</Button>\n\t);\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n\tconst { toggleSidebar } = useSidebar();\n\n\treturn (\n\t\t<button\n\t\t\tdata-sidebar=\"rail\"\n\t\t\tdata-slot=\"sidebar-rail\"\n\t\t\taria-label=\"Toggle Sidebar\"\n\t\t\ttabIndex={-1}\n\t\t\tonClick={toggleSidebar}\n\t\t\ttitle=\"Toggle Sidebar\"\n\t\t\tclassName={cn(\n\t\t\t\t\"absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] hover:after:bg-line-subtle sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2\",\n\t\t\t\t\"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n\t\t\t\t\"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n\t\t\t\t\"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-surface\",\n\t\t\t\t\"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n\t\t\t\t\"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n\treturn (\n\t\t<main\n\t\t\tdata-slot=\"sidebar-inset\"\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex min-w-0 flex-1 flex-col bg-canvas lg:peer-data-[variant=inset]:m-2 lg:peer-data-[variant=inset]:ml-0 lg:peer-data-[variant=inset]:rounded-xl lg:peer-data-[variant=inset]:border lg:peer-data-[variant=inset]:border-line-subtle lg:peer-data-[variant=inset]:shadow-[var(--elevation-e1-shadow)] lg:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction SidebarInput({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof Input>) {\n\treturn (\n\t\t<Input\n\t\t\tdata-slot=\"sidebar-input\"\n\t\t\tdata-sidebar=\"input\"\n\t\t\tclassName={cn(\"h-8 w-full bg-canvas shadow-none\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"sidebar-header\"\n\t\t\tdata-sidebar=\"header\"\n\t\t\tclassName={cn(\"flex flex-col gap-2 p-2\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"sidebar-footer\"\n\t\t\tdata-sidebar=\"footer\"\n\t\t\tclassName={cn(\"flex flex-col gap-2 p-2\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction SidebarSeparator({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof Separator>) {\n\treturn (\n\t\t<Separator\n\t\t\tdata-slot=\"sidebar-separator\"\n\t\t\tdata-sidebar=\"separator\"\n\t\t\tclassName={cn(\"mx-2 w-auto bg-line-subtle\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"sidebar-content\"\n\t\t\tdata-sidebar=\"content\"\n\t\t\tclassName={cn(\n\t\t\t\t\"no-scrollbar flex min-h-0 flex-1 flex-col gap-0 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"sidebar-group\"\n\t\t\tdata-sidebar=\"group\"\n\t\t\tclassName={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction SidebarGroupLabel({\n\tclassName,\n\trender,\n\t...props\n}: useRender.ComponentProps<\"div\"> & React.ComponentProps<\"div\">) {\n\treturn useRender({\n\t\tdefaultTagName: \"div\",\n\t\tprops: mergeProps<\"div\">(\n\t\t\t{\n\t\t\t\tclassName: cn(\n\t\t\t\t\t\"flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-fg-caption-placeholder outline-hidden transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)] [&>svg]:size-4 [&>svg]:shrink-0\",\n\t\t\t\t\tclassName,\n\t\t\t\t),\n\t\t\t},\n\t\t\tprops,\n\t\t),\n\t\trender,\n\t\tstate: {\n\t\t\tslot: \"sidebar-group-label\",\n\t\t\tsidebar: \"group-label\",\n\t\t},\n\t});\n}\n\nfunction SidebarGroupAction({\n\tclassName,\n\trender,\n\t...props\n}: useRender.ComponentProps<\"button\"> & React.ComponentProps<\"button\">) {\n\treturn useRender({\n\t\tdefaultTagName: \"button\",\n\t\tprops: mergeProps<\"button\">(\n\t\t\t{\n\t\t\t\tclassName: cn(\n\t\t\t\t\t\"absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-fg-secondary outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 hover:bg-surface-raised hover:text-fg-primary focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)] lg:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n\t\t\t\t\tclassName,\n\t\t\t\t),\n\t\t\t},\n\t\t\tprops,\n\t\t),\n\t\trender,\n\t\tstate: {\n\t\t\tslot: \"sidebar-group-action\",\n\t\t\tsidebar: \"group-action\",\n\t\t},\n\t});\n}\n\nfunction SidebarGroupContent({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"sidebar-group-content\"\n\t\t\tdata-sidebar=\"group-content\"\n\t\t\tclassName={cn(\"w-full text-sm\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n\treturn (\n\t\t<ul\n\t\t\tdata-slot=\"sidebar-menu\"\n\t\t\tdata-sidebar=\"menu\"\n\t\t\tclassName={cn(\"flex w-full min-w-0 flex-col gap-0\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n\treturn (\n\t\t<li\n\t\t\tdata-slot=\"sidebar-menu-item\"\n\t\t\tdata-sidebar=\"menu-item\"\n\t\t\tclassName={cn(\"group/menu-item relative\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nconst sidebarMenuButtonVariants = cva(\n\t\"peer/menu-button group/menu-button flex w-full items-center gap-3 overflow-hidden rounded-[10px] px-3 py-3 text-left text-gdt-sm font-semibold text-fg-secondary outline-hidden transition-[width,height,padding,gap,color,background-color] duration-200 ease-out group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:gap-0 group-data-[collapsible=icon]:px-5! group-data-[collapsible=icon]:[&>span]:max-w-0 group-data-[collapsible=icon]:[&>span]:opacity-0 hover:bg-surface-raised hover:text-fg-primary focus-visible:inset-ring-1 inset-ring-line-focus active:bg-surface-raised active:text-fg-primary disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-surface-raised data-open:hover:text-fg-primary data-active:bg-surface-brand-subtle data-active:font-medium data-active:text-fg-brand [&_svg]:size-4 [&_svg]:shrink-0 [&_svg]:text-current [&>span]:min-w-0 [&>span]:truncate [&>span]:transition-[max-width,opacity] [&>span]:duration-200 [&>span]:ease-out\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault: \"\",\n\t\t\t\toutline:\n\t\t\t\t\t\"bg-canvas text-fg-primary shadow-[inset_0_0_0_1px_var(--color-line-subtle)] hover:bg-surface-raised hover:text-fg-primary\",\n\t\t\t},\n\t\t\tsize: {\n\t\t\t\tmd: \"h-12\",\n\t\t\t\tsm: \"h-9 text-xs\",\n\t\t\t\tlg: \"h-12 group-data-[collapsible=icon]:px-[18px]! [&_svg]:size-5\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"default\",\n\t\t\tsize: \"md\",\n\t\t},\n\t},\n);\n\nfunction SidebarMenuButton({\n\trender,\n\tisActive = false,\n\tvariant = \"default\",\n\tsize = \"md\",\n\ttooltip,\n\tclassName,\n\t...props\n}: useRender.ComponentProps<\"button\"> &\n\tReact.ComponentProps<\"button\"> & {\n\t\tisActive?: boolean;\n\t\ttooltip?: string | React.ComponentProps<typeof TooltipContent>;\n\t} & VariantProps<typeof sidebarMenuButtonVariants>) {\n\tconst { isMobile, state } = useSidebar();\n\tconst comp = useRender({\n\t\tdefaultTagName: \"button\",\n\t\tprops: mergeProps<\"button\">(\n\t\t\t{\n\t\t\t\tclassName: cn(sidebarMenuButtonVariants({ variant, size }), className),\n\t\t\t},\n\t\t\tprops,\n\t\t),\n\t\trender: !tooltip ? render : <TooltipTrigger render={render} />,\n\t\tstate: {\n\t\t\tslot: \"sidebar-menu-button\",\n\t\t\tsidebar: \"menu-button\",\n\t\t\tsize,\n\t\t\tactive: isActive,\n\t\t},\n\t});\n\n\tif (!tooltip) {\n\t\treturn comp;\n\t}\n\n\tif (typeof tooltip === \"string\") {\n\t\ttooltip = {\n\t\t\tchildren: tooltip,\n\t\t};\n\t}\n\n\treturn (\n\t\t<Tooltip>\n\t\t\t{comp}\n\t\t\t<TooltipContent\n\t\t\t\tside=\"right\"\n\t\t\t\talign=\"center\"\n\t\t\t\thidden={state !== \"collapsed\" || isMobile}\n\t\t\t\t{...tooltip}\n\t\t\t/>\n\t\t</Tooltip>\n\t);\n}\n\nfunction SidebarMenuAction({\n\tclassName,\n\trender,\n\tshowOnHover = false,\n\t...props\n}: useRender.ComponentProps<\"button\"> &\n\tReact.ComponentProps<\"button\"> & {\n\t\tshowOnHover?: boolean;\n\t}) {\n\treturn useRender({\n\t\tdefaultTagName: \"button\",\n\t\tprops: mergeProps<\"button\">(\n\t\t\t{\n\t\t\t\tclassName: cn(\n\t\t\t\t\t\"absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-fg-secondary outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-fg-primary peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 hover:bg-surface-raised hover:text-fg-primary focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)] lg:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n\t\t\t\t\tshowOnHover &&\n\t\t\t\t\t\t\"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-active/menu-button:text-fg-brand aria-expanded:opacity-100 lg:opacity-0\",\n\t\t\t\t\tclassName,\n\t\t\t\t),\n\t\t\t},\n\t\t\tprops,\n\t\t),\n\t\trender,\n\t\tstate: {\n\t\t\tslot: \"sidebar-menu-action\",\n\t\t\tsidebar: \"menu-action\",\n\t\t},\n\t});\n}\n\nfunction SidebarMenuBadge({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"sidebar-menu-badge\"\n\t\t\tdata-sidebar=\"menu-badge\"\n\t\t\tclassName={cn(\n\t\t\t\t\"pointer-events-none absolute right-4 flex h-5 min-w-5 items-center justify-center rounded-full bg-surface-brand px-1 text-gdt-subtext font-bold leading-none text-fg-on-brand tabular-nums select-none group-data-[collapsible=icon]:hidden peer-data-[size=default]/menu-button:top-2.5 peer-data-[size=lg]/menu-button:top-4 peer-data-[size=sm]/menu-button:top-2\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction SidebarMenuSkeleton({\n\tclassName,\n\tshowIcon = false,\n\t...props\n}: React.ComponentProps<\"div\"> & {\n\tshowIcon?: boolean;\n}) {\n\t// Random width between 50 to 90%.\n\tconst [width] = React.useState(() => {\n\t\treturn `${Math.floor(Math.random() * 40) + 50}%`;\n\t});\n\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"sidebar-menu-skeleton\"\n\t\t\tdata-sidebar=\"menu-skeleton\"\n\t\t\tclassName={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{showIcon && (\n\t\t\t\t<Skeleton\n\t\t\t\t\tclassName=\"size-4 rounded-md\"\n\t\t\t\t\tdata-sidebar=\"menu-skeleton-icon\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<Skeleton\n\t\t\t\tclassName=\"h-4 max-w-(--skeleton-width) flex-1\"\n\t\t\t\tdata-sidebar=\"menu-skeleton-text\"\n\t\t\t\tstyle={\n\t\t\t\t\t{\n\t\t\t\t\t\t\"--skeleton-width\": width,\n\t\t\t\t\t} as React.CSSProperties\n\t\t\t\t}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n\treturn (\n\t\t<ul\n\t\t\tdata-slot=\"sidebar-menu-sub\"\n\t\t\tdata-sidebar=\"menu-sub\"\n\t\t\tclassName={cn(\n\t\t\t\t\"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-line-subtle px-2.5 py-0.5 group-data-[collapsible=icon]:hidden\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction SidebarMenuSubItem({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"li\">) {\n\treturn (\n\t\t<li\n\t\t\tdata-slot=\"sidebar-menu-sub-item\"\n\t\t\tdata-sidebar=\"menu-sub-item\"\n\t\t\tclassName={cn(\"group/menu-sub-item relative\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction SidebarMenuSubButton({\n\trender,\n\tsize = \"md\",\n\tisActive = false,\n\tclassName,\n\t...props\n}: useRender.ComponentProps<\"a\"> &\n\tReact.ComponentProps<\"a\"> & {\n\t\tsize?: \"sm\" | \"md\";\n\t\tisActive?: boolean;\n\t}) {\n\treturn useRender({\n\t\tdefaultTagName: \"a\",\n\t\tprops: mergeProps<\"a\">(\n\t\t\t{\n\t\t\t\tclassName: cn(\n\t\t\t\t\t\"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-fg-secondary outline-hidden group-data-[collapsible=icon]:hidden hover:bg-surface-raised hover:text-fg-primary focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)] active:bg-surface-raised active:text-fg-primary disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs data-active:bg-surface-brand-subtle data-active:text-fg-brand [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-fg-caption-placeholder\",\n\t\t\t\t\tclassName,\n\t\t\t\t),\n\t\t\t},\n\t\t\tprops,\n\t\t),\n\t\trender,\n\t\tstate: {\n\t\t\tslot: \"sidebar-menu-sub-button\",\n\t\t\tsidebar: \"menu-sub-button\",\n\t\t\tsize,\n\t\t\tactive: isActive,\n\t\t},\n\t});\n}\n\nexport {\n\tSidebar,\n\tSidebarContent,\n\tSidebarFooter,\n\tSidebarGroup,\n\tSidebarGroupAction,\n\tSidebarGroupContent,\n\tSidebarGroupLabel,\n\tSidebarHeader,\n\tSidebarInput,\n\tSidebarInset,\n\tSidebarMenu,\n\tSidebarMenuAction,\n\tSidebarMenuBadge,\n\tSidebarMenuButton,\n\tSidebarMenuItem,\n\tSidebarMenuSkeleton,\n\tSidebarMenuSub,\n\tSidebarMenuSubButton,\n\tSidebarMenuSubItem,\n\tSidebarProvider,\n\tSidebarRail,\n\tSidebarSeparator,\n\tSidebarTrigger,\n\tuseSidebar,\n};\n"],"mappings":"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","names":["open"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/slider.tsx"],"sourcesContent":["\"use client\";\n\nimport { Slider as SliderPrimitive } from \"@base-ui/react/slider\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\n\nimport { cn } from \"./lib/cn\";\nimport { SizeProvider, useComponentSize } from \"./size-context\";\n\nconst sliderVariants = cva(\n\t\"group/slider grid w-full gap-2 disabled:cursor-not-allowed disabled:opacity-60 data-[disabled=true]:cursor-not-allowed data-[disabled=true]:opacity-60\",\n\t{\n\t\tvariants: {\n\t\t\tsize: {\n\t\t\t\tsm: \"[--slider-thumb-size:1rem] [--slider-track-size:0.25rem]\",\n\t\t\t\tmd: \"[--slider-thumb-size:1.25rem] [--slider-track-size:0.375rem]\",\n\t\t\t\tlg: \"[--slider-thumb-size:1.5rem] [--slider-track-size:0.5rem]\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tsize: \"md\",\n\t\t},\n\t},\n);\n\ntype SliderRootValue = number | readonly number[];\ntype SliderSize = NonNullable<VariantProps<typeof sliderVariants>[\"size\"]>;\n\ntype SliderProps<Value extends SliderRootValue = SliderRootValue> =\n\tSliderPrimitive.Root.Props<Value> & VariantProps<typeof sliderVariants>;\n\ntype SliderControlProps = SliderPrimitive.Control.Props;\ntype SliderTrackProps = SliderPrimitive.Track.Props;\ntype SliderIndicatorProps = SliderPrimitive.Indicator.Props;\ntype SliderThumbProps = SliderPrimitive.Thumb.Props;\ntype SliderLabelProps = SliderPrimitive.Label.Props;\ntype SliderValueProps = SliderPrimitive.Value.Props;\ntype SliderCaptionProps = React.ComponentProps<\"p\">;\n\nfunction Slider<Value extends SliderRootValue = SliderRootValue>({\n\tclassName,\n\tchildren,\n\tsize,\n\tdisabled = false,\n\t...props\n}: SliderProps<Value>) {\n\tconst resolvedSize = useComponentSize(size);\n\n\treturn (\n\t\t<SizeProvider size={resolvedSize}>\n\t\t\t<SliderPrimitive.Root\n\t\t\t\tdisabled={disabled}\n\t\t\t\tdata-disabled={disabled}\n\t\t\t\tdata-size={resolvedSize}\n\t\t\t\tdata-slot=\"slider\"\n\t\t\t\tclassName={cn(sliderVariants({ size: resolvedSize }), className)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</SliderPrimitive.Root>\n\t\t</SizeProvider>\n\t);\n}\n\nfunction SliderControl({ className, ...props }: SliderControlProps) {\n\treturn (\n\t\t<SliderPrimitive.Control\n\t\t\tdata-slot=\"slider-control\"\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex touch-none items-center select-none data-[orientation=horizontal]:h-(--slider-thumb-size) data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-56 data-[orientation=vertical]:w-(--slider-thumb-size) data-[orientation=vertical]:justify-center\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction SliderTrack({ className, ...props }: SliderTrackProps) {\n\treturn (\n\t\t<SliderPrimitive.Track\n\t\t\tdata-slot=\"slider-track\"\n\t\t\tclassName={cn(\n\t\t\t\t\"relative rounded-full bg-line select-none group-data-[disabled=true]/slider:bg-line-subtle data-[orientation=horizontal]:h-(--slider-track-size) data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-(--slider-track-size)\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction SliderIndicator({ className, ...props }: SliderIndicatorProps) {\n\treturn (\n\t\t<SliderPrimitive.Indicator\n\t\t\tdata-slot=\"slider-indicator\"\n\t\t\tclassName={cn(\n\t\t\t\t\"rounded-full bg-surface-brand transition-[height,left,width,bottom,background-color] duration-200 ease-out select-none group-data-[disabled=true]/slider:bg-line-strong data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction SliderThumb({ className, ...props }: SliderThumbProps) {\n\treturn (\n\t\t<SliderPrimitive.Thumb\n\t\t\tdata-slot=\"slider-thumb\"\n\t\t\tclassName={cn(\n\t\t\t\t\"relative box-border size-(--slider-thumb-size) rounded-full border-2 border-surface-brand bg-canvas shadow-[var(--shadow-1)] outline-none transition-[border-color,background-color,box-shadow,transform] duration-200 ease-out select-none after:absolute after:-inset-2 has-[:focus-visible]:shadow-[0_0_0_2px_var(--color-line-focus),var(--shadow-1)] data-[dragging]:scale-105 data-[disabled]:border-line-strong data-[disabled]:bg-surface data-[disabled]:shadow-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction SliderLabel({ className, ...props }: SliderLabelProps) {\n\treturn (\n\t\t<SliderPrimitive.Label\n\t\t\tdata-slot=\"slider-label\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-fg-primary font-semibold leading-snug group-data-[disabled=true]/slider:text-fg-caption-placeholder group-data-[size=sm]/slider:text-gdt-xs group-data-[size=md]/slider:text-gdt-sm group-data-[size=lg]/slider:text-gdt-md\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction SliderValue({ className, ...props }: SliderValueProps) {\n\treturn (\n\t\t<SliderPrimitive.Value\n\t\t\tdata-slot=\"slider-value\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-fg-primary font-semibold tabular-nums leading-snug group-data-[disabled=true]/slider:text-fg-caption-placeholder group-data-[size=sm]/slider:text-gdt-subtext group-data-[size=md]/slider:text-gdt-xs group-data-[size=lg]/slider:text-gdt-sm\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction SliderCaption({ className, ...props }: SliderCaptionProps) {\n\treturn (\n\t\t<p\n\t\t\tdata-slot=\"slider-caption\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-fg-secondary leading-snug group-data-[disabled=true]/slider:text-fg-caption-placeholder group-data-[size=sm]/slider:text-gdt-subtext group-data-[size=md]/slider:text-gdt-xs group-data-[size=lg]/slider:text-gdt-sm\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tSlider,\n\tSliderCaption,\n\tSliderControl,\n\tSliderIndicator,\n\tSliderLabel,\n\tSliderThumb,\n\tSliderTrack,\n\tSliderValue,\n\tsliderVariants,\n\ttype SliderSize,\n};\n"],"mappings":";;;;;;;;;;AAEA,SAAS,UAAU,uBAAuB;AAC1C,SAAS,WAA8B;AA+CpC;AAzCH,IAAM,iBAAiB;AAAA,EACtB;AAAA,EACA;AAAA,IACC,UAAU;AAAA,MACT,MAAM;AAAA,QACL,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACL;AAAA,IACD;AAAA,IACA,iBAAiB;AAAA,MAChB,MAAM;AAAA,IACP;AAAA,EACD;AACD;AAgBA,SAAS,OAAwD;AAAA,EAChE;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,GAAG;AACJ,GAAuB;AACtB,QAAM,eAAe,iBAAiB,IAAI;AAE1C,SACC,oBAAC,gBAAa,MAAM,cACnB;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACA;AAAA,MACA,iBAAe;AAAA,MACf,aAAW;AAAA,MACX,aAAU;AAAA,MACV,WAAW,GAAG,eAAe,EAAE,MAAM,aAAa,CAAC,GAAG,SAAS;AAAA,MAC9D,GAAG;AAAA,MAEH;AAAA;AAAA,EACF,GACD;AAEF;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,MAAM,GAAuB;AACnE,SACC;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAqB;AAC/D,SACC;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,gBAAgB,EAAE,WAAW,GAAG,MAAM,GAAyB;AACvE,SACC;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAqB;AAC/D,SACC;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAqB;AAC/D,SACC;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAqB;AAC/D,SACC;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,MAAM,GAAuB;AACnE,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/sparkline.tsx"],"sourcesContent":["\"use client\";\n\nimport type * as React from \"react\";\nimport {\n\tArea,\n\tAreaChart,\n\tBar,\n\tBarChart,\n\tLine,\n\tLineChart,\n\tXAxis,\n} from \"recharts\";\nimport {\n\ttype ChartConfig,\n\tChartContainer,\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype ChartValueType,\n} from \"./chart\";\nimport { cn } from \"./lib/cn\";\nimport { type ComponentSize, useComponentSize } from \"./size-context\";\n\n/**\n * Small inline trend lines for KPI cards and dense tables — no axes, no\n * gridlines. Composed from recharts plot primitives (`Line`/`Area`/`Bar`) so it\n * shares one charting engine with `line-chart`/`bar-chart` and gets hover\n * tooltips for free via the shared `ChartTooltip`/`ChartTooltipContent`.\n *\n * Sizing follows the same convention as the other charts: `size` sets the height\n * (plus stroke/dot scale) and the width is parent-driven — the component is\n * `w-full`, so constrain it with a wrapper (the SPARKLINE_LAYOUT widths are the\n * recommended container sizes) or let it fill a KPI card.\n *\n * Sentiment colour is driven by the data direction — `status-success` for an\n * upward series, `status-danger` for downward, `text-secondary` for flat — and\n * can be overridden with `trend`. The area fill reuses the line colour at 14 %.\n *\n * Tokens:\n * - Stroke / fill — up: `var(--color-status-success)`, down:\n * `var(--color-status-danger)`, flat: `var(--color-fg-secondary)` (fed through\n * `ChartConfig` as `--color-value`)\n * - Area fill: the same colour at `0.14` opacity\n * - End-point dot ring: `var(--color-surface)` (separates the dot from the line)\n *\n * @example\n * // KPI card trend — colour follows the metric's sentiment automatically\n * <Sparkline data={[40, 44, 42, 55, 58, 62, 70]} type=\"area\" />\n *\n * @example\n * // Interactive — hover tooltip with currency formatting and month captions\n * <Sparkline data={values} tooltip label=\"Revenue\" valueType=\"currency\" labels={months} />\n *\n * @example\n * // Dense table cell — fixed-width wrapper, bar render, no marker\n * <span className=\"inline-block w-[72px]\">\n * <Sparkline data={values} type=\"bar\" size=\"sm\" showMarker={false} />\n * </span>\n */\n\n/** Sparkline sizes line up with the three shared `ComponentSize` values. */\ntype SparklineSize = ComponentSize;\n\n/** Render style for the series. */\ntype SparklineType = \"line\" | \"bar\" | \"area\";\n\n/** Sentiment of the series — drives the stroke/fill colour. */\ntype SparklineTrend = \"up\" | \"down\" | \"flat\";\n\ntype SparklineLayout = {\n\t/** Recommended container width in px (width is parent-driven). */\n\twidth: number;\n\t/** Plot height in px. */\n\theight: number;\n\t/** Line/area stroke width in px. */\n\tstrokeWidth: number;\n\t/** Radius of the end-point dot. */\n\tdotRadius: number;\n\t/** Outer margin — keeps the stroke, peaks, and end dot from clipping. */\n\tmargin: { top: number; right: number; bottom: number; left: number };\n\t/** Corner radius for bars. */\n\tbarRadius: number;\n\t/** Cap on bar thickness so stretched sparklines keep thin bars. */\n\tmaxBarSize: number;\n};\n\nconst SPARKLINE_LAYOUT: Record<SparklineSize, SparklineLayout> = {\n\tsm: {\n\t\twidth: 72,\n\t\theight: 24,\n\t\tstrokeWidth: 1.5,\n\t\tdotRadius: 2,\n\t\tmargin: { top: 4, right: 4, bottom: 2, left: 2 },\n\t\tbarRadius: 1,\n\t\tmaxBarSize: 6,\n\t},\n\tmd: {\n\t\twidth: 104,\n\t\theight: 32,\n\t\tstrokeWidth: 2,\n\t\tdotRadius: 2.5,\n\t\tmargin: { top: 5, right: 5, bottom: 2, left: 2 },\n\t\tbarRadius: 2,\n\t\tmaxBarSize: 8,\n\t},\n\tlg: {\n\t\twidth: 144,\n\t\theight: 44,\n\t\tstrokeWidth: 2,\n\t\tdotRadius: 3,\n\t\tmargin: { top: 6, right: 6, bottom: 3, left: 3 },\n\t\tbarRadius: 2,\n\t\tmaxBarSize: 10,\n\t},\n};\n\nconst TREND_COLOR: Record<SparklineTrend, string> = {\n\tup: \"var(--color-status-success)\",\n\tdown: \"var(--color-status-danger)\",\n\tflat: \"var(--color-fg-secondary)\",\n};\n\n/**\n * Derive sentiment from the series: compare the last value to the first and\n * read flat when the change is a small fraction of the overall range.\n */\nfunction resolveTrend(data: number[]): SparklineTrend {\n\tif (data.length < 2) return \"flat\";\n\tconst first = data[0];\n\tconst last = data[data.length - 1];\n\tconst min = Math.min(...data);\n\tconst max = Math.max(...data);\n\tconst range = max - min || 1;\n\tconst delta = last - first;\n\tif (Math.abs(delta) / range < 0.05) return \"flat\";\n\treturn delta > 0 ? \"up\" : \"down\";\n}\n\n/**\n * Custom dot passed to recharts as `dot={<SparklineEndDot ... />}`. recharts\n * clones it for every point, injecting `cx`/`cy`/`index`; we only paint the\n * latest point so the series carries a single end-point marker.\n */\nfunction SparklineEndDot({\n\tcx,\n\tcy,\n\tindex,\n\tlastIndex,\n\tradius,\n}: {\n\tcx?: number;\n\tcy?: number;\n\tindex?: number;\n\tlastIndex?: number;\n\tradius?: number;\n}) {\n\tif (cx == null || cy == null || index !== lastIndex) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<circle\n\t\t\tcx={cx}\n\t\t\tcy={cy}\n\t\t\tr={radius}\n\t\t\tfill=\"var(--color-value)\"\n\t\t\tstroke=\"var(--color-surface)\"\n\t\t\tstrokeWidth={2}\n\t\t/>\n\t);\n}\n\n/**\n * Bars do not support `dot`, so the marker is rendered as part of a custom bar\n * shape. Only the latest bar receives the end-point marker.\n */\nfunction SparklineBarShape({\n\tx,\n\ty,\n\twidth,\n\theight,\n\tindex,\n\tvalue,\n\tlastIndex,\n\tradius,\n\tdotRadius,\n}: {\n\tx?: number;\n\ty?: number;\n\twidth?: number;\n\theight?: number;\n\tindex?: number;\n\tvalue?: number;\n\tlastIndex?: number;\n\tradius: number;\n\tdotRadius: number;\n}) {\n\tif (x == null || y == null || width == null || height == null) {\n\t\treturn null;\n\t}\n\n\tconst markerY = typeof value === \"number\" && value < 0 ? y + height : y;\n\n\treturn (\n\t\t<g>\n\t\t\t<rect\n\t\t\t\tx={x}\n\t\t\t\ty={y}\n\t\t\t\twidth={width}\n\t\t\t\theight={height}\n\t\t\t\trx={radius}\n\t\t\t\try={radius}\n\t\t\t\tfill=\"var(--color-value)\"\n\t\t\t/>\n\t\t\t{index === lastIndex ? (\n\t\t\t\t<circle\n\t\t\t\t\tcx={x + width / 2}\n\t\t\t\t\tcy={markerY}\n\t\t\t\t\tr={dotRadius}\n\t\t\t\t\tfill=\"var(--color-value)\"\n\t\t\t\t\tstroke=\"var(--color-surface)\"\n\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t</g>\n\t);\n}\n\ntype SparklineDatum = { x: string; value: number };\n\ntype SparklineProps = Omit<\n\tReact.ComponentProps<typeof ChartContainer>,\n\t\"config\" | \"children\"\n> & {\n\t/** The series to plot. Needs at least two points to draw a trend. */\n\tdata: number[];\n\t/** Render style. Defaults to `line`. */\n\ttype?: SparklineType;\n\t/** Explicit size; otherwise inherited from the nearest `SizeProvider`. */\n\tsize?: SparklineSize;\n\t/** Override the auto-detected sentiment colour. */\n\ttrend?: SparklineTrend;\n\t/** Show the filled marker on the latest value. Default true. */\n\tshowMarker?: boolean;\n\t/** Enable the hover tooltip. Default false. */\n\ttooltip?: boolean;\n\t/** Series name shown in the tooltip, e.g. \"Revenue\". */\n\tlabel?: string;\n\t/** Per-point captions for the tooltip (e.g. months). Indexed by data point. */\n\tlabels?: string[];\n\t/** Value formatting for the tooltip. Defaults to `number`. */\n\tvalueType?: ChartValueType;\n};\n\nfunction Sparkline({\n\tdata,\n\ttype = \"line\",\n\tsize,\n\ttrend,\n\tshowMarker = true,\n\ttooltip = false,\n\tlabel = \"Value\",\n\tlabels,\n\tvalueType = \"number\",\n\tclassName,\n\tstyle,\n\t...props\n}: SparklineProps) {\n\tconst layout = SPARKLINE_LAYOUT[useComponentSize(size)];\n\tconst resolvedTrend = trend ?? resolveTrend(data);\n\tconst color = TREND_COLOR[resolvedTrend];\n\n\tconst chartData: SparklineDatum[] = data.map((value, i) => ({\n\t\tx: labels?.[i] ?? `${i + 1}`,\n\t\tvalue,\n\t}));\n\tconst lastIndex = data.length - 1;\n\n\tconst config = {\n\t\tvalue: { label, color },\n\t} satisfies ChartConfig;\n\n\tconst showDot = showMarker && data.length >= 2;\n\tconst endDot = showDot ? (\n\t\t<SparklineEndDot lastIndex={lastIndex} radius={layout.dotRadius} />\n\t) : (\n\t\tfalse\n\t);\n\tconst barShape = showDot ? (\n\t\t<SparklineBarShape\n\t\t\tlastIndex={lastIndex}\n\t\t\tradius={layout.barRadius}\n\t\t\tdotRadius={layout.dotRadius}\n\t\t/>\n\t) : undefined;\n\tconst activeDot = tooltip\n\t\t? {\n\t\t\t\tr: layout.dotRadius + 0.5,\n\t\t\t\tfill: \"var(--color-value)\",\n\t\t\t\tstroke: \"var(--color-surface)\",\n\t\t\t\tstrokeWidth: 2,\n\t\t\t}\n\t\t: false;\n\n\tconst tooltipNode = tooltip ? (\n\t\t<ChartTooltip\n\t\t\tcursor={false}\n\t\t\tcontent={<ChartTooltipContent size=\"xs\" valueType={valueType} />}\n\t\t/>\n\t) : null;\n\n\tconst ariaLabel =\n\t\t(props[\"aria-label\"] as string | undefined) ??\n\t\t`${label} sparkline, trend ${resolvedTrend}`;\n\n\tif (data.length < 2) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\t{...props}\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\trole=\"img\"\n\t\t\t\tclassName={cn(\"w-full\", className)}\n\t\t\t\tstyle={{ height: layout.height, ...style }}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<ChartContainer\n\t\t\t{...props}\n\t\t\taria-label={ariaLabel}\n\t\t\trole=\"img\"\n\t\t\tconfig={config}\n\t\t\tclassName={cn(\"aspect-auto w-full\", className)}\n\t\t\tstyle={{ height: layout.height, ...style }}\n\t\t>\n\t\t\t{type === \"bar\" ? (\n\t\t\t\t<BarChart accessibilityLayer data={chartData} margin={layout.margin}>\n\t\t\t\t\t{tooltipNode}\n\t\t\t\t\t<Bar\n\t\t\t\t\t\tdataKey=\"value\"\n\t\t\t\t\t\tfill=\"var(--color-value)\"\n\t\t\t\t\t\tradius={layout.barRadius}\n\t\t\t\t\t\tmaxBarSize={layout.maxBarSize}\n\t\t\t\t\t\tshape={barShape}\n\t\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\t/>\n\t\t\t\t</BarChart>\n\t\t\t) : type === \"area\" ? (\n\t\t\t\t<AreaChart accessibilityLayer data={chartData} margin={layout.margin}>\n\t\t\t\t\t{tooltip ? <XAxis dataKey=\"x\" hide /> : null}\n\t\t\t\t\t{tooltipNode}\n\t\t\t\t\t<Area\n\t\t\t\t\t\ttype=\"monotone\"\n\t\t\t\t\t\tdataKey=\"value\"\n\t\t\t\t\t\tstroke=\"var(--color-value)\"\n\t\t\t\t\t\tstrokeWidth={layout.strokeWidth}\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tfill=\"var(--color-value)\"\n\t\t\t\t\t\tfillOpacity={0.14}\n\t\t\t\t\t\tdot={endDot}\n\t\t\t\t\t\tactiveDot={activeDot}\n\t\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\t/>\n\t\t\t\t</AreaChart>\n\t\t\t) : (\n\t\t\t\t<LineChart accessibilityLayer data={chartData} margin={layout.margin}>\n\t\t\t\t\t{tooltip ? <XAxis dataKey=\"x\" hide /> : null}\n\t\t\t\t\t{tooltipNode}\n\t\t\t\t\t<Line\n\t\t\t\t\t\ttype=\"monotone\"\n\t\t\t\t\t\tdataKey=\"value\"\n\t\t\t\t\t\tstroke=\"var(--color-value)\"\n\t\t\t\t\t\tstrokeWidth={layout.strokeWidth}\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tdot={endDot}\n\t\t\t\t\t\tactiveDot={activeDot}\n\t\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\t/>\n\t\t\t\t</LineChart>\n\t\t\t)}\n\t\t</ChartContainer>\n\t);\n}\n\nexport { Sparkline, SPARKLINE_LAYOUT };\nexport type { SparklineProps, SparklineSize, SparklineTrend, SparklineType };\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/stepper.tsx"],"sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\";\nimport { CheckIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { cn } from \"./lib/cn\";\n\ntype StepperOrientation = \"horizontal\" | \"vertical\";\ntype StepperState = \"complete\" | \"active\" | \"upcoming\";\n\ntype StepperContextValue = {\n\torientation: StepperOrientation;\n\t/** Active step number (1-based). Steps derive their state from this. */\n\tvalue?: number;\n};\n\nconst StepperContext = React.createContext<StepperContextValue | null>(null);\n\nfunction useStepper() {\n\tconst context = React.useContext(StepperContext);\n\n\tif (!context) {\n\t\tthrow new Error(\"Stepper parts must be used within a <Stepper />\");\n\t}\n\n\treturn context;\n}\n\ntype StepperItemContextValue = {\n\tstate: StepperState;\n\t/** 1-based position of this step in the stepper. */\n\tstep: number;\n};\n\nconst StepperItemContext = React.createContext<StepperItemContextValue | null>(\n\tnull,\n);\n\nfunction useStepperItem() {\n\tconst context = React.useContext(StepperItemContext);\n\n\tif (!context) {\n\t\tthrow new Error(\"Stepper item parts must be used within a <StepperItem />\");\n\t}\n\n\treturn context;\n}\n\nfunction resolveState(\n\tstep: number,\n\tvalue: number | undefined,\n\toverride: StepperState | undefined,\n): StepperState {\n\tif (override) return override;\n\tif (value == null) return \"upcoming\";\n\tif (step < value) return \"complete\";\n\tif (step === value) return \"active\";\n\treturn \"upcoming\";\n}\n\ntype StepperProps = React.ComponentProps<\"div\"> & {\n\torientation?: StepperOrientation;\n\t/** Active step number (1-based). Items without an explicit `state` derive theirs from this. */\n\tvalue?: number;\n};\n\nfunction Stepper({\n\torientation = \"horizontal\",\n\tvalue,\n\tclassName,\n\tchildren,\n\t...props\n}: StepperProps) {\n\tconst items = React.Children.toArray(children).filter(React.isValidElement);\n\n\tconst contextValue = React.useMemo<StepperContextValue>(\n\t\t() => ({ orientation, value }),\n\t\t[orientation, value],\n\t);\n\n\treturn (\n\t\t<StepperContext.Provider value={contextValue}>\n\t\t\t<div\n\t\t\t\tdata-slot=\"stepper\"\n\t\t\t\tdata-orientation={orientation}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex\",\n\t\t\t\t\torientation === \"horizontal\" ? \"flex-row\" : \"flex-col\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{items.map((child, index) => {\n\t\t\t\t\tif (!React.isValidElement<StepperItemProps>(child)) return child;\n\n\t\t\t\t\treturn React.cloneElement(child, {\n\t\t\t\t\t\tstep: child.props.step ?? index + 1,\n\t\t\t\t\t\tlast: child.props.last ?? index === items.length - 1,\n\t\t\t\t\t});\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</StepperContext.Provider>\n\t);\n}\n\ntype StepperItemProps = Omit<React.ComponentProps<\"div\">, \"children\"> & {\n\t/** Force a specific state instead of deriving it from the stepper `value`. */\n\tstate?: StepperState;\n\t/** 1-based position. Injected by `Stepper`; only set this to override. */\n\tstep?: number;\n\t/** Whether this is the last item (hides its connector). Injected by `Stepper`. */\n\tlast?: boolean;\n\t/** Custom indicator node. Defaults to a numbered circle / checkmark. */\n\tindicator?: React.ReactNode;\n\tchildren?: React.ReactNode;\n};\n\nfunction StepperItem({\n\tstate: stateOverride,\n\tstep = 1,\n\tlast = false,\n\tindicator,\n\tclassName,\n\tchildren,\n\t...props\n}: StepperItemProps) {\n\tconst { orientation, value } = useStepper();\n\tconst state = resolveState(step, value, stateOverride);\n\n\tconst itemContext = React.useMemo<StepperItemContextValue>(\n\t\t() => ({ state, step }),\n\t\t[state, step],\n\t);\n\n\treturn (\n\t\t<StepperItemContext.Provider value={itemContext}>\n\t\t\t<div\n\t\t\t\tdata-slot=\"stepper-item\"\n\t\t\t\tdata-state={state}\n\t\t\t\tdata-orientation={orientation}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group/stepper-item flex min-w-0\",\n\t\t\t\t\torientation === \"horizontal\"\n\t\t\t\t\t\t? \"flex-1 flex-col gap-3 last:flex-none\"\n\t\t\t\t\t\t: \"flex-row items-stretch gap-3\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex\",\n\t\t\t\t\t\torientation === \"horizontal\"\n\t\t\t\t\t\t\t? \"items-center\"\n\t\t\t\t\t\t\t: \"flex-col items-center\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{indicator ?? <StepperIndicator />}\n\t\t\t\t\t{!last && <StepperSeparator />}\n\t\t\t\t</div>\n\n\t\t\t\t{children != null && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex min-w-0 flex-col gap-1\",\n\t\t\t\t\t\t\torientation === \"horizontal\"\n\t\t\t\t\t\t\t\t? \"pr-4\"\n\t\t\t\t\t\t\t\t: cn(\"pt-1\", !last && \"pb-8\"),\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</StepperItemContext.Provider>\n\t);\n}\n\nconst indicatorVariants = cva(\n\t\"relative flex size-7 shrink-0 items-center justify-center rounded-full text-gdt-sm font-semibold transition-colors sm:size-9\",\n\t{\n\t\tvariants: {\n\t\t\tstate: {\n\t\t\t\tcomplete:\n\t\t\t\t\t\"border border-transparent bg-action-primary text-fg-on-brand\",\n\t\t\t\tactive: \"border-2 border-line-focus bg-canvas text-fg-brand\",\n\t\t\t\tupcoming: \"border border-line bg-surface text-fg-secondary\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tstate: \"upcoming\",\n\t\t},\n\t},\n);\n\ntype StepperIndicatorProps = Omit<React.ComponentProps<\"div\">, \"children\"> &\n\tVariantProps<typeof indicatorVariants> & {\n\t\t/** Override the rendered glyph. Defaults to the step number / checkmark. */\n\t\tchildren?: React.ReactNode;\n\t};\n\nfunction StepperIndicator({\n\tclassName,\n\tstate: stateProp,\n\tchildren,\n\t...props\n}: StepperIndicatorProps) {\n\tconst { state, step } = useStepperItem();\n\tconst resolved = stateProp ?? state;\n\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"stepper-indicator\"\n\t\t\tdata-state={resolved}\n\t\t\tclassName={cn(indicatorVariants({ state: resolved }), className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children ??\n\t\t\t\t(resolved === \"complete\" ? (\n\t\t\t\t\t<CheckIcon className=\"size-4 sm:size-4.5\" strokeWidth={2.5} />\n\t\t\t\t) : (\n\t\t\t\t\tstep\n\t\t\t\t))}\n\t\t</div>\n\t);\n}\n\nconst separatorVariants = cva(\"shrink-0 rounded-full transition-colors\", {\n\tvariants: {\n\t\tstate: {\n\t\t\tcomplete: \"bg-action-primary\",\n\t\t\tactive: \"bg-line\",\n\t\t\tupcoming: \"bg-line\",\n\t\t},\n\t\torientation: {\n\t\t\thorizontal: \"h-0.5 flex-1\",\n\t\t\tvertical: \"w-0.5 flex-1 min-h-8\",\n\t\t},\n\t},\n\tdefaultVariants: {\n\t\tstate: \"upcoming\",\n\t\torientation: \"horizontal\",\n\t},\n});\n\nfunction StepperSeparator({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"div\">) {\n\tconst { orientation } = useStepper();\n\tconst { state } = useStepperItem();\n\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"stepper-separator\"\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={cn(separatorVariants({ state, orientation }), className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nconst titleVariants = cva(\"text-gdt-sm font-bold\", {\n\tvariants: {\n\t\tstate: {\n\t\t\tcomplete: \"text-fg-primary\",\n\t\t\tactive: \"text-fg-brand\",\n\t\t\tupcoming: \"text-fg-secondary\",\n\t\t},\n\t},\n\tdefaultVariants: {\n\t\tstate: \"upcoming\",\n\t},\n});\n\nfunction StepperTitle({ className, ...props }: React.ComponentProps<\"p\">) {\n\tconst { state } = useStepperItem();\n\n\treturn (\n\t\t<p\n\t\t\tdata-slot=\"stepper-title\"\n\t\t\tclassName={cn(titleVariants({ state }), className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nconst descriptionVariants = cva(\"text-gdt-sm\", {\n\tvariants: {\n\t\tstate: {\n\t\t\tcomplete: \"text-fg-secondary\",\n\t\t\tactive: \"text-fg-secondary\",\n\t\t\tupcoming: \"text-fg-caption-placeholder\",\n\t\t},\n\t},\n\tdefaultVariants: {\n\t\tstate: \"upcoming\",\n\t},\n});\n\nfunction StepperDescription({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"p\">) {\n\tconst { state } = useStepperItem();\n\n\treturn (\n\t\t<p\n\t\t\tdata-slot=\"stepper-description\"\n\t\t\tclassName={cn(descriptionVariants({ state }), className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\ntype StepperMetaProps = Omit<React.ComponentProps<\"div\">, \"children\"> & {\n\tdate?: React.ReactNode;\n\ttime?: React.ReactNode;\n};\n\n/** Date / timestamp caption pair. Placeholder colour regardless of state. */\nfunction StepperMeta({ date, time, className, ...props }: StepperMetaProps) {\n\tif (date == null && time == null) return null;\n\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"stepper-meta\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-wrap items-center gap-x-2 gap-y-0.5 text-gdt-xs text-fg-caption-placeholder\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{date != null && <span>{date}</span>}\n\t\t\t{time != null && <span>{time}</span>}\n\t\t</div>\n\t);\n}\n\nexport {\n\tStepper,\n\tStepperItem,\n\tStepperIndicator,\n\tStepperSeparator,\n\tStepperTitle,\n\tStepperDescription,\n\tStepperMeta,\n\ttype StepperOrientation,\n\ttype StepperState,\n};\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/switch.tsx"],"sourcesContent":["\"use client\";\n\nimport { Switch as SwitchPrimitive } from \"@base-ui/react/switch\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"./lib/cn\";\nimport { useComponentSize } from \"./size-context\";\n\nconst switchVariants = cva(\n\t\"peer group/switch relative inline-flex shrink-0 items-center rounded-full border bg-clip-padding p-0.5 transition-[background-color,border-color,box-shadow,opacity] outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-line-focus focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)] aria-invalid:border-line-danger aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-checked:border-action-primary data-checked:bg-action-primary data-unchecked:border-line data-unchecked:bg-transparent data-[loading=true]:border-action-primary data-[loading=true]:bg-action-primary data-disabled:border-line-subtle! data-disabled:bg-transparent! data-disabled:cursor-not-allowed data-disabled:opacity-60 h-6 w-10 [--switch-spinner-size:0.75rem] [--switch-thumb-size:18px] [--switch-track-width:2.5rem] group-data-[size=sm]/field:h-5 group-data-[size=sm]/field:w-8 group-data-[size=sm]/field:[--switch-spinner-size:0.625rem] group-data-[size=sm]/field:[--switch-thumb-size:14px] group-data-[size=sm]/field:[--switch-track-width:2rem] group-data-[size=md]/field:h-6 group-data-[size=md]/field:w-10 group-data-[size=md]/field:[--switch-spinner-size:0.75rem] group-data-[size=md]/field:[--switch-thumb-size:18px] group-data-[size=md]/field:[--switch-track-width:2.5rem] group-data-[size=lg]/field:h-7 group-data-[size=lg]/field:w-12 group-data-[size=lg]/field:[--switch-spinner-size:0.875rem] group-data-[size=lg]/field:[--switch-thumb-size:22px] group-data-[size=lg]/field:[--switch-track-width:3rem]\",\n\t{\n\t\tvariants: {\n\t\t\tsize: {\n\t\t\t\tsm: \"h-5 w-8 [--switch-spinner-size:0.625rem] [--switch-thumb-size:14px] [--switch-track-width:2rem]\",\n\t\t\t\tmd: \"h-6 w-10 [--switch-spinner-size:0.75rem] [--switch-thumb-size:18px] [--switch-track-width:2.5rem]\",\n\t\t\t\tlg: \"h-7 w-12 [--switch-spinner-size:0.875rem] [--switch-thumb-size:22px] [--switch-track-width:3rem]\",\n\t\t\t},\n\t\t},\n\t},\n);\n\ntype SwitchSize = NonNullable<VariantProps<typeof switchVariants>[\"size\"]>;\ntype SwitchProps = Omit<SwitchPrimitive.Root.Props, \"children\"> & {\n\tloading?: boolean;\n\tsize?: SwitchSize;\n};\n\n/**\n * Compose with the shared field primitives for label and helper text.\n *\n * ```tsx\n * <Field orientation=\"horizontal\" size=\"sm\">\n * <Switch id=\"notifications\" />\n * <FieldContent>\n * <FieldLabel htmlFor=\"notifications\">Notifications</FieldLabel>\n * <FieldDescription>Receive product update emails.</FieldDescription>\n * </FieldContent>\n * </Field>\n * ```\n */\nfunction Switch({\n\tclassName,\n\tdisabled = false,\n\tloading = false,\n\treadOnly = false,\n\tsize,\n\t...props\n}: SwitchProps) {\n\tconst resolvedSize = useComponentSize(size);\n\tconst isDisabled = disabled;\n\tconst isReadOnly = readOnly || loading;\n\n\treturn (\n\t\t<SwitchPrimitive.Root\n\t\t\taria-busy={loading || undefined}\n\t\t\tdata-slot=\"switch\"\n\t\t\tdata-loading={loading}\n\t\t\tdata-size={resolvedSize}\n\t\t\tdisabled={isDisabled}\n\t\t\treadOnly={isReadOnly}\n\t\t\tclassName={cn(switchVariants({ size: resolvedSize }), className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<SwitchPrimitive.Thumb\n\t\t\t\tdata-slot=\"switch-thumb\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"pointer-events-none grid size-(--switch-thumb-size) translate-x-0 place-items-center rounded-full bg-fg-on-brand text-fg-brand ring-0 transition-transform duration-200 ease-out data-checked:translate-x-[calc(var(--switch-track-width)-var(--switch-thumb-size)-4px)]\",\n\t\t\t\t\tloading &&\n\t\t\t\t\t\t\"translate-x-[calc(var(--switch-track-width)-var(--switch-thumb-size)-4px)]\",\n\t\t\t\t\tisDisabled && \"translate-x-0! bg-line text-fg-caption-placeholder\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{loading && !isDisabled && (\n\t\t\t\t\t<span\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tdata-slot=\"switch-spinner\"\n\t\t\t\t\t\tclassName=\"size-(--switch-spinner-size) animate-spin rounded-full border-2 border-current border-r-transparent\"\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</SwitchPrimitive.Thumb>\n\t\t</SwitchPrimitive.Root>\n\t);\n}\n\nexport { Switch, switchVariants };\n"],"mappings":";;;;;;;;;AAEA,SAAS,UAAU,uBAAuB;AAC1C,SAAS,WAA8B;AAsElC;AAjEL,IAAM,iBAAiB;AAAA,EACtB;AAAA,EACA;AAAA,IACC,UAAU;AAAA,MACT,MAAM;AAAA,QACL,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACL;AAAA,IACD;AAAA,EACD;AACD;AAqBA,SAAS,OAAO;AAAA,EACf;AAAA,EACA,WAAW;AAAA,EACX,UAAU;AAAA,EACV,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACJ,GAAgB;AACf,QAAM,eAAe,iBAAiB,IAAI;AAC1C,QAAM,aAAa;AACnB,QAAM,aAAa,YAAY;AAE/B,SACC;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACA,aAAW,WAAW;AAAA,MACtB,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,aAAW;AAAA,MACX,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW,GAAG,eAAe,EAAE,MAAM,aAAa,CAAC,GAAG,SAAS;AAAA,MAC9D,GAAG;AAAA,MAEJ;AAAA,QAAC,gBAAgB;AAAA,QAAhB;AAAA,UACA,aAAU;AAAA,UACV,WAAW;AAAA,YACV;AAAA,YACA,WACC;AAAA,YACD,cAAc;AAAA,UACf;AAAA,UAEC,qBAAW,CAAC,cACZ;AAAA,YAAC;AAAA;AAAA,cACA,eAAY;AAAA,cACZ,aAAU;AAAA,cACV,WAAU;AAAA;AAAA,UACX;AAAA;AAAA,MAEF;AAAA;AAAA,EACD;AAEF;","names":[]}
@@ -1,38 +0,0 @@
1
- import * as React$1 from 'react';
2
- import { Tabs } from '@base-ui/react/tabs';
3
-
4
- type TabsListVariant = "default" | "line" | "secondary" | "underline";
5
- type TabListItem = {
6
- /** Stable value used to match the active tab. */
7
- value: string;
8
- /** Visible label. */
9
- label: React.ReactNode;
10
- /** Optional count badge rendered after the label. */
11
- count?: number;
12
- disabled?: boolean;
13
- /**
14
- * Optional element to render the trigger as (e.g. a router `<Link>`).
15
- * Used for both the in-bar tab and its overflow menu item.
16
- */
17
- render?: React.ReactElement;
18
- };
19
- type TabListProps = Omit<Tabs.Root.Props, "children" | "value" | "defaultValue" | "onValueChange"> & {
20
- items: TabListItem[];
21
- value?: string;
22
- defaultValue?: string;
23
- onValueChange?: (value: string) => void;
24
- variant?: TabsListVariant;
25
- /** Max tabs shown inline on small screens before collapsing into "More". */
26
- maxVisibleMobile?: number;
27
- /** Max tabs shown inline on larger screens before collapsing into "More". */
28
- maxVisibleDesktop?: number;
29
- /** Label for the overflow trigger. */
30
- moreLabel?: React.ReactNode;
31
- className?: string;
32
- listClassName?: string;
33
- /** Tab panels (`TabsContent`) to render under the bar. */
34
- children?: React.ReactNode;
35
- };
36
- declare function TabList({ items, value, defaultValue, onValueChange, variant, maxVisibleMobile, maxVisibleDesktop, moreLabel, className, listClassName, children, ...rootProps }: TabListProps): React$1.JSX.Element;
37
-
38
- export { TabList, type TabListItem };
package/dist/tab-list.js DELETED
@@ -1,123 +0,0 @@
1
- "use client";
2
- import {
3
- Tabs,
4
- TabsCount,
5
- TabsList,
6
- TabsTrigger
7
- } from "./chunk-EFSOSSIC.js";
8
- import {
9
- useIsMobile
10
- } from "./chunk-RBMK26XD.js";
11
- import {
12
- DropdownMenu,
13
- DropdownMenuContent,
14
- DropdownMenuItem,
15
- DropdownMenuTrigger
16
- } from "./chunk-3T65TLJX.js";
17
- import "./chunk-HL3ZSYES.js";
18
- import {
19
- cn
20
- } from "./chunk-Y4TTYVNE.js";
21
-
22
- // src/tab-list.tsx
23
- import { ChevronDownIcon } from "lucide-react";
24
- import { useState } from "react";
25
- import { jsx, jsxs } from "react/jsx-runtime";
26
- function TabList({
27
- items,
28
- value,
29
- defaultValue,
30
- onValueChange,
31
- variant = "line",
32
- maxVisibleMobile = 2,
33
- maxVisibleDesktop = 4,
34
- moreLabel = "More",
35
- className,
36
- listClassName,
37
- children,
38
- ...rootProps
39
- }) {
40
- const isMobile = useIsMobile();
41
- const [internalValue, setInternalValue] = useState(
42
- value ?? defaultValue ?? items[0]?.value
43
- );
44
- const currentValue = value ?? internalValue;
45
- const selectValue = (next) => {
46
- if (value === void 0) setInternalValue(next);
47
- onValueChange?.(next);
48
- };
49
- const maxVisible = isMobile ? maxVisibleMobile : maxVisibleDesktop;
50
- const visibleItems = items.slice(0, maxVisible);
51
- const overflowItems = items.slice(maxVisible);
52
- const isOverflowActive = overflowItems.some(
53
- (item) => item.value === currentValue
54
- );
55
- return /* @__PURE__ */ jsxs(
56
- Tabs,
57
- {
58
- value: currentValue,
59
- onValueChange: (next) => selectValue(next),
60
- className,
61
- ...rootProps,
62
- children: [
63
- /* @__PURE__ */ jsxs(TabsList, { variant, className: listClassName, children: [
64
- visibleItems.map((item) => /* @__PURE__ */ jsxs(
65
- TabsTrigger,
66
- {
67
- value: item.value,
68
- disabled: item.disabled,
69
- nativeButton: item.render ? false : void 0,
70
- render: item.render,
71
- children: [
72
- item.label,
73
- item.count != null && /* @__PURE__ */ jsx(TabsCount, { children: item.count })
74
- ]
75
- },
76
- item.value
77
- )),
78
- overflowItems.length > 0 && /* @__PURE__ */ jsxs(DropdownMenu, { children: [
79
- /* @__PURE__ */ jsxs(
80
- DropdownMenuTrigger,
81
- {
82
- render: /* @__PURE__ */ jsx(
83
- "button",
84
- {
85
- type: "button",
86
- "data-active": isOverflowActive || void 0,
87
- className: cn(
88
- "group/tab-list-more relative inline-flex shrink-0 items-center justify-center gap-1.5 whitespace-nowrap border border-transparent px-4 py-3 text-gdt-md font-semibold text-fg-secondary outline-none transition-colors hover:text-fg-primary focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)] data-active:text-fg-primary max-sm:px-3 max-sm:py-2.5 max-sm:text-gdt-sm"
89
- )
90
- }
91
- ),
92
- children: [
93
- moreLabel,
94
- /* @__PURE__ */ jsx(ChevronDownIcon, { className: "size-4 transition-transform duration-200 group-data-[popup-open]/tab-list-more:rotate-180" })
95
- ]
96
- }
97
- ),
98
- /* @__PURE__ */ jsx(DropdownMenuContent, { align: "end", children: overflowItems.map((item) => /* @__PURE__ */ jsxs(
99
- DropdownMenuItem,
100
- {
101
- disabled: item.disabled,
102
- "data-active": item.value === currentValue || void 0,
103
- className: "justify-between gap-3 data-active:text-fg-brand",
104
- render: item.render,
105
- onClick: () => selectValue(item.value),
106
- children: [
107
- item.label,
108
- item.count != null && /* @__PURE__ */ jsx("span", { className: "ml-auto inline-flex min-w-5 items-center justify-center rounded-full bg-surface-raised px-1.5 py-0.5 text-[11px] leading-none font-semibold text-fg-secondary", children: item.count })
109
- ]
110
- },
111
- item.value
112
- )) })
113
- ] })
114
- ] }),
115
- children
116
- ]
117
- }
118
- );
119
- }
120
- export {
121
- TabList
122
- };
123
- //# sourceMappingURL=tab-list.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tab-list.tsx"],"sourcesContent":["\"use client\";\n\nimport type { Tabs as TabsPrimitive } from \"@base-ui/react/tabs\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport { useState } from \"react\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n} from \"./dropdown-menu\";\nimport { cn } from \"./lib/cn\";\nimport { useIsMobile } from \"./lib/use-mobile\";\nimport { Tabs, TabsCount, TabsList, TabsTrigger } from \"./tabs\";\n\ntype TabsListVariant = \"default\" | \"line\" | \"secondary\" | \"underline\";\n\ntype TabListItem = {\n\t/** Stable value used to match the active tab. */\n\tvalue: string;\n\t/** Visible label. */\n\tlabel: React.ReactNode;\n\t/** Optional count badge rendered after the label. */\n\tcount?: number;\n\tdisabled?: boolean;\n\t/**\n\t * Optional element to render the trigger as (e.g. a router `<Link>`).\n\t * Used for both the in-bar tab and its overflow menu item.\n\t */\n\trender?: React.ReactElement;\n};\n\ntype TabListProps = Omit<\n\tTabsPrimitive.Root.Props,\n\t\"children\" | \"value\" | \"defaultValue\" | \"onValueChange\"\n> & {\n\titems: TabListItem[];\n\tvalue?: string;\n\tdefaultValue?: string;\n\tonValueChange?: (value: string) => void;\n\tvariant?: TabsListVariant;\n\t/** Max tabs shown inline on small screens before collapsing into \"More\". */\n\tmaxVisibleMobile?: number;\n\t/** Max tabs shown inline on larger screens before collapsing into \"More\". */\n\tmaxVisibleDesktop?: number;\n\t/** Label for the overflow trigger. */\n\tmoreLabel?: React.ReactNode;\n\tclassName?: string;\n\tlistClassName?: string;\n\t/** Tab panels (`TabsContent`) to render under the bar. */\n\tchildren?: React.ReactNode;\n};\n\nfunction TabList({\n\titems,\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n\tvariant = \"line\",\n\tmaxVisibleMobile = 2,\n\tmaxVisibleDesktop = 4,\n\tmoreLabel = \"More\",\n\tclassName,\n\tlistClassName,\n\tchildren,\n\t...rootProps\n}: TabListProps) {\n\tconst isMobile = useIsMobile();\n\tconst [internalValue, setInternalValue] = useState(\n\t\tvalue ?? defaultValue ?? items[0]?.value,\n\t);\n\n\tconst currentValue = value ?? internalValue;\n\n\tconst selectValue = (next: string) => {\n\t\tif (value === undefined) setInternalValue(next);\n\t\tonValueChange?.(next);\n\t};\n\n\tconst maxVisible = isMobile ? maxVisibleMobile : maxVisibleDesktop;\n\tconst visibleItems = items.slice(0, maxVisible);\n\tconst overflowItems = items.slice(maxVisible);\n\tconst isOverflowActive = overflowItems.some(\n\t\t(item) => item.value === currentValue,\n\t);\n\n\treturn (\n\t\t<Tabs\n\t\t\tvalue={currentValue}\n\t\t\tonValueChange={(next) => selectValue(next as string)}\n\t\t\tclassName={className}\n\t\t\t{...rootProps}\n\t\t>\n\t\t\t<TabsList variant={variant} className={listClassName}>\n\t\t\t\t{visibleItems.map((item) => (\n\t\t\t\t\t<TabsTrigger\n\t\t\t\t\t\tkey={item.value}\n\t\t\t\t\t\tvalue={item.value}\n\t\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\t\tnativeButton={item.render ? false : undefined}\n\t\t\t\t\t\trender={item.render}\n\t\t\t\t\t>\n\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t{item.count != null && <TabsCount>{item.count}</TabsCount>}\n\t\t\t\t\t</TabsTrigger>\n\t\t\t\t))}\n\n\t\t\t\t{overflowItems.length > 0 && (\n\t\t\t\t\t<DropdownMenu>\n\t\t\t\t\t\t<DropdownMenuTrigger\n\t\t\t\t\t\t\trender={\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tdata-active={isOverflowActive || undefined}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"group/tab-list-more relative inline-flex shrink-0 items-center justify-center gap-1.5 whitespace-nowrap border border-transparent px-4 py-3 text-gdt-md font-semibold text-fg-secondary outline-none transition-colors hover:text-fg-primary focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)] data-active:text-fg-primary max-sm:px-3 max-sm:py-2.5 max-sm:text-gdt-sm\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{moreLabel}\n\t\t\t\t\t\t\t<ChevronDownIcon className=\"size-4 transition-transform duration-200 group-data-[popup-open]/tab-list-more:rotate-180\" />\n\t\t\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t\t\t\t{overflowItems.map((item) => (\n\t\t\t\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\t\t\t\tkey={item.value}\n\t\t\t\t\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\t\t\t\t\tdata-active={item.value === currentValue || undefined}\n\t\t\t\t\t\t\t\t\tclassName=\"justify-between gap-3 data-active:text-fg-brand\"\n\t\t\t\t\t\t\t\t\trender={item.render}\n\t\t\t\t\t\t\t\t\tonClick={() => selectValue(item.value)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t\t{item.count != null && (\n\t\t\t\t\t\t\t\t\t\t<span className=\"ml-auto inline-flex min-w-5 items-center justify-center rounded-full bg-surface-raised px-1.5 py-0.5 text-[11px] leading-none font-semibold text-fg-secondary\">\n\t\t\t\t\t\t\t\t\t\t\t{item.count}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</DropdownMenuContent>\n\t\t\t\t\t</DropdownMenu>\n\t\t\t\t)}\n\t\t\t</TabsList>\n\n\t\t\t{children}\n\t\t</Tabs>\n\t);\n}\n\nexport { TabList, type TabListItem };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAGA,SAAS,uBAAuB;AAChC,SAAS,gBAAgB;AA2FpB,SAQwB,KARxB;AA1CL,SAAS,QAAQ;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAAiB;AAChB,QAAM,WAAW,YAAY;AAC7B,QAAM,CAAC,eAAe,gBAAgB,IAAI;AAAA,IACzC,SAAS,gBAAgB,MAAM,CAAC,GAAG;AAAA,EACpC;AAEA,QAAM,eAAe,SAAS;AAE9B,QAAM,cAAc,CAAC,SAAiB;AACrC,QAAI,UAAU,OAAW,kBAAiB,IAAI;AAC9C,oBAAgB,IAAI;AAAA,EACrB;AAEA,QAAM,aAAa,WAAW,mBAAmB;AACjD,QAAM,eAAe,MAAM,MAAM,GAAG,UAAU;AAC9C,QAAM,gBAAgB,MAAM,MAAM,UAAU;AAC5C,QAAM,mBAAmB,cAAc;AAAA,IACtC,CAAC,SAAS,KAAK,UAAU;AAAA,EAC1B;AAEA,SACC;AAAA,IAAC;AAAA;AAAA,MACA,OAAO;AAAA,MACP,eAAe,CAAC,SAAS,YAAY,IAAc;AAAA,MACnD;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,6BAAC,YAAS,SAAkB,WAAW,eACrC;AAAA,uBAAa,IAAI,CAAC,SAClB;AAAA,YAAC;AAAA;AAAA,cAEA,OAAO,KAAK;AAAA,cACZ,UAAU,KAAK;AAAA,cACf,cAAc,KAAK,SAAS,QAAQ;AAAA,cACpC,QAAQ,KAAK;AAAA,cAEZ;AAAA,qBAAK;AAAA,gBACL,KAAK,SAAS,QAAQ,oBAAC,aAAW,eAAK,OAAM;AAAA;AAAA;AAAA,YAPzC,KAAK;AAAA,UAQX,CACA;AAAA,UAEA,cAAc,SAAS,KACvB,qBAAC,gBACA;AAAA;AAAA,cAAC;AAAA;AAAA,gBACA,QACC;AAAA,kBAAC;AAAA;AAAA,oBACA,MAAK;AAAA,oBACL,eAAa,oBAAoB;AAAA,oBACjC,WAAW;AAAA,sBACV;AAAA,oBACD;AAAA;AAAA,gBACD;AAAA,gBAGA;AAAA;AAAA,kBACD,oBAAC,mBAAgB,WAAU,6FAA4F;AAAA;AAAA;AAAA,YACxH;AAAA,YACA,oBAAC,uBAAoB,OAAM,OACzB,wBAAc,IAAI,CAAC,SACnB;AAAA,cAAC;AAAA;AAAA,gBAEA,UAAU,KAAK;AAAA,gBACf,eAAa,KAAK,UAAU,gBAAgB;AAAA,gBAC5C,WAAU;AAAA,gBACV,QAAQ,KAAK;AAAA,gBACb,SAAS,MAAM,YAAY,KAAK,KAAK;AAAA,gBAEpC;AAAA,uBAAK;AAAA,kBACL,KAAK,SAAS,QACd,oBAAC,UAAK,WAAU,iKACd,eAAK,OACP;AAAA;AAAA;AAAA,cAXI,KAAK;AAAA,YAaX,CACA,GACF;AAAA,aACD;AAAA,WAEF;AAAA,QAEC;AAAA;AAAA;AAAA,EACF;AAEF;","names":[]}