@snow-labs/brutal-ui 0.1.0 → 0.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 (282) hide show
  1. package/dist/components/brutal/cta-section.d.ts +7 -2
  2. package/dist/components/brutal/cta-section.js +253 -4
  3. package/dist/components/brutal/cta-section.js.map +1 -1
  4. package/dist/components/brutal/faq.d.ts +16 -0
  5. package/dist/components/brutal/faq.js +166 -0
  6. package/dist/components/brutal/faq.js.map +1 -0
  7. package/dist/components/brutal/feature-grid.d.ts +5 -1
  8. package/dist/components/brutal/feature-grid.js +238 -4
  9. package/dist/components/brutal/feature-grid.js.map +1 -1
  10. package/dist/components/brutal/footer.d.ts +14 -1
  11. package/dist/components/brutal/footer.js +215 -2
  12. package/dist/components/brutal/footer.js.map +1 -1
  13. package/dist/components/brutal/hero.d.ts +8 -1
  14. package/dist/components/brutal/hero.js +197 -4
  15. package/dist/components/brutal/hero.js.map +1 -1
  16. package/dist/components/brutal/index.d.ts +7 -2
  17. package/dist/components/brutal/index.js +1393 -12
  18. package/dist/components/brutal/index.js.map +1 -1
  19. package/dist/components/brutal/integration-grid.js +105 -3
  20. package/dist/components/brutal/integration-grid.js.map +1 -1
  21. package/dist/components/brutal/logo-cloud.d.ts +17 -0
  22. package/dist/components/brutal/logo-cloud.js +96 -0
  23. package/dist/components/brutal/logo-cloud.js.map +1 -0
  24. package/dist/components/brutal/nav.d.ts +3 -1
  25. package/dist/components/brutal/nav.js +258 -3
  26. package/dist/components/brutal/nav.js.map +1 -1
  27. package/dist/components/brutal/newsletter.d.ts +14 -0
  28. package/dist/components/brutal/newsletter.js +172 -0
  29. package/dist/components/brutal/newsletter.js.map +1 -0
  30. package/dist/components/brutal/pricing-table.d.ts +27 -0
  31. package/dist/components/brutal/pricing-table.js +254 -0
  32. package/dist/components/brutal/pricing-table.js.map +1 -0
  33. package/dist/components/brutal/section-divider.d.ts +14 -0
  34. package/dist/components/brutal/section-divider.js +70 -0
  35. package/dist/components/brutal/section-divider.js.map +1 -0
  36. package/dist/components/brutal/section.d.ts +6 -2
  37. package/dist/components/brutal/section.js +67 -2
  38. package/dist/components/brutal/section.js.map +1 -1
  39. package/dist/components/brutal/stats-bar.d.ts +16 -0
  40. package/dist/components/brutal/stats-bar.js +130 -0
  41. package/dist/components/brutal/stats-bar.js.map +1 -0
  42. package/dist/components/brutal/testimonials.d.ts +11 -3
  43. package/dist/components/brutal/testimonials.js +192 -3
  44. package/dist/components/brutal/testimonials.js.map +1 -1
  45. package/dist/components/brutal/wave-divider.d.ts +2 -12
  46. package/dist/components/brutal/wave-divider.js +68 -1
  47. package/dist/components/brutal/wave-divider.js.map +1 -1
  48. package/dist/components/dashboard/activity-feed.d.ts +18 -0
  49. package/dist/components/dashboard/activity-feed.js +105 -0
  50. package/dist/components/dashboard/activity-feed.js.map +1 -0
  51. package/dist/components/dashboard/app-shell.d.ts +19 -0
  52. package/dist/components/dashboard/app-shell.js +206 -0
  53. package/dist/components/dashboard/app-shell.js.map +1 -0
  54. package/dist/components/dashboard/empty-state.d.ts +14 -0
  55. package/dist/{chunk-CY2FOBOD.js → components/dashboard/empty-state.js} +36 -5
  56. package/dist/components/dashboard/empty-state.js.map +1 -0
  57. package/dist/components/dashboard/file-upload.d.ts +12 -0
  58. package/dist/components/dashboard/file-upload.js +86 -0
  59. package/dist/components/dashboard/file-upload.js.map +1 -0
  60. package/dist/components/dashboard/index.d.ts +10 -0
  61. package/dist/components/dashboard/index.js +755 -0
  62. package/dist/components/dashboard/index.js.map +1 -0
  63. package/dist/components/dashboard/search-bar.d.ts +12 -0
  64. package/dist/components/dashboard/search-bar.js +49 -0
  65. package/dist/components/dashboard/search-bar.js.map +1 -0
  66. package/dist/components/dashboard/sidebar.d.ts +23 -0
  67. package/dist/components/dashboard/sidebar.js +113 -0
  68. package/dist/components/dashboard/sidebar.js.map +1 -0
  69. package/dist/components/dashboard/stat-card.d.ts +13 -0
  70. package/dist/components/dashboard/stat-card.js +55 -0
  71. package/dist/components/dashboard/stat-card.js.map +1 -0
  72. package/dist/components/dashboard/user-menu.d.ts +16 -0
  73. package/dist/components/dashboard/user-menu.js +179 -0
  74. package/dist/components/dashboard/user-menu.js.map +1 -0
  75. package/dist/components/dashboard/view-switcher.d.ts +12 -0
  76. package/dist/{chunk-OCSYB6YE.js → components/dashboard/view-switcher.js} +57 -5
  77. package/dist/components/dashboard/view-switcher.js.map +1 -0
  78. package/dist/components/ui/accordion.js +78 -2
  79. package/dist/components/ui/accordion.js.map +1 -1
  80. package/dist/components/ui/alert.js +80 -2
  81. package/dist/components/ui/alert.js.map +1 -1
  82. package/dist/components/ui/avatar.js +103 -2
  83. package/dist/components/ui/avatar.js.map +1 -1
  84. package/dist/components/ui/badge.d.ts +1 -1
  85. package/dist/components/ui/badge.js +55 -2
  86. package/dist/components/ui/badge.js.map +1 -1
  87. package/dist/components/ui/breadcrumb.js +122 -2
  88. package/dist/components/ui/breadcrumb.js.map +1 -1
  89. package/dist/components/ui/button.d.ts +1 -1
  90. package/dist/components/ui/button.js +68 -2
  91. package/dist/components/ui/button.js.map +1 -1
  92. package/dist/components/ui/card.js +90 -2
  93. package/dist/components/ui/card.js.map +1 -1
  94. package/dist/components/ui/checkbox.js +36 -2
  95. package/dist/components/ui/checkbox.js.map +1 -1
  96. package/dist/components/ui/collapsible.js +15 -1
  97. package/dist/components/ui/collapsible.js.map +1 -1
  98. package/dist/components/ui/command.js +399 -7
  99. package/dist/components/ui/command.js.map +1 -1
  100. package/dist/components/ui/context-menu.js +232 -2
  101. package/dist/components/ui/context-menu.js.map +1 -1
  102. package/dist/components/ui/dialog.js +201 -3
  103. package/dist/components/ui/dialog.js.map +1 -1
  104. package/dist/components/ui/drawer.js +118 -2
  105. package/dist/components/ui/drawer.js.map +1 -1
  106. package/dist/components/ui/dropdown-menu.js +242 -2
  107. package/dist/components/ui/dropdown-menu.js.map +1 -1
  108. package/dist/components/ui/hover-card.js +47 -2
  109. package/dist/components/ui/hover-card.js.map +1 -1
  110. package/dist/components/ui/input-group.js +226 -5
  111. package/dist/components/ui/input-group.js.map +1 -1
  112. package/dist/components/ui/input.js +26 -2
  113. package/dist/components/ui/input.js.map +1 -1
  114. package/dist/components/ui/label.js +23 -2
  115. package/dist/components/ui/label.js.map +1 -1
  116. package/dist/components/ui/menubar.js +398 -3
  117. package/dist/components/ui/menubar.js.map +1 -1
  118. package/dist/components/ui/navigation-menu.js +160 -2
  119. package/dist/components/ui/navigation-menu.js.map +1 -1
  120. package/dist/components/ui/pagination.js +185 -3
  121. package/dist/components/ui/pagination.js.map +1 -1
  122. package/dist/components/ui/popover.js +80 -2
  123. package/dist/components/ui/popover.js.map +1 -1
  124. package/dist/components/ui/progress.js +80 -2
  125. package/dist/components/ui/progress.js.map +1 -1
  126. package/dist/components/ui/radio-group.js +43 -2
  127. package/dist/components/ui/radio-group.js.map +1 -1
  128. package/dist/components/ui/scroll-area.js +63 -2
  129. package/dist/components/ui/scroll-area.js.map +1 -1
  130. package/dist/components/ui/select.js +190 -2
  131. package/dist/components/ui/select.js.map +1 -1
  132. package/dist/components/ui/separator.js +29 -2
  133. package/dist/components/ui/separator.js.map +1 -1
  134. package/dist/components/ui/sheet.js +185 -3
  135. package/dist/components/ui/sheet.js.map +1 -1
  136. package/dist/components/ui/skeleton.js +21 -2
  137. package/dist/components/ui/skeleton.js.map +1 -1
  138. package/dist/components/ui/slider.js +62 -2
  139. package/dist/components/ui/slider.js.map +1 -1
  140. package/dist/components/ui/switch.js +36 -2
  141. package/dist/components/ui/switch.js.map +1 -1
  142. package/dist/components/ui/tabs.d.ts +1 -1
  143. package/dist/components/ui/tabs.js +85 -2
  144. package/dist/components/ui/tabs.js.map +1 -1
  145. package/dist/components/ui/textarea.js +24 -2
  146. package/dist/components/ui/textarea.js.map +1 -1
  147. package/dist/components/ui/toggle-group.js +101 -3
  148. package/dist/components/ui/toggle-group.js.map +1 -1
  149. package/dist/components/ui/toggle.js +47 -2
  150. package/dist/components/ui/toggle.js.map +1 -1
  151. package/dist/components/ui/tooltip.js +65 -2
  152. package/dist/components/ui/tooltip.js.map +1 -1
  153. package/dist/components/views/calendar-view.d.ts +17 -0
  154. package/dist/components/views/calendar-view.js +182 -0
  155. package/dist/components/views/calendar-view.js.map +1 -0
  156. package/dist/components/views/data-table.d.ts +15 -0
  157. package/dist/components/views/data-table.js +204 -0
  158. package/dist/components/views/data-table.js.map +1 -0
  159. package/dist/components/views/grid-view.d.ts +11 -0
  160. package/dist/components/views/grid-view.js +31 -0
  161. package/dist/components/views/grid-view.js.map +1 -0
  162. package/dist/components/views/index.d.ts +7 -0
  163. package/dist/components/views/index.js +542 -0
  164. package/dist/components/views/index.js.map +1 -0
  165. package/dist/components/views/kanban-board.d.ts +21 -0
  166. package/dist/components/views/kanban-board.js +153 -0
  167. package/dist/components/views/kanban-board.js.map +1 -0
  168. package/dist/components/views/list-view.d.ts +19 -0
  169. package/dist/components/views/list-view.js +96 -0
  170. package/dist/components/views/list-view.js.map +1 -0
  171. package/dist/index.d.ts +27 -3
  172. package/dist/index.js +4957 -46
  173. package/dist/index.js.map +1 -1
  174. package/dist/lib/animations.d.ts +68 -0
  175. package/dist/lib/animations.js +44 -0
  176. package/dist/lib/animations.js.map +1 -0
  177. package/dist/lib/utils.js +10 -1
  178. package/dist/lib/utils.js.map +1 -1
  179. package/dist/templates/dashboard.d.ts +40 -0
  180. package/dist/templates/dashboard.js +658 -0
  181. package/dist/templates/dashboard.js.map +1 -0
  182. package/dist/templates/index.d.ts +4 -0
  183. package/dist/templates/index.js +2031 -0
  184. package/dist/templates/index.js.map +1 -0
  185. package/dist/templates/saas-launch.d.ts +113 -0
  186. package/dist/templates/saas-launch.js +1424 -0
  187. package/dist/templates/saas-launch.js.map +1 -0
  188. package/dist/templates/studio.d.ts +72 -0
  189. package/dist/templates/studio.js +1129 -0
  190. package/dist/templates/studio.js.map +1 -0
  191. package/dist/theme.css +53 -0
  192. package/package.json +48 -2
  193. package/dist/chunk-3HN3QP23.js +0 -44
  194. package/dist/chunk-3HN3QP23.js.map +0 -1
  195. package/dist/chunk-4A3EQV6F.js +0 -76
  196. package/dist/chunk-4A3EQV6F.js.map +0 -1
  197. package/dist/chunk-53KZXLG4.js +0 -100
  198. package/dist/chunk-53KZXLG4.js.map +0 -1
  199. package/dist/chunk-5JCN6EQG.js +0 -60
  200. package/dist/chunk-5JCN6EQG.js.map +0 -1
  201. package/dist/chunk-5JEBZUEI.js +0 -20
  202. package/dist/chunk-5JEBZUEI.js.map +0 -1
  203. package/dist/chunk-6APJMAO7.js +0 -44
  204. package/dist/chunk-6APJMAO7.js.map +0 -1
  205. package/dist/chunk-6UKMYVHC.js +0 -187
  206. package/dist/chunk-6UKMYVHC.js.map +0 -1
  207. package/dist/chunk-7FVJ36BQ.js +0 -239
  208. package/dist/chunk-7FVJ36BQ.js.map +0 -1
  209. package/dist/chunk-7I7XYB7H.js +0 -44
  210. package/dist/chunk-7I7XYB7H.js.map +0 -1
  211. package/dist/chunk-A5KONGTJ.js +0 -49
  212. package/dist/chunk-A5KONGTJ.js.map +0 -1
  213. package/dist/chunk-AHUC5AID.js +0 -40
  214. package/dist/chunk-AHUC5AID.js.map +0 -1
  215. package/dist/chunk-B6UM5GHF.js +0 -20
  216. package/dist/chunk-B6UM5GHF.js.map +0 -1
  217. package/dist/chunk-BAUUM52T.js +0 -234
  218. package/dist/chunk-BAUUM52T.js.map +0 -1
  219. package/dist/chunk-BDWCMMEI.js +0 -82
  220. package/dist/chunk-BDWCMMEI.js.map +0 -1
  221. package/dist/chunk-BSVJVM2L.js +0 -52
  222. package/dist/chunk-BSVJVM2L.js.map +0 -1
  223. package/dist/chunk-CPVH3LD5.js +0 -86
  224. package/dist/chunk-CPVH3LD5.js.map +0 -1
  225. package/dist/chunk-CY2FOBOD.js.map +0 -1
  226. package/dist/chunk-DJTTNICL.js +0 -40
  227. package/dist/chunk-DJTTNICL.js.map +0 -1
  228. package/dist/chunk-F2E32OOJ.js +0 -38
  229. package/dist/chunk-F2E32OOJ.js.map +0 -1
  230. package/dist/chunk-F7YWBVP6.js +0 -141
  231. package/dist/chunk-F7YWBVP6.js.map +0 -1
  232. package/dist/chunk-G7JMADLU.js +0 -167
  233. package/dist/chunk-G7JMADLU.js.map +0 -1
  234. package/dist/chunk-GKCLNHVQ.js +0 -124
  235. package/dist/chunk-GKCLNHVQ.js.map +0 -1
  236. package/dist/chunk-GQBWKH72.js +0 -33
  237. package/dist/chunk-GQBWKH72.js.map +0 -1
  238. package/dist/chunk-H6SOU4UG.js +0 -10
  239. package/dist/chunk-H6SOU4UG.js.map +0 -1
  240. package/dist/chunk-HKJJHYFX.js +0 -115
  241. package/dist/chunk-HKJJHYFX.js.map +0 -1
  242. package/dist/chunk-IQ5WXHRB.js +0 -16
  243. package/dist/chunk-IQ5WXHRB.js.map +0 -1
  244. package/dist/chunk-ISZQ5TSG.js +0 -26
  245. package/dist/chunk-ISZQ5TSG.js.map +0 -1
  246. package/dist/chunk-JSYGVDO6.js +0 -41
  247. package/dist/chunk-JSYGVDO6.js.map +0 -1
  248. package/dist/chunk-KY6GKED2.js +0 -229
  249. package/dist/chunk-KY6GKED2.js.map +0 -1
  250. package/dist/chunk-L5OPCX6F.js +0 -33
  251. package/dist/chunk-L5OPCX6F.js.map +0 -1
  252. package/dist/chunk-LLMBKOKT.js +0 -44
  253. package/dist/chunk-LLMBKOKT.js.map +0 -1
  254. package/dist/chunk-MKBO4S2O.js +0 -48
  255. package/dist/chunk-MKBO4S2O.js.map +0 -1
  256. package/dist/chunk-NMQRI5G5.js +0 -48
  257. package/dist/chunk-NMQRI5G5.js.map +0 -1
  258. package/dist/chunk-OCSYB6YE.js.map +0 -1
  259. package/dist/chunk-OILW3ESA.js +0 -62
  260. package/dist/chunk-OILW3ESA.js.map +0 -1
  261. package/dist/chunk-PCVJLIUU.js +0 -125
  262. package/dist/chunk-PCVJLIUU.js.map +0 -1
  263. package/dist/chunk-RXSDAOF7.js +0 -45
  264. package/dist/chunk-RXSDAOF7.js.map +0 -1
  265. package/dist/chunk-RZD2P2BD.js +0 -77
  266. package/dist/chunk-RZD2P2BD.js.map +0 -1
  267. package/dist/chunk-UL52C2UU.js +0 -22
  268. package/dist/chunk-UL52C2UU.js.map +0 -1
  269. package/dist/chunk-USFQYYSE.js +0 -118
  270. package/dist/chunk-USFQYYSE.js.map +0 -1
  271. package/dist/chunk-UW3CSNPH.js +0 -77
  272. package/dist/chunk-UW3CSNPH.js.map +0 -1
  273. package/dist/chunk-V2ORCFEN.js +0 -156
  274. package/dist/chunk-V2ORCFEN.js.map +0 -1
  275. package/dist/chunk-WQO7NSII.js +0 -141
  276. package/dist/chunk-WQO7NSII.js.map +0 -1
  277. package/dist/chunk-WXHK2EIV.js +0 -75
  278. package/dist/chunk-WXHK2EIV.js.map +0 -1
  279. package/dist/chunk-Y6W3YC3K.js +0 -17
  280. package/dist/chunk-Y6W3YC3K.js.map +0 -1
  281. package/dist/chunk-ZRVEDPQA.js +0 -59
  282. package/dist/chunk-ZRVEDPQA.js.map +0 -1
@@ -0,0 +1,658 @@
1
+ "use client";
2
+ import { clsx } from 'clsx';
3
+ import { twMerge } from 'tailwind-merge';
4
+ import * as React from 'react';
5
+ import { createContext, useState, useContext } from 'react';
6
+ import { Dialog } from '@base-ui/react/dialog';
7
+ import { Button as Button$1 } from '@base-ui/react/button';
8
+ import { cva } from 'class-variance-authority';
9
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
10
+ import { XIcon } from 'lucide-react';
11
+ import { Input as Input$1 } from '@base-ui/react/input';
12
+ import { Menu } from '@base-ui/react/menu';
13
+ import { Avatar as Avatar$1 } from '@base-ui/react/avatar';
14
+ import { Toggle } from '@base-ui/react/toggle';
15
+ import { ToggleGroup as ToggleGroup$1 } from '@base-ui/react/toggle-group';
16
+
17
+ function cn(...inputs) {
18
+ return twMerge(clsx(inputs));
19
+ }
20
+ var buttonVariants = cva(
21
+ "group/button inline-flex shrink-0 items-center justify-center rounded-lg whitespace-nowrap font-bold transition-all duration-150 select-none outline-none disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
22
+ {
23
+ variants: {
24
+ variant: {
25
+ // Primary: Black bg, white text, offset shadow
26
+ default: "border-brutal border-foreground bg-primary text-primary-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm",
27
+ // CTA: Mint green bg — the Bannerbear signature
28
+ cta: "border-brutal border-foreground bg-cta text-cta-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm",
29
+ // Brand: Dynamic brand color bg
30
+ brand: "border-brutal border-foreground bg-brand text-brand-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm",
31
+ // Outline: White bg, black border, offset shadow
32
+ outline: "border-brutal border-foreground bg-background text-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm",
33
+ // Secondary: Light bg, border, smaller shadow
34
+ secondary: "border-brutal border-foreground bg-secondary text-secondary-foreground shadow-brutal-sm hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal active:translate-x-px active:translate-y-px active:shadow-none",
35
+ // Ghost: No border/shadow, subtle hover
36
+ ghost: "hover:bg-secondary hover:text-foreground",
37
+ // Link: Text only
38
+ link: "text-foreground underline-offset-4 hover:underline",
39
+ // Destructive
40
+ destructive: "border-brutal border-destructive bg-destructive text-destructive-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm",
41
+ // Nav: Thin border, no shadow (for nav Sign In buttons)
42
+ nav: "border border-foreground bg-background text-foreground hover:bg-foreground hover:text-background"
43
+ },
44
+ size: {
45
+ xs: "h-7 gap-1 px-2.5 text-xs",
46
+ sm: "h-8 gap-1.5 px-3 text-sm",
47
+ default: "h-10 gap-2 px-5 text-sm",
48
+ lg: "h-12 gap-2 px-7 text-base",
49
+ xl: "h-14 gap-2.5 px-9 text-lg",
50
+ icon: "size-10",
51
+ "icon-sm": "size-8",
52
+ "icon-lg": "size-12"
53
+ }
54
+ },
55
+ defaultVariants: {
56
+ variant: "default",
57
+ size: "default"
58
+ }
59
+ }
60
+ );
61
+ function Button({
62
+ className,
63
+ variant = "default",
64
+ size = "default",
65
+ ...props
66
+ }) {
67
+ return /* @__PURE__ */ jsx(
68
+ Button$1,
69
+ {
70
+ "data-slot": "button",
71
+ className: cn(buttonVariants({ variant, size, className })),
72
+ ...props
73
+ }
74
+ );
75
+ }
76
+ function Sheet({ ...props }) {
77
+ return /* @__PURE__ */ jsx(Dialog.Root, { "data-slot": "sheet", ...props });
78
+ }
79
+ function SheetPortal({ ...props }) {
80
+ return /* @__PURE__ */ jsx(Dialog.Portal, { "data-slot": "sheet-portal", ...props });
81
+ }
82
+ function SheetOverlay({ className, ...props }) {
83
+ return /* @__PURE__ */ jsx(
84
+ Dialog.Backdrop,
85
+ {
86
+ "data-slot": "sheet-overlay",
87
+ className: cn(
88
+ "fixed inset-0 z-50 bg-black/60 transition-opacity duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0",
89
+ className
90
+ ),
91
+ ...props
92
+ }
93
+ );
94
+ }
95
+ function SheetContent({
96
+ className,
97
+ children,
98
+ side = "right",
99
+ showCloseButton = true,
100
+ ...props
101
+ }) {
102
+ return /* @__PURE__ */ jsxs(SheetPortal, { children: [
103
+ /* @__PURE__ */ jsx(SheetOverlay, {}),
104
+ /* @__PURE__ */ jsxs(
105
+ Dialog.Popup,
106
+ {
107
+ "data-slot": "sheet-content",
108
+ "data-side": side,
109
+ className: cn(
110
+ "fixed z-50 flex flex-col gap-4 border-brutal border-foreground bg-background bg-clip-padding text-sm shadow-brutal-lg transition duration-200 ease-in-out data-ending-style:opacity-0 data-starting-style:opacity-0 data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:data-ending-style:translate-y-[2.5rem] data-[side=bottom]:data-starting-style:translate-y-[2.5rem] data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:data-ending-style:translate-x-[-2.5rem] data-[side=left]:data-starting-style:translate-x-[-2.5rem] data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:data-ending-style:translate-x-[2.5rem] data-[side=right]:data-starting-style:translate-x-[2.5rem] data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:data-ending-style:translate-y-[-2.5rem] data-[side=top]:data-starting-style:translate-y-[-2.5rem] data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm",
111
+ className
112
+ ),
113
+ ...props,
114
+ children: [
115
+ children,
116
+ showCloseButton && /* @__PURE__ */ jsxs(
117
+ Dialog.Close,
118
+ {
119
+ "data-slot": "sheet-close",
120
+ render: /* @__PURE__ */ jsx(
121
+ Button,
122
+ {
123
+ variant: "ghost",
124
+ className: "absolute top-3 right-3",
125
+ size: "icon-sm"
126
+ }
127
+ ),
128
+ children: [
129
+ /* @__PURE__ */ jsx(
130
+ XIcon,
131
+ {}
132
+ ),
133
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
134
+ ]
135
+ }
136
+ )
137
+ ]
138
+ }
139
+ )
140
+ ] });
141
+ }
142
+ function SheetTitle({ className, ...props }) {
143
+ return /* @__PURE__ */ jsx(
144
+ Dialog.Title,
145
+ {
146
+ "data-slot": "sheet-title",
147
+ className: cn("text-base font-bold text-foreground", className),
148
+ ...props
149
+ }
150
+ );
151
+ }
152
+ var AppShellContext = createContext({
153
+ collapsed: false,
154
+ setCollapsed: () => {
155
+ },
156
+ mobileOpen: false,
157
+ setMobileOpen: () => {
158
+ }
159
+ });
160
+ var useAppShell = () => useContext(AppShellContext);
161
+ function AppShell({
162
+ sidebar,
163
+ header,
164
+ children,
165
+ defaultCollapsed = false,
166
+ className
167
+ }) {
168
+ const [collapsed, setCollapsed] = useState(defaultCollapsed);
169
+ const [mobileOpen, setMobileOpen] = useState(false);
170
+ return /* @__PURE__ */ jsx(
171
+ AppShellContext.Provider,
172
+ {
173
+ value: { collapsed, setCollapsed, mobileOpen, setMobileOpen },
174
+ children: /* @__PURE__ */ jsxs("div", { className: cn("flex h-screen bg-background", className), children: [
175
+ /* @__PURE__ */ jsx(
176
+ "aside",
177
+ {
178
+ className: cn(
179
+ "hidden border-r-brutal border-foreground bg-background transition-all duration-200 md:block",
180
+ collapsed ? "w-16" : "w-64"
181
+ ),
182
+ children: sidebar
183
+ }
184
+ ),
185
+ /* @__PURE__ */ jsx(Sheet, { open: mobileOpen, onOpenChange: setMobileOpen, children: /* @__PURE__ */ jsxs(SheetContent, { side: "left", className: "w-64 p-0 md:hidden", children: [
186
+ /* @__PURE__ */ jsx(SheetTitle, { className: "sr-only", children: "Navigation" }),
187
+ sidebar
188
+ ] }) }),
189
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-col overflow-hidden", children: [
190
+ header && /* @__PURE__ */ jsxs("header", { className: "flex h-14 items-center gap-4 border-b-brutal border-foreground px-6", children: [
191
+ /* @__PURE__ */ jsx(
192
+ Button,
193
+ {
194
+ variant: "ghost",
195
+ size: "sm",
196
+ className: "md:hidden",
197
+ onClick: () => setMobileOpen(true),
198
+ children: "\u2630"
199
+ }
200
+ ),
201
+ header
202
+ ] }),
203
+ /* @__PURE__ */ jsx("main", { className: "flex-1 overflow-auto p-6", children })
204
+ ] })
205
+ ] })
206
+ }
207
+ );
208
+ }
209
+ function Sidebar({
210
+ logo,
211
+ logoCollapsed,
212
+ groups,
213
+ footer,
214
+ className
215
+ }) {
216
+ const { collapsed, setCollapsed } = useAppShell();
217
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex h-full flex-col", className), children: [
218
+ /* @__PURE__ */ jsxs("div", { className: "flex h-14 items-center justify-between border-b-brutal border-foreground px-4", children: [
219
+ /* @__PURE__ */ jsx("div", { className: "font-black", children: collapsed ? logoCollapsed || logo : logo }),
220
+ /* @__PURE__ */ jsx(
221
+ "button",
222
+ {
223
+ onClick: () => setCollapsed(!collapsed),
224
+ className: "hidden text-xs text-muted-foreground hover:text-foreground md:block",
225
+ children: collapsed ? "\u2192" : "\u2190"
226
+ }
227
+ )
228
+ ] }),
229
+ /* @__PURE__ */ jsx("nav", { className: "flex-1 overflow-auto p-2", children: groups.map((group, gi) => /* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
230
+ group.title && !collapsed && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-2 px-2 text-muted-foreground", children: group.title }),
231
+ /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-0.5", children: group.links.map((link) => /* @__PURE__ */ jsxs(
232
+ "a",
233
+ {
234
+ href: link.href,
235
+ className: cn(
236
+ "flex items-center gap-3 rounded-sm px-3 py-2 text-sm font-medium transition-colors",
237
+ link.active ? "bg-brand text-brand-foreground" : "hover:bg-secondary",
238
+ collapsed && "justify-center"
239
+ ),
240
+ title: collapsed ? link.label : void 0,
241
+ children: [
242
+ /* @__PURE__ */ jsx("span", { className: "size-5 shrink-0", children: link.icon }),
243
+ !collapsed && /* @__PURE__ */ jsxs(Fragment, { children: [
244
+ /* @__PURE__ */ jsx("span", { className: "flex-1", children: link.label }),
245
+ link.badge !== void 0 && /* @__PURE__ */ jsx("span", { className: "border border-foreground bg-brand-muted px-1.5 font-mono text-[10px] font-bold", children: link.badge })
246
+ ] })
247
+ ]
248
+ },
249
+ link.href
250
+ )) })
251
+ ] }, gi)) }),
252
+ footer && /* @__PURE__ */ jsx("div", { className: "border-t-brutal border-foreground p-3", children: footer })
253
+ ] });
254
+ }
255
+ function Input({ className, type, ...props }) {
256
+ return /* @__PURE__ */ jsx(
257
+ Input$1,
258
+ {
259
+ type,
260
+ "data-slot": "input",
261
+ className: cn(
262
+ "h-10 w-full min-w-0 rounded-lg border-brutal border-foreground bg-background px-3 py-2 text-base font-medium shadow-brutal-sm transition-all outline-none placeholder:text-muted-foreground focus:shadow-brutal focus:-translate-x-0.5 focus:-translate-y-0.5 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive md:text-sm",
263
+ className
264
+ ),
265
+ ...props
266
+ }
267
+ );
268
+ }
269
+ function SearchBar({
270
+ placeholder = "Search...",
271
+ shortcut = "\u2318K",
272
+ value,
273
+ onChange,
274
+ className
275
+ }) {
276
+ return /* @__PURE__ */ jsxs("div", { className: cn("relative", className), children: [
277
+ /* @__PURE__ */ jsx(
278
+ Input,
279
+ {
280
+ type: "search",
281
+ placeholder,
282
+ value,
283
+ onChange: (e) => onChange?.(e.target.value),
284
+ className: "pr-12"
285
+ }
286
+ ),
287
+ shortcut && /* @__PURE__ */ jsx("span", { className: "absolute right-2 top-1/2 -translate-y-1/2 border border-foreground bg-secondary px-1.5 font-mono text-[10px] text-muted-foreground", children: shortcut })
288
+ ] });
289
+ }
290
+ function DropdownMenu({ ...props }) {
291
+ return /* @__PURE__ */ jsx(Menu.Root, { "data-slot": "dropdown-menu", ...props });
292
+ }
293
+ function DropdownMenuTrigger({ ...props }) {
294
+ return /* @__PURE__ */ jsx(Menu.Trigger, { "data-slot": "dropdown-menu-trigger", ...props });
295
+ }
296
+ function DropdownMenuContent({
297
+ align = "start",
298
+ alignOffset = 0,
299
+ side = "bottom",
300
+ sideOffset = 4,
301
+ className,
302
+ ...props
303
+ }) {
304
+ return /* @__PURE__ */ jsx(Menu.Portal, { children: /* @__PURE__ */ jsx(
305
+ Menu.Positioner,
306
+ {
307
+ className: "isolate z-50 outline-none",
308
+ align,
309
+ alignOffset,
310
+ side,
311
+ sideOffset,
312
+ children: /* @__PURE__ */ jsx(
313
+ Menu.Popup,
314
+ {
315
+ "data-slot": "dropdown-menu-content",
316
+ className: cn("z-50 max-h-(--available-height) w-(--anchor-width) min-w-32 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg border-brutal border-foreground bg-popover p-1 text-popover-foreground shadow-brutal duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:overflow-hidden data-closed:fade-out-0 data-closed:zoom-out-95", className),
317
+ ...props
318
+ }
319
+ )
320
+ }
321
+ ) });
322
+ }
323
+ function DropdownMenuGroup({ ...props }) {
324
+ return /* @__PURE__ */ jsx(Menu.Group, { "data-slot": "dropdown-menu-group", ...props });
325
+ }
326
+ function DropdownMenuLabel({
327
+ className,
328
+ inset,
329
+ ...props
330
+ }) {
331
+ return /* @__PURE__ */ jsx(
332
+ Menu.GroupLabel,
333
+ {
334
+ "data-slot": "dropdown-menu-label",
335
+ "data-inset": inset,
336
+ className: cn(
337
+ "px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:pl-7",
338
+ className
339
+ ),
340
+ ...props
341
+ }
342
+ );
343
+ }
344
+ function DropdownMenuItem({
345
+ className,
346
+ inset,
347
+ variant = "default",
348
+ ...props
349
+ }) {
350
+ return /* @__PURE__ */ jsx(
351
+ Menu.Item,
352
+ {
353
+ "data-slot": "dropdown-menu-item",
354
+ "data-inset": inset,
355
+ "data-variant": variant,
356
+ className: cn(
357
+ "group/dropdown-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive",
358
+ className
359
+ ),
360
+ ...props
361
+ }
362
+ );
363
+ }
364
+ function DropdownMenuSeparator({
365
+ className,
366
+ ...props
367
+ }) {
368
+ return /* @__PURE__ */ jsx(
369
+ Menu.Separator,
370
+ {
371
+ "data-slot": "dropdown-menu-separator",
372
+ className: cn("-mx-1 my-1 h-px bg-border", className),
373
+ ...props
374
+ }
375
+ );
376
+ }
377
+ function Avatar({
378
+ className,
379
+ size = "default",
380
+ ...props
381
+ }) {
382
+ return /* @__PURE__ */ jsx(
383
+ Avatar$1.Root,
384
+ {
385
+ "data-slot": "avatar",
386
+ "data-size": size,
387
+ className: cn(
388
+ "group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten",
389
+ className
390
+ ),
391
+ ...props
392
+ }
393
+ );
394
+ }
395
+ function AvatarImage({ className, ...props }) {
396
+ return /* @__PURE__ */ jsx(
397
+ Avatar$1.Image,
398
+ {
399
+ "data-slot": "avatar-image",
400
+ className: cn(
401
+ "aspect-square size-full rounded-full object-cover",
402
+ className
403
+ ),
404
+ ...props
405
+ }
406
+ );
407
+ }
408
+ function AvatarFallback({
409
+ className,
410
+ ...props
411
+ }) {
412
+ return /* @__PURE__ */ jsx(
413
+ Avatar$1.Fallback,
414
+ {
415
+ "data-slot": "avatar-fallback",
416
+ className: cn(
417
+ "flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs",
418
+ className
419
+ ),
420
+ ...props
421
+ }
422
+ );
423
+ }
424
+ function UserMenu({ name, email, avatar, items, onSignOut }) {
425
+ return /* @__PURE__ */ jsxs(DropdownMenu, { children: [
426
+ /* @__PURE__ */ jsxs(
427
+ DropdownMenuTrigger,
428
+ {
429
+ className: "inline-flex shrink-0 cursor-pointer items-center gap-2 rounded-lg px-3 py-1.5 text-sm font-medium outline-none hover:bg-secondary",
430
+ children: [
431
+ /* @__PURE__ */ jsxs(Avatar, { className: "size-7", children: [
432
+ avatar && /* @__PURE__ */ jsx(AvatarImage, { src: avatar, alt: name }),
433
+ /* @__PURE__ */ jsx(AvatarFallback, { children: name[0] })
434
+ ] }),
435
+ /* @__PURE__ */ jsx("span", { className: "hidden text-sm font-medium sm:inline", children: name })
436
+ ]
437
+ }
438
+ ),
439
+ /* @__PURE__ */ jsxs(DropdownMenuContent, { align: "end", className: "w-48", children: [
440
+ /* @__PURE__ */ jsxs(DropdownMenuLabel, { children: [
441
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-bold", children: name }),
442
+ email && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: email })
443
+ ] }),
444
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
445
+ items && /* @__PURE__ */ jsx(DropdownMenuGroup, { children: items.map((item) => /* @__PURE__ */ jsx(DropdownMenuItem, { onClick: item.onClick, children: item.href ? /* @__PURE__ */ jsx("a", { href: item.href, children: item.label }) : item.label }, item.label)) }),
446
+ onSignOut && /* @__PURE__ */ jsxs(Fragment, { children: [
447
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
448
+ /* @__PURE__ */ jsx(DropdownMenuItem, { onClick: onSignOut, children: "Sign out" })
449
+ ] })
450
+ ] })
451
+ ] });
452
+ }
453
+ function StatCard({
454
+ label,
455
+ value,
456
+ change,
457
+ changeLabel,
458
+ icon,
459
+ className
460
+ }) {
461
+ return /* @__PURE__ */ jsxs(
462
+ "div",
463
+ {
464
+ className: cn(
465
+ "border-brutal border-foreground bg-background p-5 shadow-brutal",
466
+ className
467
+ ),
468
+ children: [
469
+ /* @__PURE__ */ jsxs("div", { className: "mb-3 flex items-center justify-between", children: [
470
+ /* @__PURE__ */ jsx("p", { className: "brutal-label text-muted-foreground", children: label }),
471
+ icon && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: icon })
472
+ ] }),
473
+ /* @__PURE__ */ jsx("p", { className: "brutal-h1 mb-1", children: value }),
474
+ change !== void 0 && /* @__PURE__ */ jsxs(
475
+ "p",
476
+ {
477
+ className: cn(
478
+ "flex items-center gap-1 font-mono text-xs font-bold",
479
+ change >= 0 ? "text-cta" : "text-destructive"
480
+ ),
481
+ children: [
482
+ /* @__PURE__ */ jsx("span", { children: change >= 0 ? "\u2191" : "\u2193" }),
483
+ /* @__PURE__ */ jsxs("span", { children: [
484
+ Math.abs(change),
485
+ "%"
486
+ ] }),
487
+ changeLabel && /* @__PURE__ */ jsx("span", { className: "font-normal text-muted-foreground", children: changeLabel })
488
+ ]
489
+ }
490
+ )
491
+ ]
492
+ }
493
+ );
494
+ }
495
+ var toggleVariants = cva(
496
+ "group/toggle inline-flex items-center justify-center gap-1 rounded-lg text-sm font-medium whitespace-nowrap transition-all outline-none hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 aria-pressed:border-brutal aria-pressed:border-foreground aria-pressed:bg-muted aria-pressed:shadow-brutal-sm data-[state=on]:border-brutal data-[state=on]:border-foreground data-[state=on]:bg-muted data-[state=on]:shadow-brutal-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
497
+ {
498
+ variants: {
499
+ variant: {
500
+ default: "bg-transparent",
501
+ outline: "border-brutal border-foreground bg-transparent shadow-brutal-sm hover:bg-muted"
502
+ },
503
+ size: {
504
+ default: "h-8 min-w-8 px-2",
505
+ sm: "h-7 min-w-7 rounded-[min(var(--radius-md),12px)] px-1.5 text-[0.8rem]",
506
+ lg: "h-9 min-w-9 px-2.5"
507
+ }
508
+ },
509
+ defaultVariants: {
510
+ variant: "default",
511
+ size: "default"
512
+ }
513
+ }
514
+ );
515
+ var ToggleGroupContext = React.createContext({
516
+ size: "default",
517
+ variant: "default",
518
+ spacing: 0,
519
+ orientation: "horizontal"
520
+ });
521
+ function ToggleGroup({
522
+ className,
523
+ variant,
524
+ size,
525
+ spacing = 0,
526
+ orientation = "horizontal",
527
+ children,
528
+ ...props
529
+ }) {
530
+ return /* @__PURE__ */ jsx(
531
+ ToggleGroup$1,
532
+ {
533
+ "data-slot": "toggle-group",
534
+ "data-variant": variant,
535
+ "data-size": size,
536
+ "data-spacing": spacing,
537
+ "data-orientation": orientation,
538
+ style: { "--gap": spacing },
539
+ className: cn(
540
+ "group/toggle-group flex w-fit flex-row items-center gap-[var(--gap)] rounded-lg border-brutal border-foreground data-vertical:flex-col data-vertical:items-stretch",
541
+ className
542
+ ),
543
+ ...props,
544
+ children: /* @__PURE__ */ jsx(
545
+ ToggleGroupContext.Provider,
546
+ {
547
+ value: { variant, size, spacing, orientation },
548
+ children
549
+ }
550
+ )
551
+ }
552
+ );
553
+ }
554
+ function ToggleGroupItem({
555
+ className,
556
+ children,
557
+ variant = "default",
558
+ size = "default",
559
+ ...props
560
+ }) {
561
+ const context = React.useContext(ToggleGroupContext);
562
+ return /* @__PURE__ */ jsx(
563
+ Toggle,
564
+ {
565
+ "data-slot": "toggle-group-item",
566
+ "data-variant": context.variant || variant,
567
+ "data-size": context.size || size,
568
+ "data-spacing": context.spacing,
569
+ className: cn(
570
+ "shrink-0 group-data-[spacing=0]/toggle-group:rounded-none group-data-[spacing=0]/toggle-group:px-2 focus:z-10 focus-visible:z-10 group-data-horizontal/toggle-group:data-[spacing=0]:first:rounded-l-lg group-data-vertical/toggle-group:data-[spacing=0]:first:rounded-t-lg group-data-horizontal/toggle-group:data-[spacing=0]:last:rounded-r-lg group-data-vertical/toggle-group:data-[spacing=0]:last:rounded-b-lg group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:border-l-0 group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:border-t-0 group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-l group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-t",
571
+ toggleVariants({
572
+ variant: context.variant || variant,
573
+ size: context.size || size
574
+ }),
575
+ className
576
+ ),
577
+ ...props,
578
+ children
579
+ }
580
+ );
581
+ }
582
+ var viewLabels = {
583
+ table: "Table",
584
+ kanban: "Board",
585
+ grid: "Grid",
586
+ calendar: "Calendar",
587
+ list: "List"
588
+ };
589
+ function ViewSwitcher({
590
+ value,
591
+ onChange,
592
+ views = ["table", "kanban", "grid", "calendar", "list"],
593
+ className
594
+ }) {
595
+ return /* @__PURE__ */ jsx(
596
+ ToggleGroup,
597
+ {
598
+ value: [value],
599
+ onValueChange: (vals) => {
600
+ if (vals.length > 0) {
601
+ onChange(vals[0]);
602
+ }
603
+ },
604
+ className,
605
+ children: views.map((view) => /* @__PURE__ */ jsx(ToggleGroupItem, { value: view, className: "brutal-label text-xs", children: viewLabels[view] }, view))
606
+ }
607
+ );
608
+ }
609
+ function DashboardTemplate({
610
+ logo,
611
+ logoCollapsed,
612
+ sidebarGroups,
613
+ user,
614
+ userMenuItems,
615
+ onSignOut,
616
+ stats,
617
+ views,
618
+ children,
619
+ sidebarFooter
620
+ }) {
621
+ const [view, setView] = useState("table");
622
+ return /* @__PURE__ */ jsxs(
623
+ AppShell,
624
+ {
625
+ sidebar: /* @__PURE__ */ jsx(
626
+ Sidebar,
627
+ {
628
+ logo,
629
+ logoCollapsed,
630
+ groups: sidebarGroups,
631
+ footer: sidebarFooter
632
+ }
633
+ ),
634
+ header: /* @__PURE__ */ jsxs(Fragment, { children: [
635
+ /* @__PURE__ */ jsx(SearchBar, { className: "flex-1 max-w-sm" }),
636
+ /* @__PURE__ */ jsx("div", { className: "ml-auto", children: /* @__PURE__ */ jsx(
637
+ UserMenu,
638
+ {
639
+ name: user.name,
640
+ email: user.email,
641
+ avatar: user.avatar,
642
+ items: userMenuItems,
643
+ onSignOut
644
+ }
645
+ ) })
646
+ ] }),
647
+ children: [
648
+ stats && stats.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-6 grid gap-4 sm:grid-cols-2 lg:grid-cols-4", children: stats.map((stat) => /* @__PURE__ */ jsx(StatCard, { ...stat }, stat.label)) }),
649
+ views && views.length > 1 && /* @__PURE__ */ jsx("div", { className: "mb-4", children: /* @__PURE__ */ jsx(ViewSwitcher, { value: view, onChange: setView, views }) }),
650
+ children
651
+ ]
652
+ }
653
+ );
654
+ }
655
+
656
+ export { DashboardTemplate };
657
+ //# sourceMappingURL=dashboard.js.map
658
+ //# sourceMappingURL=dashboard.js.map