@snow-labs/brutal-ui 0.1.1 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/dist/components/brutal/cta-section.d.ts +7 -2
  2. package/dist/components/brutal/cta-section.js +136 -32
  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 +163 -0
  6. package/dist/components/brutal/faq.js.map +1 -0
  7. package/dist/components/brutal/feature-grid.d.ts +6 -2
  8. package/dist/components/brutal/feature-grid.js +73 -10
  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 +181 -18
  12. package/dist/components/brutal/footer.js.map +1 -1
  13. package/dist/components/brutal/hero.d.ts +9 -2
  14. package/dist/components/brutal/hero.js +67 -22
  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 +1035 -128
  18. package/dist/components/brutal/index.js.map +1 -1
  19. package/dist/components/brutal/integration-grid.d.ts +1 -1
  20. package/dist/components/brutal/integration-grid.js +13 -5
  21. package/dist/components/brutal/integration-grid.js.map +1 -1
  22. package/dist/components/brutal/logo-cloud.d.ts +17 -0
  23. package/dist/components/brutal/logo-cloud.js +93 -0
  24. package/dist/components/brutal/logo-cloud.js.map +1 -0
  25. package/dist/components/brutal/nav.d.ts +3 -1
  26. package/dist/components/brutal/nav.js +166 -9
  27. package/dist/components/brutal/nav.js.map +1 -1
  28. package/dist/components/brutal/newsletter.d.ts +14 -0
  29. package/dist/components/brutal/newsletter.js +169 -0
  30. package/dist/components/brutal/newsletter.js.map +1 -0
  31. package/dist/components/brutal/pricing-table.d.ts +27 -0
  32. package/dist/components/brutal/pricing-table.js +251 -0
  33. package/dist/components/brutal/pricing-table.js.map +1 -0
  34. package/dist/components/brutal/section-divider.d.ts +14 -0
  35. package/dist/components/brutal/section-divider.js +70 -0
  36. package/dist/components/brutal/section-divider.js.map +1 -0
  37. package/dist/components/brutal/section.d.ts +7 -3
  38. package/dist/components/brutal/section.js +13 -5
  39. package/dist/components/brutal/section.js.map +1 -1
  40. package/dist/components/brutal/stats-bar.d.ts +16 -0
  41. package/dist/components/brutal/stats-bar.js +127 -0
  42. package/dist/components/brutal/stats-bar.js.map +1 -0
  43. package/dist/components/brutal/testimonials.d.ts +11 -3
  44. package/dist/components/brutal/testimonials.js +126 -33
  45. package/dist/components/brutal/testimonials.js.map +1 -1
  46. package/dist/components/brutal/wave-divider.d.ts +2 -12
  47. package/dist/components/brutal/wave-divider.js +54 -26
  48. package/dist/components/brutal/wave-divider.js.map +1 -1
  49. package/dist/components/dashboard/activity-feed.d.ts +18 -0
  50. package/dist/components/dashboard/activity-feed.js +105 -0
  51. package/dist/components/dashboard/activity-feed.js.map +1 -0
  52. package/dist/components/dashboard/app-shell.d.ts +19 -0
  53. package/dist/components/dashboard/app-shell.js +206 -0
  54. package/dist/components/dashboard/app-shell.js.map +1 -0
  55. package/dist/components/dashboard/empty-state.d.ts +14 -0
  56. package/dist/components/dashboard/empty-state.js +96 -0
  57. package/dist/components/dashboard/empty-state.js.map +1 -0
  58. package/dist/components/dashboard/file-upload.d.ts +12 -0
  59. package/dist/components/dashboard/file-upload.js +86 -0
  60. package/dist/components/dashboard/file-upload.js.map +1 -0
  61. package/dist/components/dashboard/index.d.ts +10 -0
  62. package/dist/components/dashboard/index.js +755 -0
  63. package/dist/components/dashboard/index.js.map +1 -0
  64. package/dist/components/dashboard/search-bar.d.ts +12 -0
  65. package/dist/components/dashboard/search-bar.js +49 -0
  66. package/dist/components/dashboard/search-bar.js.map +1 -0
  67. package/dist/components/dashboard/sidebar.d.ts +23 -0
  68. package/dist/components/dashboard/sidebar.js +113 -0
  69. package/dist/components/dashboard/sidebar.js.map +1 -0
  70. package/dist/components/dashboard/stat-card.d.ts +13 -0
  71. package/dist/components/dashboard/stat-card.js +55 -0
  72. package/dist/components/dashboard/stat-card.js.map +1 -0
  73. package/dist/components/dashboard/user-menu.d.ts +16 -0
  74. package/dist/components/dashboard/user-menu.js +179 -0
  75. package/dist/components/dashboard/user-menu.js.map +1 -0
  76. package/dist/components/dashboard/view-switcher.d.ts +12 -0
  77. package/dist/components/dashboard/view-switcher.js +130 -0
  78. package/dist/components/dashboard/view-switcher.js.map +1 -0
  79. package/dist/components/views/calendar-view.d.ts +17 -0
  80. package/dist/components/views/calendar-view.js +182 -0
  81. package/dist/components/views/calendar-view.js.map +1 -0
  82. package/dist/components/views/data-table.d.ts +15 -0
  83. package/dist/components/views/data-table.js +204 -0
  84. package/dist/components/views/data-table.js.map +1 -0
  85. package/dist/components/views/grid-view.d.ts +11 -0
  86. package/dist/components/views/grid-view.js +31 -0
  87. package/dist/components/views/grid-view.js.map +1 -0
  88. package/dist/components/views/index.d.ts +7 -0
  89. package/dist/components/views/index.js +542 -0
  90. package/dist/components/views/index.js.map +1 -0
  91. package/dist/components/views/kanban-board.d.ts +21 -0
  92. package/dist/components/views/kanban-board.js +153 -0
  93. package/dist/components/views/kanban-board.js.map +1 -0
  94. package/dist/components/views/list-view.d.ts +19 -0
  95. package/dist/components/views/list-view.js +96 -0
  96. package/dist/components/views/list-view.js.map +1 -0
  97. package/dist/index.d.ts +27 -3
  98. package/dist/index.js +1881 -142
  99. package/dist/index.js.map +1 -1
  100. package/dist/lib/animations.d.ts +68 -0
  101. package/dist/lib/animations.js +44 -0
  102. package/dist/lib/animations.js.map +1 -0
  103. package/dist/templates/dashboard.d.ts +40 -0
  104. package/dist/templates/dashboard.js +658 -0
  105. package/dist/templates/dashboard.js.map +1 -0
  106. package/dist/templates/index.d.ts +4 -0
  107. package/dist/templates/index.js +2001 -0
  108. package/dist/templates/index.js.map +1 -0
  109. package/dist/templates/saas-launch.d.ts +113 -0
  110. package/dist/templates/saas-launch.js +1394 -0
  111. package/dist/templates/saas-launch.js.map +1 -0
  112. package/dist/templates/studio.d.ts +72 -0
  113. package/dist/templates/studio.js +1099 -0
  114. package/dist/templates/studio.js.map +1 -0
  115. package/dist/theme.css +58 -15
  116. package/package.json +48 -2
@@ -0,0 +1,1099 @@
1
+ "use client";
2
+ import { useState, useEffect } from 'react';
3
+ import { clsx } from 'clsx';
4
+ import { twMerge } from 'tailwind-merge';
5
+ import { Button as Button$1 } from '@base-ui/react/button';
6
+ import { cva } from 'class-variance-authority';
7
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
8
+ import { Dialog } from '@base-ui/react/dialog';
9
+ import { Menu, XIcon } from 'lucide-react';
10
+ import { Input as Input$1 } from '@base-ui/react/input';
11
+
12
+ // src/components/brutal/nav.tsx
13
+ function cn(...inputs) {
14
+ return twMerge(clsx(inputs));
15
+ }
16
+ var buttonVariants = cva(
17
+ "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",
18
+ {
19
+ variants: {
20
+ variant: {
21
+ // Primary: Black bg, white text, offset shadow
22
+ 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",
23
+ // CTA: Mint green bg — the Bannerbear signature
24
+ 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",
25
+ // Brand: Dynamic brand color bg
26
+ 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",
27
+ // Outline: White bg, black border, offset shadow
28
+ 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",
29
+ // Secondary: Light bg, border, smaller shadow
30
+ 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",
31
+ // Ghost: No border/shadow, subtle hover
32
+ ghost: "hover:bg-secondary hover:text-foreground",
33
+ // Link: Text only
34
+ link: "text-foreground underline-offset-4 hover:underline",
35
+ // Destructive
36
+ 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",
37
+ // Nav: Thin border, no shadow (for nav Sign In buttons)
38
+ nav: "border border-foreground bg-background text-foreground hover:bg-foreground hover:text-background"
39
+ },
40
+ size: {
41
+ xs: "h-7 gap-1 px-2.5 text-xs",
42
+ sm: "h-8 gap-1.5 px-3 text-sm",
43
+ default: "h-10 gap-2 px-5 text-sm",
44
+ lg: "h-12 gap-2 px-7 text-base",
45
+ xl: "h-14 gap-2.5 px-9 text-lg",
46
+ icon: "size-10",
47
+ "icon-sm": "size-8",
48
+ "icon-lg": "size-12"
49
+ }
50
+ },
51
+ defaultVariants: {
52
+ variant: "default",
53
+ size: "default"
54
+ }
55
+ }
56
+ );
57
+ function Button({
58
+ className,
59
+ variant = "default",
60
+ size = "default",
61
+ ...props
62
+ }) {
63
+ return /* @__PURE__ */ jsx(
64
+ Button$1,
65
+ {
66
+ "data-slot": "button",
67
+ className: cn(buttonVariants({ variant, size, className })),
68
+ ...props
69
+ }
70
+ );
71
+ }
72
+ function Sheet({ ...props }) {
73
+ return /* @__PURE__ */ jsx(Dialog.Root, { "data-slot": "sheet", ...props });
74
+ }
75
+ function SheetTrigger({ ...props }) {
76
+ return /* @__PURE__ */ jsx(Dialog.Trigger, { "data-slot": "sheet-trigger", ...props });
77
+ }
78
+ function SheetPortal({ ...props }) {
79
+ return /* @__PURE__ */ jsx(Dialog.Portal, { "data-slot": "sheet-portal", ...props });
80
+ }
81
+ function SheetOverlay({ className, ...props }) {
82
+ return /* @__PURE__ */ jsx(
83
+ Dialog.Backdrop,
84
+ {
85
+ "data-slot": "sheet-overlay",
86
+ className: cn(
87
+ "fixed inset-0 z-50 bg-black/60 transition-opacity duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0",
88
+ className
89
+ ),
90
+ ...props
91
+ }
92
+ );
93
+ }
94
+ function SheetContent({
95
+ className,
96
+ children,
97
+ side = "right",
98
+ showCloseButton = true,
99
+ ...props
100
+ }) {
101
+ return /* @__PURE__ */ jsxs(SheetPortal, { children: [
102
+ /* @__PURE__ */ jsx(SheetOverlay, {}),
103
+ /* @__PURE__ */ jsxs(
104
+ Dialog.Popup,
105
+ {
106
+ "data-slot": "sheet-content",
107
+ "data-side": side,
108
+ className: cn(
109
+ "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",
110
+ className
111
+ ),
112
+ ...props,
113
+ children: [
114
+ children,
115
+ showCloseButton && /* @__PURE__ */ jsxs(
116
+ Dialog.Close,
117
+ {
118
+ "data-slot": "sheet-close",
119
+ render: /* @__PURE__ */ jsx(
120
+ Button,
121
+ {
122
+ variant: "ghost",
123
+ className: "absolute top-3 right-3",
124
+ size: "icon-sm"
125
+ }
126
+ ),
127
+ children: [
128
+ /* @__PURE__ */ jsx(
129
+ XIcon,
130
+ {}
131
+ ),
132
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
133
+ ]
134
+ }
135
+ )
136
+ ]
137
+ }
138
+ )
139
+ ] });
140
+ }
141
+ function SheetTitle({ className, ...props }) {
142
+ return /* @__PURE__ */ jsx(
143
+ Dialog.Title,
144
+ {
145
+ "data-slot": "sheet-title",
146
+ className: cn("text-base font-bold text-foreground", className),
147
+ ...props
148
+ }
149
+ );
150
+ }
151
+ function BrutalNav({
152
+ logo,
153
+ links,
154
+ ctaText = "Sign In",
155
+ ctaHref = "/admin",
156
+ variant = "solid",
157
+ className
158
+ }) {
159
+ const [mobileOpen, setMobileOpen] = useState(false);
160
+ const [isScrolled, setIsScrolled] = useState(false);
161
+ useEffect(() => {
162
+ if (variant !== "transparent") return;
163
+ const onScroll = () => setIsScrolled(window.scrollY > 20);
164
+ onScroll();
165
+ window.addEventListener("scroll", onScroll, { passive: true });
166
+ return () => window.removeEventListener("scroll", onScroll);
167
+ }, [variant]);
168
+ const variantStyles = {
169
+ solid: "sticky top-0 z-50 w-full border-b-brutal border-foreground bg-brand",
170
+ transparent: cn(
171
+ "fixed top-0 left-0 right-0 z-50 w-full transition-all duration-200",
172
+ isScrolled ? "bg-background/80 text-foreground backdrop-blur-md border-b border-foreground/10" : "bg-transparent text-white"
173
+ ),
174
+ "floating-pill": "fixed top-0 left-0 right-0 z-50 mx-4 mt-4 rounded-full border-brutal border-foreground bg-background shadow-brutal"
175
+ };
176
+ return /* @__PURE__ */ jsx("header", { className: cn(variantStyles[variant], className), children: /* @__PURE__ */ jsxs(
177
+ "div",
178
+ {
179
+ className: cn(
180
+ "flex h-14 items-center justify-between px-6",
181
+ variant === "floating-pill" ? "mx-auto max-w-7xl" : "brutal-container"
182
+ ),
183
+ children: [
184
+ /* @__PURE__ */ jsx("a", { href: "/", className: "flex items-center gap-2 text-lg font-black", children: logo }),
185
+ /* @__PURE__ */ jsx("nav", { className: "hidden items-center gap-1 md:flex", children: links.map((link) => /* @__PURE__ */ jsxs(
186
+ "a",
187
+ {
188
+ href: link.href,
189
+ className: cn(
190
+ "relative rounded-md px-3 py-1.5 text-sm font-bold transition-colors hover:opacity-70",
191
+ link.active && "bg-foreground/10"
192
+ ),
193
+ children: [
194
+ link.label,
195
+ link.badge && /* @__PURE__ */ jsx("span", { className: "absolute -top-1 -right-1 border border-foreground bg-background px-1 font-mono text-[9px] font-bold uppercase text-foreground", children: link.badge })
196
+ ]
197
+ },
198
+ link.href
199
+ )) }),
200
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
201
+ /* @__PURE__ */ jsx(
202
+ Button,
203
+ {
204
+ variant: "nav",
205
+ size: "sm",
206
+ render: /* @__PURE__ */ jsx("a", { href: ctaHref }),
207
+ className: "hidden md:inline-flex",
208
+ children: ctaText
209
+ }
210
+ ),
211
+ /* @__PURE__ */ jsxs(Sheet, { open: mobileOpen, onOpenChange: setMobileOpen, children: [
212
+ /* @__PURE__ */ jsxs(
213
+ SheetTrigger,
214
+ {
215
+ render: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "icon-sm", className: "md:hidden" }),
216
+ children: [
217
+ /* @__PURE__ */ jsx(Menu, { className: "size-5" }),
218
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Menu" })
219
+ ]
220
+ }
221
+ ),
222
+ /* @__PURE__ */ jsxs(SheetContent, { side: "right", showCloseButton: true, children: [
223
+ /* @__PURE__ */ jsx(SheetTitle, { children: "Navigation" }),
224
+ /* @__PURE__ */ jsxs("nav", { className: "flex flex-col gap-1 px-2 pt-4", children: [
225
+ links.map((link) => /* @__PURE__ */ jsxs(
226
+ "a",
227
+ {
228
+ href: link.href,
229
+ onClick: () => setMobileOpen(false),
230
+ className: cn(
231
+ "flex items-center gap-2 rounded-md px-3 py-2.5 text-sm font-bold transition-colors hover:bg-foreground/5",
232
+ link.active && "bg-foreground/10"
233
+ ),
234
+ children: [
235
+ link.label,
236
+ link.badge && /* @__PURE__ */ jsx("span", { className: "border border-foreground bg-background px-1 font-mono text-[9px] font-bold uppercase text-foreground", children: link.badge })
237
+ ]
238
+ },
239
+ link.href
240
+ )),
241
+ /* @__PURE__ */ jsx("div", { className: "mt-4 border-t border-foreground/10 pt-4", children: /* @__PURE__ */ jsx(
242
+ Button,
243
+ {
244
+ variant: "default",
245
+ size: "default",
246
+ render: /* @__PURE__ */ jsx("a", { href: ctaHref }),
247
+ className: "w-full",
248
+ children: ctaText
249
+ }
250
+ ) })
251
+ ] })
252
+ ] })
253
+ ] })
254
+ ] })
255
+ ]
256
+ }
257
+ ) });
258
+ }
259
+ var colorMap = {
260
+ white: "bg-background text-foreground",
261
+ brand: "bg-brand",
262
+ "brand-muted": "bg-brand-muted text-foreground",
263
+ black: "bg-foreground text-background",
264
+ cta: "bg-cta"
265
+ };
266
+ var containerMap = {
267
+ sm: "brutal-container-sm",
268
+ default: "brutal-container",
269
+ lg: "brutal-container-lg"
270
+ };
271
+ var paddingMap = {
272
+ sm: "brutal-section-sm",
273
+ default: "brutal-section",
274
+ lg: "brutal-section py-28 sm:py-36 md:py-44"
275
+ };
276
+ var patternMap = {
277
+ dots: "brutal-dots",
278
+ stripes: "brutal-stripes",
279
+ noise: "brutal-noise",
280
+ grain: "brutal-grain",
281
+ crosshatch: "brutal-crosshatch",
282
+ "grid-dots": "brutal-grid-dots",
283
+ "gradient-mesh": "brutal-gradient-mesh",
284
+ none: ""
285
+ };
286
+ function BrutalSection({
287
+ children,
288
+ color = "white",
289
+ className,
290
+ containerSize = "default",
291
+ padding = "default",
292
+ pattern,
293
+ dots = false,
294
+ stripes = false,
295
+ id
296
+ }) {
297
+ const resolvedPattern = pattern ?? (dots ? "dots" : void 0) ?? (stripes ? "stripes" : void 0) ?? "none";
298
+ return /* @__PURE__ */ jsx(
299
+ "section",
300
+ {
301
+ id,
302
+ className: cn(
303
+ paddingMap[padding],
304
+ colorMap[color],
305
+ patternMap[resolvedPattern],
306
+ className
307
+ ),
308
+ children: /* @__PURE__ */ jsx("div", { className: containerMap[containerSize], children })
309
+ }
310
+ );
311
+ }
312
+ function BrutalHero({
313
+ variant = "split",
314
+ badge,
315
+ badgePosition = "above",
316
+ headline,
317
+ description,
318
+ ctaText,
319
+ ctaHref = "#",
320
+ ctaVariant = "cta",
321
+ secondaryText,
322
+ secondaryHref,
323
+ visual,
324
+ color = "brand",
325
+ pattern,
326
+ proof,
327
+ className
328
+ }) {
329
+ const badgeElement = badge && /* @__PURE__ */ jsx(
330
+ "div",
331
+ {
332
+ className: cn(
333
+ "inline-flex w-fit border-brutal border-foreground bg-background px-3 py-1 font-mono text-xs font-bold uppercase tracking-widest text-foreground shadow-brutal-sm",
334
+ badgePosition === "floating" && "absolute -top-3 left-6 z-10"
335
+ ),
336
+ children: badge
337
+ }
338
+ );
339
+ const textContent = /* @__PURE__ */ jsxs("div", { className: cn(
340
+ "flex flex-col gap-6",
341
+ variant === "centered" && "items-center text-center"
342
+ ), children: [
343
+ badgePosition === "above" && badgeElement,
344
+ /* @__PURE__ */ jsxs("h1", { className: cn(
345
+ "brutal-display text-balance",
346
+ variant === "centered" && "mx-auto max-w-4xl"
347
+ ), children: [
348
+ badgePosition === "inline" && badgeElement,
349
+ headline
350
+ ] }),
351
+ /* @__PURE__ */ jsx("p", { className: cn(
352
+ "brutal-body-lg max-w-lg opacity-80",
353
+ variant === "centered" && "mx-auto"
354
+ ), children: description }),
355
+ /* @__PURE__ */ jsxs("div", { className: cn(
356
+ "flex flex-col gap-4 sm:flex-row sm:flex-wrap",
357
+ variant === "centered" && "sm:justify-center"
358
+ ), children: [
359
+ /* @__PURE__ */ jsx(Button, { variant: ctaVariant, size: "xl", className: "w-full sm:w-auto", render: /* @__PURE__ */ jsx("a", { href: ctaHref }), children: ctaText }),
360
+ secondaryText && /* @__PURE__ */ jsx(Button, { variant: "outline", size: "xl", className: "w-full sm:w-auto", render: /* @__PURE__ */ jsx("a", { href: secondaryHref || "#" }), children: secondaryText })
361
+ ] }),
362
+ proof && /* @__PURE__ */ jsxs("p", { className: "flex items-center gap-2 text-sm font-medium opacity-70", children: [
363
+ /* @__PURE__ */ jsx("span", { className: "inline-flex size-5 items-center justify-center border border-current text-xs", children: "\u2713" }),
364
+ proof
365
+ ] })
366
+ ] });
367
+ const layoutClass = {
368
+ split: "grid items-center gap-12 lg:grid-cols-2 lg:gap-16",
369
+ centered: "flex flex-col items-center gap-12",
370
+ overlap: "relative",
371
+ asymmetric: "grid items-center gap-12 lg:grid-cols-[3fr_2fr] lg:gap-16"
372
+ }[variant];
373
+ return /* @__PURE__ */ jsxs(BrutalSection, { color, padding: "lg", pattern, className: cn("relative", className), children: [
374
+ badgePosition === "floating" && badgeElement,
375
+ /* @__PURE__ */ jsxs("div", { className: layoutClass, children: [
376
+ textContent,
377
+ visual && variant === "overlap" ? /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-center opacity-20", children: visual }) : visual ? /* @__PURE__ */ jsx("div", { className: cn(
378
+ "flex items-center justify-center",
379
+ variant === "asymmetric" && "-rotate-2 transform"
380
+ ), children: visual }) : null
381
+ ] })
382
+ ] });
383
+ }
384
+ var paths = {
385
+ wave: "M0,64 C160,128 320,0 480,64 C640,128 800,0 960,64 L960,160 L0,160 Z",
386
+ jagged: "M0,80 L80,40 L160,80 L240,20 L320,80 L400,40 L480,80 L560,20 L640,80 L720,40 L800,80 L880,20 L960,80 L960,160 L0,160 Z",
387
+ curve: "M0,128 Q480,-32 960,128 L960,160 L0,160 Z",
388
+ castle: "M0,80 L0,60 L80,60 L80,80 L120,80 L120,40 L200,40 L200,80 L240,80 L240,60 L320,60 L320,80 L360,80 L360,40 L440,40 L440,80 L480,80 L480,60 L560,60 L560,80 L600,80 L600,40 L680,40 L680,80 L720,80 L720,60 L800,60 L800,80 L840,80 L840,40 L920,40 L920,80 L960,80 L960,160 L0,160 Z",
389
+ "torn-paper": "M0,70 C30,65 45,85 80,72 C115,59 130,90 170,78 C210,66 225,88 270,75 C315,62 340,92 380,79 C420,66 445,86 490,73 C535,60 560,88 600,76 C640,64 665,90 710,77 C755,64 780,84 830,71 C875,58 900,86 960,80 L960,160 L0,160 Z",
390
+ "brush-stroke": "M0,90 C80,50 120,100 200,60 C280,20 360,110 480,70 C600,30 640,100 720,80 C800,60 880,100 960,70 L960,160 L0,160 Z",
391
+ geometric: "M0,100 L120,60 L240,80 L360,40 L480,90 L600,50 L720,70 L840,30 L960,80 L960,160 L0,160 Z",
392
+ blob: "M0,80 C80,120 160,40 280,80 C400,120 440,30 560,70 C680,110 760,40 960,80 L960,160 L0,160 Z",
393
+ diagonal: "M0,160 L960,60 L960,160 Z",
394
+ zigzag: "M0,80 L60,40 L120,80 L180,40 L240,80 L300,40 L360,80 L420,40 L480,80 L540,40 L600,80 L660,40 L720,80 L780,40 L840,80 L900,40 L960,80 L960,160 L0,160 Z",
395
+ "hand-drawn": "M0,72 C20,68 35,82 60,75 C85,68 95,84 125,76 C155,68 170,85 200,77 C230,69 245,83 275,75 C305,67 320,86 350,78 C380,70 395,82 425,74 C455,66 470,84 500,76 C530,68 545,83 575,75 C605,67 620,85 650,77 C680,69 695,82 725,74 C755,66 770,84 800,76 C830,68 845,83 875,75 C905,67 920,82 960,74 L960,160 L0,160 Z"
396
+ };
397
+ function SectionDivider({
398
+ from = "hsl(var(--background))",
399
+ to = "hsl(var(--background))",
400
+ flip = false,
401
+ className = "",
402
+ variant = "wave",
403
+ layers = false
404
+ }) {
405
+ return /* @__PURE__ */ jsxs(
406
+ "div",
407
+ {
408
+ className: cn("relative -my-px w-full overflow-hidden", className),
409
+ style: { backgroundColor: from },
410
+ children: [
411
+ layers && /* @__PURE__ */ jsx(
412
+ "svg",
413
+ {
414
+ viewBox: "0 0 960 160",
415
+ preserveAspectRatio: "none",
416
+ className: "absolute inset-0 block w-full opacity-30",
417
+ style: {
418
+ height: "clamp(40px, 6vw, 80px)",
419
+ transform: flip ? "scaleY(-1) translateY(4px)" : "translateY(-4px)"
420
+ },
421
+ children: /* @__PURE__ */ jsx("path", { d: paths[variant], fill: to })
422
+ }
423
+ ),
424
+ /* @__PURE__ */ jsx(
425
+ "svg",
426
+ {
427
+ viewBox: "0 0 960 160",
428
+ preserveAspectRatio: "none",
429
+ className: "relative block w-full",
430
+ style: {
431
+ height: "clamp(40px, 6vw, 80px)",
432
+ transform: flip ? "scaleY(-1)" : void 0
433
+ },
434
+ children: /* @__PURE__ */ jsx("path", { d: paths[variant], fill: to })
435
+ }
436
+ )
437
+ ]
438
+ }
439
+ );
440
+ }
441
+ function Card({
442
+ className,
443
+ ...props
444
+ }) {
445
+ return /* @__PURE__ */ jsx(
446
+ "div",
447
+ {
448
+ "data-slot": "card",
449
+ className: cn(
450
+ "group/card flex flex-col gap-4 rounded-lg border-brutal border-foreground bg-card p-5 text-card-foreground shadow-brutal transition-all duration-150 hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg",
451
+ className
452
+ ),
453
+ ...props
454
+ }
455
+ );
456
+ }
457
+ function CardHeader({ className, ...props }) {
458
+ return /* @__PURE__ */ jsx(
459
+ "div",
460
+ {
461
+ "data-slot": "card-header",
462
+ className: cn("flex flex-col gap-1", className),
463
+ ...props
464
+ }
465
+ );
466
+ }
467
+ function CardTitle({ className, ...props }) {
468
+ return /* @__PURE__ */ jsx(
469
+ "div",
470
+ {
471
+ "data-slot": "card-title",
472
+ className: cn("text-lg font-bold leading-snug", className),
473
+ ...props
474
+ }
475
+ );
476
+ }
477
+ function CardDescription({ className, ...props }) {
478
+ return /* @__PURE__ */ jsx(
479
+ "div",
480
+ {
481
+ "data-slot": "card-description",
482
+ className: cn("text-sm text-muted-foreground", className),
483
+ ...props
484
+ }
485
+ );
486
+ }
487
+ function CardContent({ className, ...props }) {
488
+ return /* @__PURE__ */ jsx(
489
+ "div",
490
+ {
491
+ "data-slot": "card-content",
492
+ className: cn("", className),
493
+ ...props
494
+ }
495
+ );
496
+ }
497
+ var colMap = {
498
+ 2: "sm:grid-cols-2",
499
+ 3: "sm:grid-cols-2 lg:grid-cols-3",
500
+ 4: "sm:grid-cols-2 lg:grid-cols-4"
501
+ };
502
+ function BrutalFeatureGrid({
503
+ variant = "icon-top",
504
+ badge,
505
+ headline,
506
+ description,
507
+ features,
508
+ columns = 3,
509
+ color = "white",
510
+ className
511
+ }) {
512
+ return /* @__PURE__ */ jsxs(BrutalSection, { color, className, children: [
513
+ /* @__PURE__ */ jsxs("div", { className: "mb-12 max-w-2xl", children: [
514
+ badge && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-4 text-brand", children: badge }),
515
+ /* @__PURE__ */ jsx("h2", { className: "brutal-h2 mb-4", children: headline }),
516
+ description && /* @__PURE__ */ jsx("p", { className: "brutal-body text-muted-foreground", children: description })
517
+ ] }),
518
+ /* @__PURE__ */ jsx(
519
+ "div",
520
+ {
521
+ className: cn(
522
+ "grid gap-6",
523
+ variant === "bento" ? "sm:grid-cols-2 lg:grid-cols-3" : colMap[columns]
524
+ ),
525
+ children: features.map((feature, i) => /* @__PURE__ */ jsx(
526
+ FeatureCard,
527
+ {
528
+ feature,
529
+ variant,
530
+ index: i
531
+ },
532
+ feature.title
533
+ ))
534
+ }
535
+ )
536
+ ] });
537
+ }
538
+ function FeatureCard({
539
+ feature,
540
+ variant,
541
+ index
542
+ }) {
543
+ const isBentoFeatured = variant === "bento" && feature.featured;
544
+ if (variant === "icon-left") {
545
+ return /* @__PURE__ */ jsxs("div", { className: "flex gap-4 border-brutal border-foreground border-l-4 border-l-brand bg-background p-5 shadow-brutal transition-all duration-150 hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg", children: [
546
+ feature.icon && /* @__PURE__ */ jsx("div", { className: "flex size-12 shrink-0 items-center justify-center border-brutal border-foreground bg-brand-muted text-2xl shadow-brutal-sm", children: feature.icon }),
547
+ /* @__PURE__ */ jsxs("div", { children: [
548
+ feature.stat && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-1 text-brand", children: feature.stat }),
549
+ /* @__PURE__ */ jsx("h3", { className: "brutal-h4 mb-1", children: feature.title }),
550
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: feature.description })
551
+ ] })
552
+ ] });
553
+ }
554
+ if (variant === "numbered") {
555
+ return /* @__PURE__ */ jsxs(Card, { children: [
556
+ /* @__PURE__ */ jsxs(CardHeader, { children: [
557
+ /* @__PURE__ */ jsx("span", { className: "brutal-display mb-2 block text-brand opacity-20", children: String(index + 1).padStart(2, "0") }),
558
+ feature.stat && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-1 text-brand", children: feature.stat }),
559
+ /* @__PURE__ */ jsx(CardTitle, { children: feature.title })
560
+ ] }),
561
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx(CardDescription, { children: feature.description }) })
562
+ ] });
563
+ }
564
+ return /* @__PURE__ */ jsxs(
565
+ Card,
566
+ {
567
+ className: cn(
568
+ isBentoFeatured && "sm:col-span-2 bg-brand-muted"
569
+ ),
570
+ children: [
571
+ /* @__PURE__ */ jsxs(CardHeader, { children: [
572
+ feature.icon && /* @__PURE__ */ jsx("div", { className: "mb-2 inline-flex size-12 items-center justify-center border-brutal border-foreground border-b-brand bg-brand-muted text-2xl shadow-brutal-sm", children: feature.icon }),
573
+ feature.stat && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-1 text-brand", children: feature.stat }),
574
+ /* @__PURE__ */ jsx(CardTitle, { children: feature.title })
575
+ ] }),
576
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx(CardDescription, { children: feature.description }) })
577
+ ]
578
+ }
579
+ );
580
+ }
581
+ function StarRating({ rating }) {
582
+ return /* @__PURE__ */ jsx("div", { className: "flex gap-0.5", children: Array.from({ length: 5 }, (_, i) => /* @__PURE__ */ jsx(
583
+ "span",
584
+ {
585
+ className: cn(
586
+ "text-sm",
587
+ i < rating ? "text-amber-500" : "text-foreground/20"
588
+ ),
589
+ children: "\u2605"
590
+ },
591
+ i
592
+ )) });
593
+ }
594
+ function TestimonialCard({
595
+ t,
596
+ className
597
+ }) {
598
+ return /* @__PURE__ */ jsxs(
599
+ "div",
600
+ {
601
+ className: cn(
602
+ "relative break-inside-avoid border-brutal border-foreground bg-background p-5 text-foreground shadow-brutal transition-all duration-150 hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg",
603
+ className
604
+ ),
605
+ children: [
606
+ /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute top-3 right-4 select-none font-serif text-5xl leading-none text-foreground/[0.06]", children: "\u201C" }),
607
+ t.rating && /* @__PURE__ */ jsx("div", { className: "mb-3", children: /* @__PURE__ */ jsx(StarRating, { rating: t.rating }) }),
608
+ /* @__PURE__ */ jsx("p", { className: "relative mb-4 text-sm leading-relaxed", children: t.text }),
609
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
610
+ t.avatar ? /* @__PURE__ */ jsx(
611
+ "img",
612
+ {
613
+ src: t.avatar,
614
+ alt: t.name,
615
+ className: "size-9 border-2 object-cover",
616
+ style: { borderColor: "hsl(var(--brand))" }
617
+ }
618
+ ) : /* @__PURE__ */ jsx(
619
+ "div",
620
+ {
621
+ className: "flex size-9 items-center justify-center border-2 font-bold text-brand-foreground",
622
+ style: {
623
+ borderColor: "hsl(var(--brand))",
624
+ backgroundColor: "hsl(var(--brand))"
625
+ },
626
+ children: t.name[0]
627
+ }
628
+ ),
629
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
630
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-bold", children: t.name }),
631
+ (t.role || t.company) && /* @__PURE__ */ jsxs("p", { className: "truncate text-xs text-muted-foreground", children: [
632
+ t.role,
633
+ t.role && t.company && " \xB7 ",
634
+ t.company
635
+ ] }),
636
+ !t.role && !t.company && t.handle && /* @__PURE__ */ jsx("p", { className: "font-mono text-xs text-muted-foreground", children: t.handle })
637
+ ] }),
638
+ t.companyLogo && /* @__PURE__ */ jsx(
639
+ "img",
640
+ {
641
+ src: t.companyLogo,
642
+ alt: t.company || "",
643
+ className: "h-5 object-contain opacity-60"
644
+ }
645
+ )
646
+ ] })
647
+ ]
648
+ }
649
+ );
650
+ }
651
+ function MasonryLayout({ testimonials }) {
652
+ return /* @__PURE__ */ jsx("div", { className: "columns-1 gap-6 sm:columns-2 lg:columns-3", children: testimonials.map((t, i) => /* @__PURE__ */ jsx(TestimonialCard, { t, className: "mb-6" }, i)) });
653
+ }
654
+ function FeaturedGridLayout({
655
+ testimonials
656
+ }) {
657
+ const featured = testimonials.find((t) => t.featured) || testimonials[0];
658
+ const rest = testimonials.filter((t) => t !== featured);
659
+ return /* @__PURE__ */ jsxs("div", { className: "grid gap-6 lg:grid-cols-2", children: [
660
+ featured && /* @__PURE__ */ jsx(
661
+ TestimonialCard,
662
+ {
663
+ t: featured,
664
+ className: "flex flex-col justify-between p-8 lg:row-span-2"
665
+ }
666
+ ),
667
+ rest.map((t, i) => /* @__PURE__ */ jsx(TestimonialCard, { t }, i))
668
+ ] });
669
+ }
670
+ function CarouselLayout({ testimonials }) {
671
+ return /* @__PURE__ */ jsx("div", { className: "-mx-6 flex snap-x snap-mandatory gap-6 overflow-x-auto px-6 pb-4", children: testimonials.map((t, i) => /* @__PURE__ */ jsx(
672
+ TestimonialCard,
673
+ {
674
+ t,
675
+ className: "w-80 flex-none snap-center"
676
+ },
677
+ i
678
+ )) });
679
+ }
680
+ function WallOfLoveLayout({ testimonials }) {
681
+ return /* @__PURE__ */ jsxs("div", { className: "relative max-h-[600px] overflow-hidden", children: [
682
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4", children: testimonials.map((t, i) => /* @__PURE__ */ jsx(TestimonialCard, { t }, i)) }),
683
+ /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-x-0 bottom-0 h-32 bg-gradient-to-t from-background to-transparent" })
684
+ ] });
685
+ }
686
+ function BrutalTestimonials({
687
+ badge,
688
+ headline,
689
+ testimonials,
690
+ variant = "masonry",
691
+ color = "brand-muted",
692
+ pattern,
693
+ className
694
+ }) {
695
+ return /* @__PURE__ */ jsxs(BrutalSection, { color, pattern, className, children: [
696
+ (headline || badge) && /* @__PURE__ */ jsxs("div", { className: "mb-12 text-center", children: [
697
+ badge && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-4 opacity-70", children: badge }),
698
+ headline && /* @__PURE__ */ jsx("h2", { className: "brutal-h2", children: headline })
699
+ ] }),
700
+ variant === "masonry" && /* @__PURE__ */ jsx(MasonryLayout, { testimonials }),
701
+ variant === "featured-grid" && /* @__PURE__ */ jsx(FeaturedGridLayout, { testimonials }),
702
+ variant === "carousel" && /* @__PURE__ */ jsx(CarouselLayout, { testimonials }),
703
+ variant === "wall-of-love" && /* @__PURE__ */ jsx(WallOfLoveLayout, { testimonials })
704
+ ] });
705
+ }
706
+ function Input({ className, type, ...props }) {
707
+ return /* @__PURE__ */ jsx(
708
+ Input$1,
709
+ {
710
+ type,
711
+ "data-slot": "input",
712
+ className: cn(
713
+ "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",
714
+ className
715
+ ),
716
+ ...props
717
+ }
718
+ );
719
+ }
720
+ function Newsletter({
721
+ headline = "Stay in the loop",
722
+ description,
723
+ placeholder = "you@example.com",
724
+ buttonText = "Subscribe",
725
+ onSubmit,
726
+ color = "white",
727
+ className
728
+ }) {
729
+ return /* @__PURE__ */ jsx(BrutalSection, { color, padding: "sm", className, children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-md border-brutal border-foreground bg-background p-8 text-foreground shadow-brutal-lg", children: [
730
+ /* @__PURE__ */ jsx("h3", { className: "brutal-h3 mb-2", children: headline }),
731
+ description && /* @__PURE__ */ jsx("p", { className: "brutal-body mb-6 text-muted-foreground", children: description }),
732
+ /* @__PURE__ */ jsxs(
733
+ "form",
734
+ {
735
+ onSubmit: (e) => {
736
+ e.preventDefault();
737
+ const form = e.target;
738
+ const email = new FormData(form).get("email");
739
+ onSubmit?.(email);
740
+ },
741
+ className: "flex gap-3",
742
+ children: [
743
+ /* @__PURE__ */ jsx(Input, { type: "email", name: "email", placeholder, required: true, className: "flex-1" }),
744
+ /* @__PURE__ */ jsx(Button, { type: "submit", variant: "cta", children: buttonText })
745
+ ]
746
+ }
747
+ )
748
+ ] }) });
749
+ }
750
+ function CTAButtons({
751
+ ctaText,
752
+ ctaHref = "#",
753
+ ctaVariant = "cta",
754
+ secondaryText,
755
+ secondaryHref
756
+ }) {
757
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 sm:flex-row sm:flex-wrap sm:items-center sm:justify-center", children: [
758
+ /* @__PURE__ */ jsx(
759
+ Button,
760
+ {
761
+ variant: ctaVariant,
762
+ size: "xl",
763
+ className: "w-full sm:w-auto",
764
+ render: /* @__PURE__ */ jsx("a", { href: ctaHref }),
765
+ children: ctaText
766
+ }
767
+ ),
768
+ secondaryText && /* @__PURE__ */ jsx(
769
+ Button,
770
+ {
771
+ variant: "outline",
772
+ size: "xl",
773
+ className: "w-full sm:w-auto",
774
+ render: /* @__PURE__ */ jsx("a", { href: secondaryHref || "#" }),
775
+ children: secondaryText
776
+ }
777
+ )
778
+ ] });
779
+ }
780
+ function CenteredCTA(props) {
781
+ return /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-2xl text-center", children: [
782
+ /* @__PURE__ */ jsx("h2", { className: "brutal-h1 mb-6", children: props.headline }),
783
+ props.description && /* @__PURE__ */ jsx("p", { className: "brutal-body mb-4 opacity-80", children: props.description }),
784
+ props.stats && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-8 opacity-60", children: props.stats }),
785
+ /* @__PURE__ */ jsx(
786
+ CTAButtons,
787
+ {
788
+ ctaText: props.ctaText,
789
+ ctaHref: props.ctaHref,
790
+ ctaVariant: props.ctaVariant,
791
+ secondaryText: props.secondaryText,
792
+ secondaryHref: props.secondaryHref
793
+ }
794
+ )
795
+ ] });
796
+ }
797
+ function SplitCTA(props) {
798
+ return /* @__PURE__ */ jsxs("div", { className: "grid items-center gap-12 lg:grid-cols-2", children: [
799
+ /* @__PURE__ */ jsxs("div", { children: [
800
+ /* @__PURE__ */ jsx("h2", { className: "brutal-h1 mb-6", children: props.headline }),
801
+ props.description && /* @__PURE__ */ jsx("p", { className: "brutal-body mb-4 opacity-80", children: props.description }),
802
+ props.stats && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-8 opacity-60", children: props.stats }),
803
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 sm:flex-row sm:flex-wrap", children: [
804
+ /* @__PURE__ */ jsx(
805
+ Button,
806
+ {
807
+ variant: props.ctaVariant || "cta",
808
+ size: "xl",
809
+ className: "w-full sm:w-auto",
810
+ render: /* @__PURE__ */ jsx("a", { href: props.ctaHref || "#" }),
811
+ children: props.ctaText
812
+ }
813
+ ),
814
+ props.secondaryText && /* @__PURE__ */ jsx(
815
+ Button,
816
+ {
817
+ variant: "outline",
818
+ size: "xl",
819
+ className: "w-full sm:w-auto",
820
+ render: /* @__PURE__ */ jsx("a", { href: props.secondaryHref || "#" }),
821
+ children: props.secondaryText
822
+ }
823
+ )
824
+ ] })
825
+ ] }),
826
+ props.visual && /* @__PURE__ */ jsx("div", { children: props.visual })
827
+ ] });
828
+ }
829
+ function WithVisualCTA(props) {
830
+ return /* @__PURE__ */ jsxs("div", { className: "relative", children: [
831
+ props.visual && /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-center opacity-10", children: props.visual }),
832
+ /* @__PURE__ */ jsxs("div", { className: "relative mx-auto max-w-2xl text-center", children: [
833
+ /* @__PURE__ */ jsx("h2", { className: "brutal-h1 mb-6", children: props.headline }),
834
+ props.description && /* @__PURE__ */ jsx("p", { className: "brutal-body mb-4 opacity-80", children: props.description }),
835
+ props.stats && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-8 opacity-60", children: props.stats }),
836
+ /* @__PURE__ */ jsx(
837
+ CTAButtons,
838
+ {
839
+ ctaText: props.ctaText,
840
+ ctaHref: props.ctaHref,
841
+ ctaVariant: props.ctaVariant,
842
+ secondaryText: props.secondaryText,
843
+ secondaryHref: props.secondaryHref
844
+ }
845
+ )
846
+ ] })
847
+ ] });
848
+ }
849
+ function FloatingCardCTA(props) {
850
+ return /* @__PURE__ */ jsx("div", { className: "relative z-10 -mt-16", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-2xl border-brutal border-foreground bg-background p-8 text-center text-foreground shadow-brutal-lg", children: [
851
+ /* @__PURE__ */ jsx("h2", { className: "brutal-h1 mb-6", children: props.headline }),
852
+ props.description && /* @__PURE__ */ jsx("p", { className: "brutal-body mb-4 opacity-80", children: props.description }),
853
+ props.stats && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-8 opacity-60", children: props.stats }),
854
+ /* @__PURE__ */ jsx(
855
+ CTAButtons,
856
+ {
857
+ ctaText: props.ctaText,
858
+ ctaHref: props.ctaHref,
859
+ ctaVariant: props.ctaVariant,
860
+ secondaryText: props.secondaryText,
861
+ secondaryHref: props.secondaryHref
862
+ }
863
+ )
864
+ ] }) });
865
+ }
866
+ function BrutalCTA({
867
+ variant = "centered",
868
+ color = "black",
869
+ className,
870
+ pattern,
871
+ ...props
872
+ }) {
873
+ if (variant === "floating-card") {
874
+ return /* @__PURE__ */ jsx("div", { className: cn("brutal-container px-6", className), children: /* @__PURE__ */ jsx(FloatingCardCTA, { ...props, variant, color }) });
875
+ }
876
+ return /* @__PURE__ */ jsxs(BrutalSection, { color, pattern, className, children: [
877
+ variant === "centered" && /* @__PURE__ */ jsx(CenteredCTA, { ...props, variant, color }),
878
+ variant === "split" && /* @__PURE__ */ jsx(SplitCTA, { ...props, variant, color }),
879
+ variant === "with-visual" && /* @__PURE__ */ jsx(WithVisualCTA, { ...props, variant, color })
880
+ ] });
881
+ }
882
+ function SocialsRow({
883
+ socials
884
+ }) {
885
+ const items = [
886
+ { key: "twitter", label: "Twitter", url: socials.twitter },
887
+ { key: "github", label: "GitHub", url: socials.github },
888
+ { key: "linkedin", label: "LinkedIn", url: socials.linkedin },
889
+ { key: "discord", label: "Discord", url: socials.discord }
890
+ ].filter((s) => s.url);
891
+ if (items.length === 0) return null;
892
+ return /* @__PURE__ */ jsx("div", { className: "flex items-center gap-4", children: items.map((s) => /* @__PURE__ */ jsx(
893
+ "a",
894
+ {
895
+ href: s.url,
896
+ target: "_blank",
897
+ rel: "noopener noreferrer",
898
+ className: "text-sm font-bold transition-colors hover:text-muted-foreground",
899
+ children: s.label
900
+ },
901
+ s.key
902
+ )) });
903
+ }
904
+ function NewsletterSection({
905
+ newsletter
906
+ }) {
907
+ return /* @__PURE__ */ jsx("div", { className: "mb-10 border-b-brutal border-foreground pb-10", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-lg text-center", children: [
908
+ /* @__PURE__ */ jsx("h3", { className: "brutal-h4 mb-2", children: newsletter.headline || "Stay in the loop" }),
909
+ newsletter.description && /* @__PURE__ */ jsx("p", { className: "brutal-caption mb-4", children: newsletter.description }),
910
+ /* @__PURE__ */ jsxs(
911
+ "form",
912
+ {
913
+ onSubmit: (e) => e.preventDefault(),
914
+ className: "flex gap-2",
915
+ children: [
916
+ /* @__PURE__ */ jsx(
917
+ Input,
918
+ {
919
+ type: "email",
920
+ placeholder: newsletter.placeholder || "you@email.com",
921
+ className: "flex-1"
922
+ }
923
+ ),
924
+ /* @__PURE__ */ jsx(Button, { variant: "default", size: "default", type: "submit", children: newsletter.buttonText || "Subscribe" })
925
+ ]
926
+ }
927
+ )
928
+ ] }) });
929
+ }
930
+ function MegaContent({
931
+ logo,
932
+ tagline,
933
+ columns,
934
+ socials
935
+ }) {
936
+ return /* @__PURE__ */ jsxs("div", { className: "mb-10 flex flex-col gap-8 sm:flex-row sm:items-start sm:justify-between", children: [
937
+ /* @__PURE__ */ jsxs("div", { className: "max-w-xs", children: [
938
+ /* @__PURE__ */ jsx("div", { className: "mb-2 text-xl font-black", children: logo }),
939
+ tagline && /* @__PURE__ */ jsx("p", { className: "mb-4 text-sm text-muted-foreground", children: tagline }),
940
+ socials && /* @__PURE__ */ jsx(SocialsRow, { socials })
941
+ ] }),
942
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-8 sm:grid-cols-3 md:gap-12", children: columns.map((col) => /* @__PURE__ */ jsxs("div", { children: [
943
+ /* @__PURE__ */ jsx("h3", { className: "brutal-label mb-3 text-muted-foreground", children: col.title }),
944
+ /* @__PURE__ */ jsx("ul", { className: "flex flex-col gap-2", children: col.links.map((link) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
945
+ "a",
946
+ {
947
+ href: link.href,
948
+ className: "text-sm font-medium transition-colors hover:text-muted-foreground",
949
+ children: link.label
950
+ }
951
+ ) }, link.href)) })
952
+ ] }, col.title)) })
953
+ ] });
954
+ }
955
+ function MinimalContent({
956
+ logo,
957
+ columns,
958
+ socials
959
+ }) {
960
+ const allLinks = columns.flatMap((col) => col.links);
961
+ return /* @__PURE__ */ jsxs("div", { className: "mb-6 flex flex-col items-center gap-4 sm:flex-row sm:justify-between", children: [
962
+ /* @__PURE__ */ jsx("div", { className: "text-xl font-black", children: logo }),
963
+ /* @__PURE__ */ jsx("nav", { className: "flex flex-wrap items-center justify-center gap-x-6 gap-y-2", children: allLinks.map((link) => /* @__PURE__ */ jsx(
964
+ "a",
965
+ {
966
+ href: link.href,
967
+ className: "text-sm font-medium transition-colors hover:text-muted-foreground",
968
+ children: link.label
969
+ },
970
+ link.href
971
+ )) }),
972
+ socials && /* @__PURE__ */ jsx(SocialsRow, { socials })
973
+ ] });
974
+ }
975
+ function BrutalFooter({
976
+ logo,
977
+ tagline,
978
+ columns,
979
+ bottomLeft,
980
+ bottomRight,
981
+ variant = "mega",
982
+ socials,
983
+ newsletter,
984
+ className
985
+ }) {
986
+ return /* @__PURE__ */ jsx(
987
+ "footer",
988
+ {
989
+ className: cn(
990
+ "w-full border-t-4 bg-background px-6 py-12 text-foreground",
991
+ className
992
+ ),
993
+ style: { borderTopColor: "hsl(var(--brand))" },
994
+ children: /* @__PURE__ */ jsxs("div", { className: "brutal-container", children: [
995
+ variant === "newsletter" && newsletter && /* @__PURE__ */ jsx(NewsletterSection, { newsletter }),
996
+ variant === "minimal" ? /* @__PURE__ */ jsx(MinimalContent, { logo, columns, socials }) : /* @__PURE__ */ jsx(
997
+ MegaContent,
998
+ {
999
+ logo,
1000
+ tagline,
1001
+ columns,
1002
+ socials
1003
+ }
1004
+ ),
1005
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-t-brutal border-foreground pt-6 font-mono text-xs uppercase tracking-widest text-muted-foreground", children: [
1006
+ /* @__PURE__ */ jsx("span", { children: bottomLeft || "Built with care" }),
1007
+ /* @__PURE__ */ jsx("span", { children: bottomRight || (/* @__PURE__ */ new Date()).getFullYear() })
1008
+ ] })
1009
+ ] })
1010
+ }
1011
+ );
1012
+ }
1013
+ function StudioTemplate({
1014
+ logo,
1015
+ nav,
1016
+ hero,
1017
+ features,
1018
+ testimonials,
1019
+ newsletter,
1020
+ cta,
1021
+ footer
1022
+ }) {
1023
+ return /* @__PURE__ */ jsxs("div", { children: [
1024
+ /* @__PURE__ */ jsx(BrutalNav, { logo, links: nav.links, ctaText: nav.ctaText, ctaHref: nav.ctaHref, variant: "floating-pill" }),
1025
+ /* @__PURE__ */ jsx(
1026
+ BrutalHero,
1027
+ {
1028
+ variant: "asymmetric",
1029
+ badge: hero.badge,
1030
+ headline: hero.headline,
1031
+ description: hero.description,
1032
+ ctaText: hero.ctaText,
1033
+ ctaHref: hero.ctaHref,
1034
+ visual: hero.visual,
1035
+ proof: hero.proof,
1036
+ color: "brand",
1037
+ pattern: "grain"
1038
+ }
1039
+ ),
1040
+ /* @__PURE__ */ jsx(SectionDivider, { from: "hsl(var(--brand))", to: "hsl(var(--background))", variant: "brush-stroke" }),
1041
+ /* @__PURE__ */ jsx(
1042
+ BrutalFeatureGrid,
1043
+ {
1044
+ variant: "numbered",
1045
+ badge: features.badge,
1046
+ headline: features.headline,
1047
+ description: features.description,
1048
+ features: features.items,
1049
+ color: "white"
1050
+ }
1051
+ ),
1052
+ testimonials && /* @__PURE__ */ jsxs(Fragment, { children: [
1053
+ /* @__PURE__ */ jsx(SectionDivider, { from: "hsl(var(--background))", to: "hsl(var(--brand-muted))", variant: "diagonal" }),
1054
+ /* @__PURE__ */ jsx(
1055
+ BrutalTestimonials,
1056
+ {
1057
+ variant: "featured-grid",
1058
+ badge: testimonials.badge,
1059
+ headline: testimonials.headline,
1060
+ testimonials: testimonials.items,
1061
+ color: "brand-muted"
1062
+ }
1063
+ ),
1064
+ /* @__PURE__ */ jsx(SectionDivider, { from: "hsl(var(--brand-muted))", to: "hsl(var(--background))", variant: "diagonal", flip: true })
1065
+ ] }),
1066
+ newsletter && /* @__PURE__ */ jsx(
1067
+ Newsletter,
1068
+ {
1069
+ headline: newsletter.headline,
1070
+ description: newsletter.description,
1071
+ onSubmit: newsletter.onSubmit
1072
+ }
1073
+ ),
1074
+ /* @__PURE__ */ jsx(
1075
+ BrutalCTA,
1076
+ {
1077
+ variant: "floating-card",
1078
+ headline: cta.headline,
1079
+ description: cta.description,
1080
+ ctaText: cta.ctaText,
1081
+ ctaHref: cta.ctaHref,
1082
+ color: "brand"
1083
+ }
1084
+ ),
1085
+ /* @__PURE__ */ jsx(
1086
+ BrutalFooter,
1087
+ {
1088
+ variant: "minimal",
1089
+ logo,
1090
+ tagline: footer.tagline,
1091
+ columns: footer.columns
1092
+ }
1093
+ )
1094
+ ] });
1095
+ }
1096
+
1097
+ export { StudioTemplate };
1098
+ //# sourceMappingURL=studio.js.map
1099
+ //# sourceMappingURL=studio.js.map