@nocoo/basalt 2.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +41 -0
  3. package/dist/charts/area.d.ts +8 -0
  4. package/dist/charts/area.js +55 -0
  5. package/dist/charts/area.js.map +1 -0
  6. package/dist/charts/bar.d.ts +9 -0
  7. package/dist/charts/bar.js +42 -0
  8. package/dist/charts/bar.js.map +1 -0
  9. package/dist/charts/bullet.d.ts +8 -0
  10. package/dist/charts/bullet.js +50 -0
  11. package/dist/charts/bullet.js.map +1 -0
  12. package/dist/charts/chart-colors.d.ts +1 -0
  13. package/dist/charts/chart-colors.js +3 -0
  14. package/dist/charts/charts.d.ts +6 -0
  15. package/dist/charts/charts.js +15 -0
  16. package/dist/charts/charts.js.map +1 -0
  17. package/dist/charts/config.d.ts +117 -0
  18. package/dist/charts/config.js +117 -0
  19. package/dist/charts/config.js.map +1 -0
  20. package/dist/charts/custom-chart.d.ts +6 -0
  21. package/dist/charts/custom-chart.js +15 -0
  22. package/dist/charts/custom-chart.js.map +1 -0
  23. package/dist/charts/date-navigation.d.ts +22 -0
  24. package/dist/charts/date-navigation.js +122 -0
  25. package/dist/charts/date-navigation.js.map +1 -0
  26. package/dist/charts/donut.d.ts +8 -0
  27. package/dist/charts/donut.js +36 -0
  28. package/dist/charts/donut.js.map +1 -0
  29. package/dist/charts/frame.d.ts +9 -0
  30. package/dist/charts/frame.js +22 -0
  31. package/dist/charts/frame.js.map +1 -0
  32. package/dist/charts/funnel.d.ts +7 -0
  33. package/dist/charts/funnel.js +35 -0
  34. package/dist/charts/funnel.js.map +1 -0
  35. package/dist/charts/gauge.d.ts +8 -0
  36. package/dist/charts/gauge.js +46 -0
  37. package/dist/charts/gauge.js.map +1 -0
  38. package/dist/charts/grouped-bar.d.ts +7 -0
  39. package/dist/charts/grouped-bar.js +42 -0
  40. package/dist/charts/grouped-bar.js.map +1 -0
  41. package/dist/charts/heatmap-calendar.d.ts +27 -0
  42. package/dist/charts/heatmap-calendar.js +200 -0
  43. package/dist/charts/heatmap-calendar.js.map +1 -0
  44. package/dist/charts/item-list.d.ts +9 -0
  45. package/dist/charts/item-list.js +22 -0
  46. package/dist/charts/item-list.js.map +1 -0
  47. package/dist/charts/line.d.ts +9 -0
  48. package/dist/charts/line.js +58 -0
  49. package/dist/charts/line.js.map +1 -0
  50. package/dist/charts/palette.d.ts +33 -0
  51. package/dist/charts/palette.js +44 -0
  52. package/dist/charts/palette.js.map +1 -0
  53. package/dist/charts/radar.d.ts +6 -0
  54. package/dist/charts/radar.js +37 -0
  55. package/dist/charts/radar.js.map +1 -0
  56. package/dist/charts/sample.d.ts +42 -0
  57. package/dist/charts/sample.js +124 -0
  58. package/dist/charts/sample.js.map +1 -0
  59. package/dist/charts/sankey.d.ts +6 -0
  60. package/dist/charts/sankey.js +51 -0
  61. package/dist/charts/sankey.js.map +1 -0
  62. package/dist/charts/slot-bar.d.ts +15 -0
  63. package/dist/charts/slot-bar.js +80 -0
  64. package/dist/charts/slot-bar.js.map +1 -0
  65. package/dist/charts/sparkline.d.ts +6 -0
  66. package/dist/charts/sparkline.js +29 -0
  67. package/dist/charts/sparkline.js.map +1 -0
  68. package/dist/charts/stacked-bar.d.ts +7 -0
  69. package/dist/charts/stacked-bar.js +51 -0
  70. package/dist/charts/stacked-bar.js.map +1 -0
  71. package/dist/charts/stat-card.d.ts +21 -0
  72. package/dist/charts/stat-card.js +66 -0
  73. package/dist/charts/stat-card.js.map +1 -0
  74. package/dist/charts/timeline.d.ts +17 -0
  75. package/dist/charts/timeline.js +79 -0
  76. package/dist/charts/timeline.js.map +1 -0
  77. package/dist/charts/timeseries.d.ts +6 -0
  78. package/dist/charts/timeseries.js +15 -0
  79. package/dist/charts/timeseries.js.map +1 -0
  80. package/dist/components/accordion.d.ts +6 -0
  81. package/dist/components/accordion.js +21 -0
  82. package/dist/components/accordion.js.map +1 -0
  83. package/dist/components/alert-dialog.d.ts +25 -0
  84. package/dist/components/alert-dialog.js +61 -0
  85. package/dist/components/alert-dialog.js.map +1 -0
  86. package/dist/components/app-header.d.ts +10 -0
  87. package/dist/components/app-header.js +35 -0
  88. package/dist/components/app-header.js.map +1 -0
  89. package/dist/components/app-shell.d.ts +4 -0
  90. package/dist/components/app-shell.js +29 -0
  91. package/dist/components/app-shell.js.map +1 -0
  92. package/dist/components/autocomplete.d.ts +47 -0
  93. package/dist/components/autocomplete.js +28 -0
  94. package/dist/components/autocomplete.js.map +1 -0
  95. package/dist/components/avatar.d.ts +5 -0
  96. package/dist/components/avatar.js +28 -0
  97. package/dist/components/avatar.js.map +1 -0
  98. package/dist/components/badge.d.ts +10 -0
  99. package/dist/components/badge.js +37 -0
  100. package/dist/components/badge.js.map +1 -0
  101. package/dist/components/banner.d.ts +22 -0
  102. package/dist/components/banner.js +88 -0
  103. package/dist/components/banner.js.map +1 -0
  104. package/dist/components/basalt-mark.d.ts +8 -0
  105. package/dist/components/basalt-mark.js +17 -0
  106. package/dist/components/basalt-mark.js.map +1 -0
  107. package/dist/components/breadcrumbs.d.ts +9 -0
  108. package/dist/components/breadcrumbs.js +38 -0
  109. package/dist/components/breadcrumbs.js.map +1 -0
  110. package/dist/components/button.d.ts +17 -0
  111. package/dist/components/button.js +73 -0
  112. package/dist/components/button.js.map +1 -0
  113. package/dist/components/checkbox.d.ts +86 -0
  114. package/dist/components/checkbox.js +107 -0
  115. package/dist/components/checkbox.js.map +1 -0
  116. package/dist/components/clipboard-text.d.ts +5 -0
  117. package/dist/components/clipboard-text.js +33 -0
  118. package/dist/components/clipboard-text.js.map +1 -0
  119. package/dist/components/code.d.ts +26 -0
  120. package/dist/components/code.js +45 -0
  121. package/dist/components/code.js.map +1 -0
  122. package/dist/components/collapsible.d.ts +33 -0
  123. package/dist/components/collapsible.js +38 -0
  124. package/dist/components/collapsible.js.map +1 -0
  125. package/dist/components/combobox.d.ts +47 -0
  126. package/dist/components/combobox.js +28 -0
  127. package/dist/components/combobox.js.map +1 -0
  128. package/dist/components/command-palette.d.ts +83 -0
  129. package/dist/components/command-palette.js +90 -0
  130. package/dist/components/command-palette.js.map +1 -0
  131. package/dist/components/confirm-dialog.d.ts +52 -0
  132. package/dist/components/confirm-dialog.js +61 -0
  133. package/dist/components/confirm-dialog.js.map +1 -0
  134. package/dist/components/context-menu.d.ts +7 -0
  135. package/dist/components/context-menu.js +23 -0
  136. package/dist/components/context-menu.js.map +1 -0
  137. package/dist/components/data-table.d.ts +76 -0
  138. package/dist/components/data-table.js +230 -0
  139. package/dist/components/data-table.js.map +1 -0
  140. package/dist/components/date-picker.d.ts +90 -0
  141. package/dist/components/date-picker.js +452 -0
  142. package/dist/components/date-picker.js.map +1 -0
  143. package/dist/components/dialog.d.ts +37 -0
  144. package/dist/components/dialog.js +67 -0
  145. package/dist/components/dialog.js.map +1 -0
  146. package/dist/components/dropdown-menu.d.ts +38 -0
  147. package/dist/components/dropdown-menu.js +24 -0
  148. package/dist/components/dropdown-menu.js.map +1 -0
  149. package/dist/components/empty.d.ts +6 -0
  150. package/dist/components/empty.js +28 -0
  151. package/dist/components/empty.js.map +1 -0
  152. package/dist/components/field.d.ts +39 -0
  153. package/dist/components/field.js +52 -0
  154. package/dist/components/field.js.map +1 -0
  155. package/dist/components/flow.d.ts +24 -0
  156. package/dist/components/flow.js +56 -0
  157. package/dist/components/flow.js.map +1 -0
  158. package/dist/components/grid.d.ts +15 -0
  159. package/dist/components/grid.js +24 -0
  160. package/dist/components/grid.js.map +1 -0
  161. package/dist/components/hover-card.d.ts +5 -0
  162. package/dist/components/hover-card.js +18 -0
  163. package/dist/components/hover-card.js.map +1 -0
  164. package/dist/components/input-area.d.ts +19 -0
  165. package/dist/components/input-area.js +27 -0
  166. package/dist/components/input-area.js.map +1 -0
  167. package/dist/components/input-group.d.ts +70 -0
  168. package/dist/components/input-group.js +78 -0
  169. package/dist/components/input-group.js.map +1 -0
  170. package/dist/components/input.d.ts +19 -0
  171. package/dist/components/input.js +28 -0
  172. package/dist/components/input.js.map +1 -0
  173. package/dist/components/label.d.ts +20 -0
  174. package/dist/components/label.js +34 -0
  175. package/dist/components/label.js.map +1 -0
  176. package/dist/components/layer-card.d.ts +69 -0
  177. package/dist/components/layer-card.js +104 -0
  178. package/dist/components/layer-card.js.map +1 -0
  179. package/dist/components/link.d.ts +8 -0
  180. package/dist/components/link.js +18 -0
  181. package/dist/components/link.js.map +1 -0
  182. package/dist/components/loader.d.ts +4 -0
  183. package/dist/components/loader.js +66 -0
  184. package/dist/components/loader.js.map +1 -0
  185. package/dist/components/loading-screen.d.ts +5 -0
  186. package/dist/components/loading-screen.js +24 -0
  187. package/dist/components/loading-screen.js.map +1 -0
  188. package/dist/components/menu-bar.d.ts +8 -0
  189. package/dist/components/menu-bar.js +42 -0
  190. package/dist/components/menu-bar.js.map +1 -0
  191. package/dist/components/meter.d.ts +8 -0
  192. package/dist/components/meter.js +26 -0
  193. package/dist/components/meter.js.map +1 -0
  194. package/dist/components/navigation-menu.d.ts +6 -0
  195. package/dist/components/navigation-menu.js +16 -0
  196. package/dist/components/navigation-menu.js.map +1 -0
  197. package/dist/components/overlay.d.ts +16 -0
  198. package/dist/components/overlay.js +14 -0
  199. package/dist/components/overlay.js.map +1 -0
  200. package/dist/components/page-header.d.ts +19 -0
  201. package/dist/components/page-header.js +43 -0
  202. package/dist/components/page-header.js.map +1 -0
  203. package/dist/components/pagination.d.ts +35 -0
  204. package/dist/components/pagination.js +68 -0
  205. package/dist/components/pagination.js.map +1 -0
  206. package/dist/components/popover.d.ts +38 -0
  207. package/dist/components/popover.js +65 -0
  208. package/dist/components/popover.js.map +1 -0
  209. package/dist/components/radio.d.ts +108 -0
  210. package/dist/components/radio.js +80 -0
  211. package/dist/components/radio.js.map +1 -0
  212. package/dist/components/scroll-area.d.ts +15 -0
  213. package/dist/components/scroll-area.js +49 -0
  214. package/dist/components/scroll-area.js.map +1 -0
  215. package/dist/components/segment-control.d.ts +35 -0
  216. package/dist/components/segment-control.js +46 -0
  217. package/dist/components/segment-control.js.map +1 -0
  218. package/dist/components/select.d.ts +99 -0
  219. package/dist/components/select.js +51 -0
  220. package/dist/components/select.js.map +1 -0
  221. package/dist/components/sensitive-input.d.ts +23 -0
  222. package/dist/components/sensitive-input.js +43 -0
  223. package/dist/components/sensitive-input.js.map +1 -0
  224. package/dist/components/separator.d.ts +26 -0
  225. package/dist/components/separator.js +18 -0
  226. package/dist/components/separator.js.map +1 -0
  227. package/dist/components/sheet.d.ts +26 -0
  228. package/dist/components/sheet.js +49 -0
  229. package/dist/components/sheet.js.map +1 -0
  230. package/dist/components/sidebar.d.ts +101 -0
  231. package/dist/components/sidebar.js +260 -0
  232. package/dist/components/sidebar.js.map +1 -0
  233. package/dist/components/skeleton-line.d.ts +6 -0
  234. package/dist/components/skeleton-line.js +22 -0
  235. package/dist/components/skeleton-line.js.map +1 -0
  236. package/dist/components/slider.d.ts +3 -0
  237. package/dist/components/slider.js +21 -0
  238. package/dist/components/slider.js.map +1 -0
  239. package/dist/components/stat-strip.d.ts +19 -0
  240. package/dist/components/stat-strip.js +27 -0
  241. package/dist/components/stat-strip.js.map +1 -0
  242. package/dist/components/switch.d.ts +85 -0
  243. package/dist/components/switch.js +94 -0
  244. package/dist/components/switch.js.map +1 -0
  245. package/dist/components/table-of-contents.d.ts +33 -0
  246. package/dist/components/table-of-contents.js +37 -0
  247. package/dist/components/table-of-contents.js.map +1 -0
  248. package/dist/components/table-pager.d.ts +26 -0
  249. package/dist/components/table-pager.js +35 -0
  250. package/dist/components/table-pager.js.map +1 -0
  251. package/dist/components/table.d.ts +45 -0
  252. package/dist/components/table.js +32 -0
  253. package/dist/components/table.js.map +1 -0
  254. package/dist/components/tabs.d.ts +65 -0
  255. package/dist/components/tabs.js +56 -0
  256. package/dist/components/tabs.js.map +1 -0
  257. package/dist/components/text.d.ts +32 -0
  258. package/dist/components/text.js +46 -0
  259. package/dist/components/text.js.map +1 -0
  260. package/dist/components/theme-toggle.d.ts +7 -0
  261. package/dist/components/theme-toggle.js +28 -0
  262. package/dist/components/theme-toggle.js.map +1 -0
  263. package/dist/components/toast.d.ts +27 -0
  264. package/dist/components/toast.js +78 -0
  265. package/dist/components/toast.js.map +1 -0
  266. package/dist/components/toggle-group.d.ts +4 -0
  267. package/dist/components/toggle-group.js +48 -0
  268. package/dist/components/toggle-group.js.map +1 -0
  269. package/dist/components/toggle.d.ts +7 -0
  270. package/dist/components/toggle.js +37 -0
  271. package/dist/components/toggle.js.map +1 -0
  272. package/dist/components/toolbar.d.ts +58 -0
  273. package/dist/components/toolbar.js +76 -0
  274. package/dist/components/toolbar.js.map +1 -0
  275. package/dist/components/tooltip.d.ts +13 -0
  276. package/dist/components/tooltip.js +18 -0
  277. package/dist/components/tooltip.js.map +1 -0
  278. package/dist/components/typeahead-field.d.ts +24 -0
  279. package/dist/components/typeahead-field.js +177 -0
  280. package/dist/components/typeahead-field.js.map +1 -0
  281. package/dist/index.d.ts +33 -0
  282. package/dist/index.js +35 -0
  283. package/dist/providers/link.d.ts +12 -0
  284. package/dist/providers/link.js +18 -0
  285. package/dist/providers/link.js.map +1 -0
  286. package/dist/providers/theme.d.ts +11 -0
  287. package/dist/providers/theme.js +43 -0
  288. package/dist/providers/theme.js.map +1 -0
  289. package/dist/styles/standalone.css +2233 -0
  290. package/dist/styles/tailwind.css +103 -0
  291. package/dist/styles/tokens.css +277 -0
  292. package/dist/utils/cn.d.ts +2 -0
  293. package/dist/utils/cn.js +11 -0
  294. package/dist/utils/cn.js.map +1 -0
  295. package/dist/utils/control-surface.d.ts +2 -0
  296. package/dist/utils/control-surface.js +11 -0
  297. package/dist/utils/control-surface.js.map +1 -0
  298. package/dist/utils/selection-indicator.d.ts +24 -0
  299. package/dist/utils/selection-indicator.js +108 -0
  300. package/dist/utils/selection-indicator.js.map +1 -0
  301. package/package.json +107 -0
@@ -0,0 +1,19 @@
1
+ import * as React from "react";
2
+ export interface PageHeaderBreadcrumb {
3
+ href?: string;
4
+ label: React.ReactNode;
5
+ icon?: React.ReactNode;
6
+ }
7
+ export interface PageHeaderProps {
8
+ /** The page title, rendered as the only heading. */
9
+ title: React.ReactNode;
10
+ /** Supporting text below the title. */
11
+ description?: React.ReactNode;
12
+ /** A short label above the title. */
13
+ eyebrow?: React.ReactNode;
14
+ /** Trail of parent pages. */
15
+ breadcrumbs?: readonly PageHeaderBreadcrumb[];
16
+ /** Actions aligned beside the title on wide screens. */
17
+ actions?: React.ReactNode;
18
+ }
19
+ export declare function PageHeader({ actions, breadcrumbs, description, eyebrow, title }: PageHeaderProps): React.JSX.Element;
@@ -0,0 +1,43 @@
1
+ "use client";
2
+ import { Breadcrumbs as e } from "./breadcrumbs.js";
3
+ import * as t from "react";
4
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
5
+ //#region src/components/page-header.tsx
6
+ function i({ actions: i, breadcrumbs: a, description: o, eyebrow: s, title: c }) {
7
+ let l = t.useId();
8
+ return /* @__PURE__ */ r("header", {
9
+ "aria-labelledby": l,
10
+ className: "rounded-basalt-lg bg-basalt-bright p-5 shadow-xs ring-1 ring-basalt-border md:p-6",
11
+ children: [a && a.length > 0 ? /* @__PURE__ */ n(e, {
12
+ items: [...a],
13
+ className: "mb-3"
14
+ }) : null, /* @__PURE__ */ r("div", {
15
+ className: "flex flex-col gap-4 md:flex-row md:items-start md:justify-between",
16
+ children: [/* @__PURE__ */ r("div", {
17
+ className: "min-w-0 flex-1 space-y-2",
18
+ children: [
19
+ s ? /* @__PURE__ */ n("p", {
20
+ className: "text-xs font-medium text-basalt-muted-foreground",
21
+ children: s
22
+ }) : null,
23
+ /* @__PURE__ */ n("h1", {
24
+ id: l,
25
+ className: "text-2xl font-semibold tracking-tight text-basalt-foreground",
26
+ children: c
27
+ }),
28
+ o ? /* @__PURE__ */ n("p", {
29
+ className: "text-sm text-basalt-muted-foreground",
30
+ children: o
31
+ }) : null
32
+ ]
33
+ }), i ? /* @__PURE__ */ n("div", {
34
+ className: "flex flex-wrap items-center gap-2",
35
+ children: i
36
+ }) : null]
37
+ })]
38
+ });
39
+ }
40
+ //#endregion
41
+ export { i as PageHeader };
42
+
43
+ //# sourceMappingURL=page-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-header.js","names":[],"sources":["../../src/components/page-header.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Breadcrumbs } from \"./breadcrumbs\";\n\nexport interface PageHeaderBreadcrumb {\n\thref?: string;\n\tlabel: React.ReactNode;\n\ticon?: React.ReactNode;\n}\n\nexport interface PageHeaderProps {\n\t/** The page title, rendered as the only heading. */\n\ttitle: React.ReactNode;\n\t/** Supporting text below the title. */\n\tdescription?: React.ReactNode;\n\t/** A short label above the title. */\n\teyebrow?: React.ReactNode;\n\t/** Trail of parent pages. */\n\tbreadcrumbs?: readonly PageHeaderBreadcrumb[];\n\t/** Actions aligned beside the title on wide screens. */\n\tactions?: React.ReactNode;\n}\n\nexport function PageHeader({ actions, breadcrumbs, description, eyebrow, title }: PageHeaderProps) {\n\tconst titleId = React.useId();\n\n\treturn (\n\t\t// biome-ignore lint/a11y/useAriaPropsSupportedByRole: the title heading names this header\n\t\t<header\n\t\t\taria-labelledby={titleId}\n\t\t\tclassName=\"rounded-basalt-lg bg-basalt-bright p-5 shadow-xs ring-1 ring-basalt-border md:p-6\"\n\t\t>\n\t\t\t{breadcrumbs && breadcrumbs.length > 0 ? (\n\t\t\t\t<Breadcrumbs items={[...breadcrumbs]} className=\"mb-3\" />\n\t\t\t) : null}\n\t\t\t<div className=\"flex flex-col gap-4 md:flex-row md:items-start md:justify-between\">\n\t\t\t\t<div className=\"min-w-0 flex-1 space-y-2\">\n\t\t\t\t\t{eyebrow ? (\n\t\t\t\t\t\t<p className=\"text-xs font-medium text-basalt-muted-foreground\">{eyebrow}</p>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<h1 id={titleId} className=\"text-2xl font-semibold tracking-tight text-basalt-foreground\">\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</h1>\n\t\t\t\t\t{description ? (\n\t\t\t\t\t\t<p className=\"text-sm text-basalt-muted-foreground\">{description}</p>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t\t{actions ? <div className=\"flex flex-wrap items-center gap-2\">{actions}</div> : null}\n\t\t\t</div>\n\t\t</header>\n\t);\n}\n"],"mappings":";;;;;AAsBA,SAAgB,EAAW,EAAE,YAAS,gBAAa,gBAAa,YAAS,YAA0B;CAClG,IAAM,IAAU,EAAM,MAAM;CAE5B,OAEC,kBAAC,UAAD;EACC,mBAAiB;EACjB,WAAU;EAFX,UAAA,CAIE,KAAe,EAAY,SAAS,IACpC,kBAAC,GAAD;GAAa,OAAO,CAAC,GAAG,CAAW;GAAG,WAAU;EAAQ,CAAA,IACrD,MACJ,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACC,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,IACA,kBAAC,KAAD;MAAG,WAAU;MAAoD,UAAA;KAAW,CAAA,IACzE;KACJ,kBAAC,MAAD;MAAI,IAAI;MAAS,WAAU;MACzB,UAAA;KACE,CAAA;KACH,IACA,kBAAC,KAAD;MAAG,WAAU;MAAwC,UAAA;KAAe,CAAA,IACjE;IACA;GACJ,CAAA,GAAA,IAAU,kBAAC,OAAD;IAAK,WAAU;IAAqC,UAAA;GAAa,CAAA,IAAI,IAC5E;EACE,CAAA,CAAA;;AAEV"}
@@ -0,0 +1,35 @@
1
+ export type PaginationProps = {
2
+ /**
3
+ * Controlled 1-based page.
4
+ */
5
+ page?: number;
6
+ /**
7
+ * Uncontrolled initial page.
8
+ * @default 1
9
+ */
10
+ defaultPage?: number;
11
+ /**
12
+ * Last page number.
13
+ * @default 10
14
+ */
15
+ pageCount?: number;
16
+ /**
17
+ * Called when the page changes.
18
+ */
19
+ onPageChange?: (page: number) => void;
20
+ /**
21
+ * Hide first, last, and page number controls.
22
+ * @default false
23
+ */
24
+ simple?: boolean;
25
+ /**
26
+ * Disable every control.
27
+ * @default false
28
+ */
29
+ disabled?: boolean;
30
+ /**
31
+ * Additional classes for the nav.
32
+ */
33
+ className?: string;
34
+ };
35
+ export declare function Pagination({ page, defaultPage, pageCount, onPageChange, simple, disabled, className, }: PaginationProps): import("react").JSX.Element;
@@ -0,0 +1,68 @@
1
+ "use client";
2
+ import { cn as e } from "../utils/cn.js";
3
+ import { Button as t } from "./button.js";
4
+ import { controlSurfaceClass as n } from "../utils/control-surface.js";
5
+ import { useState as r } from "react";
6
+ import { ChevronLeft as i, ChevronRight as a, ChevronsLeft as o, ChevronsRight as s } from "lucide-react";
7
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
8
+ //#region src/components/pagination.tsx
9
+ var u = e("relative h-full w-9 shrink-0 rounded-none border-0 bg-transparent shadow-none first:rounded-l-basalt-md last:rounded-r-basalt-md", "hover:bg-basalt-accent focus-visible:bg-basalt-accent active:bg-basalt-accent", "disabled:pointer-events-none disabled:opacity-100 disabled:text-basalt-muted-foreground");
10
+ function d({ page: d, defaultPage: f = 1, pageCount: p = 10, onPageChange: m, simple: h = !1, disabled: g = !1, className: _ }) {
11
+ let [v, y] = r(f), b = Math.max(1, p), x = Math.min(b, Math.max(1, d ?? v)), S = (e) => {
12
+ d === void 0 && y(e), m?.(e);
13
+ }, C = x <= 1, w = x >= b, T = g || C, E = g || w;
14
+ return /* @__PURE__ */ c("nav", {
15
+ "aria-label": "Pagination",
16
+ className: _,
17
+ children: /* @__PURE__ */ l("div", {
18
+ className: n(e("inline-flex h-9 items-stretch", "[&>*:not(:first-child)]:border-l [&>*:not(:first-child)]:border-basalt-border", "[&>:first-child]:rounded-l-basalt-md [&>:last-child]:rounded-r-basalt-md")),
19
+ children: [
20
+ h ? null : /* @__PURE__ */ c(t, {
21
+ variant: "ghost",
22
+ size: "icon",
23
+ icon: /* @__PURE__ */ c(o, {}),
24
+ className: u,
25
+ "aria-label": "First page",
26
+ disabled: T,
27
+ onClick: () => S(1)
28
+ }),
29
+ /* @__PURE__ */ c(t, {
30
+ variant: "ghost",
31
+ size: "icon",
32
+ icon: /* @__PURE__ */ c(i, {}),
33
+ className: u,
34
+ "aria-label": "Previous page",
35
+ disabled: T,
36
+ onClick: () => S(Math.max(1, x - 1))
37
+ }),
38
+ h ? null : /* @__PURE__ */ c("span", {
39
+ "aria-current": "page",
40
+ className: "flex h-full min-w-9 items-center justify-center px-3 text-sm font-medium tabular-nums text-basalt-foreground",
41
+ children: x
42
+ }),
43
+ /* @__PURE__ */ c(t, {
44
+ variant: "ghost",
45
+ size: "icon",
46
+ icon: /* @__PURE__ */ c(a, {}),
47
+ className: u,
48
+ "aria-label": "Next page",
49
+ disabled: E,
50
+ onClick: () => S(Math.min(b, x + 1))
51
+ }),
52
+ h ? null : /* @__PURE__ */ c(t, {
53
+ variant: "ghost",
54
+ size: "icon",
55
+ icon: /* @__PURE__ */ c(s, {}),
56
+ className: u,
57
+ "aria-label": "Last page",
58
+ disabled: E,
59
+ onClick: () => S(b)
60
+ })
61
+ ]
62
+ })
63
+ });
64
+ }
65
+ //#endregion
66
+ export { d as Pagination };
67
+
68
+ //# sourceMappingURL=pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.js","names":[],"sources":["../../src/components/pagination.tsx"],"sourcesContent":["import { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { controlSurfaceClass } from \"../utils/control-surface\";\nimport { Button } from \"./button\";\n\nconst itemClass = cn(\n\t\"relative h-full w-9 shrink-0 rounded-none border-0 bg-transparent shadow-none first:rounded-l-basalt-md last:rounded-r-basalt-md\",\n\t\"hover:bg-basalt-accent focus-visible:bg-basalt-accent active:bg-basalt-accent\",\n\t\"disabled:pointer-events-none disabled:opacity-100 disabled:text-basalt-muted-foreground\",\n);\n\nexport type PaginationProps = {\n\t/**\n\t * Controlled 1-based page.\n\t */\n\tpage?: number;\n\t/**\n\t * Uncontrolled initial page.\n\t * @default 1\n\t */\n\tdefaultPage?: number;\n\t/**\n\t * Last page number.\n\t * @default 10\n\t */\n\tpageCount?: number;\n\t/**\n\t * Called when the page changes.\n\t */\n\tonPageChange?: (page: number) => void;\n\t/**\n\t * Hide first, last, and page number controls.\n\t * @default false\n\t */\n\tsimple?: boolean;\n\t/**\n\t * Disable every control.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n\t/**\n\t * Additional classes for the nav.\n\t */\n\tclassName?: string;\n};\n\nexport function Pagination({\n\tpage,\n\tdefaultPage = 1,\n\tpageCount = 10,\n\tonPageChange,\n\tsimple = false,\n\tdisabled = false,\n\tclassName,\n}: PaginationProps) {\n\tconst [uncontrolled, setUncontrolled] = useState(defaultPage);\n\tconst last = Math.max(1, pageCount);\n\tconst current = Math.min(last, Math.max(1, page ?? uncontrolled));\n\tconst go = (next: number) => {\n\t\tif (page === undefined) {\n\t\t\tsetUncontrolled(next);\n\t\t}\n\t\tonPageChange?.(next);\n\t};\n\tconst atStart = current <= 1;\n\tconst atEnd = current >= last;\n\tconst startDisabled = disabled || atStart;\n\tconst endDisabled = disabled || atEnd;\n\n\treturn (\n\t\t<nav aria-label=\"Pagination\" className={className}>\n\t\t\t<div\n\t\t\t\tclassName={controlSurfaceClass(\n\t\t\t\t\tcn(\n\t\t\t\t\t\t\"inline-flex h-9 items-stretch\",\n\t\t\t\t\t\t\"[&>*:not(:first-child)]:border-l [&>*:not(:first-child)]:border-basalt-border\",\n\t\t\t\t\t\t\"[&>:first-child]:rounded-l-basalt-md [&>:last-child]:rounded-r-basalt-md\",\n\t\t\t\t\t),\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{simple ? null : (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\ticon={<ChevronsLeft />}\n\t\t\t\t\t\tclassName={itemClass}\n\t\t\t\t\t\taria-label=\"First page\"\n\t\t\t\t\t\tdisabled={startDisabled}\n\t\t\t\t\t\tonClick={() => go(1)}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\ticon={<ChevronLeft />}\n\t\t\t\t\tclassName={itemClass}\n\t\t\t\t\taria-label=\"Previous page\"\n\t\t\t\t\tdisabled={startDisabled}\n\t\t\t\t\tonClick={() => go(Math.max(1, current - 1))}\n\t\t\t\t/>\n\t\t\t\t{simple ? null : (\n\t\t\t\t\t<span\n\t\t\t\t\t\taria-current=\"page\"\n\t\t\t\t\t\tclassName=\"flex h-full min-w-9 items-center justify-center px-3 text-sm font-medium tabular-nums text-basalt-foreground\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{current}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\ticon={<ChevronRight />}\n\t\t\t\t\tclassName={itemClass}\n\t\t\t\t\taria-label=\"Next page\"\n\t\t\t\t\tdisabled={endDisabled}\n\t\t\t\t\tonClick={() => go(Math.min(last, current + 1))}\n\t\t\t\t/>\n\t\t\t\t{simple ? null : (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\ticon={<ChevronsRight />}\n\t\t\t\t\t\tclassName={itemClass}\n\t\t\t\t\t\taria-label=\"Last page\"\n\t\t\t\t\t\tdisabled={endDisabled}\n\t\t\t\t\t\tonClick={() => go(last)}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</nav>\n\t);\n}\n"],"mappings":";;;;;;;;AAMA,IAAM,IAAY,EACjB,oIACA,iFACA,yFACD;AAqCA,SAAgB,EAAW,EAC1B,SACA,iBAAc,GACd,eAAY,IACZ,iBACA,YAAS,IACT,cAAW,IACX,gBACmB;CACnB,IAAM,CAAC,GAAc,KAAmB,EAAS,CAAW,GACtD,IAAO,KAAK,IAAI,GAAG,CAAS,GAC5B,IAAU,KAAK,IAAI,GAAM,KAAK,IAAI,GAAG,KAAQ,CAAY,CAAC,GAC1D,KAAM,MAAiB;EAI5B,AAHI,MAAS,KAAA,KACZ,EAAgB,CAAI,GAErB,IAAe,CAAI;CACpB,GACM,IAAU,KAAW,GACrB,IAAQ,KAAW,GACnB,IAAgB,KAAY,GAC5B,IAAc,KAAY;CAEhC,OACC,kBAAC,OAAD;EAAK,cAAW;EAAwB;EACvC,UAAA,kBAAC,OAAD;GACC,WAAW,EACV,EACC,iCACA,iFACA,0EACD,CACD;GAPD,UAAA;IASE,IAAS,OACT,kBAAC,GAAD;KACC,SAAQ;KACR,MAAK;KACL,MAAM,kBAAC,GAAD,CAAe,CAAA;KACrB,WAAW;KACX,cAAW;KACX,UAAU;KACV,eAAe,EAAG,CAAC;IACnB,CAAA;IAEF,kBAAC,GAAD;KACC,SAAQ;KACR,MAAK;KACL,MAAM,kBAAC,GAAD,CAAc,CAAA;KACpB,WAAW;KACX,cAAW;KACX,UAAU;KACV,eAAe,EAAG,KAAK,IAAI,GAAG,IAAU,CAAC,CAAC;IAC1C,CAAA;IACA,IAAS,OACT,kBAAC,QAAD;KACC,gBAAa;KACb,WAAU;KAET,UAAA;IACI,CAAA;IAEP,kBAAC,GAAD;KACC,SAAQ;KACR,MAAK;KACL,MAAM,kBAAC,GAAD,CAAe,CAAA;KACrB,WAAW;KACX,cAAW;KACX,UAAU;KACV,eAAe,EAAG,KAAK,IAAI,GAAM,IAAU,CAAC,CAAC;IAC7C,CAAA;IACA,IAAS,OACT,kBAAC,GAAD;KACC,SAAQ;KACR,MAAK;KACL,MAAM,kBAAC,GAAD,CAAgB,CAAA;KACtB,WAAW;KACX,cAAW;KACX,UAAU;KACV,eAAe,EAAG,CAAI;IACtB,CAAA;GAEE;;CACD,CAAA;AAEP"}
@@ -0,0 +1,38 @@
1
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
2
+ import * as React from "react";
3
+ export declare const POPOVER_SIDES: readonly ["top", "bottom", "left", "right"];
4
+ export type PopoverSide = (typeof POPOVER_SIDES)[number];
5
+ export type PopoverProps = Omit<React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Root>, "open" | "defaultOpen" | "onOpenChange"> & {
6
+ /**
7
+ * The controlled open state.
8
+ */
9
+ open?: boolean;
10
+ /**
11
+ * The uncontrolled initial open state.
12
+ * @default false
13
+ */
14
+ defaultOpen?: boolean;
15
+ /**
16
+ * Called when the open state changes.
17
+ */
18
+ onOpenChange?: (open: boolean) => void;
19
+ };
20
+ export declare const Popover: React.FC<PopoverProps>;
21
+ export declare const PopoverTrigger: React.ForwardRefExoticComponent<PopoverPrimitive.PopoverTriggerProps & React.RefAttributes<HTMLButtonElement>>;
22
+ export declare const PopoverClose: React.ForwardRefExoticComponent<PopoverPrimitive.PopoverCloseProps & React.RefAttributes<HTMLButtonElement>>;
23
+ export type PopoverContentProps = React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> & {
24
+ /**
25
+ * Show the pointing arrow.
26
+ * @default true
27
+ */
28
+ arrow?: boolean;
29
+ };
30
+ export declare const PopoverContent: React.ForwardRefExoticComponent<Omit<PopoverPrimitive.PopoverContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
31
+ /**
32
+ * Show the pointing arrow.
33
+ * @default true
34
+ */
35
+ arrow?: boolean;
36
+ } & React.RefAttributes<HTMLDivElement>>;
37
+ export declare const PopoverTitle: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLHeadingElement> & React.RefAttributes<HTMLHeadingElement>>;
38
+ export declare const PopoverDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & React.RefAttributes<HTMLParagraphElement>>;
@@ -0,0 +1,65 @@
1
+ "use client";
2
+ import { cn as e } from "../utils/cn.js";
3
+ import { OVERLAY_LAYER as t, OVERLAY_MOTION as n } from "./overlay.js";
4
+ import * as r from "react";
5
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
6
+ import * as o from "@radix-ui/react-popover";
7
+ //#region src/components/popover.tsx
8
+ var s = [
9
+ "top",
10
+ "bottom",
11
+ "left",
12
+ "right"
13
+ ], c = o.Root, l = o.Trigger, u = o.Close, d = r.forwardRef(({ className: r, align: s = "center", side: c = "bottom", sideOffset: l = 8, arrow: u = !0, children: d, ...f }, p) => /* @__PURE__ */ i(o.Portal, { children: /* @__PURE__ */ a(o.Content, {
14
+ ref: p,
15
+ align: s,
16
+ side: c,
17
+ sideOffset: l,
18
+ className: e(t, n, "rounded-basalt-md border border-basalt-border bg-basalt-popover px-4 py-3 text-sm text-basalt-popover-foreground shadow-md outline-hidden", r),
19
+ ...f,
20
+ children: [d, u ? /* @__PURE__ */ i(o.Arrow, {
21
+ asChild: !0,
22
+ width: 20,
23
+ height: 10,
24
+ children: /* @__PURE__ */ i(m, {})
25
+ }) : null]
26
+ }) }));
27
+ d.displayName = o.Content.displayName;
28
+ var f = r.forwardRef(({ className: t, ...n }, r) => /* @__PURE__ */ i("h2", {
29
+ ref: r,
30
+ className: e("m-0 text-base font-medium leading-6 text-basalt-foreground", t),
31
+ ...n
32
+ }));
33
+ f.displayName = "PopoverTitle";
34
+ var p = r.forwardRef(({ className: t, ...n }, r) => /* @__PURE__ */ i("p", {
35
+ ref: r,
36
+ className: e("m-0 text-base leading-6 text-basalt-muted-foreground", t),
37
+ ...n
38
+ }));
39
+ p.displayName = "PopoverDescription";
40
+ function m(e) {
41
+ return /* @__PURE__ */ i("svg", {
42
+ width: 20,
43
+ height: 10,
44
+ "aria-hidden": !0,
45
+ ...e,
46
+ children: /* @__PURE__ */ a("svg", {
47
+ width: "100%",
48
+ height: "100%",
49
+ viewBox: "0 0 20 10",
50
+ preserveAspectRatio: "none",
51
+ "aria-hidden": !0,
52
+ children: [/* @__PURE__ */ i("path", {
53
+ d: "M9.66437 2.60207L4.80758 6.97318C4.07308 7.63423 3.11989 8 2.13172 8H0V10H20V8H18.5349C17.5468 8 16.5936 7.63423 15.8591 6.97318L11.0023 2.60207C10.622 2.2598 10.0447 2.25979 9.66437 2.60207Z",
54
+ className: "fill-basalt-popover"
55
+ }), /* @__PURE__ */ i("path", {
56
+ d: "M8.99542 1.85876C9.75604 1.17425 10.9106 1.17422 11.6713 1.85878L16.5281 6.22989C17.0789 6.72568 17.7938 7.00001 18.5349 7.00001L15.89 7L11.0023 2.60207C10.622 2.2598 10.0447 2.2598 9.66436 2.60207L4.77734 7L2.13171 7.00001C2.87284 7.00001 3.58774 6.72568 4.13861 6.22989L8.99542 1.85876Z",
57
+ className: "fill-basalt-border"
58
+ })]
59
+ })
60
+ });
61
+ }
62
+ //#endregion
63
+ export { s as POPOVER_SIDES, c as Popover, u as PopoverClose, d as PopoverContent, p as PopoverDescription, f as PopoverTitle, l as PopoverTrigger };
64
+
65
+ //# sourceMappingURL=popover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popover.js","names":[],"sources":["../../src/components/popover.tsx"],"sourcesContent":["import * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { MENU_GAP, OVERLAY_LAYER, OVERLAY_MOTION } from \"./overlay\";\n\nexport const POPOVER_SIDES = [\"top\", \"bottom\", \"left\", \"right\"] as const;\nexport type PopoverSide = (typeof POPOVER_SIDES)[number];\n\nexport type PopoverProps = Omit<\n\tReact.ComponentPropsWithoutRef<typeof PopoverPrimitive.Root>,\n\t\"open\" | \"defaultOpen\" | \"onOpenChange\"\n> & {\n\t/**\n\t * The controlled open state.\n\t */\n\topen?: boolean;\n\t/**\n\t * The uncontrolled initial open state.\n\t * @default false\n\t */\n\tdefaultOpen?: boolean;\n\t/**\n\t * Called when the open state changes.\n\t */\n\tonOpenChange?: (open: boolean) => void;\n};\nexport const Popover: React.FC<PopoverProps> = PopoverPrimitive.Root;\nexport const PopoverTrigger = PopoverPrimitive.Trigger;\nexport const PopoverClose = PopoverPrimitive.Close;\n\nexport type PopoverContentProps = React.ComponentPropsWithoutRef<\n\ttypeof PopoverPrimitive.Content\n> & {\n\t/**\n\t * Show the pointing arrow.\n\t * @default true\n\t */\n\tarrow?: boolean;\n};\n\nexport const PopoverContent = React.forwardRef<\n\tReact.ElementRef<typeof PopoverPrimitive.Content>,\n\tPopoverContentProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\talign = \"center\",\n\t\t\tside = \"bottom\",\n\t\t\tsideOffset = MENU_GAP,\n\t\t\tarrow = true,\n\t\t\tchildren,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => (\n\t\t<PopoverPrimitive.Portal>\n\t\t\t<PopoverPrimitive.Content\n\t\t\t\tref={ref}\n\t\t\t\talign={align}\n\t\t\t\tside={side}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName={cn(\n\t\t\t\t\tOVERLAY_LAYER,\n\t\t\t\t\tOVERLAY_MOTION,\n\t\t\t\t\t\"rounded-basalt-md border border-basalt-border bg-basalt-popover px-4 py-3 text-sm text-basalt-popover-foreground shadow-md outline-hidden\",\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\t{arrow ? (\n\t\t\t\t\t<PopoverPrimitive.Arrow asChild width={20} height={10}>\n\t\t\t\t\t\t<ArrowSvg />\n\t\t\t\t\t</PopoverPrimitive.Arrow>\n\t\t\t\t) : null}\n\t\t\t</PopoverPrimitive.Content>\n\t\t</PopoverPrimitive.Portal>\n\t),\n);\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport const PopoverTitle = React.forwardRef<\n\tHTMLHeadingElement,\n\tReact.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n\t<h2\n\t\tref={ref}\n\t\tclassName={cn(\"m-0 text-base font-medium leading-6 text-basalt-foreground\", className)}\n\t\t{...props}\n\t/>\n));\nPopoverTitle.displayName = \"PopoverTitle\";\n\nexport const PopoverDescription = React.forwardRef<\n\tHTMLParagraphElement,\n\tReact.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n\t<p\n\t\tref={ref}\n\t\tclassName={cn(\"m-0 text-base leading-6 text-basalt-muted-foreground\", className)}\n\t\t{...props}\n\t/>\n));\nPopoverDescription.displayName = \"PopoverDescription\";\n\nfunction ArrowSvg(props: React.ComponentProps<\"svg\">) {\n\treturn (\n\t\t<svg width={20} height={10} aria-hidden {...props}>\n\t\t\t<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 20 10\" preserveAspectRatio=\"none\" aria-hidden>\n\t\t\t\t<path\n\t\t\t\t\td=\"M9.66437 2.60207L4.80758 6.97318C4.07308 7.63423 3.11989 8 2.13172 8H0V10H20V8H18.5349C17.5468 8 16.5936 7.63423 15.8591 6.97318L11.0023 2.60207C10.622 2.2598 10.0447 2.25979 9.66437 2.60207Z\"\n\t\t\t\t\tclassName=\"fill-basalt-popover\"\n\t\t\t\t/>\n\t\t\t\t<path\n\t\t\t\t\td=\"M8.99542 1.85876C9.75604 1.17425 10.9106 1.17422 11.6713 1.85878L16.5281 6.22989C17.0789 6.72568 17.7938 7.00001 18.5349 7.00001L15.89 7L11.0023 2.60207C10.622 2.2598 10.0447 2.2598 9.66436 2.60207L4.77734 7L2.13171 7.00001C2.87284 7.00001 3.58774 6.72568 4.13861 6.22989L8.99542 1.85876Z\"\n\t\t\t\t\tclassName=\"fill-basalt-border\"\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t</svg>\n\t);\n}\n"],"mappings":";;;;;;;AAKA,IAAa,IAAgB;CAAC;CAAO;CAAU;CAAQ;AAAO,GAqBjD,IAAkC,EAAiB,MACnD,IAAiB,EAAiB,SAClC,IAAe,EAAiB,OAYhC,IAAiB,EAAM,YAKlC,EACC,cACA,WAAQ,UACR,UAAO,UACP,gBAAA,GACA,WAAQ,IACR,aACA,GAAG,KAEJ,MAEA,kBAAC,EAAiB,QAAlB,EAAA,UACC,kBAAC,EAAiB,SAAlB;CACM;CACE;CACD;CACM;CACZ,WAAW,EACV,GACA,GACA,6IACA,CACD;CACA,GAAI;CAXL,UAAA,CAaE,GACA,IACA,kBAAC,EAAiB,OAAlB;EAAwB,SAAA;EAAQ,OAAO;EAAI,QAAQ;EAClD,UAAA,kBAAC,GAAD,CAAW,CAAA;CACY,CAAA,IACrB,IACqB;AACF,CAAA,EAAA,CAAA,CAE3B;AACA,EAAe,cAAc,EAAiB,QAAQ;AAEtD,IAAa,IAAe,EAAM,YAG/B,EAAE,cAAW,GAAG,KAAS,MAC3B,kBAAC,MAAD;CACM;CACL,WAAW,EAAG,8DAA8D,CAAS;CACrF,GAAI;AACJ,CAAA,CACD;AACD,EAAa,cAAc;AAE3B,IAAa,IAAqB,EAAM,YAGrC,EAAE,cAAW,GAAG,KAAS,MAC3B,kBAAC,KAAD;CACM;CACL,WAAW,EAAG,wDAAwD,CAAS;CAC/E,GAAI;AACJ,CAAA,CACD;AACD,EAAmB,cAAc;AAEjC,SAAS,EAAS,GAAoC;CACrD,OACC,kBAAC,OAAD;EAAK,OAAO;EAAI,QAAQ;EAAI,eAAA;EAAY,GAAI;EAC3C,UAAA,kBAAC,OAAD;GAAK,OAAM;GAAO,QAAO;GAAO,SAAQ;GAAY,qBAAoB;GAAO,eAAA;GAA/E,UAAA,CACC,kBAAC,QAAD;IACC,GAAE;IACF,WAAU;GACV,CAAA,GACD,kBAAC,QAAD;IACC,GAAE;IACF,WAAU;GACV,CAAA,CACG;;CACD,CAAA;AAEP"}
@@ -0,0 +1,108 @@
1
+ import * as RadioGroupPrimitive from "@radix-ui/react-radio-group";
2
+ import * as React from "react";
3
+ export type RadioSize = "sm" | "default";
4
+ export type RadioGroupProps = Omit<React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>, "disabled" | "value" | "defaultValue" | "onValueChange"> & {
5
+ /**
6
+ * The controlled selected value.
7
+ */
8
+ value?: string;
9
+ /**
10
+ * The initially selected value.
11
+ */
12
+ defaultValue?: string;
13
+ /**
14
+ * Called when the selected value changes.
15
+ */
16
+ onValueChange?: (value: string) => void;
17
+ /**
18
+ * Marks the group invalid and shows alert copy.
19
+ */
20
+ error?: React.ReactNode;
21
+ /**
22
+ * Disable every item in the group.
23
+ * @default false
24
+ */
25
+ disabled?: boolean;
26
+ };
27
+ export type RadioLegendProps = React.ComponentPropsWithoutRef<"legend">;
28
+ export type RadioProps = Omit<React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>, "value"> & {
29
+ /**
30
+ * The value associated with the radio item.
31
+ */
32
+ value: string;
33
+ /**
34
+ * The visual size of the radio.
35
+ * @default default
36
+ */
37
+ size?: RadioSize;
38
+ };
39
+ export declare const RadioGroup: React.ForwardRefExoticComponent<Omit<Omit<RadioGroupPrimitive.RadioGroupProps & React.RefAttributes<HTMLDivElement>, "ref">, "defaultValue" | "disabled" | "onValueChange" | "value"> & {
40
+ /**
41
+ * The controlled selected value.
42
+ */
43
+ value?: string;
44
+ /**
45
+ * The initially selected value.
46
+ */
47
+ defaultValue?: string;
48
+ /**
49
+ * Called when the selected value changes.
50
+ */
51
+ onValueChange?: (value: string) => void;
52
+ /**
53
+ * Marks the group invalid and shows alert copy.
54
+ */
55
+ error?: React.ReactNode;
56
+ /**
57
+ * Disable every item in the group.
58
+ * @default false
59
+ */
60
+ disabled?: boolean;
61
+ } & React.RefAttributes<HTMLDivElement>>;
62
+ export declare const Radio: React.ForwardRefExoticComponent<Omit<Omit<RadioGroupPrimitive.RadioGroupItemProps & React.RefAttributes<HTMLButtonElement>, "ref">, "value"> & {
63
+ /**
64
+ * The value associated with the radio item.
65
+ */
66
+ value: string;
67
+ /**
68
+ * The visual size of the radio.
69
+ * @default default
70
+ */
71
+ size?: RadioSize;
72
+ } & React.RefAttributes<HTMLButtonElement>> & {
73
+ Group: React.ForwardRefExoticComponent<Omit<Omit<RadioGroupPrimitive.RadioGroupProps & React.RefAttributes<HTMLDivElement>, "ref">, "defaultValue" | "disabled" | "onValueChange" | "value"> & {
74
+ /**
75
+ * The controlled selected value.
76
+ */
77
+ value?: string;
78
+ /**
79
+ * The initially selected value.
80
+ */
81
+ defaultValue?: string;
82
+ /**
83
+ * Called when the selected value changes.
84
+ */
85
+ onValueChange?: (value: string) => void;
86
+ /**
87
+ * Marks the group invalid and shows alert copy.
88
+ */
89
+ error?: React.ReactNode;
90
+ /**
91
+ * Disable every item in the group.
92
+ * @default false
93
+ */
94
+ disabled?: boolean;
95
+ } & React.RefAttributes<HTMLDivElement>>;
96
+ Legend: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLLegendElement>, HTMLLegendElement>, "ref"> & React.RefAttributes<HTMLLegendElement>>;
97
+ Item: React.ForwardRefExoticComponent<Omit<Omit<RadioGroupPrimitive.RadioGroupItemProps & React.RefAttributes<HTMLButtonElement>, "ref">, "value"> & {
98
+ /**
99
+ * The value associated with the radio item.
100
+ */
101
+ value: string;
102
+ /**
103
+ * The visual size of the radio.
104
+ * @default default
105
+ */
106
+ size?: RadioSize;
107
+ } & React.RefAttributes<HTMLButtonElement>>;
108
+ };
@@ -0,0 +1,80 @@
1
+ "use client";
2
+ import { cn as e } from "../utils/cn.js";
3
+ import { FOCUS_RING as t } from "./overlay.js";
4
+ import * as n from "react";
5
+ import { Circle as r } from "lucide-react";
6
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
7
+ import * as o from "@radix-ui/react-radio-group";
8
+ //#region src/components/radio.tsx
9
+ var s = {
10
+ sm: "h-3 w-3",
11
+ default: "h-4 w-4"
12
+ }, c = {
13
+ sm: "h-1.5 w-1.5 fill-current text-current",
14
+ default: "h-2.5 w-2.5 fill-current text-current"
15
+ }, l = n.forwardRef(({ className: t, ...n }, r) => /* @__PURE__ */ i("legend", {
16
+ ref: r,
17
+ className: e("text-sm font-medium text-basalt-foreground", t),
18
+ ...n
19
+ }));
20
+ l.displayName = "Radio.Legend";
21
+ var u = n.forwardRef(({ className: t, error: r, disabled: s = !1, children: c, "aria-describedby": u, "aria-invalid": d, "aria-labelledby": f, ...p }, m) => {
22
+ let h = n.useId(), g = !!r, _ = `${h}-error`, v = `${h}-legend`, y = [], b = [];
23
+ n.Children.forEach(c, (e) => {
24
+ if (n.isValidElement(e) && e.type === l) {
25
+ y.push(e);
26
+ return;
27
+ }
28
+ b.push(e);
29
+ });
30
+ let x = y.map((e, t) => {
31
+ let r = e.props.id ?? (t === 0 ? v : `${v}-${t}`);
32
+ return n.cloneElement(e, {
33
+ key: r,
34
+ id: r
35
+ });
36
+ }), S = [x.map((e) => e.props.id).filter(Boolean).join(" "), f].filter(Boolean).join(" ") || void 0, C = [g ? _ : null, u].filter(Boolean).join(" ") || void 0;
37
+ return /* @__PURE__ */ a("fieldset", {
38
+ disabled: s,
39
+ className: "flex flex-col gap-2",
40
+ children: [
41
+ x,
42
+ /* @__PURE__ */ i(o.Root, {
43
+ ref: m,
44
+ disabled: s,
45
+ className: e("grid gap-2", t),
46
+ ...p,
47
+ "aria-labelledby": S,
48
+ "aria-describedby": C,
49
+ "aria-invalid": g ? !0 : d,
50
+ children: b
51
+ }),
52
+ g ? /* @__PURE__ */ i("p", {
53
+ id: _,
54
+ className: "text-xs text-basalt-destructive",
55
+ role: "alert",
56
+ children: r
57
+ }) : null
58
+ ]
59
+ });
60
+ });
61
+ u.displayName = "Radio.Group";
62
+ var d = n.forwardRef(({ className: n, size: a = "default", ...l }, u) => /* @__PURE__ */ i(o.Item, {
63
+ ref: u,
64
+ className: e("aspect-square shrink-0 rounded-full border border-basalt-primary text-basalt-primary disabled:cursor-not-allowed disabled:opacity-50", s[a], t, n),
65
+ ...l,
66
+ children: /* @__PURE__ */ i(o.Indicator, {
67
+ className: "flex items-center justify-center",
68
+ children: /* @__PURE__ */ i(r, { className: c[a] })
69
+ })
70
+ }));
71
+ d.displayName = o.Item.displayName;
72
+ var f = Object.assign(d, {
73
+ Group: u,
74
+ Legend: l,
75
+ Item: d
76
+ });
77
+ //#endregion
78
+ export { f as Radio, u as RadioGroup };
79
+
80
+ //# sourceMappingURL=radio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radio.js","names":[],"sources":["../../src/components/radio.tsx"],"sourcesContent":["import * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\";\nimport { Circle } from \"lucide-react\";\nimport * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { FOCUS_RING } from \"./overlay\";\n\nexport type RadioSize = \"sm\" | \"default\";\n\nconst RADIO_SIZE_CLASS: Record<RadioSize, string> = {\n\tsm: \"h-3 w-3\",\n\tdefault: \"h-4 w-4\",\n};\n\nconst RADIO_INDICATOR_CLASS: Record<RadioSize, string> = {\n\tsm: \"h-1.5 w-1.5 fill-current text-current\",\n\tdefault: \"h-2.5 w-2.5 fill-current text-current\",\n};\n\nexport type RadioGroupProps = Omit<\n\tReact.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>,\n\t\"disabled\" | \"value\" | \"defaultValue\" | \"onValueChange\"\n> & {\n\t/**\n\t * The controlled selected value.\n\t */\n\tvalue?: string;\n\t/**\n\t * The initially selected value.\n\t */\n\tdefaultValue?: string;\n\t/**\n\t * Called when the selected value changes.\n\t */\n\tonValueChange?: (value: string) => void;\n\t/**\n\t * Marks the group invalid and shows alert copy.\n\t */\n\terror?: React.ReactNode;\n\t/**\n\t * Disable every item in the group.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n};\n\nexport type RadioLegendProps = React.ComponentPropsWithoutRef<\"legend\">;\n\nexport type RadioProps = Omit<\n\tReact.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>,\n\t\"value\"\n> & {\n\t/**\n\t * The value associated with the radio item.\n\t */\n\tvalue: string;\n\t/**\n\t * The visual size of the radio.\n\t * @default default\n\t */\n\tsize?: RadioSize;\n};\n\nconst RadioLegend = React.forwardRef<HTMLLegendElement, RadioLegendProps>(\n\t({ className, ...props }, ref) => (\n\t\t<legend\n\t\t\tref={ref}\n\t\t\tclassName={cn(\"text-sm font-medium text-basalt-foreground\", className)}\n\t\t\t{...props}\n\t\t/>\n\t),\n);\nRadioLegend.displayName = \"Radio.Legend\";\n\nexport const RadioGroup = React.forwardRef<\n\tReact.ElementRef<typeof RadioGroupPrimitive.Root>,\n\tRadioGroupProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\terror,\n\t\t\tdisabled = false,\n\t\t\tchildren,\n\t\t\t\"aria-describedby\": describedBy,\n\t\t\t\"aria-invalid\": ariaInvalid,\n\t\t\t\"aria-labelledby\": labelledBy,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst generatedId = React.useId();\n\t\tconst invalid = Boolean(error);\n\t\tconst errorId = `${generatedId}-error`;\n\t\tconst defaultLegendId = `${generatedId}-legend`;\n\t\tconst legends: React.ReactElement<RadioLegendProps>[] = [];\n\t\tconst items: React.ReactNode[] = [];\n\t\tReact.Children.forEach(children, (child) => {\n\t\t\tif (React.isValidElement(child) && child.type === RadioLegend) {\n\t\t\t\tlegends.push(child as React.ReactElement<RadioLegendProps>);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\titems.push(child);\n\t\t});\n\t\tconst labeledLegends = legends.map((legend, index) => {\n\t\t\tconst legendId =\n\t\t\t\tlegend.props.id ?? (index === 0 ? defaultLegendId : `${defaultLegendId}-${index}`);\n\t\t\treturn React.cloneElement(legend, { key: legendId, id: legendId });\n\t\t});\n\t\tconst legendIds = labeledLegends\n\t\t\t.map((legend) => legend.props.id)\n\t\t\t.filter(Boolean)\n\t\t\t.join(\" \");\n\t\tconst mergedLabelledBy = [legendIds, labelledBy].filter(Boolean).join(\" \") || undefined;\n\t\tconst mergedDescribedBy =\n\t\t\t[invalid ? errorId : null, describedBy].filter(Boolean).join(\" \") || undefined;\n\t\treturn (\n\t\t\t<fieldset disabled={disabled} className=\"flex flex-col gap-2\">\n\t\t\t\t{labeledLegends}\n\t\t\t\t<RadioGroupPrimitive.Root\n\t\t\t\t\tref={ref}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tclassName={cn(\"grid gap-2\", className)}\n\t\t\t\t\t{...props}\n\t\t\t\t\taria-labelledby={mergedLabelledBy}\n\t\t\t\t\taria-describedby={mergedDescribedBy}\n\t\t\t\t\taria-invalid={invalid ? true : ariaInvalid}\n\t\t\t\t>\n\t\t\t\t\t{items}\n\t\t\t\t</RadioGroupPrimitive.Root>\n\t\t\t\t{invalid ? (\n\t\t\t\t\t<p id={errorId} className=\"text-xs text-basalt-destructive\" role=\"alert\">\n\t\t\t\t\t\t{error}\n\t\t\t\t\t</p>\n\t\t\t\t) : null}\n\t\t\t</fieldset>\n\t\t);\n\t},\n);\nRadioGroup.displayName = \"Radio.Group\";\n\nconst RadioRoot = React.forwardRef<React.ElementRef<typeof RadioGroupPrimitive.Item>, RadioProps>(\n\t({ className, size = \"default\", ...props }, ref) => (\n\t\t<RadioGroupPrimitive.Item\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"aspect-square shrink-0 rounded-full border border-basalt-primary text-basalt-primary disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\t\tRADIO_SIZE_CLASS[size],\n\t\t\t\tFOCUS_RING,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<RadioGroupPrimitive.Indicator className=\"flex items-center justify-center\">\n\t\t\t\t<Circle className={RADIO_INDICATOR_CLASS[size]} />\n\t\t\t</RadioGroupPrimitive.Indicator>\n\t\t</RadioGroupPrimitive.Item>\n\t),\n);\nRadioRoot.displayName = RadioGroupPrimitive.Item.displayName;\n\nexport const Radio = Object.assign(RadioRoot, {\n\tGroup: RadioGroup,\n\tLegend: RadioLegend,\n\tItem: RadioRoot,\n});\n"],"mappings":";;;;;;;;AAQA,IAAM,IAA8C;CACnD,IAAI;CACJ,SAAS;AACV,GAEM,IAAmD;CACxD,IAAI;CACJ,SAAS;AACV,GA8CM,IAAc,EAAM,YACxB,EAAE,cAAW,GAAG,KAAS,MACzB,kBAAC,UAAD;CACM;CACL,WAAW,EAAG,8CAA8C,CAAS;CACrE,GAAI;AACJ,CAAA,CAEH;AACA,EAAY,cAAc;AAE1B,IAAa,IAAa,EAAM,YAK9B,EACC,cACA,UACA,cAAW,IACX,aACA,oBAAoB,GACpB,gBAAgB,GAChB,mBAAmB,GACnB,GAAG,KAEJ,MACI;CACJ,IAAM,IAAc,EAAM,MAAM,GAC1B,IAAU,EAAQ,GAClB,IAAU,GAAG,EAAY,SACzB,IAAkB,GAAG,EAAY,UACjC,IAAkD,CAAC,GACnD,IAA2B,CAAC;CAClC,EAAM,SAAS,QAAQ,IAAW,MAAU;EAC3C,IAAI,EAAM,eAAe,CAAK,KAAK,EAAM,SAAS,GAAa;GAC9D,EAAQ,KAAK,CAA6C;GAC1D;EACD;EACA,EAAM,KAAK,CAAK;CACjB,CAAC;CACD,IAAM,IAAiB,EAAQ,KAAK,GAAQ,MAAU;EACrD,IAAM,IACL,EAAO,MAAM,OAAO,MAAU,IAAI,IAAkB,GAAG,EAAgB,GAAG;EAC3E,OAAO,EAAM,aAAa,GAAQ;GAAE,KAAK;GAAU,IAAI;EAAS,CAAC;CAClE,CAAC,GAKK,IAAmB,CAJP,EAChB,KAAK,MAAW,EAAO,MAAM,EAAE,CAAC,CAChC,OAAO,OAAO,CAAC,CACf,KAAK,GACmB,GAAW,CAAU,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,KAAK,KAAA,GACxE,IACL,CAAC,IAAU,IAAU,MAAM,CAAW,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,KAAK,KAAA;CACtE,OACC,kBAAC,YAAD;EAAoB;EAAU,WAAU;EAAxC,UAAA;GACE;GACD,kBAAC,EAAoB,MAArB;IACM;IACK;IACV,WAAW,EAAG,cAAc,CAAS;IACrC,GAAI;IACJ,mBAAiB;IACjB,oBAAkB;IAClB,gBAAc,IAAU,KAAO;IAE9B,UAAA;GACwB,CAAA;GACzB,IACA,kBAAC,KAAD;IAAG,IAAI;IAAS,WAAU;IAAkC,MAAK;IAC/D,UAAA;GACC,CAAA,IACA;EACK;;AAEZ,CACD;AACA,EAAW,cAAc;AAEzB,IAAM,IAAY,EAAM,YACtB,EAAE,cAAW,UAAO,WAAW,GAAG,KAAS,MAC3C,kBAAC,EAAoB,MAArB;CACM;CACL,WAAW,EACV,wIACA,EAAiB,IACjB,GACA,CACD;CACA,GAAI;CAEJ,UAAA,kBAAC,EAAoB,WAArB;EAA+B,WAAU;EACxC,UAAA,kBAAC,GAAD,EAAQ,WAAW,EAAsB,GAAQ,CAAA;CACnB,CAAA;AACN,CAAA,CAE5B;AACA,EAAU,cAAc,EAAoB,KAAK;AAEjD,IAAa,IAAQ,OAAO,OAAO,GAAW;CAC7C,OAAO;CACP,QAAQ;CACR,MAAM;AACP,CAAC"}
@@ -0,0 +1,15 @@
1
+ import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
2
+ import * as React from "react";
3
+ export type ScrollAreaOrientation = "vertical" | "horizontal" | "both";
4
+ type RootProps = Omit<React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>, "aria-describedby" | "aria-label" | "aria-labelledby" | "asChild" | "children" | "className" | "onScroll" | "role" | "tabIndex">;
5
+ type ViewportProps = Pick<React.ComponentPropsWithoutRef<"div">, "aria-describedby" | "aria-label" | "aria-labelledby" | "children" | "onScroll" | "role" | "tabIndex">;
6
+ export interface ScrollAreaProps extends RootProps, ViewportProps {
7
+ /** Classes applied to the non-scrolling root. */
8
+ className?: string;
9
+ /** Axes that may scroll. @default "vertical" */
10
+ orientation?: ScrollAreaOrientation;
11
+ /** Classes applied to the actual scrolling viewport. */
12
+ viewportClassName?: string;
13
+ }
14
+ export declare const ScrollArea: React.ForwardRefExoticComponent<ScrollAreaProps & React.RefAttributes<HTMLDivElement>>;
15
+ export {};
@@ -0,0 +1,49 @@
1
+ "use client";
2
+ import { cn as e } from "../utils/cn.js";
3
+ import * as t from "react";
4
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
5
+ import * as i from "@radix-ui/react-scroll-area";
6
+ //#region src/components/scroll-area.tsx
7
+ var a = "flex touch-none select-none p-px transition-colors motion-reduce:transition-none";
8
+ function o({ orientation: t }) {
9
+ return /* @__PURE__ */ n(i.Scrollbar, {
10
+ "data-slot": "scroll-area-scrollbar",
11
+ orientation: t,
12
+ className: e(a, t === "vertical" ? "h-full w-2.5 border-l border-l-transparent" : "h-2.5 flex-col border-t border-t-transparent"),
13
+ children: /* @__PURE__ */ n(i.Thumb, {
14
+ "data-slot": "scroll-area-thumb",
15
+ className: "relative flex-1 rounded-full bg-basalt-border"
16
+ })
17
+ });
18
+ }
19
+ var s = t.forwardRef(({ "aria-describedby": t, "aria-label": a, "aria-labelledby": s, children: c, className: l, onScroll: u, orientation: d = "vertical", role: f, tabIndex: p = 0, viewportClassName: m, ...h }, g) => {
20
+ let _ = d !== "horizontal", v = d !== "vertical", y = f ?? (a || s ? "region" : void 0);
21
+ return /* @__PURE__ */ r(i.Root, {
22
+ "data-slot": "scroll-area",
23
+ className: e("relative min-h-0 min-w-0 overflow-hidden", l),
24
+ ...h,
25
+ children: [
26
+ /* @__PURE__ */ n(i.Viewport, {
27
+ ref: g,
28
+ "data-orientation": d,
29
+ "data-slot": "scroll-area-viewport",
30
+ "aria-describedby": t,
31
+ "aria-label": a,
32
+ "aria-labelledby": s,
33
+ role: y,
34
+ tabIndex: p,
35
+ onScroll: u,
36
+ className: e("size-full rounded-[inherit] outline-hidden focus-visible:ring-2 focus-visible:ring-basalt-ring focus-visible:ring-offset-2 focus-visible:ring-offset-basalt-background", d === "vertical" && "overflow-x-hidden!", d === "horizontal" && "overflow-y-hidden!", m),
37
+ children: c
38
+ }),
39
+ _ ? /* @__PURE__ */ n(o, { orientation: "vertical" }) : null,
40
+ v ? /* @__PURE__ */ n(o, { orientation: "horizontal" }) : null,
41
+ _ && v ? /* @__PURE__ */ n(i.Corner, { "data-slot": "scroll-area-corner" }) : null
42
+ ]
43
+ });
44
+ });
45
+ s.displayName = "ScrollArea";
46
+ //#endregion
47
+ export { s as ScrollArea };
48
+
49
+ //# sourceMappingURL=scroll-area.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scroll-area.js","names":[],"sources":["../../src/components/scroll-area.tsx"],"sourcesContent":["import * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\nimport * as React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport type ScrollAreaOrientation = \"vertical\" | \"horizontal\" | \"both\";\n\ntype RootProps = Omit<\n\tReact.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>,\n\t| \"aria-describedby\"\n\t| \"aria-label\"\n\t| \"aria-labelledby\"\n\t| \"asChild\"\n\t| \"children\"\n\t| \"className\"\n\t| \"onScroll\"\n\t| \"role\"\n\t| \"tabIndex\"\n>;\n\ntype ViewportProps = Pick<\n\tReact.ComponentPropsWithoutRef<\"div\">,\n\t| \"aria-describedby\"\n\t| \"aria-label\"\n\t| \"aria-labelledby\"\n\t| \"children\"\n\t| \"onScroll\"\n\t| \"role\"\n\t| \"tabIndex\"\n>;\n\nexport interface ScrollAreaProps extends RootProps, ViewportProps {\n\t/** Classes applied to the non-scrolling root. */\n\tclassName?: string;\n\t/** Axes that may scroll. @default \"vertical\" */\n\torientation?: ScrollAreaOrientation;\n\t/** Classes applied to the actual scrolling viewport. */\n\tviewportClassName?: string;\n}\n\nconst SCROLLBAR_CLASSES =\n\t\"flex touch-none select-none p-px transition-colors motion-reduce:transition-none\";\n\nfunction ScrollBar({ orientation }: { orientation: \"horizontal\" | \"vertical\" }) {\n\treturn (\n\t\t<ScrollAreaPrimitive.Scrollbar\n\t\t\tdata-slot=\"scroll-area-scrollbar\"\n\t\t\torientation={orientation}\n\t\t\tclassName={cn(\n\t\t\t\tSCROLLBAR_CLASSES,\n\t\t\t\torientation === \"vertical\"\n\t\t\t\t\t? \"h-full w-2.5 border-l border-l-transparent\"\n\t\t\t\t\t: \"h-2.5 flex-col border-t border-t-transparent\",\n\t\t\t)}\n\t\t>\n\t\t\t<ScrollAreaPrimitive.Thumb\n\t\t\t\tdata-slot=\"scroll-area-thumb\"\n\t\t\t\tclassName=\"relative flex-1 rounded-full bg-basalt-border\"\n\t\t\t/>\n\t\t</ScrollAreaPrimitive.Scrollbar>\n\t);\n}\n\nexport const ScrollArea = React.forwardRef<HTMLDivElement, ScrollAreaProps>(\n\t(\n\t\t{\n\t\t\t\"aria-describedby\": ariaDescribedBy,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t\"aria-labelledby\": ariaLabelledBy,\n\t\t\tchildren,\n\t\t\tclassName,\n\t\t\tonScroll,\n\t\t\torientation = \"vertical\",\n\t\t\trole,\n\t\t\ttabIndex = 0,\n\t\t\tviewportClassName,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst hasVertical = orientation !== \"horizontal\";\n\t\tconst hasHorizontal = orientation !== \"vertical\";\n\t\tconst viewportRole = role ?? (ariaLabel || ariaLabelledBy ? \"region\" : undefined);\n\n\t\treturn (\n\t\t\t<ScrollAreaPrimitive.Root\n\t\t\t\tdata-slot=\"scroll-area\"\n\t\t\t\tclassName={cn(\"relative min-h-0 min-w-0 overflow-hidden\", className)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<ScrollAreaPrimitive.Viewport\n\t\t\t\t\tref={ref}\n\t\t\t\t\tdata-orientation={orientation}\n\t\t\t\t\tdata-slot=\"scroll-area-viewport\"\n\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\taria-labelledby={ariaLabelledBy}\n\t\t\t\t\trole={viewportRole}\n\t\t\t\t\ttabIndex={tabIndex}\n\t\t\t\t\tonScroll={onScroll}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"size-full rounded-[inherit] outline-hidden focus-visible:ring-2 focus-visible:ring-basalt-ring focus-visible:ring-offset-2 focus-visible:ring-offset-basalt-background\",\n\t\t\t\t\t\torientation === \"vertical\" && \"overflow-x-hidden!\",\n\t\t\t\t\t\torientation === \"horizontal\" && \"overflow-y-hidden!\",\n\t\t\t\t\t\tviewportClassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</ScrollAreaPrimitive.Viewport>\n\t\t\t\t{hasVertical ? <ScrollBar orientation=\"vertical\" /> : null}\n\t\t\t\t{hasHorizontal ? <ScrollBar orientation=\"horizontal\" /> : null}\n\t\t\t\t{hasVertical && hasHorizontal ? (\n\t\t\t\t\t<ScrollAreaPrimitive.Corner data-slot=\"scroll-area-corner\" />\n\t\t\t\t) : null}\n\t\t\t</ScrollAreaPrimitive.Root>\n\t\t);\n\t},\n);\nScrollArea.displayName = \"ScrollArea\";\n"],"mappings":";;;;;;AAuCA,IAAM,IACL;AAED,SAAS,EAAU,EAAE,kBAA2D;CAC/E,OACC,kBAAC,EAAoB,WAArB;EACC,aAAU;EACG;EACb,WAAW,EACV,GACA,MAAgB,aACb,+CACA,8CACJ;EAEA,UAAA,kBAAC,EAAoB,OAArB;GACC,aAAU;GACV,WAAU;EACV,CAAA;CAC6B,CAAA;AAEjC;AAEA,IAAa,IAAa,EAAM,YAE9B,EACC,oBAAoB,GACpB,cAAc,GACd,mBAAmB,GACnB,aACA,cACA,aACA,iBAAc,YACd,SACA,cAAW,GACX,sBACA,GAAG,KAEJ,MACI;CACJ,IAAM,IAAc,MAAgB,cAC9B,IAAgB,MAAgB,YAChC,IAAe,MAAS,KAAa,IAAiB,WAAW,KAAA;CAEvE,OACC,kBAAC,EAAoB,MAArB;EACC,aAAU;EACV,WAAW,EAAG,4CAA4C,CAAS;EACnE,GAAI;EAHL,UAAA;GAKC,kBAAC,EAAoB,UAArB;IACM;IACL,oBAAkB;IAClB,aAAU;IACV,oBAAkB;IAClB,cAAY;IACZ,mBAAiB;IACjB,MAAM;IACI;IACA;IACV,WAAW,EACV,0KACA,MAAgB,cAAc,sBAC9B,MAAgB,gBAAgB,sBAChC,CACD;IAEC;GAC4B,CAAA;GAC7B,IAAc,kBAAC,GAAD,EAAW,aAAY,WAAY,CAAA,IAAI;GACrD,IAAgB,kBAAC,GAAD,EAAW,aAAY,aAAc,CAAA,IAAI;GACzD,KAAe,IACf,kBAAC,EAAoB,QAArB,EAA4B,aAAU,qBAAsB,CAAA,IACzD;EACqB;;AAE5B,CACD;AACA,EAAW,cAAc"}
@@ -0,0 +1,35 @@
1
+ import * as React from "react";
2
+ export interface SegmentControlOption {
3
+ /** The value selected when this segment is activated. */
4
+ value: string;
5
+ /** The visible label for the segment. */
6
+ label: React.ReactNode;
7
+ /** Disable only this segment. */
8
+ disabled?: boolean;
9
+ }
10
+ export interface SegmentControlAllOption {
11
+ /** The value representing the unfiltered selection. */
12
+ value: string;
13
+ /** The visible label for the leading segment. */
14
+ label?: React.ReactNode;
15
+ /** Disable only the leading segment. */
16
+ disabled?: boolean;
17
+ }
18
+ export interface SegmentControlProps extends Omit<React.HTMLAttributes<HTMLFieldSetElement>, "children" | "onChange"> {
19
+ /** The currently selected value. */
20
+ value: string;
21
+ /** Called when the user selects a different segment. */
22
+ onValueChange: (value: string) => void;
23
+ /** The visible legend that names the control. */
24
+ legend: React.ReactNode;
25
+ /** The selectable segments shown after the optional All segment. */
26
+ options: readonly SegmentControlOption[];
27
+ /** Add a leading unfiltered segment, labelled All by default. */
28
+ allOption?: SegmentControlAllOption;
29
+ /**
30
+ * Disable every segment.
31
+ * @default false
32
+ */
33
+ disabled?: boolean;
34
+ }
35
+ export declare const SegmentControl: React.ForwardRefExoticComponent<SegmentControlProps & React.RefAttributes<HTMLFieldSetElement>>;