@spatika/react 1.1.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 (311) hide show
  1. package/AGENTS.md +71 -0
  2. package/README.md +4 -3
  3. package/dist/composites/Card.d.ts +7 -1
  4. package/dist/composites/Card.d.ts.map +1 -1
  5. package/dist/composites/Card.js +10 -0
  6. package/dist/composites/ChartDataGrid.d.ts +33 -0
  7. package/dist/composites/ChartDataGrid.d.ts.map +1 -0
  8. package/dist/composites/ChartDataGrid.js +77 -0
  9. package/dist/composites/CoverHero.d.ts +1 -1
  10. package/dist/composites/CoverHero.d.ts.map +1 -1
  11. package/dist/composites/CoverHero.js +2 -2
  12. package/dist/composites/EntityMediaCard.d.ts +1 -1
  13. package/dist/composites/EntityMediaCard.d.ts.map +1 -1
  14. package/dist/composites/EntityMediaCard.js +12 -4
  15. package/dist/composites/EventCalendar.d.ts +35 -0
  16. package/dist/composites/EventCalendar.d.ts.map +1 -0
  17. package/dist/composites/EventCalendar.js +339 -0
  18. package/dist/composites/EventEditor.d.ts +22 -0
  19. package/dist/composites/EventEditor.d.ts.map +1 -0
  20. package/dist/composites/EventEditor.js +86 -0
  21. package/dist/composites/EventTimeline.d.ts +24 -0
  22. package/dist/composites/EventTimeline.d.ts.map +1 -0
  23. package/dist/composites/EventTimeline.js +184 -0
  24. package/dist/composites/MapChart.d.ts +24 -0
  25. package/dist/composites/MapChart.d.ts.map +1 -0
  26. package/dist/composites/MapChart.js +58 -0
  27. package/dist/composites/ProfileHero.d.ts +6 -4
  28. package/dist/composites/ProfileHero.d.ts.map +1 -1
  29. package/dist/composites/ProfileHero.js +8 -8
  30. package/dist/composites/ScatterWebGL.d.ts +22 -0
  31. package/dist/composites/ScatterWebGL.d.ts.map +1 -0
  32. package/dist/composites/ScatterWebGL.js +45 -0
  33. package/dist/composites/SiteFooter.d.ts +1 -1
  34. package/dist/composites/SiteFooter.js +1 -1
  35. package/dist/composites/SiteNav.d.ts +7 -2
  36. package/dist/composites/SiteNav.d.ts.map +1 -1
  37. package/dist/composites/SiteNav.js +9 -5
  38. package/dist/composites/StatCard.d.ts +2 -1
  39. package/dist/composites/StatCard.d.ts.map +1 -1
  40. package/dist/composites/StatCard.js +3 -3
  41. package/dist/composites/StatusDot.d.ts +1 -1
  42. package/dist/composites/Wordmark.d.ts +2 -2
  43. package/dist/composites/Wordmark.d.ts.map +1 -1
  44. package/dist/composites/cartesian-charts.d.ts +138 -0
  45. package/dist/composites/cartesian-charts.d.ts.map +1 -0
  46. package/dist/composites/cartesian-charts.js +401 -0
  47. package/dist/composites/chart-composition.d.ts +139 -0
  48. package/dist/composites/chart-composition.d.ts.map +1 -0
  49. package/dist/composites/chart-composition.js +486 -0
  50. package/dist/composites/chart-ui.d.ts +83 -0
  51. package/dist/composites/chart-ui.d.ts.map +1 -0
  52. package/dist/composites/chart-ui.js +108 -0
  53. package/dist/composites/charts-3d.d.ts +37 -0
  54. package/dist/composites/charts-3d.d.ts.map +1 -0
  55. package/dist/composites/charts-3d.js +121 -0
  56. package/dist/composites/flow-charts.d.ts +89 -0
  57. package/dist/composites/flow-charts.d.ts.map +1 -0
  58. package/dist/composites/flow-charts.js +186 -0
  59. package/dist/composites/radial-charts.d.ts +109 -0
  60. package/dist/composites/radial-charts.d.ts.map +1 -0
  61. package/dist/composites/radial-charts.js +176 -0
  62. package/dist/composites/scheduler-ui.d.ts +43 -0
  63. package/dist/composites/scheduler-ui.d.ts.map +1 -0
  64. package/dist/composites/scheduler-ui.js +71 -0
  65. package/dist/index.d.ts +67 -7
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +57 -7
  68. package/dist/lib/chart-export.d.ts +10 -0
  69. package/dist/lib/chart-export.d.ts.map +1 -0
  70. package/dist/lib/chart-export.js +102 -0
  71. package/dist/lib/charts.d.ts +235 -0
  72. package/dist/lib/charts.d.ts.map +1 -0
  73. package/dist/lib/charts.js +744 -0
  74. package/dist/lib/geo.d.ts +39 -0
  75. package/dist/lib/geo.d.ts.map +1 -0
  76. package/dist/lib/geo.js +101 -0
  77. package/dist/lib/iso.d.ts +21 -0
  78. package/dist/lib/iso.d.ts.map +1 -0
  79. package/dist/lib/iso.js +56 -0
  80. package/dist/lib/rrule.d.ts +20 -0
  81. package/dist/lib/rrule.d.ts.map +1 -0
  82. package/dist/lib/rrule.js +236 -0
  83. package/dist/lib/scheduler.d.ts +152 -0
  84. package/dist/lib/scheduler.d.ts.map +1 -0
  85. package/dist/lib/scheduler.js +501 -0
  86. package/dist/lib/webgl-scatter.d.ts +44 -0
  87. package/dist/lib/webgl-scatter.d.ts.map +1 -0
  88. package/dist/lib/webgl-scatter.js +185 -0
  89. package/dist/primitives/Accordion.d.ts +44 -20
  90. package/dist/primitives/Accordion.d.ts.map +1 -1
  91. package/dist/primitives/Accordion.js +82 -22
  92. package/dist/primitives/AppBar.d.ts +13 -0
  93. package/dist/primitives/AppBar.d.ts.map +1 -0
  94. package/dist/primitives/AppBar.js +27 -0
  95. package/dist/primitives/Autocomplete.d.ts +28 -0
  96. package/dist/primitives/Autocomplete.d.ts.map +1 -0
  97. package/dist/primitives/Autocomplete.js +118 -0
  98. package/dist/primitives/Avatar.d.ts +13 -1
  99. package/dist/primitives/Avatar.d.ts.map +1 -1
  100. package/dist/primitives/Avatar.js +17 -2
  101. package/dist/primitives/Backdrop.d.ts +17 -0
  102. package/dist/primitives/Backdrop.d.ts.map +1 -0
  103. package/dist/primitives/Backdrop.js +17 -0
  104. package/dist/primitives/BottomNavigation.d.ts +23 -0
  105. package/dist/primitives/BottomNavigation.d.ts.map +1 -0
  106. package/dist/primitives/BottomNavigation.js +30 -0
  107. package/dist/primitives/ButtonBase.d.ts +14 -0
  108. package/dist/primitives/ButtonBase.d.ts.map +1 -0
  109. package/dist/primitives/ButtonBase.js +13 -0
  110. package/dist/primitives/ButtonGroup.d.ts +25 -0
  111. package/dist/primitives/ButtonGroup.d.ts.map +1 -0
  112. package/dist/primitives/ButtonGroup.js +44 -0
  113. package/dist/primitives/CircularProgress.d.ts +16 -0
  114. package/dist/primitives/CircularProgress.d.ts.map +1 -0
  115. package/dist/primitives/CircularProgress.js +17 -0
  116. package/dist/primitives/ClickAwayListener.d.ts +16 -0
  117. package/dist/primitives/ClickAwayListener.d.ts.map +1 -0
  118. package/dist/primitives/ClickAwayListener.js +33 -0
  119. package/dist/primitives/Collapse.d.ts +19 -0
  120. package/dist/primitives/Collapse.d.ts.map +1 -0
  121. package/dist/primitives/Collapse.js +14 -0
  122. package/dist/primitives/Container.d.ts +13 -0
  123. package/dist/primitives/Container.d.ts.map +1 -0
  124. package/dist/primitives/Container.js +26 -0
  125. package/dist/primitives/Fab.d.ts +22 -0
  126. package/dist/primitives/Fab.d.ts.map +1 -0
  127. package/dist/primitives/Fab.js +42 -0
  128. package/dist/primitives/FormControl.d.ts +27 -0
  129. package/dist/primitives/FormControl.d.ts.map +1 -0
  130. package/dist/primitives/FormControl.js +24 -0
  131. package/dist/primitives/FormControlLabel.d.ts +18 -0
  132. package/dist/primitives/FormControlLabel.d.ts.map +1 -0
  133. package/dist/primitives/FormControlLabel.js +19 -0
  134. package/dist/primitives/Grid.d.ts +32 -0
  135. package/dist/primitives/Grid.d.ts.map +1 -0
  136. package/dist/primitives/Grid.js +50 -0
  137. package/dist/primitives/IconButton.d.ts +22 -0
  138. package/dist/primitives/IconButton.d.ts.map +1 -0
  139. package/dist/primitives/IconButton.js +39 -0
  140. package/dist/primitives/ImageList.d.ts +31 -0
  141. package/dist/primitives/ImageList.d.ts.map +1 -0
  142. package/dist/primitives/ImageList.js +33 -0
  143. package/dist/primitives/InputAdornment.d.ts +28 -0
  144. package/dist/primitives/InputAdornment.d.ts.map +1 -0
  145. package/dist/primitives/InputAdornment.js +13 -0
  146. package/dist/primitives/Link.d.ts +17 -0
  147. package/dist/primitives/Link.d.ts.map +1 -0
  148. package/dist/primitives/Link.js +29 -0
  149. package/dist/primitives/List.d.ts +41 -0
  150. package/dist/primitives/List.d.ts.map +1 -0
  151. package/dist/primitives/List.js +22 -0
  152. package/dist/primitives/Masonry.d.ts +14 -0
  153. package/dist/primitives/Masonry.d.ts.map +1 -0
  154. package/dist/primitives/Masonry.js +15 -0
  155. package/dist/primitives/Menu.d.ts +28 -0
  156. package/dist/primitives/Menu.d.ts.map +1 -0
  157. package/dist/primitives/Menu.js +54 -0
  158. package/dist/primitives/MobileStepper.d.ts +15 -0
  159. package/dist/primitives/MobileStepper.d.ts.map +1 -0
  160. package/dist/primitives/MobileStepper.js +8 -0
  161. package/dist/primitives/Modal.d.ts +18 -0
  162. package/dist/primitives/Modal.d.ts.map +1 -0
  163. package/dist/primitives/Modal.js +29 -0
  164. package/dist/primitives/NoSsr.d.ts +15 -0
  165. package/dist/primitives/NoSsr.d.ts.map +1 -0
  166. package/dist/primitives/NoSsr.js +19 -0
  167. package/dist/primitives/Paper.d.ts +22 -0
  168. package/dist/primitives/Paper.d.ts.map +1 -0
  169. package/dist/primitives/Paper.js +33 -0
  170. package/dist/primitives/Progress.d.ts +6 -2
  171. package/dist/primitives/Progress.d.ts.map +1 -1
  172. package/dist/primitives/Progress.js +8 -3
  173. package/dist/primitives/Snackbar.d.ts +23 -0
  174. package/dist/primitives/Snackbar.d.ts.map +1 -0
  175. package/dist/primitives/Snackbar.js +33 -0
  176. package/dist/primitives/SpeedDial.d.ts +26 -0
  177. package/dist/primitives/SpeedDial.d.ts.map +1 -0
  178. package/dist/primitives/SpeedDial.js +26 -0
  179. package/dist/primitives/Stack.d.ts +15 -0
  180. package/dist/primitives/Stack.d.ts.map +1 -0
  181. package/dist/primitives/Stack.js +45 -0
  182. package/dist/primitives/StarRating.d.ts +19 -1
  183. package/dist/primitives/StarRating.d.ts.map +1 -1
  184. package/dist/primitives/StarRating.js +36 -6
  185. package/dist/primitives/Stepper.d.ts +36 -0
  186. package/dist/primitives/Stepper.d.ts.map +1 -0
  187. package/dist/primitives/Stepper.js +53 -0
  188. package/dist/primitives/TablePagination.d.ts +16 -0
  189. package/dist/primitives/TablePagination.d.ts.map +1 -0
  190. package/dist/primitives/TablePagination.js +12 -0
  191. package/dist/primitives/TextField.d.ts +24 -0
  192. package/dist/primitives/TextField.d.ts.map +1 -0
  193. package/dist/primitives/TextField.js +19 -0
  194. package/dist/primitives/TextareaAutosize.d.ts +11 -0
  195. package/dist/primitives/TextareaAutosize.d.ts.map +1 -0
  196. package/dist/primitives/TextareaAutosize.js +26 -0
  197. package/dist/primitives/ToggleButton.d.ts +28 -0
  198. package/dist/primitives/ToggleButton.d.ts.map +1 -0
  199. package/dist/primitives/ToggleButton.js +56 -0
  200. package/dist/primitives/TransferList.d.ts +21 -0
  201. package/dist/primitives/TransferList.d.ts.map +1 -0
  202. package/dist/primitives/TransferList.js +40 -0
  203. package/dist/primitives/Typography.d.ts +23 -0
  204. package/dist/primitives/Typography.d.ts.map +1 -0
  205. package/dist/primitives/Typography.js +69 -0
  206. package/dist/primitives/transitions.d.ts +29 -0
  207. package/dist/primitives/transitions.d.ts.map +1 -0
  208. package/dist/primitives/transitions.js +52 -0
  209. package/package.json +28 -4
  210. package/skills/spatika-ui/SKILL.md +96 -0
  211. package/src/composites/Card.tsx +51 -1
  212. package/src/composites/ChartDataGrid.test.tsx +57 -0
  213. package/src/composites/ChartDataGrid.tsx +196 -0
  214. package/src/composites/CoverHero.test.tsx +38 -0
  215. package/src/composites/CoverHero.tsx +29 -22
  216. package/src/composites/EntityMediaCard.test.tsx +58 -0
  217. package/src/composites/EntityMediaCard.tsx +31 -13
  218. package/src/composites/EventCalendar.tsx +928 -0
  219. package/src/composites/EventEditor.tsx +268 -0
  220. package/src/composites/EventTimeline.tsx +357 -0
  221. package/src/composites/MapChart.test.tsx +39 -0
  222. package/src/composites/MapChart.tsx +130 -0
  223. package/src/composites/ProfileHero.test.tsx +33 -0
  224. package/src/composites/ProfileHero.tsx +96 -79
  225. package/src/composites/ScatterWebGL.test.tsx +25 -0
  226. package/src/composites/ScatterWebGL.tsx +79 -0
  227. package/src/composites/SiteFooter.test.tsx +37 -0
  228. package/src/composites/SiteFooter.tsx +1 -1
  229. package/src/composites/SiteNav.test.tsx +46 -0
  230. package/src/composites/SiteNav.tsx +14 -4
  231. package/src/composites/StatCard.test.tsx +30 -0
  232. package/src/composites/StatCard.tsx +4 -0
  233. package/src/composites/Wordmark.test.tsx +23 -0
  234. package/src/composites/Wordmark.tsx +2 -2
  235. package/src/composites/cartesian-charts.test.tsx +52 -0
  236. package/src/composites/cartesian-charts.tsx +1287 -0
  237. package/src/composites/chart-composition.test.tsx +53 -0
  238. package/src/composites/chart-composition.tsx +898 -0
  239. package/src/composites/chart-ui.tsx +328 -0
  240. package/src/composites/charts-3d.test.tsx +25 -0
  241. package/src/composites/charts-3d.tsx +318 -0
  242. package/src/composites/charts.test.tsx +254 -0
  243. package/src/composites/chrome.test.tsx +29 -0
  244. package/src/composites/flow-charts.test.tsx +79 -0
  245. package/src/composites/flow-charts.tsx +607 -0
  246. package/src/composites/marketing.test.tsx +38 -34
  247. package/src/composites/radial-charts.test.tsx +74 -0
  248. package/src/composites/radial-charts.tsx +617 -0
  249. package/src/composites/scheduler-ui.tsx +304 -0
  250. package/src/composites/scheduler.test.tsx +194 -0
  251. package/src/index.test.ts +22 -0
  252. package/src/index.ts +277 -5
  253. package/src/lib/chart-export.test.ts +20 -0
  254. package/src/lib/chart-export.ts +99 -0
  255. package/src/lib/charts-platform.test.ts +93 -0
  256. package/src/lib/charts.test.ts +132 -0
  257. package/src/lib/charts.ts +1021 -0
  258. package/src/lib/geo.test.ts +42 -0
  259. package/src/lib/geo.ts +138 -0
  260. package/src/lib/iso.test.ts +22 -0
  261. package/src/lib/iso.ts +102 -0
  262. package/src/lib/rrule.test.ts +53 -0
  263. package/src/lib/rrule.ts +281 -0
  264. package/src/lib/scheduler.test.ts +186 -0
  265. package/src/lib/scheduler.ts +688 -0
  266. package/src/lib/tokens.test.ts +2 -2
  267. package/src/lib/webgl-scatter.test.ts +36 -0
  268. package/src/lib/webgl-scatter.ts +230 -0
  269. package/src/primitives/Accordion.tsx +218 -63
  270. package/src/primitives/AppBar.tsx +39 -0
  271. package/src/primitives/Autocomplete.tsx +236 -0
  272. package/src/primitives/Avatar.tsx +52 -1
  273. package/src/primitives/Backdrop.tsx +48 -0
  274. package/src/primitives/BottomNavigation.tsx +102 -0
  275. package/src/primitives/ButtonBase.tsx +34 -0
  276. package/src/primitives/ButtonGroup.tsx +90 -0
  277. package/src/primitives/CircularProgress.tsx +104 -0
  278. package/src/primitives/ClickAwayListener.tsx +46 -0
  279. package/src/primitives/Collapse.tsx +39 -0
  280. package/src/primitives/Container.tsx +40 -0
  281. package/src/primitives/Fab.tsx +62 -0
  282. package/src/primitives/FormControl.tsx +90 -0
  283. package/src/primitives/FormControlLabel.tsx +51 -0
  284. package/src/primitives/Grid.tsx +101 -0
  285. package/src/primitives/IconButton.tsx +59 -0
  286. package/src/primitives/ImageList.test.tsx +48 -0
  287. package/src/primitives/ImageList.tsx +112 -0
  288. package/src/primitives/InputAdornment.tsx +86 -0
  289. package/src/primitives/Link.tsx +48 -0
  290. package/src/primitives/List.tsx +121 -0
  291. package/src/primitives/Masonry.tsx +32 -0
  292. package/src/primitives/Menu.tsx +112 -0
  293. package/src/primitives/MobileStepper.tsx +64 -0
  294. package/src/primitives/Modal.tsx +70 -0
  295. package/src/primitives/NoSsr.tsx +28 -0
  296. package/src/primitives/Paper.tsx +55 -0
  297. package/src/primitives/Progress.tsx +25 -7
  298. package/src/primitives/Snackbar.tsx +83 -0
  299. package/src/primitives/SpeedDial.tsx +110 -0
  300. package/src/primitives/Stack.tsx +88 -0
  301. package/src/primitives/StarRating.tsx +87 -28
  302. package/src/primitives/Stepper.tsx +184 -0
  303. package/src/primitives/TablePagination.tsx +58 -0
  304. package/src/primitives/TextField.tsx +105 -0
  305. package/src/primitives/TextareaAutosize.tsx +49 -0
  306. package/src/primitives/ToggleButton.tsx +148 -0
  307. package/src/primitives/TransferList.tsx +110 -0
  308. package/src/primitives/Typography.tsx +90 -0
  309. package/src/primitives/mui-more.test.tsx +76 -0
  310. package/src/primitives/mui.test.tsx +134 -0
  311. package/src/primitives/transitions.tsx +120 -0
@@ -0,0 +1,50 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { Slot } from "../lib/slot";
4
+ import { cn } from "../lib/cn";
5
+ /**
6
+ * Generic layout primitive. Prefer Stack / Grid / Paper for structured layouts.
7
+ */
8
+ const Box = React.forwardRef(({ className, component = "div", asChild = false, ...props }, ref) => {
9
+ const Comp = asChild ? Slot : component;
10
+ return _jsx(Comp, { ref: ref, "data-slot": "box", className: cn(className), ...props });
11
+ });
12
+ Box.displayName = "Box";
13
+ const gapClass = {
14
+ 0: "gap-0",
15
+ 1: "gap-1",
16
+ 2: "gap-2",
17
+ 3: "gap-3",
18
+ 4: "gap-4",
19
+ 5: "gap-5",
20
+ 6: "gap-6",
21
+ 8: "gap-8",
22
+ };
23
+ const spanClass = {
24
+ 1: "col-span-1",
25
+ 2: "col-span-2",
26
+ 3: "col-span-3",
27
+ 4: "col-span-4",
28
+ 5: "col-span-5",
29
+ 6: "col-span-6",
30
+ 7: "col-span-7",
31
+ 8: "col-span-8",
32
+ 9: "col-span-9",
33
+ 10: "col-span-10",
34
+ 11: "col-span-11",
35
+ 12: "col-span-12",
36
+ };
37
+ function spanFor(value) {
38
+ if (value == null || value === "auto" || value === "grow")
39
+ return undefined;
40
+ return spanClass[value] ?? "col-span-12";
41
+ }
42
+ /**
43
+ * 12-column CSS grid. Use `container` on the parent and breakpoint spans on items.
44
+ */
45
+ function Grid({ container, item: _item, spacing = 2, columns: _columns = 12, xs, sm, md, lg, size, className, ...props }) {
46
+ const span = spanFor(typeof size === "number" ? size : xs);
47
+ return (_jsx("div", { "data-slot": "grid", "data-container": container ? "" : undefined, "data-item": _item || !container ? "" : undefined, className: cn(container && "grid grid-cols-12", container && (gapClass[spacing] ?? "gap-2"), !container && (span ?? (size === "grow" ? "col-span-12" : "col-span-12")), sm && typeof sm === "number" && spanClass[sm]?.replace("col-span", "sm:col-span"), md && typeof md === "number" && spanClass[md]?.replace("col-span", "md:col-span"), lg && typeof lg === "number" && spanClass[lg]?.replace("col-span", "lg:col-span"), className), ...props }));
48
+ }
49
+ Grid.displayName = "Grid";
50
+ export { Box, Grid };
@@ -0,0 +1,22 @@
1
+ import * as React from "react";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ declare const iconButtonVariants: (props?: ({
4
+ variant?: "filled" | "outline" | "ghost" | "glass" | null | undefined;
5
+ size?: "touch" | "sm" | "lg" | "md" | null | undefined;
6
+ shape?: "circular" | "rounded" | null | undefined;
7
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
8
+ export type IconButtonProps = React.ComponentPropsWithoutRef<"button"> & VariantProps<typeof iconButtonVariants> & {
9
+ asChild?: boolean;
10
+ };
11
+ /**
12
+ * Compact icon-only control. Prefer {@link HeaderIconButton} inside app chrome.
13
+ */
14
+ declare const IconButton: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & VariantProps<(props?: ({
15
+ variant?: "filled" | "outline" | "ghost" | "glass" | null | undefined;
16
+ size?: "touch" | "sm" | "lg" | "md" | null | undefined;
17
+ shape?: "circular" | "rounded" | null | undefined;
18
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string> & {
19
+ asChild?: boolean;
20
+ } & React.RefAttributes<HTMLButtonElement>>;
21
+ export { IconButton, iconButtonVariants };
22
+ //# sourceMappingURL=IconButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconButton.d.ts","sourceRoot":"","sources":["../../src/primitives/IconButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAIlE,QAAA,MAAM,kBAAkB;;;;8EA2BvB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,KAAK,CAAC,wBAAwB,CAAC,QAAQ,CAAC,GACpE,YAAY,CAAC,OAAO,kBAAkB,CAAC,GAAG;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEJ;;GAEG;AACH,QAAA,MAAM,UAAU;;;;;cANF,OAAO;2CAmBpB,CAAC;AAGF,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cva } from "class-variance-authority";
4
+ import { Slot } from "../lib/slot";
5
+ import { cn } from "../lib/cn";
6
+ const iconButtonVariants = cva("inline-flex shrink-0 items-center justify-center outline-none transition-[color,background-color,border-color,transform] duration-150 focus-visible:ring-ring/50 focus-visible:ring-[3px] active:scale-[0.98] disabled:pointer-events-none disabled:opacity-50 [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", {
7
+ variants: {
8
+ variant: {
9
+ ghost: "text-muted-foreground hover:bg-muted/40 hover:text-foreground",
10
+ outline: "border border-border/60 bg-background/80 text-foreground hover:bg-muted/40",
11
+ glass: "glass border-border/50 text-foreground hover:border-primary/30 hover:text-primary",
12
+ filled: "bg-primary text-primary-foreground hover:bg-primary/90",
13
+ },
14
+ size: {
15
+ sm: "size-8 rounded-lg",
16
+ md: "size-10 rounded-xl",
17
+ lg: "size-12 rounded-xl",
18
+ touch: "size-11 rounded-xl",
19
+ },
20
+ shape: {
21
+ rounded: "",
22
+ circular: "rounded-full",
23
+ },
24
+ },
25
+ defaultVariants: {
26
+ variant: "ghost",
27
+ size: "md",
28
+ shape: "rounded",
29
+ },
30
+ });
31
+ /**
32
+ * Compact icon-only control. Prefer {@link HeaderIconButton} inside app chrome.
33
+ */
34
+ const IconButton = React.forwardRef(({ className, variant, size, shape, asChild = false, ...props }, ref) => {
35
+ const Comp = asChild ? Slot : "button";
36
+ return (_jsx(Comp, { ref: ref, type: asChild ? undefined : "button", "data-slot": "icon-button", className: cn(iconButtonVariants({ variant, size, shape }), className), ...props }));
37
+ });
38
+ IconButton.displayName = "IconButton";
39
+ export { IconButton, iconButtonVariants };
@@ -0,0 +1,31 @@
1
+ import * as React from "react";
2
+ export type ImageListProps = React.ComponentPropsWithoutRef<"ul"> & {
3
+ cols?: number;
4
+ gap?: number;
5
+ variant?: "standard" | "quilted" | "masonry";
6
+ rowHeight?: number;
7
+ };
8
+ declare function ImageList({ cols, gap, variant, rowHeight, className, style, children, ...props }: ImageListProps): React.JSX.Element;
9
+ declare namespace ImageList {
10
+ var displayName: string;
11
+ }
12
+ export type ImageListItemProps = React.ComponentPropsWithoutRef<"li"> & {
13
+ cols?: number;
14
+ rows?: number;
15
+ };
16
+ declare function ImageListItem({ cols, rows, className, style, ...props }: ImageListItemProps): React.JSX.Element;
17
+ declare namespace ImageListItem {
18
+ var displayName: string;
19
+ }
20
+ export type ImageListItemBarProps = React.ComponentPropsWithoutRef<"div"> & {
21
+ title?: React.ReactNode;
22
+ subtitle?: React.ReactNode;
23
+ actionIcon?: React.ReactNode;
24
+ position?: "bottom" | "top";
25
+ };
26
+ declare function ImageListItemBar({ title, subtitle, actionIcon, position, className, ...props }: ImageListItemBarProps): React.JSX.Element;
27
+ declare namespace ImageListItemBar {
28
+ var displayName: string;
29
+ }
30
+ export { ImageList, ImageListItem, ImageListItemBar };
31
+ //# sourceMappingURL=ImageList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageList.d.ts","sourceRoot":"","sources":["../../src/primitives/ImageList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,MAAM,cAAc,GAAG,KAAK,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,iBAAS,SAAS,CAAC,EACjB,IAAQ,EACR,GAAO,EACP,OAAoB,EACpB,SAAe,EACf,SAAS,EACT,KAAK,EACL,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,qBA2BhB;kBApCQ,SAAS;;;AAuClB,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,iBAAS,aAAa,CAAC,EAAE,IAAQ,EAAE,IAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,kBAAkB,qBAiB5F;kBAjBQ,aAAa;;;AAoBtB,MAAM,MAAM,qBAAqB,GAAG,KAAK,CAAC,wBAAwB,CAAC,KAAK,CAAC,GAAG;IAC1E,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;CAC7B,CAAC;AAEF,iBAAS,gBAAgB,CAAC,EACxB,KAAK,EACL,QAAQ,EACR,UAAU,EACV,QAAmB,EACnB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,qBAAqB,qBAoBvB;kBA3BQ,gBAAgB;;;AA8BzB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../lib/cn";
3
+ function ImageList({ cols = 2, gap = 8, variant = "standard", rowHeight = 180, className, style, children, ...props }) {
4
+ return (_jsx("ul", { "data-slot": "image-list", "data-variant": variant, className: cn("m-0 w-full list-none p-0", variant === "masonry"
5
+ ? "block [&>[data-slot=image-list-item]]:mb-2 [&>[data-slot=image-list-item]]:h-auto"
6
+ : "grid", className), style: {
7
+ gap,
8
+ ...(variant === "masonry"
9
+ ? { columnCount: cols, columnGap: gap }
10
+ : {
11
+ gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))`,
12
+ gridAutoRows: rowHeight,
13
+ }),
14
+ ...style,
15
+ }, ...props, children: children }));
16
+ }
17
+ ImageList.displayName = "ImageList";
18
+ function ImageListItem({ cols = 1, rows = 1, className, style, ...props }) {
19
+ return (_jsx("li", { "data-slot": "image-list-item", className: cn("relative h-full min-h-0 overflow-hidden rounded-xl [&_img]:absolute [&_img]:inset-0 [&_img]:size-full [&_img]:object-cover", className), style: {
20
+ gridColumn: `span ${cols}`,
21
+ gridRow: `span ${rows}`,
22
+ breakInside: "avoid",
23
+ ...style,
24
+ }, ...props }));
25
+ }
26
+ ImageListItem.displayName = "ImageListItem";
27
+ function ImageListItemBar({ title, subtitle, actionIcon, position = "bottom", className, ...props }) {
28
+ return (_jsxs("div", { "data-slot": "image-list-item-bar", className: cn("absolute inset-x-0 z-10 flex items-end justify-between gap-2 p-3 text-white", position === "top"
29
+ ? "top-0 bg-gradient-to-b from-black/70 to-transparent"
30
+ : "bottom-0 bg-gradient-to-t from-black/70 to-transparent", className), ...props, children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "truncate text-sm font-bold", children: title }), subtitle ? _jsx("div", { className: "truncate text-xs opacity-80", children: subtitle }) : null] }), actionIcon] }));
31
+ }
32
+ ImageListItemBar.displayName = "ImageListItemBar";
33
+ export { ImageList, ImageListItem, ImageListItemBar };
@@ -0,0 +1,28 @@
1
+ import * as React from "react";
2
+ export type InputAdornmentProps = React.ComponentPropsWithoutRef<"span"> & {
3
+ position?: "start" | "end";
4
+ };
5
+ declare function InputAdornment({ position, className, ...props }: InputAdornmentProps): React.JSX.Element;
6
+ declare namespace InputAdornment {
7
+ var displayName: string;
8
+ }
9
+ export type OutlinedInputProps = React.ComponentPropsWithoutRef<"input"> & {
10
+ startAdornment?: React.ReactNode;
11
+ endAdornment?: React.ReactNode;
12
+ error?: boolean;
13
+ fullWidth?: boolean;
14
+ };
15
+ declare const OutlinedInput: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, "ref"> & {
16
+ startAdornment?: React.ReactNode;
17
+ endAdornment?: React.ReactNode;
18
+ error?: boolean;
19
+ fullWidth?: boolean;
20
+ } & React.RefAttributes<HTMLInputElement>>;
21
+ declare const FilledInput: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, "ref"> & {
22
+ startAdornment?: React.ReactNode;
23
+ endAdornment?: React.ReactNode;
24
+ error?: boolean;
25
+ fullWidth?: boolean;
26
+ } & React.RefAttributes<HTMLInputElement>>;
27
+ export { InputAdornment, OutlinedInput, FilledInput };
28
+ //# sourceMappingURL=InputAdornment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputAdornment.d.ts","sourceRoot":"","sources":["../../src/primitives/InputAdornment.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,MAAM,mBAAmB,GAAG,KAAK,CAAC,wBAAwB,CAAC,MAAM,CAAC,GAAG;IACzE,QAAQ,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;CAC5B,CAAC;AAEF,iBAAS,cAAc,CAAC,EACtB,QAAkB,EAClB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,mBAAmB,qBAarB;kBAjBQ,cAAc;;;AAoBvB,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,CAAC,GAAG;IACzE,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACjC,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,QAAA,MAAM,aAAa;qBANA,KAAK,CAAC,SAAS;mBACjB,KAAK,CAAC,SAAS;YACtB,OAAO;gBACH,OAAO;0CAyBpB,CAAC;AAGF,QAAA,MAAM,WAAW;qBA/BE,KAAK,CAAC,SAAS;mBACjB,KAAK,CAAC,SAAS;YACtB,OAAO;gBACH,OAAO;0CAkDpB,CAAC;AAGF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "../lib/cn";
4
+ import { Input } from "./Input";
5
+ function InputAdornment({ position = "start", className, ...props }) {
6
+ return (_jsx("span", { "data-slot": "input-adornment", "data-position": position, className: cn("inline-flex shrink-0 items-center text-sm font-medium text-muted-foreground", position === "start" ? "pl-1 pr-1.5" : "pl-1.5 pr-1", className), ...props }));
7
+ }
8
+ InputAdornment.displayName = "InputAdornment";
9
+ const OutlinedInput = React.forwardRef(({ startAdornment, endAdornment, error, fullWidth, className, ...props }, ref) => (_jsxs("div", { "data-slot": "outlined-input", className: cn("flex h-9 items-center rounded-md border border-input bg-input-background px-2", "focus-within:border-ring focus-within:ring-ring/50 focus-within:ring-[3px]", error && "border-destructive", fullWidth && "w-full", className), children: [startAdornment, _jsx(Input, { ref: ref, "aria-invalid": error || undefined, className: "h-full flex-1 border-0 bg-transparent px-1 shadow-none focus-visible:ring-0", ...props }), endAdornment] })));
10
+ OutlinedInput.displayName = "OutlinedInput";
11
+ const FilledInput = React.forwardRef(({ startAdornment, endAdornment, error, fullWidth, className, ...props }, ref) => (_jsxs("div", { "data-slot": "filled-input", className: cn("flex h-9 items-center rounded-md border-b border-transparent bg-muted/50 px-2", "focus-within:border-primary focus-within:bg-muted/70", error && "border-destructive", fullWidth && "w-full", className), children: [startAdornment, _jsx(Input, { ref: ref, "aria-invalid": error || undefined, className: "h-full flex-1 border-0 bg-transparent px-1 shadow-none focus-visible:ring-0", ...props }), endAdornment] })));
12
+ FilledInput.displayName = "FilledInput";
13
+ export { InputAdornment, OutlinedInput, FilledInput };
@@ -0,0 +1,17 @@
1
+ import * as React from "react";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ declare const linkVariants: (props?: ({
4
+ color?: "inherit" | "primary" | "muted" | null | undefined;
5
+ underline?: "none" | "always" | "hover" | null | undefined;
6
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
+ export type LinkProps = Omit<React.ComponentPropsWithoutRef<"a">, "color"> & VariantProps<typeof linkVariants> & {
8
+ asChild?: boolean;
9
+ };
10
+ declare const Link: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>, "ref">, "color"> & VariantProps<(props?: ({
11
+ color?: "inherit" | "primary" | "muted" | null | undefined;
12
+ underline?: "none" | "always" | "hover" | null | undefined;
13
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string> & {
14
+ asChild?: boolean;
15
+ } & React.RefAttributes<HTMLAnchorElement>>;
16
+ export { Link, linkVariants };
17
+ //# sourceMappingURL=Link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../../src/primitives/Link.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAIlE,QAAA,MAAM,YAAY;;;8EAoBjB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,GACxE,YAAY,CAAC,OAAO,YAAY,CAAC,GAAG;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEJ,QAAA,MAAM,IAAI;;;;cAHI,OAAO;2CAepB,CAAC;AAGF,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cva } from "class-variance-authority";
4
+ import { Slot } from "../lib/slot";
5
+ import { cn } from "../lib/cn";
6
+ const linkVariants = cva("inline font-medium underline-offset-4 outline-none transition-colors focus-visible:ring-ring/50 focus-visible:ring-[3px] rounded-sm", {
7
+ variants: {
8
+ color: {
9
+ primary: "text-primary hover:text-primary/80",
10
+ inherit: "text-inherit hover:text-primary",
11
+ muted: "text-muted-foreground hover:text-foreground",
12
+ },
13
+ underline: {
14
+ always: "underline",
15
+ hover: "hover:underline",
16
+ none: "no-underline",
17
+ },
18
+ },
19
+ defaultVariants: {
20
+ color: "primary",
21
+ underline: "hover",
22
+ },
23
+ });
24
+ const Link = React.forwardRef(({ className, color, underline, asChild = false, ...props }, ref) => {
25
+ const Comp = asChild ? Slot : "a";
26
+ return (_jsx(Comp, { ref: ref, "data-slot": "link", className: cn(linkVariants({ color, underline }), className), ...props }));
27
+ });
28
+ Link.displayName = "Link";
29
+ export { Link, linkVariants };
@@ -0,0 +1,41 @@
1
+ import * as React from "react";
2
+ export type ListProps = React.ComponentPropsWithoutRef<"ul"> & {
3
+ dense?: boolean;
4
+ disablePadding?: boolean;
5
+ };
6
+ declare const List: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLUListElement>, HTMLUListElement>, "ref"> & {
7
+ dense?: boolean;
8
+ disablePadding?: boolean;
9
+ } & React.RefAttributes<HTMLUListElement>>;
10
+ export type ListItemProps = React.ComponentPropsWithoutRef<"li"> & {
11
+ disablePadding?: boolean;
12
+ disableGutters?: boolean;
13
+ };
14
+ declare const ListItem: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.LiHTMLAttributes<HTMLLIElement>, HTMLLIElement>, "ref"> & {
15
+ disablePadding?: boolean;
16
+ disableGutters?: boolean;
17
+ } & React.RefAttributes<HTMLLIElement>>;
18
+ export type ListItemButtonProps = React.ComponentPropsWithoutRef<"button"> & {
19
+ selected?: boolean;
20
+ };
21
+ declare const ListItemButton: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & {
22
+ selected?: boolean;
23
+ } & React.RefAttributes<HTMLButtonElement>>;
24
+ declare function ListItemIcon({ className, ...props }: React.ComponentPropsWithoutRef<"span">): React.JSX.Element;
25
+ declare namespace ListItemIcon {
26
+ var displayName: string;
27
+ }
28
+ export type ListItemTextProps = React.ComponentPropsWithoutRef<"div"> & {
29
+ primary?: React.ReactNode;
30
+ secondary?: React.ReactNode;
31
+ };
32
+ declare function ListItemText({ className, primary, secondary, children, ...props }: ListItemTextProps): React.JSX.Element;
33
+ declare namespace ListItemText {
34
+ var displayName: string;
35
+ }
36
+ declare function ListSubheader({ className, ...props }: React.ComponentPropsWithoutRef<"li">): React.JSX.Element;
37
+ declare namespace ListSubheader {
38
+ var displayName: string;
39
+ }
40
+ export { List, ListItem, ListItemButton, ListItemIcon, ListItemText, ListSubheader };
41
+ //# sourceMappingURL=List.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"List.d.ts","sourceRoot":"","sources":["../../src/primitives/List.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,MAAM,SAAS,GAAG,KAAK,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG;IAC7D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,QAAA,MAAM,IAAI;YAJA,OAAO;qBACE,OAAO;0CAiBzB,CAAC;AAGF,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG;IACjE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,QAAA,MAAM,QAAQ;qBAJK,OAAO;qBACP,OAAO;uCAgBzB,CAAC;AAGF,MAAM,MAAM,mBAAmB,GAAG,KAAK,CAAC,wBAAwB,CAAC,QAAQ,CAAC,GAAG;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,QAAA,MAAM,cAAc;eAHP,OAAO;2CAmBnB,CAAC;AAGF,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,wBAAwB,CAAC,MAAM,CAAC,qBAWpF;kBAXQ,YAAY;;;AAcrB,MAAM,MAAM,iBAAiB,GAAG,KAAK,CAAC,wBAAwB,CAAC,KAAK,CAAC,GAAG;IACtE,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC7B,CAAC;AAEF,iBAAS,YAAY,CAAC,EACpB,SAAS,EACT,OAAO,EACP,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,iBAAiB,qBASnB;kBAfQ,YAAY;;;AAkBrB,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,wBAAwB,CAAC,IAAI,CAAC,qBAWnF;kBAXQ,aAAa;;;AActB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "../lib/cn";
4
+ const List = React.forwardRef(({ className, dense, disablePadding, ...props }, ref) => (_jsx("ul", { ref: ref, "data-slot": "list", "data-dense": dense ? "" : undefined, className: cn("m-0 list-none", disablePadding ? "p-0" : dense ? "py-1" : "py-2", className), ...props })));
5
+ List.displayName = "List";
6
+ const ListItem = React.forwardRef(({ className, disablePadding, disableGutters, ...props }, ref) => (_jsx("li", { ref: ref, "data-slot": "list-item", className: cn("flex items-center gap-3", disablePadding ? "p-0" : disableGutters ? "py-2" : "px-4 py-2.5", className), ...props })));
7
+ ListItem.displayName = "ListItem";
8
+ const ListItemButton = React.forwardRef(({ className, selected, ...props }, ref) => (_jsx("button", { ref: ref, type: "button", "data-slot": "list-item-button", "data-selected": selected ? "" : undefined, className: cn("flex w-full items-center gap-3 px-4 py-2.5 text-left text-sm font-medium outline-none transition-colors", "hover:bg-muted/40 focus-visible:ring-ring/50 focus-visible:ring-[3px]", selected && "bg-primary/10 text-primary", className), ...props })));
9
+ ListItemButton.displayName = "ListItemButton";
10
+ function ListItemIcon({ className, ...props }) {
11
+ return (_jsx("span", { "data-slot": "list-item-icon", className: cn("inline-flex size-8 shrink-0 items-center justify-center text-muted-foreground [&_svg]:size-4", className), ...props }));
12
+ }
13
+ ListItemIcon.displayName = "ListItemIcon";
14
+ function ListItemText({ className, primary, secondary, children, ...props }) {
15
+ return (_jsxs("div", { "data-slot": "list-item-text", className: cn("min-w-0 flex-1", className), ...props, children: [_jsx("div", { className: "truncate text-sm font-semibold", children: primary ?? children }), secondary ? (_jsx("div", { className: "truncate text-xs font-medium text-muted-foreground", children: secondary })) : null] }));
16
+ }
17
+ ListItemText.displayName = "ListItemText";
18
+ function ListSubheader({ className, ...props }) {
19
+ return (_jsx("li", { "data-slot": "list-subheader", className: cn("px-4 py-2 text-[10px] font-black uppercase tracking-widest text-muted-foreground", className), ...props }));
20
+ }
21
+ ListSubheader.displayName = "ListSubheader";
22
+ export { List, ListItem, ListItemButton, ListItemIcon, ListItemText, ListSubheader };
@@ -0,0 +1,14 @@
1
+ import * as React from "react";
2
+ export type MasonryProps = React.ComponentPropsWithoutRef<"div"> & {
3
+ columns?: number;
4
+ spacing?: number;
5
+ };
6
+ /**
7
+ * CSS multi-column masonry. Children should be block-level items.
8
+ */
9
+ declare function Masonry({ columns, spacing, className, style, children, ...props }: MasonryProps): React.JSX.Element;
10
+ declare namespace Masonry {
11
+ var displayName: string;
12
+ }
13
+ export { Masonry };
14
+ //# sourceMappingURL=Masonry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Masonry.d.ts","sourceRoot":"","sources":["../../src/primitives/Masonry.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,wBAAwB,CAAC,KAAK,CAAC,GAAG;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;GAEG;AACH,iBAAS,OAAO,CAAC,EAAE,OAAW,EAAE,OAAY,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,YAAY,qBAiBjG;kBAjBQ,OAAO;;;AAoBhB,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "../lib/cn";
4
+ /**
5
+ * CSS multi-column masonry. Children should be block-level items.
6
+ */
7
+ function Masonry({ columns = 3, spacing = 16, className, style, children, ...props }) {
8
+ return (_jsx("div", { "data-slot": "masonry", className: cn(className), style: {
9
+ columnCount: columns,
10
+ columnGap: spacing,
11
+ ...style,
12
+ }, ...props, children: React.Children.map(children, (child) => (_jsx("div", { className: "mb-4 break-inside-avoid", children: child }))) }));
13
+ }
14
+ Masonry.displayName = "Masonry";
15
+ export { Masonry };
@@ -0,0 +1,28 @@
1
+ import * as React from "react";
2
+ export type MenuProps = {
3
+ open?: boolean;
4
+ defaultOpen?: boolean;
5
+ onOpenChange?: (open: boolean) => void;
6
+ /** Anchor element — typically the button that opened the menu. */
7
+ anchorEl?: HTMLElement | null;
8
+ children?: React.ReactNode;
9
+ };
10
+ declare function Menu({ open: openProp, defaultOpen, onOpenChange, anchorEl, children, }: MenuProps): React.JSX.Element | null;
11
+ declare namespace Menu {
12
+ var displayName: string;
13
+ }
14
+ declare function MenuList({ className, ...props }: React.ComponentPropsWithoutRef<"div">): React.JSX.Element;
15
+ declare namespace MenuList {
16
+ var displayName: string;
17
+ }
18
+ export type MenuItemProps = React.ComponentPropsWithoutRef<"button"> & {
19
+ selected?: boolean;
20
+ dense?: boolean;
21
+ };
22
+ declare function MenuItem({ className, selected, dense, ...props }: MenuItemProps): React.JSX.Element;
23
+ declare namespace MenuItem {
24
+ var displayName: string;
25
+ }
26
+ declare const MenuAnchor: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
27
+ export { Menu, MenuList, MenuItem, MenuAnchor };
28
+ //# sourceMappingURL=Menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../src/primitives/Menu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,kEAAkE;IAClE,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAEF,iBAAS,IAAI,CAAC,EACZ,IAAI,EAAE,QAAQ,EACd,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,QAAQ,GACT,EAAE,SAAS,4BAiDX;kBAvDQ,IAAI;;;AA0Db,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,wBAAwB,CAAC,KAAK,CAAC,qBAE/E;kBAFQ,QAAQ;;;AAKjB,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,wBAAwB,CAAC,QAAQ,CAAC,GAAG;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,qBAiBxE;kBAjBQ,QAAQ;;;AAoBjB,QAAA,MAAM,UAAU,kLAEf,CAAC;AAGF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { Portal } from "../lib/portal";
4
+ import { useControllableState } from "../lib/use-controllable-state";
5
+ import { useDismissable } from "../lib/use-dismissable";
6
+ import { useFloatingPosition } from "../lib/use-floating-position";
7
+ import { cn } from "../lib/cn";
8
+ import { OVERLAY_Z_INDEX } from "../lib/overlay-stack";
9
+ function Menu({ open: openProp, defaultOpen, onOpenChange, anchorEl, children, }) {
10
+ const [open = false, setOpen] = useControllableState({
11
+ prop: openProp,
12
+ defaultProp: defaultOpen ?? false,
13
+ onChange: onOpenChange,
14
+ });
15
+ const triggerRef = React.useRef(null);
16
+ const contentRef = React.useRef(null);
17
+ React.useEffect(() => {
18
+ triggerRef.current = anchorEl ?? null;
19
+ }, [anchorEl]);
20
+ const position = useFloatingPosition({
21
+ open,
22
+ triggerRef,
23
+ contentRef,
24
+ side: "bottom",
25
+ align: "start",
26
+ sideOffset: 4,
27
+ });
28
+ useDismissable({
29
+ enabled: open,
30
+ onDismiss: () => setOpen(false),
31
+ refs: [triggerRef, contentRef],
32
+ });
33
+ if (!open)
34
+ return null;
35
+ return (_jsx(Portal, { children: _jsx("div", { ref: contentRef, role: "menu", "data-slot": "menu", className: "glass-menu z-[10000] min-w-40 overflow-hidden rounded-xl border border-border/50 p-1 shadow-xl outline-none", style: {
36
+ position: "fixed",
37
+ top: position?.top ?? 0,
38
+ left: position?.left ?? 0,
39
+ zIndex: OVERLAY_Z_INDEX.menu,
40
+ opacity: position ? 1 : 0,
41
+ }, children: children }) }));
42
+ }
43
+ Menu.displayName = "Menu";
44
+ function MenuList({ className, ...props }) {
45
+ return _jsx("div", { role: "menu", "data-slot": "menu-list", className: cn("flex flex-col p-1", className), ...props });
46
+ }
47
+ MenuList.displayName = "MenuList";
48
+ function MenuItem({ className, selected, dense, ...props }) {
49
+ return (_jsx("button", { type: "button", role: "menuitem", "data-slot": "menu-item", "data-selected": selected ? "" : undefined, className: cn("flex w-full items-center gap-2 rounded-lg px-3 text-left text-sm font-medium outline-none", dense ? "py-1.5" : "py-2", selected ? "bg-primary/10 text-primary" : "hover:bg-muted/50", "disabled:pointer-events-none disabled:opacity-40", className), ...props }));
50
+ }
51
+ MenuItem.displayName = "MenuItem";
52
+ const MenuAnchor = React.forwardRef((props, ref) => _jsx("button", { ref: ref, type: "button", "data-slot": "menu-anchor", ...props }));
53
+ MenuAnchor.displayName = "MenuAnchor";
54
+ export { Menu, MenuList, MenuItem, MenuAnchor };
@@ -0,0 +1,15 @@
1
+ import * as React from "react";
2
+ export type MobileStepperProps = React.ComponentPropsWithoutRef<"div"> & {
3
+ steps: number;
4
+ activeStep?: number;
5
+ position?: "static" | "bottom" | "top";
6
+ variant?: "dots" | "text" | "progress";
7
+ nextButton?: React.ReactNode;
8
+ backButton?: React.ReactNode;
9
+ };
10
+ declare function MobileStepper({ steps, activeStep, position, variant, nextButton, backButton, className, ...props }: MobileStepperProps): React.JSX.Element;
11
+ declare namespace MobileStepper {
12
+ var displayName: string;
13
+ }
14
+ export { MobileStepper };
15
+ //# sourceMappingURL=MobileStepper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MobileStepper.d.ts","sourceRoot":"","sources":["../../src/primitives/MobileStepper.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC,wBAAwB,CAAC,KAAK,CAAC,GAAG;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;IACvC,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC9B,CAAC;AAEF,iBAAS,aAAa,CAAC,EACrB,KAAK,EACL,UAAc,EACd,QAAmB,EACnB,OAAgB,EAChB,UAAU,EACV,UAAU,EACV,SAAS,EACT,GAAG,KAAK,EACT,EAAE,kBAAkB,qBAsCpB;kBA/CQ,aAAa;;;AAkDtB,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from "../lib/cn";
3
+ import { LinearProgress } from "./Progress";
4
+ function MobileStepper({ steps, activeStep = 0, position = "static", variant = "dots", nextButton, backButton, className, ...props }) {
5
+ return (_jsxs("div", { "data-slot": "mobile-stepper", "data-position": position, className: cn("flex w-full items-center gap-3 rounded-xl border border-border/40 bg-card/40 px-3 py-2", position === "bottom" && "sticky bottom-0", position === "top" && "sticky top-0", className), ...props, children: [backButton, _jsx("div", { className: "min-w-0 flex-1", children: variant === "text" ? (_jsxs("p", { className: "text-center text-xs font-bold text-muted-foreground", children: [activeStep + 1, " / ", steps] })) : variant === "progress" ? (_jsx(LinearProgress, { value: ((activeStep + 1) / steps) * 100 })) : (_jsx("div", { className: "flex items-center justify-center gap-1.5", children: Array.from({ length: steps }, (_, i) => (_jsx("span", { className: cn("size-1.5 rounded-full", i === activeStep ? "bg-primary" : "bg-border") }, i))) })) }), nextButton] }));
6
+ }
7
+ MobileStepper.displayName = "MobileStepper";
8
+ export { MobileStepper };
@@ -0,0 +1,18 @@
1
+ import * as React from "react";
2
+ export type ModalProps = Omit<React.ComponentPropsWithoutRef<"div">, "children"> & {
3
+ open?: boolean;
4
+ onClose?: () => void;
5
+ children?: React.ReactNode;
6
+ keepMounted?: boolean;
7
+ disableEscapeKeyDown?: boolean;
8
+ hideBackdrop?: boolean;
9
+ };
10
+ /**
11
+ * Low-level modal. Prefer Dialog for titled confirmations.
12
+ */
13
+ declare function Modal({ open, onClose, children, keepMounted, disableEscapeKeyDown, hideBackdrop, className, style, ...props }: ModalProps): React.JSX.Element | null;
14
+ declare namespace Modal {
15
+ var displayName: string;
16
+ }
17
+ export { Modal };
18
+ //# sourceMappingURL=Modal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../src/primitives/Modal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,GAAG;IACjF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,iBAAS,KAAK,CAAC,EACb,IAAY,EACZ,OAAO,EACP,QAAQ,EACR,WAAW,EACX,oBAAoB,EACpB,YAAY,EACZ,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EACT,EAAE,UAAU,4BAqCZ;kBA/CQ,KAAK;;;AAkDd,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { Portal } from "../lib/portal";
4
+ import { useFocusTrap } from "../lib/use-focus-trap";
5
+ import { cn } from "../lib/cn";
6
+ import { OVERLAY_Z_INDEX, fixedLayerStyle } from "../lib/overlay-stack";
7
+ import { Backdrop } from "./Backdrop";
8
+ /**
9
+ * Low-level modal. Prefer Dialog for titled confirmations.
10
+ */
11
+ function Modal({ open = false, onClose, children, keepMounted, disableEscapeKeyDown, hideBackdrop, className, style, ...props }) {
12
+ const contentRef = React.useRef(null);
13
+ useFocusTrap(contentRef, open);
14
+ React.useEffect(() => {
15
+ if (!open || disableEscapeKeyDown || !onClose)
16
+ return;
17
+ const onKey = (event) => {
18
+ if (event.key === "Escape")
19
+ onClose();
20
+ };
21
+ document.addEventListener("keydown", onKey);
22
+ return () => document.removeEventListener("keydown", onKey);
23
+ }, [open, disableEscapeKeyDown, onClose]);
24
+ if (!open && !keepMounted)
25
+ return null;
26
+ return (_jsx(Portal, { children: _jsxs("div", { "data-slot": "modal", hidden: !open, className: cn("fixed inset-0 flex items-center justify-center p-4", className), style: fixedLayerStyle(OVERLAY_Z_INDEX.modal, style), ...props, children: [hideBackdrop ? null : (_jsx(Backdrop, { open: open, contained: true, className: "absolute inset-0", onClick: onClose })), _jsx("div", { ref: contentRef, role: "presentation", className: "relative z-10 outline-none", children: children })] }) }));
27
+ }
28
+ Modal.displayName = "Modal";
29
+ export { Modal };
@@ -0,0 +1,15 @@
1
+ import * as React from "react";
2
+ export type NoSsrProps = {
3
+ children: React.ReactNode;
4
+ fallback?: React.ReactNode;
5
+ defer?: boolean;
6
+ };
7
+ /**
8
+ * Renders children only after mount — useful for browser-only APIs.
9
+ */
10
+ declare function NoSsr({ children, fallback, defer }: NoSsrProps): React.JSX.Element;
11
+ declare namespace NoSsr {
12
+ var displayName: string;
13
+ }
14
+ export { NoSsr };
15
+ //# sourceMappingURL=NoSsr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NoSsr.d.ts","sourceRoot":"","sources":["../../src/primitives/NoSsr.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;GAEG;AACH,iBAAS,KAAK,CAAC,EAAE,QAAQ,EAAE,QAAe,EAAE,KAAa,EAAE,EAAE,UAAU,qBAatE;kBAbQ,KAAK;;;AAgBd,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ /**
4
+ * Renders children only after mount — useful for browser-only APIs.
5
+ */
6
+ function NoSsr({ children, fallback = null, defer = false }) {
7
+ const [mounted, setMounted] = React.useState(false);
8
+ React.useEffect(() => {
9
+ if (!defer) {
10
+ setMounted(true);
11
+ return;
12
+ }
13
+ const id = window.requestAnimationFrame(() => setMounted(true));
14
+ return () => window.cancelAnimationFrame(id);
15
+ }, [defer]);
16
+ return _jsx(_Fragment, { children: mounted ? children : fallback });
17
+ }
18
+ NoSsr.displayName = "NoSsr";
19
+ export { NoSsr };