@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.
- package/dist/components/brutal/cta-section.d.ts +7 -2
- package/dist/components/brutal/cta-section.js +253 -4
- package/dist/components/brutal/cta-section.js.map +1 -1
- package/dist/components/brutal/faq.d.ts +16 -0
- package/dist/components/brutal/faq.js +166 -0
- package/dist/components/brutal/faq.js.map +1 -0
- package/dist/components/brutal/feature-grid.d.ts +5 -1
- package/dist/components/brutal/feature-grid.js +238 -4
- package/dist/components/brutal/feature-grid.js.map +1 -1
- package/dist/components/brutal/footer.d.ts +14 -1
- package/dist/components/brutal/footer.js +215 -2
- package/dist/components/brutal/footer.js.map +1 -1
- package/dist/components/brutal/hero.d.ts +8 -1
- package/dist/components/brutal/hero.js +197 -4
- package/dist/components/brutal/hero.js.map +1 -1
- package/dist/components/brutal/index.d.ts +7 -2
- package/dist/components/brutal/index.js +1393 -12
- package/dist/components/brutal/index.js.map +1 -1
- package/dist/components/brutal/integration-grid.js +105 -3
- package/dist/components/brutal/integration-grid.js.map +1 -1
- package/dist/components/brutal/logo-cloud.d.ts +17 -0
- package/dist/components/brutal/logo-cloud.js +96 -0
- package/dist/components/brutal/logo-cloud.js.map +1 -0
- package/dist/components/brutal/nav.d.ts +3 -1
- package/dist/components/brutal/nav.js +258 -3
- package/dist/components/brutal/nav.js.map +1 -1
- package/dist/components/brutal/newsletter.d.ts +14 -0
- package/dist/components/brutal/newsletter.js +172 -0
- package/dist/components/brutal/newsletter.js.map +1 -0
- package/dist/components/brutal/pricing-table.d.ts +27 -0
- package/dist/components/brutal/pricing-table.js +254 -0
- package/dist/components/brutal/pricing-table.js.map +1 -0
- package/dist/components/brutal/section-divider.d.ts +14 -0
- package/dist/components/brutal/section-divider.js +70 -0
- package/dist/components/brutal/section-divider.js.map +1 -0
- package/dist/components/brutal/section.d.ts +6 -2
- package/dist/components/brutal/section.js +67 -2
- package/dist/components/brutal/section.js.map +1 -1
- package/dist/components/brutal/stats-bar.d.ts +16 -0
- package/dist/components/brutal/stats-bar.js +130 -0
- package/dist/components/brutal/stats-bar.js.map +1 -0
- package/dist/components/brutal/testimonials.d.ts +11 -3
- package/dist/components/brutal/testimonials.js +192 -3
- package/dist/components/brutal/testimonials.js.map +1 -1
- package/dist/components/brutal/wave-divider.d.ts +2 -12
- package/dist/components/brutal/wave-divider.js +68 -1
- package/dist/components/brutal/wave-divider.js.map +1 -1
- package/dist/components/dashboard/activity-feed.d.ts +18 -0
- package/dist/components/dashboard/activity-feed.js +105 -0
- package/dist/components/dashboard/activity-feed.js.map +1 -0
- package/dist/components/dashboard/app-shell.d.ts +19 -0
- package/dist/components/dashboard/app-shell.js +206 -0
- package/dist/components/dashboard/app-shell.js.map +1 -0
- package/dist/components/dashboard/empty-state.d.ts +14 -0
- package/dist/{chunk-CY2FOBOD.js → components/dashboard/empty-state.js} +36 -5
- package/dist/components/dashboard/empty-state.js.map +1 -0
- package/dist/components/dashboard/file-upload.d.ts +12 -0
- package/dist/components/dashboard/file-upload.js +86 -0
- package/dist/components/dashboard/file-upload.js.map +1 -0
- package/dist/components/dashboard/index.d.ts +10 -0
- package/dist/components/dashboard/index.js +755 -0
- package/dist/components/dashboard/index.js.map +1 -0
- package/dist/components/dashboard/search-bar.d.ts +12 -0
- package/dist/components/dashboard/search-bar.js +49 -0
- package/dist/components/dashboard/search-bar.js.map +1 -0
- package/dist/components/dashboard/sidebar.d.ts +23 -0
- package/dist/components/dashboard/sidebar.js +113 -0
- package/dist/components/dashboard/sidebar.js.map +1 -0
- package/dist/components/dashboard/stat-card.d.ts +13 -0
- package/dist/components/dashboard/stat-card.js +55 -0
- package/dist/components/dashboard/stat-card.js.map +1 -0
- package/dist/components/dashboard/user-menu.d.ts +16 -0
- package/dist/components/dashboard/user-menu.js +179 -0
- package/dist/components/dashboard/user-menu.js.map +1 -0
- package/dist/components/dashboard/view-switcher.d.ts +12 -0
- package/dist/{chunk-OCSYB6YE.js → components/dashboard/view-switcher.js} +57 -5
- package/dist/components/dashboard/view-switcher.js.map +1 -0
- package/dist/components/ui/accordion.js +78 -2
- package/dist/components/ui/accordion.js.map +1 -1
- package/dist/components/ui/alert.js +80 -2
- package/dist/components/ui/alert.js.map +1 -1
- package/dist/components/ui/avatar.js +103 -2
- package/dist/components/ui/avatar.js.map +1 -1
- package/dist/components/ui/badge.d.ts +1 -1
- package/dist/components/ui/badge.js +55 -2
- package/dist/components/ui/badge.js.map +1 -1
- package/dist/components/ui/breadcrumb.js +122 -2
- package/dist/components/ui/breadcrumb.js.map +1 -1
- package/dist/components/ui/button.d.ts +1 -1
- package/dist/components/ui/button.js +68 -2
- package/dist/components/ui/button.js.map +1 -1
- package/dist/components/ui/card.js +90 -2
- package/dist/components/ui/card.js.map +1 -1
- package/dist/components/ui/checkbox.js +36 -2
- package/dist/components/ui/checkbox.js.map +1 -1
- package/dist/components/ui/collapsible.js +15 -1
- package/dist/components/ui/collapsible.js.map +1 -1
- package/dist/components/ui/command.js +399 -7
- package/dist/components/ui/command.js.map +1 -1
- package/dist/components/ui/context-menu.js +232 -2
- package/dist/components/ui/context-menu.js.map +1 -1
- package/dist/components/ui/dialog.js +201 -3
- package/dist/components/ui/dialog.js.map +1 -1
- package/dist/components/ui/drawer.js +118 -2
- package/dist/components/ui/drawer.js.map +1 -1
- package/dist/components/ui/dropdown-menu.js +242 -2
- package/dist/components/ui/dropdown-menu.js.map +1 -1
- package/dist/components/ui/hover-card.js +47 -2
- package/dist/components/ui/hover-card.js.map +1 -1
- package/dist/components/ui/input-group.js +226 -5
- package/dist/components/ui/input-group.js.map +1 -1
- package/dist/components/ui/input.js +26 -2
- package/dist/components/ui/input.js.map +1 -1
- package/dist/components/ui/label.js +23 -2
- package/dist/components/ui/label.js.map +1 -1
- package/dist/components/ui/menubar.js +398 -3
- package/dist/components/ui/menubar.js.map +1 -1
- package/dist/components/ui/navigation-menu.js +160 -2
- package/dist/components/ui/navigation-menu.js.map +1 -1
- package/dist/components/ui/pagination.js +185 -3
- package/dist/components/ui/pagination.js.map +1 -1
- package/dist/components/ui/popover.js +80 -2
- package/dist/components/ui/popover.js.map +1 -1
- package/dist/components/ui/progress.js +80 -2
- package/dist/components/ui/progress.js.map +1 -1
- package/dist/components/ui/radio-group.js +43 -2
- package/dist/components/ui/radio-group.js.map +1 -1
- package/dist/components/ui/scroll-area.js +63 -2
- package/dist/components/ui/scroll-area.js.map +1 -1
- package/dist/components/ui/select.js +190 -2
- package/dist/components/ui/select.js.map +1 -1
- package/dist/components/ui/separator.js +29 -2
- package/dist/components/ui/separator.js.map +1 -1
- package/dist/components/ui/sheet.js +185 -3
- package/dist/components/ui/sheet.js.map +1 -1
- package/dist/components/ui/skeleton.js +21 -2
- package/dist/components/ui/skeleton.js.map +1 -1
- package/dist/components/ui/slider.js +62 -2
- package/dist/components/ui/slider.js.map +1 -1
- package/dist/components/ui/switch.js +36 -2
- package/dist/components/ui/switch.js.map +1 -1
- package/dist/components/ui/tabs.d.ts +1 -1
- package/dist/components/ui/tabs.js +85 -2
- package/dist/components/ui/tabs.js.map +1 -1
- package/dist/components/ui/textarea.js +24 -2
- package/dist/components/ui/textarea.js.map +1 -1
- package/dist/components/ui/toggle-group.js +101 -3
- package/dist/components/ui/toggle-group.js.map +1 -1
- package/dist/components/ui/toggle.js +47 -2
- package/dist/components/ui/toggle.js.map +1 -1
- package/dist/components/ui/tooltip.js +65 -2
- package/dist/components/ui/tooltip.js.map +1 -1
- package/dist/components/views/calendar-view.d.ts +17 -0
- package/dist/components/views/calendar-view.js +182 -0
- package/dist/components/views/calendar-view.js.map +1 -0
- package/dist/components/views/data-table.d.ts +15 -0
- package/dist/components/views/data-table.js +204 -0
- package/dist/components/views/data-table.js.map +1 -0
- package/dist/components/views/grid-view.d.ts +11 -0
- package/dist/components/views/grid-view.js +31 -0
- package/dist/components/views/grid-view.js.map +1 -0
- package/dist/components/views/index.d.ts +7 -0
- package/dist/components/views/index.js +542 -0
- package/dist/components/views/index.js.map +1 -0
- package/dist/components/views/kanban-board.d.ts +21 -0
- package/dist/components/views/kanban-board.js +153 -0
- package/dist/components/views/kanban-board.js.map +1 -0
- package/dist/components/views/list-view.d.ts +19 -0
- package/dist/components/views/list-view.js +96 -0
- package/dist/components/views/list-view.js.map +1 -0
- package/dist/index.d.ts +27 -3
- package/dist/index.js +4957 -46
- package/dist/index.js.map +1 -1
- package/dist/lib/animations.d.ts +68 -0
- package/dist/lib/animations.js +44 -0
- package/dist/lib/animations.js.map +1 -0
- package/dist/lib/utils.js +10 -1
- package/dist/lib/utils.js.map +1 -1
- package/dist/templates/dashboard.d.ts +40 -0
- package/dist/templates/dashboard.js +658 -0
- package/dist/templates/dashboard.js.map +1 -0
- package/dist/templates/index.d.ts +4 -0
- package/dist/templates/index.js +2031 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/saas-launch.d.ts +113 -0
- package/dist/templates/saas-launch.js +1424 -0
- package/dist/templates/saas-launch.js.map +1 -0
- package/dist/templates/studio.d.ts +72 -0
- package/dist/templates/studio.js +1129 -0
- package/dist/templates/studio.js.map +1 -0
- package/dist/theme.css +53 -0
- package/package.json +48 -2
- package/dist/chunk-3HN3QP23.js +0 -44
- package/dist/chunk-3HN3QP23.js.map +0 -1
- package/dist/chunk-4A3EQV6F.js +0 -76
- package/dist/chunk-4A3EQV6F.js.map +0 -1
- package/dist/chunk-53KZXLG4.js +0 -100
- package/dist/chunk-53KZXLG4.js.map +0 -1
- package/dist/chunk-5JCN6EQG.js +0 -60
- package/dist/chunk-5JCN6EQG.js.map +0 -1
- package/dist/chunk-5JEBZUEI.js +0 -20
- package/dist/chunk-5JEBZUEI.js.map +0 -1
- package/dist/chunk-6APJMAO7.js +0 -44
- package/dist/chunk-6APJMAO7.js.map +0 -1
- package/dist/chunk-6UKMYVHC.js +0 -187
- package/dist/chunk-6UKMYVHC.js.map +0 -1
- package/dist/chunk-7FVJ36BQ.js +0 -239
- package/dist/chunk-7FVJ36BQ.js.map +0 -1
- package/dist/chunk-7I7XYB7H.js +0 -44
- package/dist/chunk-7I7XYB7H.js.map +0 -1
- package/dist/chunk-A5KONGTJ.js +0 -49
- package/dist/chunk-A5KONGTJ.js.map +0 -1
- package/dist/chunk-AHUC5AID.js +0 -40
- package/dist/chunk-AHUC5AID.js.map +0 -1
- package/dist/chunk-B6UM5GHF.js +0 -20
- package/dist/chunk-B6UM5GHF.js.map +0 -1
- package/dist/chunk-BAUUM52T.js +0 -234
- package/dist/chunk-BAUUM52T.js.map +0 -1
- package/dist/chunk-BDWCMMEI.js +0 -82
- package/dist/chunk-BDWCMMEI.js.map +0 -1
- package/dist/chunk-BSVJVM2L.js +0 -52
- package/dist/chunk-BSVJVM2L.js.map +0 -1
- package/dist/chunk-CPVH3LD5.js +0 -86
- package/dist/chunk-CPVH3LD5.js.map +0 -1
- package/dist/chunk-CY2FOBOD.js.map +0 -1
- package/dist/chunk-DJTTNICL.js +0 -40
- package/dist/chunk-DJTTNICL.js.map +0 -1
- package/dist/chunk-F2E32OOJ.js +0 -38
- package/dist/chunk-F2E32OOJ.js.map +0 -1
- package/dist/chunk-F7YWBVP6.js +0 -141
- package/dist/chunk-F7YWBVP6.js.map +0 -1
- package/dist/chunk-G7JMADLU.js +0 -167
- package/dist/chunk-G7JMADLU.js.map +0 -1
- package/dist/chunk-GKCLNHVQ.js +0 -124
- package/dist/chunk-GKCLNHVQ.js.map +0 -1
- package/dist/chunk-GQBWKH72.js +0 -33
- package/dist/chunk-GQBWKH72.js.map +0 -1
- package/dist/chunk-H6SOU4UG.js +0 -10
- package/dist/chunk-H6SOU4UG.js.map +0 -1
- package/dist/chunk-HKJJHYFX.js +0 -115
- package/dist/chunk-HKJJHYFX.js.map +0 -1
- package/dist/chunk-IQ5WXHRB.js +0 -16
- package/dist/chunk-IQ5WXHRB.js.map +0 -1
- package/dist/chunk-ISZQ5TSG.js +0 -26
- package/dist/chunk-ISZQ5TSG.js.map +0 -1
- package/dist/chunk-JSYGVDO6.js +0 -41
- package/dist/chunk-JSYGVDO6.js.map +0 -1
- package/dist/chunk-KY6GKED2.js +0 -229
- package/dist/chunk-KY6GKED2.js.map +0 -1
- package/dist/chunk-L5OPCX6F.js +0 -33
- package/dist/chunk-L5OPCX6F.js.map +0 -1
- package/dist/chunk-LLMBKOKT.js +0 -44
- package/dist/chunk-LLMBKOKT.js.map +0 -1
- package/dist/chunk-MKBO4S2O.js +0 -48
- package/dist/chunk-MKBO4S2O.js.map +0 -1
- package/dist/chunk-NMQRI5G5.js +0 -48
- package/dist/chunk-NMQRI5G5.js.map +0 -1
- package/dist/chunk-OCSYB6YE.js.map +0 -1
- package/dist/chunk-OILW3ESA.js +0 -62
- package/dist/chunk-OILW3ESA.js.map +0 -1
- package/dist/chunk-PCVJLIUU.js +0 -125
- package/dist/chunk-PCVJLIUU.js.map +0 -1
- package/dist/chunk-RXSDAOF7.js +0 -45
- package/dist/chunk-RXSDAOF7.js.map +0 -1
- package/dist/chunk-RZD2P2BD.js +0 -77
- package/dist/chunk-RZD2P2BD.js.map +0 -1
- package/dist/chunk-UL52C2UU.js +0 -22
- package/dist/chunk-UL52C2UU.js.map +0 -1
- package/dist/chunk-USFQYYSE.js +0 -118
- package/dist/chunk-USFQYYSE.js.map +0 -1
- package/dist/chunk-UW3CSNPH.js +0 -77
- package/dist/chunk-UW3CSNPH.js.map +0 -1
- package/dist/chunk-V2ORCFEN.js +0 -156
- package/dist/chunk-V2ORCFEN.js.map +0 -1
- package/dist/chunk-WQO7NSII.js +0 -141
- package/dist/chunk-WQO7NSII.js.map +0 -1
- package/dist/chunk-WXHK2EIV.js +0 -75
- package/dist/chunk-WXHK2EIV.js.map +0 -1
- package/dist/chunk-Y6W3YC3K.js +0 -17
- package/dist/chunk-Y6W3YC3K.js.map +0 -1
- package/dist/chunk-ZRVEDPQA.js +0 -59
- package/dist/chunk-ZRVEDPQA.js.map +0 -1
|
@@ -1,14 +1,1395 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import '
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
import '
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
import '
|
|
1
|
+
"use client";
|
|
2
|
+
import { clsx } from 'clsx';
|
|
3
|
+
import { twMerge } from 'tailwind-merge';
|
|
4
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
5
|
+
import { Button as Button$1 } from '@base-ui/react/button';
|
|
6
|
+
import { cva } from 'class-variance-authority';
|
|
7
|
+
import { useState, useEffect, useRef } from 'react';
|
|
8
|
+
import { Dialog } from '@base-ui/react/dialog';
|
|
9
|
+
import { Menu, XIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react';
|
|
10
|
+
import { Input as Input$1 } from '@base-ui/react/input';
|
|
11
|
+
import { mergeProps } from '@base-ui/react/merge-props';
|
|
12
|
+
import { useRender } from '@base-ui/react/use-render';
|
|
13
|
+
import { Accordion as Accordion$1 } from '@base-ui/react/accordion';
|
|
14
|
+
|
|
15
|
+
// src/lib/utils.ts
|
|
16
|
+
function cn(...inputs) {
|
|
17
|
+
return twMerge(clsx(inputs));
|
|
18
|
+
}
|
|
19
|
+
var colorMap = {
|
|
20
|
+
white: "bg-background text-foreground",
|
|
21
|
+
brand: "bg-brand",
|
|
22
|
+
"brand-muted": "bg-brand-muted text-foreground",
|
|
23
|
+
blue: "bg-section-blue",
|
|
24
|
+
gray: "bg-section-gray text-foreground",
|
|
25
|
+
cream: "bg-section-cream text-foreground",
|
|
26
|
+
black: "bg-foreground text-background",
|
|
27
|
+
cta: "bg-cta"
|
|
28
|
+
};
|
|
29
|
+
var containerMap = {
|
|
30
|
+
sm: "brutal-container-sm",
|
|
31
|
+
default: "brutal-container",
|
|
32
|
+
lg: "brutal-container-lg"
|
|
33
|
+
};
|
|
34
|
+
var paddingMap = {
|
|
35
|
+
sm: "brutal-section-sm",
|
|
36
|
+
default: "brutal-section",
|
|
37
|
+
lg: "brutal-section py-28 sm:py-36 md:py-44"
|
|
38
|
+
};
|
|
39
|
+
var patternMap = {
|
|
40
|
+
dots: "brutal-dots",
|
|
41
|
+
stripes: "brutal-stripes",
|
|
42
|
+
noise: "brutal-noise",
|
|
43
|
+
grain: "brutal-grain",
|
|
44
|
+
crosshatch: "brutal-crosshatch",
|
|
45
|
+
"grid-dots": "brutal-grid-dots",
|
|
46
|
+
"gradient-mesh": "brutal-gradient-mesh",
|
|
47
|
+
none: ""
|
|
48
|
+
};
|
|
49
|
+
function BrutalSection({
|
|
50
|
+
children,
|
|
51
|
+
color = "white",
|
|
52
|
+
className,
|
|
53
|
+
containerSize = "default",
|
|
54
|
+
padding = "default",
|
|
55
|
+
pattern,
|
|
56
|
+
dots = false,
|
|
57
|
+
stripes = false,
|
|
58
|
+
id
|
|
59
|
+
}) {
|
|
60
|
+
const resolvedPattern = pattern ?? (dots ? "dots" : void 0) ?? (stripes ? "stripes" : void 0) ?? "none";
|
|
61
|
+
return /* @__PURE__ */ jsx(
|
|
62
|
+
"section",
|
|
63
|
+
{
|
|
64
|
+
id,
|
|
65
|
+
className: cn(
|
|
66
|
+
paddingMap[padding],
|
|
67
|
+
colorMap[color],
|
|
68
|
+
patternMap[resolvedPattern],
|
|
69
|
+
className
|
|
70
|
+
),
|
|
71
|
+
children: /* @__PURE__ */ jsx("div", { className: containerMap[containerSize], children })
|
|
72
|
+
}
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
var paths = {
|
|
76
|
+
wave: "M0,64 C160,128 320,0 480,64 C640,128 800,0 960,64 L960,160 L0,160 Z",
|
|
77
|
+
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",
|
|
78
|
+
curve: "M0,128 Q480,-32 960,128 L960,160 L0,160 Z",
|
|
79
|
+
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",
|
|
80
|
+
"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",
|
|
81
|
+
"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",
|
|
82
|
+
geometric: "M0,100 L120,60 L240,80 L360,40 L480,90 L600,50 L720,70 L840,30 L960,80 L960,160 L0,160 Z",
|
|
83
|
+
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",
|
|
84
|
+
diagonal: "M0,160 L960,60 L960,160 Z",
|
|
85
|
+
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",
|
|
86
|
+
"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"
|
|
87
|
+
};
|
|
88
|
+
function SectionDivider({
|
|
89
|
+
from = "hsl(var(--background))",
|
|
90
|
+
to = "hsl(var(--background))",
|
|
91
|
+
flip = false,
|
|
92
|
+
className = "",
|
|
93
|
+
variant = "wave",
|
|
94
|
+
layers = false
|
|
95
|
+
}) {
|
|
96
|
+
return /* @__PURE__ */ jsxs(
|
|
97
|
+
"div",
|
|
98
|
+
{
|
|
99
|
+
className: cn("relative -my-px w-full overflow-hidden", className),
|
|
100
|
+
style: { backgroundColor: from },
|
|
101
|
+
children: [
|
|
102
|
+
layers && /* @__PURE__ */ jsx(
|
|
103
|
+
"svg",
|
|
104
|
+
{
|
|
105
|
+
viewBox: "0 0 960 160",
|
|
106
|
+
preserveAspectRatio: "none",
|
|
107
|
+
className: "absolute inset-0 block w-full opacity-30",
|
|
108
|
+
style: {
|
|
109
|
+
height: "clamp(40px, 6vw, 80px)",
|
|
110
|
+
transform: flip ? "scaleY(-1) translateY(4px)" : "translateY(-4px)"
|
|
111
|
+
},
|
|
112
|
+
children: /* @__PURE__ */ jsx("path", { d: paths[variant], fill: to })
|
|
113
|
+
}
|
|
114
|
+
),
|
|
115
|
+
/* @__PURE__ */ jsx(
|
|
116
|
+
"svg",
|
|
117
|
+
{
|
|
118
|
+
viewBox: "0 0 960 160",
|
|
119
|
+
preserveAspectRatio: "none",
|
|
120
|
+
className: "relative block w-full",
|
|
121
|
+
style: {
|
|
122
|
+
height: "clamp(40px, 6vw, 80px)",
|
|
123
|
+
transform: flip ? "scaleY(-1)" : void 0
|
|
124
|
+
},
|
|
125
|
+
children: /* @__PURE__ */ jsx("path", { d: paths[variant], fill: to })
|
|
126
|
+
}
|
|
127
|
+
)
|
|
128
|
+
]
|
|
129
|
+
}
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
var buttonVariants = cva(
|
|
133
|
+
"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",
|
|
134
|
+
{
|
|
135
|
+
variants: {
|
|
136
|
+
variant: {
|
|
137
|
+
// Primary: Black bg, white text, offset shadow
|
|
138
|
+
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",
|
|
139
|
+
// CTA: Mint green bg — the Bannerbear signature
|
|
140
|
+
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",
|
|
141
|
+
// Brand: Dynamic brand color bg
|
|
142
|
+
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",
|
|
143
|
+
// Outline: White bg, black border, offset shadow
|
|
144
|
+
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",
|
|
145
|
+
// Secondary: Light bg, border, smaller shadow
|
|
146
|
+
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",
|
|
147
|
+
// Ghost: No border/shadow, subtle hover
|
|
148
|
+
ghost: "hover:bg-secondary hover:text-foreground",
|
|
149
|
+
// Link: Text only
|
|
150
|
+
link: "text-foreground underline-offset-4 hover:underline",
|
|
151
|
+
// Destructive
|
|
152
|
+
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",
|
|
153
|
+
// Nav: Thin border, no shadow (for nav Sign In buttons)
|
|
154
|
+
nav: "border border-foreground bg-background text-foreground hover:bg-foreground hover:text-background"
|
|
155
|
+
},
|
|
156
|
+
size: {
|
|
157
|
+
xs: "h-7 gap-1 px-2.5 text-xs",
|
|
158
|
+
sm: "h-8 gap-1.5 px-3 text-sm",
|
|
159
|
+
default: "h-10 gap-2 px-5 text-sm",
|
|
160
|
+
lg: "h-12 gap-2 px-7 text-base",
|
|
161
|
+
xl: "h-14 gap-2.5 px-9 text-lg",
|
|
162
|
+
icon: "size-10",
|
|
163
|
+
"icon-sm": "size-8",
|
|
164
|
+
"icon-lg": "size-12"
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
defaultVariants: {
|
|
168
|
+
variant: "default",
|
|
169
|
+
size: "default"
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
);
|
|
173
|
+
function Button({
|
|
174
|
+
className,
|
|
175
|
+
variant = "default",
|
|
176
|
+
size = "default",
|
|
177
|
+
...props
|
|
178
|
+
}) {
|
|
179
|
+
return /* @__PURE__ */ jsx(
|
|
180
|
+
Button$1,
|
|
181
|
+
{
|
|
182
|
+
"data-slot": "button",
|
|
183
|
+
className: cn(buttonVariants({ variant, size, className })),
|
|
184
|
+
...props
|
|
185
|
+
}
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
function BrutalHero({
|
|
189
|
+
variant = "split",
|
|
190
|
+
badge,
|
|
191
|
+
badgePosition = "above",
|
|
192
|
+
headline,
|
|
193
|
+
description,
|
|
194
|
+
ctaText,
|
|
195
|
+
ctaHref = "#",
|
|
196
|
+
ctaVariant = "cta",
|
|
197
|
+
secondaryText,
|
|
198
|
+
secondaryHref,
|
|
199
|
+
visual,
|
|
200
|
+
color = "brand",
|
|
201
|
+
pattern,
|
|
202
|
+
proof,
|
|
203
|
+
className
|
|
204
|
+
}) {
|
|
205
|
+
const badgeElement = badge && /* @__PURE__ */ jsx(
|
|
206
|
+
"div",
|
|
207
|
+
{
|
|
208
|
+
className: cn(
|
|
209
|
+
"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",
|
|
210
|
+
badgePosition === "floating" && "absolute -top-3 left-6 z-10"
|
|
211
|
+
),
|
|
212
|
+
children: badge
|
|
213
|
+
}
|
|
214
|
+
);
|
|
215
|
+
const textContent = /* @__PURE__ */ jsxs("div", { className: cn(
|
|
216
|
+
"flex flex-col gap-6",
|
|
217
|
+
variant === "centered" && "items-center text-center"
|
|
218
|
+
), children: [
|
|
219
|
+
badgePosition === "above" && badgeElement,
|
|
220
|
+
/* @__PURE__ */ jsxs("h1", { className: cn(
|
|
221
|
+
"brutal-display text-balance",
|
|
222
|
+
variant === "centered" && "mx-auto max-w-4xl"
|
|
223
|
+
), children: [
|
|
224
|
+
badgePosition === "inline" && badgeElement,
|
|
225
|
+
headline
|
|
226
|
+
] }),
|
|
227
|
+
/* @__PURE__ */ jsx("p", { className: cn(
|
|
228
|
+
"brutal-body-lg max-w-lg opacity-80",
|
|
229
|
+
variant === "centered" && "mx-auto"
|
|
230
|
+
), children: description }),
|
|
231
|
+
/* @__PURE__ */ jsxs("div", { className: cn(
|
|
232
|
+
"flex flex-wrap gap-4",
|
|
233
|
+
variant === "centered" && "justify-center"
|
|
234
|
+
), children: [
|
|
235
|
+
/* @__PURE__ */ jsx(Button, { variant: ctaVariant, size: "xl", render: /* @__PURE__ */ jsx("a", { href: ctaHref }), children: ctaText }),
|
|
236
|
+
secondaryText && /* @__PURE__ */ jsx(Button, { variant: "outline", size: "xl", render: /* @__PURE__ */ jsx("a", { href: secondaryHref || "#" }), children: secondaryText })
|
|
237
|
+
] }),
|
|
238
|
+
proof && /* @__PURE__ */ jsxs("p", { className: "flex items-center gap-2 text-sm font-medium opacity-70", children: [
|
|
239
|
+
/* @__PURE__ */ jsx("span", { className: "inline-flex size-5 items-center justify-center border border-current text-xs", children: "\u2713" }),
|
|
240
|
+
proof
|
|
241
|
+
] })
|
|
242
|
+
] });
|
|
243
|
+
const layoutClass = {
|
|
244
|
+
split: "grid items-center gap-12 lg:grid-cols-2 lg:gap-16",
|
|
245
|
+
centered: "flex flex-col items-center gap-12",
|
|
246
|
+
overlap: "relative",
|
|
247
|
+
asymmetric: "grid items-center gap-12 lg:grid-cols-[3fr_2fr] lg:gap-16"
|
|
248
|
+
}[variant];
|
|
249
|
+
return /* @__PURE__ */ jsxs(BrutalSection, { color, padding: "lg", pattern, className: cn("relative", className), children: [
|
|
250
|
+
badgePosition === "floating" && badgeElement,
|
|
251
|
+
/* @__PURE__ */ jsxs("div", { className: layoutClass, children: [
|
|
252
|
+
textContent,
|
|
253
|
+
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(
|
|
254
|
+
"flex items-center justify-center",
|
|
255
|
+
variant === "asymmetric" && "-rotate-2 transform"
|
|
256
|
+
), children: visual }) : null
|
|
257
|
+
] })
|
|
258
|
+
] });
|
|
259
|
+
}
|
|
260
|
+
function Card({
|
|
261
|
+
className,
|
|
262
|
+
...props
|
|
263
|
+
}) {
|
|
264
|
+
return /* @__PURE__ */ jsx(
|
|
265
|
+
"div",
|
|
266
|
+
{
|
|
267
|
+
"data-slot": "card",
|
|
268
|
+
className: cn(
|
|
269
|
+
"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",
|
|
270
|
+
className
|
|
271
|
+
),
|
|
272
|
+
...props
|
|
273
|
+
}
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
function CardHeader({ className, ...props }) {
|
|
277
|
+
return /* @__PURE__ */ jsx(
|
|
278
|
+
"div",
|
|
279
|
+
{
|
|
280
|
+
"data-slot": "card-header",
|
|
281
|
+
className: cn("flex flex-col gap-1", className),
|
|
282
|
+
...props
|
|
283
|
+
}
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
function CardTitle({ className, ...props }) {
|
|
287
|
+
return /* @__PURE__ */ jsx(
|
|
288
|
+
"div",
|
|
289
|
+
{
|
|
290
|
+
"data-slot": "card-title",
|
|
291
|
+
className: cn("text-lg font-bold leading-snug", className),
|
|
292
|
+
...props
|
|
293
|
+
}
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
function CardDescription({ className, ...props }) {
|
|
297
|
+
return /* @__PURE__ */ jsx(
|
|
298
|
+
"div",
|
|
299
|
+
{
|
|
300
|
+
"data-slot": "card-description",
|
|
301
|
+
className: cn("text-sm text-muted-foreground", className),
|
|
302
|
+
...props
|
|
303
|
+
}
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
function CardContent({ className, ...props }) {
|
|
307
|
+
return /* @__PURE__ */ jsx(
|
|
308
|
+
"div",
|
|
309
|
+
{
|
|
310
|
+
"data-slot": "card-content",
|
|
311
|
+
className: cn("", className),
|
|
312
|
+
...props
|
|
313
|
+
}
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
var accentColors = [
|
|
317
|
+
"hsl(var(--brand))",
|
|
318
|
+
"hsl(var(--cta))",
|
|
319
|
+
"hsl(var(--section-blue))",
|
|
320
|
+
"hsl(12 85% 62%)",
|
|
321
|
+
"hsl(260 55% 68%)",
|
|
322
|
+
"hsl(25 75% 48%)"
|
|
323
|
+
];
|
|
324
|
+
var colMap = {
|
|
325
|
+
2: "sm:grid-cols-2",
|
|
326
|
+
3: "sm:grid-cols-2 lg:grid-cols-3",
|
|
327
|
+
4: "sm:grid-cols-2 lg:grid-cols-4"
|
|
328
|
+
};
|
|
329
|
+
function BrutalFeatureGrid({
|
|
330
|
+
variant = "icon-top",
|
|
331
|
+
badge,
|
|
332
|
+
headline,
|
|
333
|
+
description,
|
|
334
|
+
features,
|
|
335
|
+
columns = 3,
|
|
336
|
+
color = "white",
|
|
337
|
+
className
|
|
338
|
+
}) {
|
|
339
|
+
return /* @__PURE__ */ jsxs(BrutalSection, { color, className, children: [
|
|
340
|
+
/* @__PURE__ */ jsxs("div", { className: "mb-12 max-w-2xl", children: [
|
|
341
|
+
badge && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-4 text-muted-foreground", children: badge }),
|
|
342
|
+
/* @__PURE__ */ jsx("h2", { className: "brutal-h2 mb-4", children: headline }),
|
|
343
|
+
description && /* @__PURE__ */ jsx("p", { className: "brutal-body text-muted-foreground", children: description })
|
|
344
|
+
] }),
|
|
345
|
+
/* @__PURE__ */ jsx(
|
|
346
|
+
"div",
|
|
347
|
+
{
|
|
348
|
+
className: cn(
|
|
349
|
+
"grid gap-6",
|
|
350
|
+
variant === "bento" ? "sm:grid-cols-2 lg:grid-cols-3" : colMap[columns]
|
|
351
|
+
),
|
|
352
|
+
children: features.map((feature, i) => /* @__PURE__ */ jsx(
|
|
353
|
+
FeatureCard,
|
|
354
|
+
{
|
|
355
|
+
feature,
|
|
356
|
+
variant,
|
|
357
|
+
index: i,
|
|
358
|
+
accentColor: accentColors[i % accentColors.length]
|
|
359
|
+
},
|
|
360
|
+
feature.title
|
|
361
|
+
))
|
|
362
|
+
}
|
|
363
|
+
)
|
|
364
|
+
] });
|
|
365
|
+
}
|
|
366
|
+
function FeatureCard({
|
|
367
|
+
feature,
|
|
368
|
+
variant,
|
|
369
|
+
index,
|
|
370
|
+
accentColor
|
|
371
|
+
}) {
|
|
372
|
+
const isBentoFeatured = variant === "bento" && feature.featured;
|
|
373
|
+
if (variant === "icon-left") {
|
|
374
|
+
return /* @__PURE__ */ jsxs(
|
|
375
|
+
"div",
|
|
376
|
+
{
|
|
377
|
+
className: "flex gap-4 border-brutal border-foreground bg-background p-5 shadow-brutal transition-all duration-150 hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg",
|
|
378
|
+
style: { borderLeftColor: accentColor, borderLeftWidth: "4px" },
|
|
379
|
+
children: [
|
|
380
|
+
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 }),
|
|
381
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
382
|
+
feature.stat && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-1 text-brand", children: feature.stat }),
|
|
383
|
+
/* @__PURE__ */ jsx("h3", { className: "brutal-h4 mb-1", children: feature.title }),
|
|
384
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: feature.description })
|
|
385
|
+
] })
|
|
386
|
+
]
|
|
387
|
+
}
|
|
388
|
+
);
|
|
389
|
+
}
|
|
390
|
+
if (variant === "numbered") {
|
|
391
|
+
return /* @__PURE__ */ jsxs(Card, { children: [
|
|
392
|
+
/* @__PURE__ */ jsxs(CardHeader, { children: [
|
|
393
|
+
/* @__PURE__ */ jsx(
|
|
394
|
+
"span",
|
|
395
|
+
{
|
|
396
|
+
className: "brutal-display mb-2 block opacity-15",
|
|
397
|
+
style: { color: accentColor },
|
|
398
|
+
children: String(index + 1).padStart(2, "0")
|
|
399
|
+
}
|
|
400
|
+
),
|
|
401
|
+
feature.stat && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-1 text-brand", children: feature.stat }),
|
|
402
|
+
/* @__PURE__ */ jsx(CardTitle, { children: feature.title })
|
|
403
|
+
] }),
|
|
404
|
+
/* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx(CardDescription, { children: feature.description }) })
|
|
405
|
+
] });
|
|
406
|
+
}
|
|
407
|
+
return /* @__PURE__ */ jsxs(
|
|
408
|
+
Card,
|
|
409
|
+
{
|
|
410
|
+
className: cn(
|
|
411
|
+
isBentoFeatured && "sm:col-span-2 bg-brand-muted"
|
|
412
|
+
),
|
|
413
|
+
children: [
|
|
414
|
+
/* @__PURE__ */ jsxs(CardHeader, { children: [
|
|
415
|
+
feature.icon && /* @__PURE__ */ jsx(
|
|
416
|
+
"div",
|
|
417
|
+
{
|
|
418
|
+
className: "mb-2 inline-flex size-12 items-center justify-center border-brutal border-foreground bg-brand-muted text-2xl shadow-brutal-sm",
|
|
419
|
+
style: { borderBottomColor: accentColor },
|
|
420
|
+
children: feature.icon
|
|
421
|
+
}
|
|
422
|
+
),
|
|
423
|
+
feature.stat && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-1 text-brand", children: feature.stat }),
|
|
424
|
+
/* @__PURE__ */ jsx(CardTitle, { children: feature.title })
|
|
425
|
+
] }),
|
|
426
|
+
/* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx(CardDescription, { children: feature.description }) })
|
|
427
|
+
]
|
|
428
|
+
}
|
|
429
|
+
);
|
|
430
|
+
}
|
|
431
|
+
function StarRating({ rating }) {
|
|
432
|
+
return /* @__PURE__ */ jsx("div", { className: "flex gap-0.5", children: Array.from({ length: 5 }, (_, i) => /* @__PURE__ */ jsx(
|
|
433
|
+
"span",
|
|
434
|
+
{
|
|
435
|
+
className: cn(
|
|
436
|
+
"text-sm",
|
|
437
|
+
i < rating ? "text-amber-500" : "text-foreground/20"
|
|
438
|
+
),
|
|
439
|
+
children: "\u2605"
|
|
440
|
+
},
|
|
441
|
+
i
|
|
442
|
+
)) });
|
|
443
|
+
}
|
|
444
|
+
function TestimonialCard({
|
|
445
|
+
t,
|
|
446
|
+
className
|
|
447
|
+
}) {
|
|
448
|
+
return /* @__PURE__ */ jsxs(
|
|
449
|
+
"div",
|
|
450
|
+
{
|
|
451
|
+
className: cn(
|
|
452
|
+
"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",
|
|
453
|
+
className
|
|
454
|
+
),
|
|
455
|
+
children: [
|
|
456
|
+
/* @__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" }),
|
|
457
|
+
t.rating && /* @__PURE__ */ jsx("div", { className: "mb-3", children: /* @__PURE__ */ jsx(StarRating, { rating: t.rating }) }),
|
|
458
|
+
/* @__PURE__ */ jsx("p", { className: "relative mb-4 text-sm leading-relaxed", children: t.text }),
|
|
459
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
460
|
+
t.avatar ? /* @__PURE__ */ jsx(
|
|
461
|
+
"img",
|
|
462
|
+
{
|
|
463
|
+
src: t.avatar,
|
|
464
|
+
alt: t.name,
|
|
465
|
+
className: "size-9 border-2 object-cover",
|
|
466
|
+
style: { borderColor: "hsl(var(--brand))" }
|
|
467
|
+
}
|
|
468
|
+
) : /* @__PURE__ */ jsx(
|
|
469
|
+
"div",
|
|
470
|
+
{
|
|
471
|
+
className: "flex size-9 items-center justify-center border-2 font-bold text-brand-foreground",
|
|
472
|
+
style: {
|
|
473
|
+
borderColor: "hsl(var(--brand))",
|
|
474
|
+
backgroundColor: "hsl(var(--brand))"
|
|
475
|
+
},
|
|
476
|
+
children: t.name[0]
|
|
477
|
+
}
|
|
478
|
+
),
|
|
479
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
480
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-bold", children: t.name }),
|
|
481
|
+
(t.role || t.company) && /* @__PURE__ */ jsxs("p", { className: "truncate text-xs text-muted-foreground", children: [
|
|
482
|
+
t.role,
|
|
483
|
+
t.role && t.company && " \xB7 ",
|
|
484
|
+
t.company
|
|
485
|
+
] }),
|
|
486
|
+
!t.role && !t.company && t.handle && /* @__PURE__ */ jsx("p", { className: "font-mono text-xs text-muted-foreground", children: t.handle })
|
|
487
|
+
] }),
|
|
488
|
+
t.companyLogo && /* @__PURE__ */ jsx(
|
|
489
|
+
"img",
|
|
490
|
+
{
|
|
491
|
+
src: t.companyLogo,
|
|
492
|
+
alt: t.company || "",
|
|
493
|
+
className: "h-5 object-contain opacity-60"
|
|
494
|
+
}
|
|
495
|
+
)
|
|
496
|
+
] })
|
|
497
|
+
]
|
|
498
|
+
}
|
|
499
|
+
);
|
|
500
|
+
}
|
|
501
|
+
function MasonryLayout({ testimonials }) {
|
|
502
|
+
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)) });
|
|
503
|
+
}
|
|
504
|
+
function FeaturedGridLayout({
|
|
505
|
+
testimonials
|
|
506
|
+
}) {
|
|
507
|
+
const featured = testimonials.find((t) => t.featured) || testimonials[0];
|
|
508
|
+
const rest = testimonials.filter((t) => t !== featured);
|
|
509
|
+
return /* @__PURE__ */ jsxs("div", { className: "grid gap-6 lg:grid-cols-2", children: [
|
|
510
|
+
featured && /* @__PURE__ */ jsx(
|
|
511
|
+
TestimonialCard,
|
|
512
|
+
{
|
|
513
|
+
t: featured,
|
|
514
|
+
className: "flex flex-col justify-between p-8 lg:row-span-2"
|
|
515
|
+
}
|
|
516
|
+
),
|
|
517
|
+
rest.map((t, i) => /* @__PURE__ */ jsx(TestimonialCard, { t }, i))
|
|
518
|
+
] });
|
|
519
|
+
}
|
|
520
|
+
function CarouselLayout({ testimonials }) {
|
|
521
|
+
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(
|
|
522
|
+
TestimonialCard,
|
|
523
|
+
{
|
|
524
|
+
t,
|
|
525
|
+
className: "w-80 flex-none snap-center"
|
|
526
|
+
},
|
|
527
|
+
i
|
|
528
|
+
)) });
|
|
529
|
+
}
|
|
530
|
+
function WallOfLoveLayout({ testimonials }) {
|
|
531
|
+
return /* @__PURE__ */ jsxs("div", { className: "relative max-h-[600px] overflow-hidden", children: [
|
|
532
|
+
/* @__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)) }),
|
|
533
|
+
/* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-x-0 bottom-0 h-32 bg-gradient-to-t from-background to-transparent" })
|
|
534
|
+
] });
|
|
535
|
+
}
|
|
536
|
+
function BrutalTestimonials({
|
|
537
|
+
badge,
|
|
538
|
+
headline,
|
|
539
|
+
testimonials,
|
|
540
|
+
variant = "masonry",
|
|
541
|
+
color = "blue",
|
|
542
|
+
pattern,
|
|
543
|
+
className
|
|
544
|
+
}) {
|
|
545
|
+
return /* @__PURE__ */ jsxs(BrutalSection, { color, pattern, className, children: [
|
|
546
|
+
(headline || badge) && /* @__PURE__ */ jsxs("div", { className: "mb-12 text-center", children: [
|
|
547
|
+
badge && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-4 opacity-70", children: badge }),
|
|
548
|
+
headline && /* @__PURE__ */ jsx("h2", { className: "brutal-h2", children: headline })
|
|
549
|
+
] }),
|
|
550
|
+
variant === "masonry" && /* @__PURE__ */ jsx(MasonryLayout, { testimonials }),
|
|
551
|
+
variant === "featured-grid" && /* @__PURE__ */ jsx(FeaturedGridLayout, { testimonials }),
|
|
552
|
+
variant === "carousel" && /* @__PURE__ */ jsx(CarouselLayout, { testimonials }),
|
|
553
|
+
variant === "wall-of-love" && /* @__PURE__ */ jsx(WallOfLoveLayout, { testimonials })
|
|
554
|
+
] });
|
|
555
|
+
}
|
|
556
|
+
function BrutalIntegrationGrid({
|
|
557
|
+
badge,
|
|
558
|
+
headline,
|
|
559
|
+
description,
|
|
560
|
+
integrations,
|
|
561
|
+
color = "brand",
|
|
562
|
+
className
|
|
563
|
+
}) {
|
|
564
|
+
return /* @__PURE__ */ jsxs(BrutalSection, { color, className, children: [
|
|
565
|
+
/* @__PURE__ */ jsxs("div", { className: "mb-12 text-center", children: [
|
|
566
|
+
badge && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-4 opacity-70", children: badge }),
|
|
567
|
+
/* @__PURE__ */ jsx("h2", { className: "brutal-h2 mb-4", children: headline }),
|
|
568
|
+
description && /* @__PURE__ */ jsx("p", { className: "brutal-body mx-auto max-w-lg text-muted-foreground", children: description })
|
|
569
|
+
] }),
|
|
570
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center justify-center gap-6", children: integrations.map((item) => {
|
|
571
|
+
const inner = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
572
|
+
/* @__PURE__ */ jsx("div", { className: "mb-2 flex size-14 items-center justify-center text-3xl", children: item.icon }),
|
|
573
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-bold", children: item.name })
|
|
574
|
+
] });
|
|
575
|
+
return item.href ? /* @__PURE__ */ jsx(
|
|
576
|
+
"a",
|
|
577
|
+
{
|
|
578
|
+
href: item.href,
|
|
579
|
+
className: "flex w-28 flex-col items-center border-brutal border-foreground bg-background p-4 text-foreground shadow-brutal transition-all duration-150 hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg",
|
|
580
|
+
children: inner
|
|
581
|
+
},
|
|
582
|
+
item.name
|
|
583
|
+
) : /* @__PURE__ */ jsx(
|
|
584
|
+
"div",
|
|
585
|
+
{
|
|
586
|
+
className: "flex w-28 flex-col items-center border-brutal border-foreground bg-background p-4 text-foreground shadow-brutal",
|
|
587
|
+
children: inner
|
|
588
|
+
},
|
|
589
|
+
item.name
|
|
590
|
+
);
|
|
591
|
+
}) })
|
|
592
|
+
] });
|
|
593
|
+
}
|
|
594
|
+
function CTAButtons({
|
|
595
|
+
ctaText,
|
|
596
|
+
ctaHref = "#",
|
|
597
|
+
ctaVariant = "cta",
|
|
598
|
+
secondaryText,
|
|
599
|
+
secondaryHref
|
|
600
|
+
}) {
|
|
601
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-center gap-4", children: [
|
|
602
|
+
/* @__PURE__ */ jsx(
|
|
603
|
+
Button,
|
|
604
|
+
{
|
|
605
|
+
variant: ctaVariant,
|
|
606
|
+
size: "xl",
|
|
607
|
+
render: /* @__PURE__ */ jsx("a", { href: ctaHref }),
|
|
608
|
+
children: ctaText
|
|
609
|
+
}
|
|
610
|
+
),
|
|
611
|
+
secondaryText && /* @__PURE__ */ jsx(
|
|
612
|
+
Button,
|
|
613
|
+
{
|
|
614
|
+
variant: "outline",
|
|
615
|
+
size: "lg",
|
|
616
|
+
render: /* @__PURE__ */ jsx("a", { href: secondaryHref || "#" }),
|
|
617
|
+
children: secondaryText
|
|
618
|
+
}
|
|
619
|
+
)
|
|
620
|
+
] });
|
|
621
|
+
}
|
|
622
|
+
function CenteredCTA(props) {
|
|
623
|
+
return /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-2xl text-center", children: [
|
|
624
|
+
/* @__PURE__ */ jsx("h2", { className: "brutal-h1 mb-6", children: props.headline }),
|
|
625
|
+
props.description && /* @__PURE__ */ jsx("p", { className: "brutal-body mb-4 opacity-80", children: props.description }),
|
|
626
|
+
props.stats && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-8 opacity-60", children: props.stats }),
|
|
627
|
+
/* @__PURE__ */ jsx(
|
|
628
|
+
CTAButtons,
|
|
629
|
+
{
|
|
630
|
+
ctaText: props.ctaText,
|
|
631
|
+
ctaHref: props.ctaHref,
|
|
632
|
+
ctaVariant: props.ctaVariant,
|
|
633
|
+
secondaryText: props.secondaryText,
|
|
634
|
+
secondaryHref: props.secondaryHref
|
|
635
|
+
}
|
|
636
|
+
)
|
|
637
|
+
] });
|
|
638
|
+
}
|
|
639
|
+
function SplitCTA(props) {
|
|
640
|
+
return /* @__PURE__ */ jsxs("div", { className: "grid items-center gap-12 lg:grid-cols-2", children: [
|
|
641
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
642
|
+
/* @__PURE__ */ jsx("h2", { className: "brutal-h1 mb-6", children: props.headline }),
|
|
643
|
+
props.description && /* @__PURE__ */ jsx("p", { className: "brutal-body mb-4 opacity-80", children: props.description }),
|
|
644
|
+
props.stats && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-8 opacity-60", children: props.stats }),
|
|
645
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-4", children: [
|
|
646
|
+
/* @__PURE__ */ jsx(
|
|
647
|
+
Button,
|
|
648
|
+
{
|
|
649
|
+
variant: props.ctaVariant || "cta",
|
|
650
|
+
size: "xl",
|
|
651
|
+
render: /* @__PURE__ */ jsx("a", { href: props.ctaHref || "#" }),
|
|
652
|
+
children: props.ctaText
|
|
653
|
+
}
|
|
654
|
+
),
|
|
655
|
+
props.secondaryText && /* @__PURE__ */ jsx(
|
|
656
|
+
Button,
|
|
657
|
+
{
|
|
658
|
+
variant: "outline",
|
|
659
|
+
size: "lg",
|
|
660
|
+
render: /* @__PURE__ */ jsx("a", { href: props.secondaryHref || "#" }),
|
|
661
|
+
children: props.secondaryText
|
|
662
|
+
}
|
|
663
|
+
)
|
|
664
|
+
] })
|
|
665
|
+
] }),
|
|
666
|
+
props.visual && /* @__PURE__ */ jsx("div", { children: props.visual })
|
|
667
|
+
] });
|
|
668
|
+
}
|
|
669
|
+
function WithVisualCTA(props) {
|
|
670
|
+
return /* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
671
|
+
props.visual && /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-center opacity-10", children: props.visual }),
|
|
672
|
+
/* @__PURE__ */ jsxs("div", { className: "relative mx-auto max-w-2xl text-center", children: [
|
|
673
|
+
/* @__PURE__ */ jsx("h2", { className: "brutal-h1 mb-6", children: props.headline }),
|
|
674
|
+
props.description && /* @__PURE__ */ jsx("p", { className: "brutal-body mb-4 opacity-80", children: props.description }),
|
|
675
|
+
props.stats && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-8 opacity-60", children: props.stats }),
|
|
676
|
+
/* @__PURE__ */ jsx(
|
|
677
|
+
CTAButtons,
|
|
678
|
+
{
|
|
679
|
+
ctaText: props.ctaText,
|
|
680
|
+
ctaHref: props.ctaHref,
|
|
681
|
+
ctaVariant: props.ctaVariant,
|
|
682
|
+
secondaryText: props.secondaryText,
|
|
683
|
+
secondaryHref: props.secondaryHref
|
|
684
|
+
}
|
|
685
|
+
)
|
|
686
|
+
] })
|
|
687
|
+
] });
|
|
688
|
+
}
|
|
689
|
+
function FloatingCardCTA(props) {
|
|
690
|
+
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: [
|
|
691
|
+
/* @__PURE__ */ jsx("h2", { className: "brutal-h1 mb-6", children: props.headline }),
|
|
692
|
+
props.description && /* @__PURE__ */ jsx("p", { className: "brutal-body mb-4 opacity-80", children: props.description }),
|
|
693
|
+
props.stats && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-8 opacity-60", children: props.stats }),
|
|
694
|
+
/* @__PURE__ */ jsx(
|
|
695
|
+
CTAButtons,
|
|
696
|
+
{
|
|
697
|
+
ctaText: props.ctaText,
|
|
698
|
+
ctaHref: props.ctaHref,
|
|
699
|
+
ctaVariant: props.ctaVariant,
|
|
700
|
+
secondaryText: props.secondaryText,
|
|
701
|
+
secondaryHref: props.secondaryHref
|
|
702
|
+
}
|
|
703
|
+
)
|
|
704
|
+
] }) });
|
|
705
|
+
}
|
|
706
|
+
function BrutalCTA({
|
|
707
|
+
variant = "centered",
|
|
708
|
+
color = "black",
|
|
709
|
+
className,
|
|
710
|
+
pattern,
|
|
711
|
+
...props
|
|
712
|
+
}) {
|
|
713
|
+
if (variant === "floating-card") {
|
|
714
|
+
return /* @__PURE__ */ jsx("div", { className: cn("brutal-container px-6", className), children: /* @__PURE__ */ jsx(FloatingCardCTA, { ...props, variant, color }) });
|
|
715
|
+
}
|
|
716
|
+
return /* @__PURE__ */ jsxs(BrutalSection, { color, pattern, className, children: [
|
|
717
|
+
variant === "centered" && /* @__PURE__ */ jsx(CenteredCTA, { ...props, variant, color }),
|
|
718
|
+
variant === "split" && /* @__PURE__ */ jsx(SplitCTA, { ...props, variant, color }),
|
|
719
|
+
variant === "with-visual" && /* @__PURE__ */ jsx(WithVisualCTA, { ...props, variant, color })
|
|
720
|
+
] });
|
|
721
|
+
}
|
|
722
|
+
function Sheet({ ...props }) {
|
|
723
|
+
return /* @__PURE__ */ jsx(Dialog.Root, { "data-slot": "sheet", ...props });
|
|
724
|
+
}
|
|
725
|
+
function SheetTrigger({ ...props }) {
|
|
726
|
+
return /* @__PURE__ */ jsx(Dialog.Trigger, { "data-slot": "sheet-trigger", ...props });
|
|
727
|
+
}
|
|
728
|
+
function SheetPortal({ ...props }) {
|
|
729
|
+
return /* @__PURE__ */ jsx(Dialog.Portal, { "data-slot": "sheet-portal", ...props });
|
|
730
|
+
}
|
|
731
|
+
function SheetOverlay({ className, ...props }) {
|
|
732
|
+
return /* @__PURE__ */ jsx(
|
|
733
|
+
Dialog.Backdrop,
|
|
734
|
+
{
|
|
735
|
+
"data-slot": "sheet-overlay",
|
|
736
|
+
className: cn(
|
|
737
|
+
"fixed inset-0 z-50 bg-black/60 transition-opacity duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0",
|
|
738
|
+
className
|
|
739
|
+
),
|
|
740
|
+
...props
|
|
741
|
+
}
|
|
742
|
+
);
|
|
743
|
+
}
|
|
744
|
+
function SheetContent({
|
|
745
|
+
className,
|
|
746
|
+
children,
|
|
747
|
+
side = "right",
|
|
748
|
+
showCloseButton = true,
|
|
749
|
+
...props
|
|
750
|
+
}) {
|
|
751
|
+
return /* @__PURE__ */ jsxs(SheetPortal, { children: [
|
|
752
|
+
/* @__PURE__ */ jsx(SheetOverlay, {}),
|
|
753
|
+
/* @__PURE__ */ jsxs(
|
|
754
|
+
Dialog.Popup,
|
|
755
|
+
{
|
|
756
|
+
"data-slot": "sheet-content",
|
|
757
|
+
"data-side": side,
|
|
758
|
+
className: cn(
|
|
759
|
+
"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",
|
|
760
|
+
className
|
|
761
|
+
),
|
|
762
|
+
...props,
|
|
763
|
+
children: [
|
|
764
|
+
children,
|
|
765
|
+
showCloseButton && /* @__PURE__ */ jsxs(
|
|
766
|
+
Dialog.Close,
|
|
767
|
+
{
|
|
768
|
+
"data-slot": "sheet-close",
|
|
769
|
+
render: /* @__PURE__ */ jsx(
|
|
770
|
+
Button,
|
|
771
|
+
{
|
|
772
|
+
variant: "ghost",
|
|
773
|
+
className: "absolute top-3 right-3",
|
|
774
|
+
size: "icon-sm"
|
|
775
|
+
}
|
|
776
|
+
),
|
|
777
|
+
children: [
|
|
778
|
+
/* @__PURE__ */ jsx(
|
|
779
|
+
XIcon,
|
|
780
|
+
{}
|
|
781
|
+
),
|
|
782
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
|
|
783
|
+
]
|
|
784
|
+
}
|
|
785
|
+
)
|
|
786
|
+
]
|
|
787
|
+
}
|
|
788
|
+
)
|
|
789
|
+
] });
|
|
790
|
+
}
|
|
791
|
+
function SheetTitle({ className, ...props }) {
|
|
792
|
+
return /* @__PURE__ */ jsx(
|
|
793
|
+
Dialog.Title,
|
|
794
|
+
{
|
|
795
|
+
"data-slot": "sheet-title",
|
|
796
|
+
className: cn("text-base font-bold text-foreground", className),
|
|
797
|
+
...props
|
|
798
|
+
}
|
|
799
|
+
);
|
|
800
|
+
}
|
|
801
|
+
function BrutalNav({
|
|
802
|
+
logo,
|
|
803
|
+
links,
|
|
804
|
+
ctaText = "Sign In",
|
|
805
|
+
ctaHref = "/admin",
|
|
806
|
+
variant = "solid",
|
|
807
|
+
className
|
|
808
|
+
}) {
|
|
809
|
+
const [mobileOpen, setMobileOpen] = useState(false);
|
|
810
|
+
const [isScrolled, setIsScrolled] = useState(false);
|
|
811
|
+
useEffect(() => {
|
|
812
|
+
if (variant !== "transparent") return;
|
|
813
|
+
const onScroll = () => setIsScrolled(window.scrollY > 20);
|
|
814
|
+
onScroll();
|
|
815
|
+
window.addEventListener("scroll", onScroll, { passive: true });
|
|
816
|
+
return () => window.removeEventListener("scroll", onScroll);
|
|
817
|
+
}, [variant]);
|
|
818
|
+
const variantStyles = {
|
|
819
|
+
solid: "sticky top-0 z-50 w-full border-b-brutal border-foreground bg-brand",
|
|
820
|
+
transparent: cn(
|
|
821
|
+
"fixed top-0 left-0 right-0 z-50 w-full transition-all duration-200",
|
|
822
|
+
isScrolled ? "bg-background/80 text-foreground backdrop-blur-md border-b border-foreground/10" : "bg-transparent text-white"
|
|
823
|
+
),
|
|
824
|
+
"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"
|
|
825
|
+
};
|
|
826
|
+
return /* @__PURE__ */ jsx("header", { className: cn(variantStyles[variant], className), children: /* @__PURE__ */ jsxs(
|
|
827
|
+
"div",
|
|
828
|
+
{
|
|
829
|
+
className: cn(
|
|
830
|
+
"flex h-14 items-center justify-between px-6",
|
|
831
|
+
variant === "floating-pill" ? "mx-auto max-w-7xl" : "brutal-container"
|
|
832
|
+
),
|
|
833
|
+
children: [
|
|
834
|
+
/* @__PURE__ */ jsx("a", { href: "/", className: "flex items-center gap-2 text-lg font-black", children: logo }),
|
|
835
|
+
/* @__PURE__ */ jsx("nav", { className: "hidden items-center gap-1 md:flex", children: links.map((link) => /* @__PURE__ */ jsxs(
|
|
836
|
+
"a",
|
|
837
|
+
{
|
|
838
|
+
href: link.href,
|
|
839
|
+
className: cn(
|
|
840
|
+
"relative rounded-md px-3 py-1.5 text-sm font-bold transition-colors hover:opacity-70",
|
|
841
|
+
link.active && "bg-foreground/10"
|
|
842
|
+
),
|
|
843
|
+
children: [
|
|
844
|
+
link.label,
|
|
845
|
+
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 })
|
|
846
|
+
]
|
|
847
|
+
},
|
|
848
|
+
link.href
|
|
849
|
+
)) }),
|
|
850
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
851
|
+
/* @__PURE__ */ jsx(
|
|
852
|
+
Button,
|
|
853
|
+
{
|
|
854
|
+
variant: "nav",
|
|
855
|
+
size: "sm",
|
|
856
|
+
render: /* @__PURE__ */ jsx("a", { href: ctaHref }),
|
|
857
|
+
className: "hidden md:inline-flex",
|
|
858
|
+
children: ctaText
|
|
859
|
+
}
|
|
860
|
+
),
|
|
861
|
+
/* @__PURE__ */ jsxs(Sheet, { open: mobileOpen, onOpenChange: setMobileOpen, children: [
|
|
862
|
+
/* @__PURE__ */ jsxs(
|
|
863
|
+
SheetTrigger,
|
|
864
|
+
{
|
|
865
|
+
render: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "icon-sm", className: "md:hidden" }),
|
|
866
|
+
children: [
|
|
867
|
+
/* @__PURE__ */ jsx(Menu, { className: "size-5" }),
|
|
868
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Menu" })
|
|
869
|
+
]
|
|
870
|
+
}
|
|
871
|
+
),
|
|
872
|
+
/* @__PURE__ */ jsxs(SheetContent, { side: "right", showCloseButton: true, children: [
|
|
873
|
+
/* @__PURE__ */ jsx(SheetTitle, { children: "Navigation" }),
|
|
874
|
+
/* @__PURE__ */ jsxs("nav", { className: "flex flex-col gap-1 px-2 pt-4", children: [
|
|
875
|
+
links.map((link) => /* @__PURE__ */ jsxs(
|
|
876
|
+
"a",
|
|
877
|
+
{
|
|
878
|
+
href: link.href,
|
|
879
|
+
onClick: () => setMobileOpen(false),
|
|
880
|
+
className: cn(
|
|
881
|
+
"flex items-center gap-2 rounded-md px-3 py-2.5 text-sm font-bold transition-colors hover:bg-foreground/5",
|
|
882
|
+
link.active && "bg-foreground/10"
|
|
883
|
+
),
|
|
884
|
+
children: [
|
|
885
|
+
link.label,
|
|
886
|
+
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 })
|
|
887
|
+
]
|
|
888
|
+
},
|
|
889
|
+
link.href
|
|
890
|
+
)),
|
|
891
|
+
/* @__PURE__ */ jsx("div", { className: "mt-4 border-t border-foreground/10 pt-4", children: /* @__PURE__ */ jsx(
|
|
892
|
+
Button,
|
|
893
|
+
{
|
|
894
|
+
variant: "default",
|
|
895
|
+
size: "default",
|
|
896
|
+
render: /* @__PURE__ */ jsx("a", { href: ctaHref }),
|
|
897
|
+
className: "w-full",
|
|
898
|
+
children: ctaText
|
|
899
|
+
}
|
|
900
|
+
) })
|
|
901
|
+
] })
|
|
902
|
+
] })
|
|
903
|
+
] })
|
|
904
|
+
] })
|
|
905
|
+
]
|
|
906
|
+
}
|
|
907
|
+
) });
|
|
908
|
+
}
|
|
909
|
+
function Input({ className, type, ...props }) {
|
|
910
|
+
return /* @__PURE__ */ jsx(
|
|
911
|
+
Input$1,
|
|
912
|
+
{
|
|
913
|
+
type,
|
|
914
|
+
"data-slot": "input",
|
|
915
|
+
className: cn(
|
|
916
|
+
"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",
|
|
917
|
+
className
|
|
918
|
+
),
|
|
919
|
+
...props
|
|
920
|
+
}
|
|
921
|
+
);
|
|
922
|
+
}
|
|
923
|
+
function SocialsRow({
|
|
924
|
+
socials
|
|
925
|
+
}) {
|
|
926
|
+
const items = [
|
|
927
|
+
{ key: "twitter", label: "Twitter", url: socials.twitter },
|
|
928
|
+
{ key: "github", label: "GitHub", url: socials.github },
|
|
929
|
+
{ key: "linkedin", label: "LinkedIn", url: socials.linkedin },
|
|
930
|
+
{ key: "discord", label: "Discord", url: socials.discord }
|
|
931
|
+
].filter((s) => s.url);
|
|
932
|
+
if (items.length === 0) return null;
|
|
933
|
+
return /* @__PURE__ */ jsx("div", { className: "flex items-center gap-4", children: items.map((s) => /* @__PURE__ */ jsx(
|
|
934
|
+
"a",
|
|
935
|
+
{
|
|
936
|
+
href: s.url,
|
|
937
|
+
target: "_blank",
|
|
938
|
+
rel: "noopener noreferrer",
|
|
939
|
+
className: "text-sm font-bold transition-colors hover:text-muted-foreground",
|
|
940
|
+
children: s.label
|
|
941
|
+
},
|
|
942
|
+
s.key
|
|
943
|
+
)) });
|
|
944
|
+
}
|
|
945
|
+
function NewsletterSection({
|
|
946
|
+
newsletter
|
|
947
|
+
}) {
|
|
948
|
+
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: [
|
|
949
|
+
/* @__PURE__ */ jsx("h3", { className: "brutal-h4 mb-2", children: newsletter.headline || "Stay in the loop" }),
|
|
950
|
+
newsletter.description && /* @__PURE__ */ jsx("p", { className: "brutal-caption mb-4", children: newsletter.description }),
|
|
951
|
+
/* @__PURE__ */ jsxs(
|
|
952
|
+
"form",
|
|
953
|
+
{
|
|
954
|
+
onSubmit: (e) => e.preventDefault(),
|
|
955
|
+
className: "flex gap-2",
|
|
956
|
+
children: [
|
|
957
|
+
/* @__PURE__ */ jsx(
|
|
958
|
+
Input,
|
|
959
|
+
{
|
|
960
|
+
type: "email",
|
|
961
|
+
placeholder: newsletter.placeholder || "you@email.com",
|
|
962
|
+
className: "flex-1"
|
|
963
|
+
}
|
|
964
|
+
),
|
|
965
|
+
/* @__PURE__ */ jsx(Button, { variant: "default", size: "default", type: "submit", children: newsletter.buttonText || "Subscribe" })
|
|
966
|
+
]
|
|
967
|
+
}
|
|
968
|
+
)
|
|
969
|
+
] }) });
|
|
970
|
+
}
|
|
971
|
+
function MegaContent({
|
|
972
|
+
logo,
|
|
973
|
+
tagline,
|
|
974
|
+
columns,
|
|
975
|
+
socials
|
|
976
|
+
}) {
|
|
977
|
+
return /* @__PURE__ */ jsxs("div", { className: "mb-10 flex flex-col gap-8 sm:flex-row sm:items-start sm:justify-between", children: [
|
|
978
|
+
/* @__PURE__ */ jsxs("div", { className: "max-w-xs", children: [
|
|
979
|
+
/* @__PURE__ */ jsx("div", { className: "mb-2 text-xl font-black", children: logo }),
|
|
980
|
+
tagline && /* @__PURE__ */ jsx("p", { className: "mb-4 text-sm text-muted-foreground", children: tagline }),
|
|
981
|
+
socials && /* @__PURE__ */ jsx(SocialsRow, { socials })
|
|
982
|
+
] }),
|
|
983
|
+
/* @__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: [
|
|
984
|
+
/* @__PURE__ */ jsx("h3", { className: "brutal-label mb-3 text-muted-foreground", children: col.title }),
|
|
985
|
+
/* @__PURE__ */ jsx("ul", { className: "flex flex-col gap-2", children: col.links.map((link) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
|
|
986
|
+
"a",
|
|
987
|
+
{
|
|
988
|
+
href: link.href,
|
|
989
|
+
className: "text-sm font-medium transition-colors hover:text-muted-foreground",
|
|
990
|
+
children: link.label
|
|
991
|
+
}
|
|
992
|
+
) }, link.href)) })
|
|
993
|
+
] }, col.title)) })
|
|
994
|
+
] });
|
|
995
|
+
}
|
|
996
|
+
function MinimalContent({
|
|
997
|
+
logo,
|
|
998
|
+
columns,
|
|
999
|
+
socials
|
|
1000
|
+
}) {
|
|
1001
|
+
const allLinks = columns.flatMap((col) => col.links);
|
|
1002
|
+
return /* @__PURE__ */ jsxs("div", { className: "mb-6 flex flex-col items-center gap-4 sm:flex-row sm:justify-between", children: [
|
|
1003
|
+
/* @__PURE__ */ jsx("div", { className: "text-xl font-black", children: logo }),
|
|
1004
|
+
/* @__PURE__ */ jsx("nav", { className: "flex flex-wrap items-center justify-center gap-x-6 gap-y-2", children: allLinks.map((link) => /* @__PURE__ */ jsx(
|
|
1005
|
+
"a",
|
|
1006
|
+
{
|
|
1007
|
+
href: link.href,
|
|
1008
|
+
className: "text-sm font-medium transition-colors hover:text-muted-foreground",
|
|
1009
|
+
children: link.label
|
|
1010
|
+
},
|
|
1011
|
+
link.href
|
|
1012
|
+
)) }),
|
|
1013
|
+
socials && /* @__PURE__ */ jsx(SocialsRow, { socials })
|
|
1014
|
+
] });
|
|
1015
|
+
}
|
|
1016
|
+
function BrutalFooter({
|
|
1017
|
+
logo,
|
|
1018
|
+
tagline,
|
|
1019
|
+
columns,
|
|
1020
|
+
bottomLeft,
|
|
1021
|
+
bottomRight,
|
|
1022
|
+
variant = "mega",
|
|
1023
|
+
socials,
|
|
1024
|
+
newsletter,
|
|
1025
|
+
className
|
|
1026
|
+
}) {
|
|
1027
|
+
return /* @__PURE__ */ jsx(
|
|
1028
|
+
"footer",
|
|
1029
|
+
{
|
|
1030
|
+
className: cn(
|
|
1031
|
+
"w-full border-t-4 bg-background px-6 py-12 text-foreground",
|
|
1032
|
+
className
|
|
1033
|
+
),
|
|
1034
|
+
style: { borderTopColor: "hsl(var(--brand))" },
|
|
1035
|
+
children: /* @__PURE__ */ jsxs("div", { className: "brutal-container", children: [
|
|
1036
|
+
variant === "newsletter" && newsletter && /* @__PURE__ */ jsx(NewsletterSection, { newsletter }),
|
|
1037
|
+
variant === "minimal" ? /* @__PURE__ */ jsx(MinimalContent, { logo, columns, socials }) : /* @__PURE__ */ jsx(
|
|
1038
|
+
MegaContent,
|
|
1039
|
+
{
|
|
1040
|
+
logo,
|
|
1041
|
+
tagline,
|
|
1042
|
+
columns,
|
|
1043
|
+
socials
|
|
1044
|
+
}
|
|
1045
|
+
),
|
|
1046
|
+
/* @__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: [
|
|
1047
|
+
/* @__PURE__ */ jsx("span", { children: bottomLeft || "Built with care" }),
|
|
1048
|
+
/* @__PURE__ */ jsx("span", { children: bottomRight || (/* @__PURE__ */ new Date()).getFullYear() })
|
|
1049
|
+
] })
|
|
1050
|
+
] })
|
|
1051
|
+
}
|
|
1052
|
+
);
|
|
1053
|
+
}
|
|
1054
|
+
var badgeVariants = cva(
|
|
1055
|
+
"group/badge inline-flex w-fit shrink-0 items-center justify-center gap-1 rounded-md whitespace-nowrap font-bold transition-all [&>svg]:pointer-events-none [&>svg]:size-3!",
|
|
1056
|
+
{
|
|
1057
|
+
variants: {
|
|
1058
|
+
variant: {
|
|
1059
|
+
default: "border-brutal border-foreground bg-primary px-3 py-1 text-xs text-primary-foreground shadow-brutal-sm",
|
|
1060
|
+
secondary: "border-brutal border-foreground bg-secondary px-3 py-1 text-xs text-secondary-foreground shadow-brutal-sm",
|
|
1061
|
+
brand: "border-brutal border-foreground bg-brand px-3 py-1 text-xs text-brand-foreground shadow-brutal-sm",
|
|
1062
|
+
cta: "border-brutal border-foreground bg-cta px-3 py-1 text-xs text-cta-foreground shadow-brutal-sm",
|
|
1063
|
+
outline: "border-brutal border-foreground bg-background px-3 py-1 text-xs text-foreground",
|
|
1064
|
+
destructive: "border-brutal border-destructive bg-destructive/10 px-3 py-1 text-xs text-destructive",
|
|
1065
|
+
ghost: "px-2 py-0.5 text-xs text-muted-foreground"
|
|
1066
|
+
}
|
|
1067
|
+
},
|
|
1068
|
+
defaultVariants: {
|
|
1069
|
+
variant: "default"
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
);
|
|
1073
|
+
function Badge({
|
|
1074
|
+
className,
|
|
1075
|
+
variant = "default",
|
|
1076
|
+
render,
|
|
1077
|
+
...props
|
|
1078
|
+
}) {
|
|
1079
|
+
return useRender({
|
|
1080
|
+
defaultTagName: "span",
|
|
1081
|
+
props: mergeProps(
|
|
1082
|
+
{
|
|
1083
|
+
className: cn(badgeVariants({ variant }), className)
|
|
1084
|
+
},
|
|
1085
|
+
props
|
|
1086
|
+
),
|
|
1087
|
+
render,
|
|
1088
|
+
state: {
|
|
1089
|
+
slot: "badge",
|
|
1090
|
+
variant
|
|
1091
|
+
}
|
|
1092
|
+
});
|
|
1093
|
+
}
|
|
1094
|
+
function PricingTable({
|
|
1095
|
+
badge,
|
|
1096
|
+
headline,
|
|
1097
|
+
description,
|
|
1098
|
+
tiers,
|
|
1099
|
+
popularIndex,
|
|
1100
|
+
billingToggle = true,
|
|
1101
|
+
color = "white",
|
|
1102
|
+
className
|
|
1103
|
+
}) {
|
|
1104
|
+
const [annual, setAnnual] = useState(false);
|
|
1105
|
+
return /* @__PURE__ */ jsxs(BrutalSection, { color, className, children: [
|
|
1106
|
+
(headline || badge) && /* @__PURE__ */ jsxs("div", { className: "mb-8 text-center", children: [
|
|
1107
|
+
badge && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-4 text-muted-foreground", children: badge }),
|
|
1108
|
+
headline && /* @__PURE__ */ jsx("h2", { className: "brutal-h2 mb-4", children: headline }),
|
|
1109
|
+
description && /* @__PURE__ */ jsx("p", { className: "brutal-body mx-auto max-w-lg text-muted-foreground", children: description })
|
|
1110
|
+
] }),
|
|
1111
|
+
billingToggle && /* @__PURE__ */ jsxs("div", { className: "mb-10 flex items-center justify-center gap-3", children: [
|
|
1112
|
+
/* @__PURE__ */ jsx("span", { className: cn("text-sm font-bold", !annual && "text-brand"), children: "Monthly" }),
|
|
1113
|
+
/* @__PURE__ */ jsx(
|
|
1114
|
+
"button",
|
|
1115
|
+
{
|
|
1116
|
+
onClick: () => setAnnual(!annual),
|
|
1117
|
+
className: cn(
|
|
1118
|
+
"relative h-8 w-14 border-brutal border-foreground transition-colors",
|
|
1119
|
+
annual ? "bg-brand" : "bg-secondary"
|
|
1120
|
+
),
|
|
1121
|
+
children: /* @__PURE__ */ jsx(
|
|
1122
|
+
"span",
|
|
1123
|
+
{
|
|
1124
|
+
className: cn(
|
|
1125
|
+
"absolute top-1 size-6 border border-foreground bg-background transition-transform",
|
|
1126
|
+
annual ? "left-7" : "left-1"
|
|
1127
|
+
)
|
|
1128
|
+
}
|
|
1129
|
+
)
|
|
1130
|
+
}
|
|
1131
|
+
),
|
|
1132
|
+
/* @__PURE__ */ jsx("span", { className: cn("text-sm font-bold", annual && "text-brand"), children: "Annual" }),
|
|
1133
|
+
annual && /* @__PURE__ */ jsx(Badge, { variant: "cta", children: "Save 20%" })
|
|
1134
|
+
] }),
|
|
1135
|
+
/* @__PURE__ */ jsx("div", { className: cn(
|
|
1136
|
+
"grid gap-6",
|
|
1137
|
+
tiers.length === 2 && "mx-auto max-w-2xl sm:grid-cols-2",
|
|
1138
|
+
tiers.length === 3 && "lg:grid-cols-3",
|
|
1139
|
+
tiers.length >= 4 && "sm:grid-cols-2 lg:grid-cols-4"
|
|
1140
|
+
), children: tiers.map((tier, i) => {
|
|
1141
|
+
const isPopular = i === popularIndex;
|
|
1142
|
+
const price = annual ? tier.price.annual : tier.price.monthly;
|
|
1143
|
+
return /* @__PURE__ */ jsxs(
|
|
1144
|
+
"div",
|
|
1145
|
+
{
|
|
1146
|
+
className: cn(
|
|
1147
|
+
"relative flex flex-col border-brutal border-foreground bg-background p-6 shadow-brutal",
|
|
1148
|
+
isPopular && "border-brand shadow-brutal-lg ring-2 ring-brand z-10 scale-105"
|
|
1149
|
+
),
|
|
1150
|
+
children: [
|
|
1151
|
+
isPopular && /* @__PURE__ */ jsx(Badge, { variant: "brand", className: "absolute -top-3 left-1/2 -translate-x-1/2", children: "Popular" }),
|
|
1152
|
+
/* @__PURE__ */ jsx("h3", { className: "brutal-h4 mb-1", children: tier.name }),
|
|
1153
|
+
tier.description && /* @__PURE__ */ jsx("p", { className: "mb-4 text-sm text-muted-foreground", children: tier.description }),
|
|
1154
|
+
/* @__PURE__ */ jsxs("div", { className: "mb-6", children: [
|
|
1155
|
+
/* @__PURE__ */ jsx("span", { className: "brutal-h1", children: typeof price === "number" ? `$${price}` : price }),
|
|
1156
|
+
typeof price === "number" && /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: "/mo" })
|
|
1157
|
+
] }),
|
|
1158
|
+
/* @__PURE__ */ jsx("ul", { className: "mb-8 flex flex-1 flex-col gap-2", children: tier.features.map((feature) => /* @__PURE__ */ jsxs("li", { className: "flex items-start gap-2 text-sm", children: [
|
|
1159
|
+
/* @__PURE__ */ jsx("span", { className: "mt-0.5 text-brand", children: "\u2713" }),
|
|
1160
|
+
feature
|
|
1161
|
+
] }, feature)) }),
|
|
1162
|
+
/* @__PURE__ */ jsx(
|
|
1163
|
+
Button,
|
|
1164
|
+
{
|
|
1165
|
+
variant: tier.ctaVariant || (isPopular ? "cta" : "outline"),
|
|
1166
|
+
size: "lg",
|
|
1167
|
+
className: "w-full",
|
|
1168
|
+
render: tier.ctaHref ? /* @__PURE__ */ jsx("a", { href: tier.ctaHref }) : void 0,
|
|
1169
|
+
children: tier.ctaText
|
|
1170
|
+
}
|
|
1171
|
+
)
|
|
1172
|
+
]
|
|
1173
|
+
},
|
|
1174
|
+
tier.name
|
|
1175
|
+
);
|
|
1176
|
+
}) })
|
|
1177
|
+
] });
|
|
1178
|
+
}
|
|
1179
|
+
function LogoCloud({
|
|
1180
|
+
title,
|
|
1181
|
+
logos,
|
|
1182
|
+
marquee = false,
|
|
1183
|
+
color = "white",
|
|
1184
|
+
className
|
|
1185
|
+
}) {
|
|
1186
|
+
const logoElements = logos.map((logo) => {
|
|
1187
|
+
const img = /* @__PURE__ */ jsx(
|
|
1188
|
+
"img",
|
|
1189
|
+
{
|
|
1190
|
+
src: logo.src,
|
|
1191
|
+
alt: logo.alt,
|
|
1192
|
+
className: "h-8 max-w-[120px] object-contain opacity-50 grayscale transition-all duration-200 hover:opacity-100 hover:grayscale-0"
|
|
1193
|
+
},
|
|
1194
|
+
logo.alt
|
|
1195
|
+
);
|
|
1196
|
+
return logo.href ? /* @__PURE__ */ jsx("a", { href: logo.href, className: "flex items-center px-6", children: img }, logo.alt) : /* @__PURE__ */ jsx("div", { className: "flex items-center px-6", children: img }, logo.alt);
|
|
1197
|
+
});
|
|
1198
|
+
return /* @__PURE__ */ jsxs(BrutalSection, { color, padding: "sm", className, children: [
|
|
1199
|
+
title && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-6 text-center text-muted-foreground", children: title }),
|
|
1200
|
+
marquee ? /* @__PURE__ */ jsx("div", { className: "relative overflow-hidden", children: /* @__PURE__ */ jsxs("div", { className: "flex animate-marquee", children: [
|
|
1201
|
+
logoElements,
|
|
1202
|
+
logoElements
|
|
1203
|
+
] }) }) : /* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center justify-center gap-8", children: logoElements })
|
|
1204
|
+
] });
|
|
1205
|
+
}
|
|
1206
|
+
function useCountUp(target, inView) {
|
|
1207
|
+
const [count, setCount] = useState(0);
|
|
1208
|
+
useEffect(() => {
|
|
1209
|
+
if (!inView) return;
|
|
1210
|
+
let frame;
|
|
1211
|
+
const duration = 1500;
|
|
1212
|
+
const start = performance.now();
|
|
1213
|
+
function animate(now) {
|
|
1214
|
+
const elapsed = now - start;
|
|
1215
|
+
const progress = Math.min(elapsed / duration, 1);
|
|
1216
|
+
const eased = 1 - Math.pow(1 - progress, 3);
|
|
1217
|
+
setCount(Math.round(eased * target));
|
|
1218
|
+
if (progress < 1) frame = requestAnimationFrame(animate);
|
|
1219
|
+
}
|
|
1220
|
+
frame = requestAnimationFrame(animate);
|
|
1221
|
+
return () => cancelAnimationFrame(frame);
|
|
1222
|
+
}, [target, inView]);
|
|
1223
|
+
return count;
|
|
1224
|
+
}
|
|
1225
|
+
function StatItem({ stat, inView }) {
|
|
1226
|
+
const count = useCountUp(stat.value, inView);
|
|
1227
|
+
return /* @__PURE__ */ jsxs("div", { className: "text-center", children: [
|
|
1228
|
+
/* @__PURE__ */ jsxs("p", { className: "brutal-display", children: [
|
|
1229
|
+
stat.prefix,
|
|
1230
|
+
count.toLocaleString(),
|
|
1231
|
+
stat.suffix
|
|
1232
|
+
] }),
|
|
1233
|
+
/* @__PURE__ */ jsx("p", { className: "brutal-label mt-2 text-muted-foreground", children: stat.label })
|
|
1234
|
+
] });
|
|
1235
|
+
}
|
|
1236
|
+
function StatsBar({ stats, color = "white", className }) {
|
|
1237
|
+
const ref = useRef(null);
|
|
1238
|
+
const [inView, setInView] = useState(false);
|
|
1239
|
+
useEffect(() => {
|
|
1240
|
+
if (!ref.current) return;
|
|
1241
|
+
const observer = new IntersectionObserver(
|
|
1242
|
+
([entry]) => {
|
|
1243
|
+
if (entry.isIntersecting) {
|
|
1244
|
+
setInView(true);
|
|
1245
|
+
observer.disconnect();
|
|
1246
|
+
}
|
|
1247
|
+
},
|
|
1248
|
+
{ threshold: 0.3 }
|
|
1249
|
+
);
|
|
1250
|
+
observer.observe(ref.current);
|
|
1251
|
+
return () => observer.disconnect();
|
|
1252
|
+
}, []);
|
|
1253
|
+
return /* @__PURE__ */ jsx(BrutalSection, { color, padding: "sm", className, children: /* @__PURE__ */ jsx(
|
|
1254
|
+
"div",
|
|
1255
|
+
{
|
|
1256
|
+
ref,
|
|
1257
|
+
className: cn(
|
|
1258
|
+
"grid gap-8",
|
|
1259
|
+
stats.length === 2 && "grid-cols-2",
|
|
1260
|
+
stats.length === 3 && "grid-cols-3",
|
|
1261
|
+
stats.length >= 4 && "grid-cols-2 sm:grid-cols-4"
|
|
1262
|
+
),
|
|
1263
|
+
children: stats.map((stat) => /* @__PURE__ */ jsx(StatItem, { stat, inView }, stat.label))
|
|
1264
|
+
}
|
|
1265
|
+
) });
|
|
1266
|
+
}
|
|
1267
|
+
function Accordion({ className, ...props }) {
|
|
1268
|
+
return /* @__PURE__ */ jsx(
|
|
1269
|
+
Accordion$1.Root,
|
|
1270
|
+
{
|
|
1271
|
+
"data-slot": "accordion",
|
|
1272
|
+
className: cn("flex w-full flex-col", className),
|
|
1273
|
+
...props
|
|
1274
|
+
}
|
|
1275
|
+
);
|
|
1276
|
+
}
|
|
1277
|
+
function AccordionItem({ className, ...props }) {
|
|
1278
|
+
return /* @__PURE__ */ jsx(
|
|
1279
|
+
Accordion$1.Item,
|
|
1280
|
+
{
|
|
1281
|
+
"data-slot": "accordion-item",
|
|
1282
|
+
className: cn("border-brutal border-foreground rounded-lg mb-2 px-3", className),
|
|
1283
|
+
...props
|
|
1284
|
+
}
|
|
1285
|
+
);
|
|
1286
|
+
}
|
|
1287
|
+
function AccordionTrigger({
|
|
1288
|
+
className,
|
|
1289
|
+
children,
|
|
1290
|
+
...props
|
|
1291
|
+
}) {
|
|
1292
|
+
return /* @__PURE__ */ jsx(Accordion$1.Header, { className: "flex", children: /* @__PURE__ */ jsxs(
|
|
1293
|
+
Accordion$1.Trigger,
|
|
1294
|
+
{
|
|
1295
|
+
"data-slot": "accordion-trigger",
|
|
1296
|
+
className: cn(
|
|
1297
|
+
"group/accordion-trigger relative flex flex-1 items-start justify-between rounded-lg border border-transparent py-2.5 text-left text-sm font-bold transition-all outline-none hover:underline focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 aria-disabled:pointer-events-none aria-disabled:opacity-50 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground",
|
|
1298
|
+
className
|
|
1299
|
+
),
|
|
1300
|
+
...props,
|
|
1301
|
+
children: [
|
|
1302
|
+
children,
|
|
1303
|
+
/* @__PURE__ */ jsx(ChevronDownIcon, { "data-slot": "accordion-trigger-icon", className: "pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden" }),
|
|
1304
|
+
/* @__PURE__ */ jsx(ChevronUpIcon, { "data-slot": "accordion-trigger-icon", className: "pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline" })
|
|
1305
|
+
]
|
|
1306
|
+
}
|
|
1307
|
+
) });
|
|
1308
|
+
}
|
|
1309
|
+
function AccordionContent({
|
|
1310
|
+
className,
|
|
1311
|
+
children,
|
|
1312
|
+
...props
|
|
1313
|
+
}) {
|
|
1314
|
+
return /* @__PURE__ */ jsx(
|
|
1315
|
+
Accordion$1.Panel,
|
|
1316
|
+
{
|
|
1317
|
+
"data-slot": "accordion-content",
|
|
1318
|
+
className: "overflow-hidden text-sm data-open:animate-accordion-down data-closed:animate-accordion-up",
|
|
1319
|
+
...props,
|
|
1320
|
+
children: /* @__PURE__ */ jsx(
|
|
1321
|
+
"div",
|
|
1322
|
+
{
|
|
1323
|
+
className: cn(
|
|
1324
|
+
"h-(--accordion-panel-height) pt-0 pb-2.5 data-ending-style:h-0 data-starting-style:h-0 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4",
|
|
1325
|
+
className
|
|
1326
|
+
),
|
|
1327
|
+
children
|
|
1328
|
+
}
|
|
1329
|
+
)
|
|
1330
|
+
}
|
|
1331
|
+
);
|
|
1332
|
+
}
|
|
1333
|
+
function FAQ({
|
|
1334
|
+
badge,
|
|
1335
|
+
headline,
|
|
1336
|
+
items,
|
|
1337
|
+
color = "white",
|
|
1338
|
+
className
|
|
1339
|
+
}) {
|
|
1340
|
+
return /* @__PURE__ */ jsxs(BrutalSection, { color, className, children: [
|
|
1341
|
+
(headline || badge) && /* @__PURE__ */ jsxs("div", { className: "mb-10 max-w-2xl", children: [
|
|
1342
|
+
badge && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-4 text-muted-foreground", children: badge }),
|
|
1343
|
+
headline && /* @__PURE__ */ jsx("h2", { className: "brutal-h2", children: headline })
|
|
1344
|
+
] }),
|
|
1345
|
+
/* @__PURE__ */ jsx(Accordion, { className: "mx-auto max-w-2xl", children: items.map((item, i) => /* @__PURE__ */ jsxs(
|
|
1346
|
+
AccordionItem,
|
|
1347
|
+
{
|
|
1348
|
+
value: `faq-${i}`,
|
|
1349
|
+
className: cn(
|
|
1350
|
+
"border-brutal border-foreground mb-3 px-5",
|
|
1351
|
+
i % 2 === 0 ? "bg-background" : "bg-secondary"
|
|
1352
|
+
),
|
|
1353
|
+
children: [
|
|
1354
|
+
/* @__PURE__ */ jsx(AccordionTrigger, { className: "brutal-h4 py-4 text-left", children: item.question }),
|
|
1355
|
+
/* @__PURE__ */ jsx(AccordionContent, { className: "brutal-body pb-4 text-muted-foreground", children: item.answer })
|
|
1356
|
+
]
|
|
1357
|
+
},
|
|
1358
|
+
i
|
|
1359
|
+
)) })
|
|
1360
|
+
] });
|
|
1361
|
+
}
|
|
1362
|
+
function Newsletter({
|
|
1363
|
+
headline = "Stay in the loop",
|
|
1364
|
+
description,
|
|
1365
|
+
placeholder = "you@example.com",
|
|
1366
|
+
buttonText = "Subscribe",
|
|
1367
|
+
onSubmit,
|
|
1368
|
+
color = "white",
|
|
1369
|
+
className
|
|
1370
|
+
}) {
|
|
1371
|
+
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: [
|
|
1372
|
+
/* @__PURE__ */ jsx("h3", { className: "brutal-h3 mb-2", children: headline }),
|
|
1373
|
+
description && /* @__PURE__ */ jsx("p", { className: "brutal-body mb-6 text-muted-foreground", children: description }),
|
|
1374
|
+
/* @__PURE__ */ jsxs(
|
|
1375
|
+
"form",
|
|
1376
|
+
{
|
|
1377
|
+
onSubmit: (e) => {
|
|
1378
|
+
e.preventDefault();
|
|
1379
|
+
const form = e.target;
|
|
1380
|
+
const email = new FormData(form).get("email");
|
|
1381
|
+
onSubmit?.(email);
|
|
1382
|
+
},
|
|
1383
|
+
className: "flex gap-3",
|
|
1384
|
+
children: [
|
|
1385
|
+
/* @__PURE__ */ jsx(Input, { type: "email", name: "email", placeholder, required: true, className: "flex-1" }),
|
|
1386
|
+
/* @__PURE__ */ jsx(Button, { type: "submit", variant: "cta", children: buttonText })
|
|
1387
|
+
]
|
|
1388
|
+
}
|
|
1389
|
+
)
|
|
1390
|
+
] }) });
|
|
1391
|
+
}
|
|
1392
|
+
|
|
1393
|
+
export { BrutalCTA, BrutalFeatureGrid, BrutalFooter, BrutalHero, BrutalIntegrationGrid, BrutalNav, BrutalSection, BrutalTestimonials, FAQ, LogoCloud, Newsletter, PricingTable, SectionDivider, StatsBar, SectionDivider as WaveDivider };
|
|
13
1394
|
//# sourceMappingURL=index.js.map
|
|
14
1395
|
//# sourceMappingURL=index.js.map
|