@snow-labs/brutal-ui 0.1.0 → 0.1.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 (189) hide show
  1. package/dist/components/brutal/cta-section.js +150 -4
  2. package/dist/components/brutal/cta-section.js.map +1 -1
  3. package/dist/components/brutal/feature-grid.js +141 -4
  4. package/dist/components/brutal/feature-grid.js.map +1 -1
  5. package/dist/components/brutal/footer.js +52 -2
  6. package/dist/components/brutal/footer.js.map +1 -1
  7. package/dist/components/brutal/hero.js +149 -4
  8. package/dist/components/brutal/hero.js.map +1 -1
  9. package/dist/components/brutal/index.js +456 -12
  10. package/dist/components/brutal/index.js.map +1 -1
  11. package/dist/components/brutal/integration-grid.js +94 -3
  12. package/dist/components/brutal/integration-grid.js.map +1 -1
  13. package/dist/components/brutal/nav.js +101 -3
  14. package/dist/components/brutal/nav.js.map +1 -1
  15. package/dist/components/brutal/section.js +56 -2
  16. package/dist/components/brutal/section.js.map +1 -1
  17. package/dist/components/brutal/testimonials.js +96 -3
  18. package/dist/components/brutal/testimonials.js.map +1 -1
  19. package/dist/components/brutal/wave-divider.js +40 -1
  20. package/dist/components/brutal/wave-divider.js.map +1 -1
  21. package/dist/components/ui/accordion.js +78 -2
  22. package/dist/components/ui/accordion.js.map +1 -1
  23. package/dist/components/ui/alert.js +80 -2
  24. package/dist/components/ui/alert.js.map +1 -1
  25. package/dist/components/ui/avatar.js +103 -2
  26. package/dist/components/ui/avatar.js.map +1 -1
  27. package/dist/components/ui/badge.js +55 -2
  28. package/dist/components/ui/badge.js.map +1 -1
  29. package/dist/components/ui/breadcrumb.js +122 -2
  30. package/dist/components/ui/breadcrumb.js.map +1 -1
  31. package/dist/components/ui/button.js +68 -2
  32. package/dist/components/ui/button.js.map +1 -1
  33. package/dist/components/ui/card.js +90 -2
  34. package/dist/components/ui/card.js.map +1 -1
  35. package/dist/components/ui/checkbox.js +36 -2
  36. package/dist/components/ui/checkbox.js.map +1 -1
  37. package/dist/components/ui/collapsible.js +15 -1
  38. package/dist/components/ui/collapsible.js.map +1 -1
  39. package/dist/components/ui/command.js +399 -7
  40. package/dist/components/ui/command.js.map +1 -1
  41. package/dist/components/ui/context-menu.js +232 -2
  42. package/dist/components/ui/context-menu.js.map +1 -1
  43. package/dist/components/ui/dialog.js +201 -3
  44. package/dist/components/ui/dialog.js.map +1 -1
  45. package/dist/components/ui/drawer.js +118 -2
  46. package/dist/components/ui/drawer.js.map +1 -1
  47. package/dist/components/ui/dropdown-menu.js +242 -2
  48. package/dist/components/ui/dropdown-menu.js.map +1 -1
  49. package/dist/components/ui/hover-card.js +47 -2
  50. package/dist/components/ui/hover-card.js.map +1 -1
  51. package/dist/components/ui/input-group.js +226 -5
  52. package/dist/components/ui/input-group.js.map +1 -1
  53. package/dist/components/ui/input.js +26 -2
  54. package/dist/components/ui/input.js.map +1 -1
  55. package/dist/components/ui/label.js +23 -2
  56. package/dist/components/ui/label.js.map +1 -1
  57. package/dist/components/ui/menubar.js +398 -3
  58. package/dist/components/ui/menubar.js.map +1 -1
  59. package/dist/components/ui/navigation-menu.js +160 -2
  60. package/dist/components/ui/navigation-menu.js.map +1 -1
  61. package/dist/components/ui/pagination.js +185 -3
  62. package/dist/components/ui/pagination.js.map +1 -1
  63. package/dist/components/ui/popover.js +80 -2
  64. package/dist/components/ui/popover.js.map +1 -1
  65. package/dist/components/ui/progress.js +80 -2
  66. package/dist/components/ui/progress.js.map +1 -1
  67. package/dist/components/ui/radio-group.js +43 -2
  68. package/dist/components/ui/radio-group.js.map +1 -1
  69. package/dist/components/ui/scroll-area.js +63 -2
  70. package/dist/components/ui/scroll-area.js.map +1 -1
  71. package/dist/components/ui/select.js +190 -2
  72. package/dist/components/ui/select.js.map +1 -1
  73. package/dist/components/ui/separator.js +29 -2
  74. package/dist/components/ui/separator.js.map +1 -1
  75. package/dist/components/ui/sheet.js +185 -3
  76. package/dist/components/ui/sheet.js.map +1 -1
  77. package/dist/components/ui/skeleton.js +21 -2
  78. package/dist/components/ui/skeleton.js.map +1 -1
  79. package/dist/components/ui/slider.js +62 -2
  80. package/dist/components/ui/slider.js.map +1 -1
  81. package/dist/components/ui/switch.js +36 -2
  82. package/dist/components/ui/switch.js.map +1 -1
  83. package/dist/components/ui/tabs.js +85 -2
  84. package/dist/components/ui/tabs.js.map +1 -1
  85. package/dist/components/ui/textarea.js +24 -2
  86. package/dist/components/ui/textarea.js.map +1 -1
  87. package/dist/components/ui/toggle-group.js +101 -3
  88. package/dist/components/ui/toggle-group.js.map +1 -1
  89. package/dist/components/ui/toggle.js +47 -2
  90. package/dist/components/ui/toggle.js.map +1 -1
  91. package/dist/components/ui/tooltip.js +65 -2
  92. package/dist/components/ui/tooltip.js.map +1 -1
  93. package/dist/index.js +3188 -46
  94. package/dist/index.js.map +1 -1
  95. package/dist/lib/utils.js +10 -1
  96. package/dist/lib/utils.js.map +1 -1
  97. package/package.json +1 -1
  98. package/dist/chunk-3HN3QP23.js +0 -44
  99. package/dist/chunk-3HN3QP23.js.map +0 -1
  100. package/dist/chunk-4A3EQV6F.js +0 -76
  101. package/dist/chunk-4A3EQV6F.js.map +0 -1
  102. package/dist/chunk-53KZXLG4.js +0 -100
  103. package/dist/chunk-53KZXLG4.js.map +0 -1
  104. package/dist/chunk-5JCN6EQG.js +0 -60
  105. package/dist/chunk-5JCN6EQG.js.map +0 -1
  106. package/dist/chunk-5JEBZUEI.js +0 -20
  107. package/dist/chunk-5JEBZUEI.js.map +0 -1
  108. package/dist/chunk-6APJMAO7.js +0 -44
  109. package/dist/chunk-6APJMAO7.js.map +0 -1
  110. package/dist/chunk-6UKMYVHC.js +0 -187
  111. package/dist/chunk-6UKMYVHC.js.map +0 -1
  112. package/dist/chunk-7FVJ36BQ.js +0 -239
  113. package/dist/chunk-7FVJ36BQ.js.map +0 -1
  114. package/dist/chunk-7I7XYB7H.js +0 -44
  115. package/dist/chunk-7I7XYB7H.js.map +0 -1
  116. package/dist/chunk-A5KONGTJ.js +0 -49
  117. package/dist/chunk-A5KONGTJ.js.map +0 -1
  118. package/dist/chunk-AHUC5AID.js +0 -40
  119. package/dist/chunk-AHUC5AID.js.map +0 -1
  120. package/dist/chunk-B6UM5GHF.js +0 -20
  121. package/dist/chunk-B6UM5GHF.js.map +0 -1
  122. package/dist/chunk-BAUUM52T.js +0 -234
  123. package/dist/chunk-BAUUM52T.js.map +0 -1
  124. package/dist/chunk-BDWCMMEI.js +0 -82
  125. package/dist/chunk-BDWCMMEI.js.map +0 -1
  126. package/dist/chunk-BSVJVM2L.js +0 -52
  127. package/dist/chunk-BSVJVM2L.js.map +0 -1
  128. package/dist/chunk-CPVH3LD5.js +0 -86
  129. package/dist/chunk-CPVH3LD5.js.map +0 -1
  130. package/dist/chunk-CY2FOBOD.js +0 -65
  131. package/dist/chunk-CY2FOBOD.js.map +0 -1
  132. package/dist/chunk-DJTTNICL.js +0 -40
  133. package/dist/chunk-DJTTNICL.js.map +0 -1
  134. package/dist/chunk-F2E32OOJ.js +0 -38
  135. package/dist/chunk-F2E32OOJ.js.map +0 -1
  136. package/dist/chunk-F7YWBVP6.js +0 -141
  137. package/dist/chunk-F7YWBVP6.js.map +0 -1
  138. package/dist/chunk-G7JMADLU.js +0 -167
  139. package/dist/chunk-G7JMADLU.js.map +0 -1
  140. package/dist/chunk-GKCLNHVQ.js +0 -124
  141. package/dist/chunk-GKCLNHVQ.js.map +0 -1
  142. package/dist/chunk-GQBWKH72.js +0 -33
  143. package/dist/chunk-GQBWKH72.js.map +0 -1
  144. package/dist/chunk-H6SOU4UG.js +0 -10
  145. package/dist/chunk-H6SOU4UG.js.map +0 -1
  146. package/dist/chunk-HKJJHYFX.js +0 -115
  147. package/dist/chunk-HKJJHYFX.js.map +0 -1
  148. package/dist/chunk-IQ5WXHRB.js +0 -16
  149. package/dist/chunk-IQ5WXHRB.js.map +0 -1
  150. package/dist/chunk-ISZQ5TSG.js +0 -26
  151. package/dist/chunk-ISZQ5TSG.js.map +0 -1
  152. package/dist/chunk-JSYGVDO6.js +0 -41
  153. package/dist/chunk-JSYGVDO6.js.map +0 -1
  154. package/dist/chunk-KY6GKED2.js +0 -229
  155. package/dist/chunk-KY6GKED2.js.map +0 -1
  156. package/dist/chunk-L5OPCX6F.js +0 -33
  157. package/dist/chunk-L5OPCX6F.js.map +0 -1
  158. package/dist/chunk-LLMBKOKT.js +0 -44
  159. package/dist/chunk-LLMBKOKT.js.map +0 -1
  160. package/dist/chunk-MKBO4S2O.js +0 -48
  161. package/dist/chunk-MKBO4S2O.js.map +0 -1
  162. package/dist/chunk-NMQRI5G5.js +0 -48
  163. package/dist/chunk-NMQRI5G5.js.map +0 -1
  164. package/dist/chunk-OCSYB6YE.js +0 -78
  165. package/dist/chunk-OCSYB6YE.js.map +0 -1
  166. package/dist/chunk-OILW3ESA.js +0 -62
  167. package/dist/chunk-OILW3ESA.js.map +0 -1
  168. package/dist/chunk-PCVJLIUU.js +0 -125
  169. package/dist/chunk-PCVJLIUU.js.map +0 -1
  170. package/dist/chunk-RXSDAOF7.js +0 -45
  171. package/dist/chunk-RXSDAOF7.js.map +0 -1
  172. package/dist/chunk-RZD2P2BD.js +0 -77
  173. package/dist/chunk-RZD2P2BD.js.map +0 -1
  174. package/dist/chunk-UL52C2UU.js +0 -22
  175. package/dist/chunk-UL52C2UU.js.map +0 -1
  176. package/dist/chunk-USFQYYSE.js +0 -118
  177. package/dist/chunk-USFQYYSE.js.map +0 -1
  178. package/dist/chunk-UW3CSNPH.js +0 -77
  179. package/dist/chunk-UW3CSNPH.js.map +0 -1
  180. package/dist/chunk-V2ORCFEN.js +0 -156
  181. package/dist/chunk-V2ORCFEN.js.map +0 -1
  182. package/dist/chunk-WQO7NSII.js +0 -141
  183. package/dist/chunk-WQO7NSII.js.map +0 -1
  184. package/dist/chunk-WXHK2EIV.js +0 -75
  185. package/dist/chunk-WXHK2EIV.js.map +0 -1
  186. package/dist/chunk-Y6W3YC3K.js +0 -17
  187. package/dist/chunk-Y6W3YC3K.js.map +0 -1
  188. package/dist/chunk-ZRVEDPQA.js +0 -59
  189. package/dist/chunk-ZRVEDPQA.js.map +0 -1
@@ -1,6 +1,152 @@
1
- export { BrutalCTA } from '../../chunk-LLMBKOKT.js';
2
- import '../../chunk-CY2FOBOD.js';
3
- import '../../chunk-BSVJVM2L.js';
4
- import '../../chunk-H6SOU4UG.js';
1
+ "use client";
2
+ import { Button as Button$1 } from '@base-ui/react/button';
3
+ import { cva } from 'class-variance-authority';
4
+ import { clsx } from 'clsx';
5
+ import { twMerge } from 'tailwind-merge';
6
+ import { jsx, jsxs } from 'react/jsx-runtime';
7
+
8
+ // src/components/ui/button.tsx
9
+ function cn(...inputs) {
10
+ return twMerge(clsx(inputs));
11
+ }
12
+ var buttonVariants = cva(
13
+ "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",
14
+ {
15
+ variants: {
16
+ variant: {
17
+ // Primary: Black bg, white text, offset shadow
18
+ 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",
19
+ // CTA: Mint green bg — the Bannerbear signature
20
+ 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",
21
+ // Brand: Dynamic brand color bg
22
+ 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",
23
+ // Outline: White bg, black border, offset shadow
24
+ 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",
25
+ // Secondary: Light bg, border, smaller shadow
26
+ 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",
27
+ // Ghost: No border/shadow, subtle hover
28
+ ghost: "hover:bg-secondary hover:text-foreground",
29
+ // Link: Text only
30
+ link: "text-foreground underline-offset-4 hover:underline",
31
+ // Destructive
32
+ 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",
33
+ // Nav: Thin border, no shadow (for nav Sign In buttons)
34
+ nav: "border border-foreground bg-background text-foreground hover:bg-foreground hover:text-background"
35
+ },
36
+ size: {
37
+ xs: "h-7 gap-1 px-2.5 text-xs",
38
+ sm: "h-8 gap-1.5 px-3 text-sm",
39
+ default: "h-10 gap-2 px-5 text-sm",
40
+ lg: "h-12 gap-2 px-7 text-base",
41
+ xl: "h-14 gap-2.5 px-9 text-lg",
42
+ icon: "size-10",
43
+ "icon-sm": "size-8",
44
+ "icon-lg": "size-12"
45
+ }
46
+ },
47
+ defaultVariants: {
48
+ variant: "default",
49
+ size: "default"
50
+ }
51
+ }
52
+ );
53
+ function Button({
54
+ className,
55
+ variant = "default",
56
+ size = "default",
57
+ ...props
58
+ }) {
59
+ return /* @__PURE__ */ jsx(
60
+ Button$1,
61
+ {
62
+ "data-slot": "button",
63
+ className: cn(buttonVariants({ variant, size, className })),
64
+ ...props
65
+ }
66
+ );
67
+ }
68
+ var colorMap = {
69
+ white: "bg-background text-foreground",
70
+ brand: "bg-brand",
71
+ "brand-muted": "bg-brand-muted text-foreground",
72
+ blue: "bg-section-blue",
73
+ gray: "bg-section-gray text-foreground",
74
+ cream: "bg-section-cream text-foreground",
75
+ black: "bg-foreground text-background",
76
+ cta: "bg-cta"
77
+ };
78
+ var containerMap = {
79
+ sm: "brutal-container-sm",
80
+ default: "brutal-container",
81
+ lg: "brutal-container-lg"
82
+ };
83
+ var paddingMap = {
84
+ sm: "brutal-section-sm",
85
+ default: "brutal-section",
86
+ lg: "brutal-section py-28 sm:py-36 md:py-44"
87
+ };
88
+ function BrutalSection({
89
+ children,
90
+ color = "white",
91
+ className,
92
+ containerSize = "default",
93
+ padding = "default",
94
+ dots = false,
95
+ stripes = false,
96
+ id
97
+ }) {
98
+ return /* @__PURE__ */ jsx(
99
+ "section",
100
+ {
101
+ id,
102
+ className: cn(
103
+ paddingMap[padding],
104
+ colorMap[color],
105
+ dots && "brutal-dots",
106
+ stripes && "brutal-stripes",
107
+ className
108
+ ),
109
+ children: /* @__PURE__ */ jsx("div", { className: containerMap[containerSize], children })
110
+ }
111
+ );
112
+ }
113
+ function BrutalCTA({
114
+ headline,
115
+ description,
116
+ ctaText,
117
+ ctaHref = "#",
118
+ ctaVariant = "cta",
119
+ secondaryText,
120
+ secondaryHref,
121
+ color = "black",
122
+ className
123
+ }) {
124
+ return /* @__PURE__ */ jsx(BrutalSection, { color, className, children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-2xl text-center", children: [
125
+ /* @__PURE__ */ jsx("h2", { className: "brutal-h1 mb-6", children: headline }),
126
+ description && /* @__PURE__ */ jsx("p", { className: "brutal-body mb-8 opacity-80", children: description }),
127
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-center gap-4", children: [
128
+ /* @__PURE__ */ jsx(
129
+ Button,
130
+ {
131
+ variant: ctaVariant,
132
+ size: "xl",
133
+ render: /* @__PURE__ */ jsx("a", { href: ctaHref }),
134
+ children: ctaText
135
+ }
136
+ ),
137
+ secondaryText && /* @__PURE__ */ jsx(
138
+ Button,
139
+ {
140
+ variant: "outline",
141
+ size: "lg",
142
+ render: /* @__PURE__ */ jsx("a", { href: secondaryHref || "#" }),
143
+ children: secondaryText
144
+ }
145
+ )
146
+ ] })
147
+ ] }) });
148
+ }
149
+
150
+ export { BrutalCTA };
5
151
  //# sourceMappingURL=cta-section.js.map
6
152
  //# sourceMappingURL=cta-section.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"cta-section.js"}
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/button.tsx","../../../src/components/brutal/section.tsx","../../../src/components/brutal/cta-section.tsx"],"names":["ButtonPrimitive","jsx"],"mappings":"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","file":"cta-section.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\";\n\nimport { Button as ButtonPrimitive } from \"@base-ui/react/button\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n \"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\",\n {\n variants: {\n variant: {\n // Primary: Black bg, white text, offset shadow\n default:\n \"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\",\n // CTA: Mint green bg — the Bannerbear signature\n 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\",\n // Brand: Dynamic brand color bg\n brand:\n \"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\",\n // Outline: White bg, black border, offset shadow\n outline:\n \"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\",\n // Secondary: Light bg, border, smaller shadow\n secondary:\n \"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\",\n // Ghost: No border/shadow, subtle hover\n ghost: \"hover:bg-secondary hover:text-foreground\",\n // Link: Text only\n link: \"text-foreground underline-offset-4 hover:underline\",\n // Destructive\n destructive:\n \"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\",\n // Nav: Thin border, no shadow (for nav Sign In buttons)\n nav: \"border border-foreground bg-background text-foreground hover:bg-foreground hover:text-background\",\n },\n size: {\n xs: \"h-7 gap-1 px-2.5 text-xs\",\n sm: \"h-8 gap-1.5 px-3 text-sm\",\n default: \"h-10 gap-2 px-5 text-sm\",\n lg: \"h-12 gap-2 px-7 text-base\",\n xl: \"h-14 gap-2.5 px-9 text-lg\",\n icon: \"size-10\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-12\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {\n return (\n <ButtonPrimitive\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n","import { cn } from \"../../lib/utils\";\n\ntype SectionColor =\n | \"white\"\n | \"brand\"\n | \"brand-muted\"\n | \"blue\"\n | \"gray\"\n | \"cream\"\n | \"black\"\n | \"cta\";\n\ninterface BrutalSectionProps {\n children: React.ReactNode;\n color?: SectionColor;\n className?: string;\n containerSize?: \"sm\" | \"default\" | \"lg\";\n padding?: \"sm\" | \"default\" | \"lg\";\n dots?: boolean;\n stripes?: boolean;\n id?: string;\n}\n\nconst colorMap: Record<SectionColor, string> = {\n white: \"bg-background text-foreground\",\n brand: \"bg-brand\",\n \"brand-muted\": \"bg-brand-muted text-foreground\",\n blue: \"bg-section-blue\",\n gray: \"bg-section-gray text-foreground\",\n cream: \"bg-section-cream text-foreground\",\n black: \"bg-foreground text-background\",\n cta: \"bg-cta\",\n};\n\nconst containerMap = {\n sm: \"brutal-container-sm\",\n default: \"brutal-container\",\n lg: \"brutal-container-lg\",\n};\n\nconst paddingMap = {\n sm: \"brutal-section-sm\",\n default: \"brutal-section\",\n lg: \"brutal-section py-28 sm:py-36 md:py-44\",\n};\n\nexport function BrutalSection({\n children,\n color = \"white\",\n className,\n containerSize = \"default\",\n padding = \"default\",\n dots = false,\n stripes = false,\n id,\n}: BrutalSectionProps) {\n return (\n <section\n id={id}\n className={cn(\n paddingMap[padding],\n colorMap[color],\n dots && \"brutal-dots\",\n stripes && \"brutal-stripes\",\n className\n )}\n >\n <div className={containerMap[containerSize]}>{children}</div>\n </section>\n );\n}\n","import { Button } from \"../ui/button\";\nimport { BrutalSection } from \"./section\";\n\ninterface BrutalCTAProps {\n headline: string;\n description?: string;\n ctaText: string;\n ctaHref?: string;\n ctaVariant?: \"cta\" | \"brand\" | \"default\" | \"outline\";\n secondaryText?: string;\n secondaryHref?: string;\n color?: \"black\" | \"brand\" | \"blue\" | \"white\";\n className?: string;\n}\n\nexport function BrutalCTA({\n headline,\n description,\n ctaText,\n ctaHref = \"#\",\n ctaVariant = \"cta\",\n secondaryText,\n secondaryHref,\n color = \"black\",\n className,\n}: BrutalCTAProps) {\n return (\n <BrutalSection color={color} className={className}>\n <div className=\"mx-auto max-w-2xl text-center\">\n <h2 className=\"brutal-h1 mb-6\">{headline}</h2>\n {description && (\n <p className=\"brutal-body mb-8 opacity-80\">{description}</p>\n )}\n <div className=\"flex flex-wrap items-center justify-center gap-4\">\n <Button\n variant={ctaVariant}\n size=\"xl\"\n render={<a href={ctaHref} />}\n >\n {ctaText}\n </Button>\n {secondaryText && (\n <Button\n variant=\"outline\"\n size=\"lg\"\n render={<a href={secondaryHref || \"#\"} />}\n >\n {secondaryText}\n </Button>\n )}\n </div>\n </div>\n </BrutalSection>\n );\n}\n"]}
@@ -1,6 +1,143 @@
1
- export { BrutalFeatureGrid } from '../../chunk-F2E32OOJ.js';
2
- import '../../chunk-CPVH3LD5.js';
3
- import '../../chunk-BSVJVM2L.js';
4
- import '../../chunk-H6SOU4UG.js';
1
+ "use client";
2
+ import { clsx } from 'clsx';
3
+ import { twMerge } from 'tailwind-merge';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ // src/lib/utils.ts
7
+ function cn(...inputs) {
8
+ return twMerge(clsx(inputs));
9
+ }
10
+ function Card({
11
+ className,
12
+ ...props
13
+ }) {
14
+ return /* @__PURE__ */ jsx(
15
+ "div",
16
+ {
17
+ "data-slot": "card",
18
+ className: cn(
19
+ "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",
20
+ className
21
+ ),
22
+ ...props
23
+ }
24
+ );
25
+ }
26
+ function CardHeader({ className, ...props }) {
27
+ return /* @__PURE__ */ jsx(
28
+ "div",
29
+ {
30
+ "data-slot": "card-header",
31
+ className: cn("flex flex-col gap-1", className),
32
+ ...props
33
+ }
34
+ );
35
+ }
36
+ function CardTitle({ className, ...props }) {
37
+ return /* @__PURE__ */ jsx(
38
+ "div",
39
+ {
40
+ "data-slot": "card-title",
41
+ className: cn("text-lg font-bold leading-snug", className),
42
+ ...props
43
+ }
44
+ );
45
+ }
46
+ function CardDescription({ className, ...props }) {
47
+ return /* @__PURE__ */ jsx(
48
+ "div",
49
+ {
50
+ "data-slot": "card-description",
51
+ className: cn("text-sm text-muted-foreground", className),
52
+ ...props
53
+ }
54
+ );
55
+ }
56
+ function CardContent({ className, ...props }) {
57
+ return /* @__PURE__ */ jsx(
58
+ "div",
59
+ {
60
+ "data-slot": "card-content",
61
+ className: cn("", className),
62
+ ...props
63
+ }
64
+ );
65
+ }
66
+ var colorMap = {
67
+ white: "bg-background text-foreground",
68
+ brand: "bg-brand",
69
+ "brand-muted": "bg-brand-muted text-foreground",
70
+ blue: "bg-section-blue",
71
+ gray: "bg-section-gray text-foreground",
72
+ cream: "bg-section-cream text-foreground",
73
+ black: "bg-foreground text-background",
74
+ cta: "bg-cta"
75
+ };
76
+ var containerMap = {
77
+ sm: "brutal-container-sm",
78
+ default: "brutal-container",
79
+ lg: "brutal-container-lg"
80
+ };
81
+ var paddingMap = {
82
+ sm: "brutal-section-sm",
83
+ default: "brutal-section",
84
+ lg: "brutal-section py-28 sm:py-36 md:py-44"
85
+ };
86
+ function BrutalSection({
87
+ children,
88
+ color = "white",
89
+ className,
90
+ containerSize = "default",
91
+ padding = "default",
92
+ dots = false,
93
+ stripes = false,
94
+ id
95
+ }) {
96
+ return /* @__PURE__ */ jsx(
97
+ "section",
98
+ {
99
+ id,
100
+ className: cn(
101
+ paddingMap[padding],
102
+ colorMap[color],
103
+ dots && "brutal-dots",
104
+ stripes && "brutal-stripes",
105
+ className
106
+ ),
107
+ children: /* @__PURE__ */ jsx("div", { className: containerMap[containerSize], children })
108
+ }
109
+ );
110
+ }
111
+ var colMap = {
112
+ 2: "sm:grid-cols-2",
113
+ 3: "sm:grid-cols-2 lg:grid-cols-3",
114
+ 4: "sm:grid-cols-2 lg:grid-cols-4"
115
+ };
116
+ function BrutalFeatureGrid({
117
+ badge,
118
+ headline,
119
+ description,
120
+ features,
121
+ columns = 3,
122
+ color = "white",
123
+ className
124
+ }) {
125
+ return /* @__PURE__ */ jsxs(BrutalSection, { color, className, children: [
126
+ /* @__PURE__ */ jsxs("div", { className: "mb-12 max-w-2xl", children: [
127
+ badge && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-4 text-muted-foreground", children: badge }),
128
+ /* @__PURE__ */ jsx("h2", { className: "brutal-h2 mb-4", children: headline }),
129
+ description && /* @__PURE__ */ jsx("p", { className: "brutal-body text-muted-foreground", children: description })
130
+ ] }),
131
+ /* @__PURE__ */ jsx("div", { className: cn("grid gap-6", colMap[columns]), children: features.map((feature) => /* @__PURE__ */ jsxs(Card, { children: [
132
+ /* @__PURE__ */ jsxs(CardHeader, { children: [
133
+ feature.icon && /* @__PURE__ */ jsx("div", { className: "mb-2 inline-flex size-12 items-center justify-center border-brutal border-foreground bg-brand-muted text-2xl shadow-brutal-sm", children: feature.icon }),
134
+ /* @__PURE__ */ jsx(CardTitle, { children: feature.title })
135
+ ] }),
136
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx(CardDescription, { children: feature.description }) })
137
+ ] }, feature.title)) })
138
+ ] });
139
+ }
140
+
141
+ export { BrutalFeatureGrid };
5
142
  //# sourceMappingURL=feature-grid.js.map
6
143
  //# sourceMappingURL=feature-grid.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"feature-grid.js"}
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/card.tsx","../../../src/components/brutal/section.tsx","../../../src/components/brutal/feature-grid.tsx"],"names":["jsx"],"mappings":"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","file":"feature-grid.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Card({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\n \"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\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\"flex flex-col gap-1\", className)}\n {...props}\n />\n );\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\"text-lg font-bold leading-snug\", className)}\n {...props}\n />\n );\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\"self-start justify-self-end\", className)}\n {...props}\n />\n );\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"\", className)}\n {...props}\n />\n );\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\n \"flex items-center border-t-brutal border-foreground pt-4\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n};\n","import { cn } from \"../../lib/utils\";\n\ntype SectionColor =\n | \"white\"\n | \"brand\"\n | \"brand-muted\"\n | \"blue\"\n | \"gray\"\n | \"cream\"\n | \"black\"\n | \"cta\";\n\ninterface BrutalSectionProps {\n children: React.ReactNode;\n color?: SectionColor;\n className?: string;\n containerSize?: \"sm\" | \"default\" | \"lg\";\n padding?: \"sm\" | \"default\" | \"lg\";\n dots?: boolean;\n stripes?: boolean;\n id?: string;\n}\n\nconst colorMap: Record<SectionColor, string> = {\n white: \"bg-background text-foreground\",\n brand: \"bg-brand\",\n \"brand-muted\": \"bg-brand-muted text-foreground\",\n blue: \"bg-section-blue\",\n gray: \"bg-section-gray text-foreground\",\n cream: \"bg-section-cream text-foreground\",\n black: \"bg-foreground text-background\",\n cta: \"bg-cta\",\n};\n\nconst containerMap = {\n sm: \"brutal-container-sm\",\n default: \"brutal-container\",\n lg: \"brutal-container-lg\",\n};\n\nconst paddingMap = {\n sm: \"brutal-section-sm\",\n default: \"brutal-section\",\n lg: \"brutal-section py-28 sm:py-36 md:py-44\",\n};\n\nexport function BrutalSection({\n children,\n color = \"white\",\n className,\n containerSize = \"default\",\n padding = \"default\",\n dots = false,\n stripes = false,\n id,\n}: BrutalSectionProps) {\n return (\n <section\n id={id}\n className={cn(\n paddingMap[padding],\n colorMap[color],\n dots && \"brutal-dots\",\n stripes && \"brutal-stripes\",\n className\n )}\n >\n <div className={containerMap[containerSize]}>{children}</div>\n </section>\n );\n}\n","import { cn } from \"../../lib/utils\";\nimport {\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n} from \"../ui/card\";\nimport { BrutalSection } from \"./section\";\n\ninterface Feature {\n icon?: React.ReactNode;\n title: string;\n description: string;\n}\n\ninterface BrutalFeatureGridProps {\n badge?: string;\n headline: string;\n description?: string;\n features: Feature[];\n columns?: 2 | 3 | 4;\n color?: \"white\" | \"brand\" | \"brand-muted\" | \"gray\" | \"cream\";\n className?: string;\n}\n\nconst colMap = {\n 2: \"sm:grid-cols-2\",\n 3: \"sm:grid-cols-2 lg:grid-cols-3\",\n 4: \"sm:grid-cols-2 lg:grid-cols-4\",\n};\n\nexport function BrutalFeatureGrid({\n badge,\n headline,\n description,\n features,\n columns = 3,\n color = \"white\",\n className,\n}: BrutalFeatureGridProps) {\n return (\n <BrutalSection color={color} className={className}>\n <div className=\"mb-12 max-w-2xl\">\n {badge && (\n <p className=\"brutal-label mb-4 text-muted-foreground\">{badge}</p>\n )}\n <h2 className=\"brutal-h2 mb-4\">{headline}</h2>\n {description && (\n <p className=\"brutal-body text-muted-foreground\">{description}</p>\n )}\n </div>\n\n <div className={cn(\"grid gap-6\", colMap[columns])}>\n {features.map((feature) => (\n <Card key={feature.title}>\n <CardHeader>\n {feature.icon && (\n <div className=\"mb-2 inline-flex size-12 items-center justify-center border-brutal border-foreground bg-brand-muted text-2xl shadow-brutal-sm\">\n {feature.icon}\n </div>\n )}\n <CardTitle>{feature.title}</CardTitle>\n </CardHeader>\n <CardContent>\n <CardDescription>{feature.description}</CardDescription>\n </CardContent>\n </Card>\n ))}\n </div>\n </BrutalSection>\n );\n}\n"]}
@@ -1,4 +1,54 @@
1
- export { BrutalFooter } from '../../chunk-NMQRI5G5.js';
2
- import '../../chunk-H6SOU4UG.js';
1
+ "use client";
2
+ import { clsx } from 'clsx';
3
+ import { twMerge } from 'tailwind-merge';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ // src/lib/utils.ts
7
+ function cn(...inputs) {
8
+ return twMerge(clsx(inputs));
9
+ }
10
+ function BrutalFooter({
11
+ logo,
12
+ tagline,
13
+ columns,
14
+ bottomLeft,
15
+ bottomRight,
16
+ className
17
+ }) {
18
+ return /* @__PURE__ */ jsx(
19
+ "footer",
20
+ {
21
+ className: cn(
22
+ "w-full border-t-brutal border-foreground bg-background px-6 py-12 text-foreground",
23
+ className
24
+ ),
25
+ children: /* @__PURE__ */ jsxs("div", { className: "brutal-container", children: [
26
+ /* @__PURE__ */ jsxs("div", { className: "mb-10 flex flex-col gap-8 sm:flex-row sm:items-start sm:justify-between", children: [
27
+ /* @__PURE__ */ jsxs("div", { className: "max-w-xs", children: [
28
+ /* @__PURE__ */ jsx("div", { className: "mb-2 text-xl font-black", children: logo }),
29
+ tagline && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: tagline })
30
+ ] }),
31
+ /* @__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: [
32
+ /* @__PURE__ */ jsx("h3", { className: "brutal-label mb-3 text-muted-foreground", children: col.title }),
33
+ /* @__PURE__ */ jsx("ul", { className: "flex flex-col gap-2", children: col.links.map((link) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
34
+ "a",
35
+ {
36
+ href: link.href,
37
+ className: "text-sm font-medium transition-colors hover:text-muted-foreground",
38
+ children: link.label
39
+ }
40
+ ) }, link.href)) })
41
+ ] }, col.title)) })
42
+ ] }),
43
+ /* @__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: [
44
+ /* @__PURE__ */ jsx("span", { children: bottomLeft || "Built with care" }),
45
+ /* @__PURE__ */ jsx("span", { children: bottomRight || (/* @__PURE__ */ new Date()).getFullYear() })
46
+ ] })
47
+ ] })
48
+ }
49
+ );
50
+ }
51
+
52
+ export { BrutalFooter };
3
53
  //# sourceMappingURL=footer.js.map
4
54
  //# sourceMappingURL=footer.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"footer.js"}
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/brutal/footer.tsx"],"names":[],"mappings":";;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACWO,SAAS,YAAA,CAAa;AAAA,EAC3B,IAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,mFAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yEAAA,EAEb,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,UAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAA2B,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,YAC9C,OAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAiC,QAAA,EAAA,OAAA,EAAQ;AAAA,WAAA,EAE1D,CAAA;AAAA,0BAGA,GAAA,CAAC,SAAI,SAAA,EAAU,iDAAA,EACZ,kBAAQ,GAAA,CAAI,CAAC,GAAA,qBACZ,IAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yCAAA,EACX,QAAA,EAAA,GAAA,CAAI,KAAA,EACP,CAAA;AAAA,4BACA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qBAAA,EACX,QAAA,EAAA,GAAA,CAAI,MAAM,GAAA,CAAI,CAAC,IAAA,qBACd,GAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,cAAC,GAAA;AAAA,cAAA;AAAA,gBACC,MAAM,IAAA,CAAK,IAAA;AAAA,gBACX,SAAA,EAAU,mEAAA;AAAA,gBAET,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,aACR,EAAA,EANO,IAAA,CAAK,IAOd,CACD,CAAA,EACH;AAAA,WAAA,EAAA,EAfQ,GAAA,CAAI,KAgBd,CACD,CAAA,EACH;AAAA,SAAA,EACF,CAAA;AAAA,wBAGA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4IAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,MAAA,EAAA,EAAM,wBAAc,iBAAA,EAAkB,CAAA;AAAA,8BACtC,MAAA,EAAA,EAAM,QAAA,EAAA,WAAA,IAAA,qBAAmB,IAAA,EAAK,EAAE,aAAY,EAAE;AAAA,SAAA,EACjD;AAAA,OAAA,EACF;AAAA;AAAA,GACF;AAEJ","file":"footer.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { cn } from \"../../lib/utils\";\n\ninterface FooterColumn {\n title: string;\n links: { label: string; href: string }[];\n}\n\ninterface BrutalFooterProps {\n logo: React.ReactNode;\n tagline?: string;\n columns: FooterColumn[];\n bottomLeft?: string;\n bottomRight?: string;\n className?: string;\n}\n\nexport function BrutalFooter({\n logo,\n tagline,\n columns,\n bottomLeft,\n bottomRight,\n className,\n}: BrutalFooterProps) {\n return (\n <footer\n className={cn(\n \"w-full border-t-brutal border-foreground bg-background px-6 py-12 text-foreground\",\n className\n )}\n >\n <div className=\"brutal-container\">\n <div className=\"mb-10 flex flex-col gap-8 sm:flex-row sm:items-start sm:justify-between\">\n {/* Logo + tagline */}\n <div className=\"max-w-xs\">\n <div className=\"mb-2 text-xl font-black\">{logo}</div>\n {tagline && (\n <p className=\"text-sm text-muted-foreground\">{tagline}</p>\n )}\n </div>\n\n {/* Link columns */}\n <div className=\"grid grid-cols-2 gap-8 sm:grid-cols-3 md:gap-12\">\n {columns.map((col) => (\n <div key={col.title}>\n <h3 className=\"brutal-label mb-3 text-muted-foreground\">\n {col.title}\n </h3>\n <ul className=\"flex flex-col gap-2\">\n {col.links.map((link) => (\n <li key={link.href}>\n <a\n href={link.href}\n className=\"text-sm font-medium transition-colors hover:text-muted-foreground\"\n >\n {link.label}\n </a>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n </div>\n\n {/* Bottom bar */}\n <div className=\"flex items-center justify-between border-t-brutal border-foreground pt-6 font-mono text-xs uppercase tracking-widest text-muted-foreground\">\n <span>{bottomLeft || \"Built with care\"}</span>\n <span>{bottomRight || new Date().getFullYear()}</span>\n </div>\n </div>\n </footer>\n );\n}\n"]}
@@ -1,6 +1,151 @@
1
- export { BrutalHero } from '../../chunk-3HN3QP23.js';
2
- import '../../chunk-CY2FOBOD.js';
3
- import '../../chunk-BSVJVM2L.js';
4
- import '../../chunk-H6SOU4UG.js';
1
+ "use client";
2
+ import { clsx } from 'clsx';
3
+ import { twMerge } from 'tailwind-merge';
4
+ import { Button as Button$1 } from '@base-ui/react/button';
5
+ import { cva } from 'class-variance-authority';
6
+ import { jsx, jsxs } from 'react/jsx-runtime';
7
+
8
+ // src/lib/utils.ts
9
+ function cn(...inputs) {
10
+ return twMerge(clsx(inputs));
11
+ }
12
+ var buttonVariants = cva(
13
+ "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",
14
+ {
15
+ variants: {
16
+ variant: {
17
+ // Primary: Black bg, white text, offset shadow
18
+ 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",
19
+ // CTA: Mint green bg — the Bannerbear signature
20
+ 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",
21
+ // Brand: Dynamic brand color bg
22
+ 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",
23
+ // Outline: White bg, black border, offset shadow
24
+ 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",
25
+ // Secondary: Light bg, border, smaller shadow
26
+ 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",
27
+ // Ghost: No border/shadow, subtle hover
28
+ ghost: "hover:bg-secondary hover:text-foreground",
29
+ // Link: Text only
30
+ link: "text-foreground underline-offset-4 hover:underline",
31
+ // Destructive
32
+ 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",
33
+ // Nav: Thin border, no shadow (for nav Sign In buttons)
34
+ nav: "border border-foreground bg-background text-foreground hover:bg-foreground hover:text-background"
35
+ },
36
+ size: {
37
+ xs: "h-7 gap-1 px-2.5 text-xs",
38
+ sm: "h-8 gap-1.5 px-3 text-sm",
39
+ default: "h-10 gap-2 px-5 text-sm",
40
+ lg: "h-12 gap-2 px-7 text-base",
41
+ xl: "h-14 gap-2.5 px-9 text-lg",
42
+ icon: "size-10",
43
+ "icon-sm": "size-8",
44
+ "icon-lg": "size-12"
45
+ }
46
+ },
47
+ defaultVariants: {
48
+ variant: "default",
49
+ size: "default"
50
+ }
51
+ }
52
+ );
53
+ function Button({
54
+ className,
55
+ variant = "default",
56
+ size = "default",
57
+ ...props
58
+ }) {
59
+ return /* @__PURE__ */ jsx(
60
+ Button$1,
61
+ {
62
+ "data-slot": "button",
63
+ className: cn(buttonVariants({ variant, size, className })),
64
+ ...props
65
+ }
66
+ );
67
+ }
68
+ var colorMap = {
69
+ white: "bg-background text-foreground",
70
+ brand: "bg-brand",
71
+ "brand-muted": "bg-brand-muted text-foreground",
72
+ blue: "bg-section-blue",
73
+ gray: "bg-section-gray text-foreground",
74
+ cream: "bg-section-cream text-foreground",
75
+ black: "bg-foreground text-background",
76
+ cta: "bg-cta"
77
+ };
78
+ var containerMap = {
79
+ sm: "brutal-container-sm",
80
+ default: "brutal-container",
81
+ lg: "brutal-container-lg"
82
+ };
83
+ var paddingMap = {
84
+ sm: "brutal-section-sm",
85
+ default: "brutal-section",
86
+ lg: "brutal-section py-28 sm:py-36 md:py-44"
87
+ };
88
+ function BrutalSection({
89
+ children,
90
+ color = "white",
91
+ className,
92
+ containerSize = "default",
93
+ padding = "default",
94
+ dots = false,
95
+ stripes = false,
96
+ id
97
+ }) {
98
+ return /* @__PURE__ */ jsx(
99
+ "section",
100
+ {
101
+ id,
102
+ className: cn(
103
+ paddingMap[padding],
104
+ colorMap[color],
105
+ dots && "brutal-dots",
106
+ stripes && "brutal-stripes",
107
+ className
108
+ ),
109
+ children: /* @__PURE__ */ jsx("div", { className: containerMap[containerSize], children })
110
+ }
111
+ );
112
+ }
113
+ function BrutalHero({
114
+ badge,
115
+ headline,
116
+ description,
117
+ ctaText,
118
+ ctaHref = "#",
119
+ ctaVariant = "cta",
120
+ visual,
121
+ color = "brand",
122
+ proof,
123
+ className
124
+ }) {
125
+ return /* @__PURE__ */ jsx(BrutalSection, { color, padding: "lg", className, children: /* @__PURE__ */ jsxs(
126
+ "div",
127
+ {
128
+ className: cn(
129
+ "grid items-center gap-12",
130
+ visual ? "lg:grid-cols-2 lg:gap-16" : "max-w-3xl"
131
+ ),
132
+ children: [
133
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-6", children: [
134
+ badge && /* @__PURE__ */ jsx("div", { className: "inline-flex w-fit border-brutal border-foreground bg-background px-3 py-1 font-mono text-xs font-bold uppercase tracking-widest shadow-brutal-sm", children: badge }),
135
+ /* @__PURE__ */ jsx("h1", { className: "brutal-display text-balance", children: headline }),
136
+ /* @__PURE__ */ jsx("p", { className: "brutal-body-lg max-w-lg opacity-80", children: description }),
137
+ /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Button, { variant: ctaVariant, size: "xl", render: /* @__PURE__ */ jsx("a", { href: ctaHref }), children: ctaText }) }),
138
+ proof && /* @__PURE__ */ jsxs("p", { className: "flex items-center gap-2 text-sm font-medium opacity-70", children: [
139
+ /* @__PURE__ */ jsx("span", { className: "inline-flex size-5 items-center justify-center border border-current text-xs", children: "\u2713" }),
140
+ proof
141
+ ] })
142
+ ] }),
143
+ visual && /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center", children: visual })
144
+ ]
145
+ }
146
+ ) });
147
+ }
148
+
149
+ export { BrutalHero };
5
150
  //# sourceMappingURL=hero.js.map
6
151
  //# sourceMappingURL=hero.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"hero.js"}
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/button.tsx","../../../src/components/brutal/section.tsx","../../../src/components/brutal/hero.tsx"],"names":["ButtonPrimitive","jsx"],"mappings":"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","file":"hero.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\";\n\nimport { Button as ButtonPrimitive } from \"@base-ui/react/button\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n \"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\",\n {\n variants: {\n variant: {\n // Primary: Black bg, white text, offset shadow\n default:\n \"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\",\n // CTA: Mint green bg — the Bannerbear signature\n 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\",\n // Brand: Dynamic brand color bg\n brand:\n \"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\",\n // Outline: White bg, black border, offset shadow\n outline:\n \"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\",\n // Secondary: Light bg, border, smaller shadow\n secondary:\n \"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\",\n // Ghost: No border/shadow, subtle hover\n ghost: \"hover:bg-secondary hover:text-foreground\",\n // Link: Text only\n link: \"text-foreground underline-offset-4 hover:underline\",\n // Destructive\n destructive:\n \"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\",\n // Nav: Thin border, no shadow (for nav Sign In buttons)\n nav: \"border border-foreground bg-background text-foreground hover:bg-foreground hover:text-background\",\n },\n size: {\n xs: \"h-7 gap-1 px-2.5 text-xs\",\n sm: \"h-8 gap-1.5 px-3 text-sm\",\n default: \"h-10 gap-2 px-5 text-sm\",\n lg: \"h-12 gap-2 px-7 text-base\",\n xl: \"h-14 gap-2.5 px-9 text-lg\",\n icon: \"size-10\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-12\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {\n return (\n <ButtonPrimitive\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n","import { cn } from \"../../lib/utils\";\n\ntype SectionColor =\n | \"white\"\n | \"brand\"\n | \"brand-muted\"\n | \"blue\"\n | \"gray\"\n | \"cream\"\n | \"black\"\n | \"cta\";\n\ninterface BrutalSectionProps {\n children: React.ReactNode;\n color?: SectionColor;\n className?: string;\n containerSize?: \"sm\" | \"default\" | \"lg\";\n padding?: \"sm\" | \"default\" | \"lg\";\n dots?: boolean;\n stripes?: boolean;\n id?: string;\n}\n\nconst colorMap: Record<SectionColor, string> = {\n white: \"bg-background text-foreground\",\n brand: \"bg-brand\",\n \"brand-muted\": \"bg-brand-muted text-foreground\",\n blue: \"bg-section-blue\",\n gray: \"bg-section-gray text-foreground\",\n cream: \"bg-section-cream text-foreground\",\n black: \"bg-foreground text-background\",\n cta: \"bg-cta\",\n};\n\nconst containerMap = {\n sm: \"brutal-container-sm\",\n default: \"brutal-container\",\n lg: \"brutal-container-lg\",\n};\n\nconst paddingMap = {\n sm: \"brutal-section-sm\",\n default: \"brutal-section\",\n lg: \"brutal-section py-28 sm:py-36 md:py-44\",\n};\n\nexport function BrutalSection({\n children,\n color = \"white\",\n className,\n containerSize = \"default\",\n padding = \"default\",\n dots = false,\n stripes = false,\n id,\n}: BrutalSectionProps) {\n return (\n <section\n id={id}\n className={cn(\n paddingMap[padding],\n colorMap[color],\n dots && \"brutal-dots\",\n stripes && \"brutal-stripes\",\n className\n )}\n >\n <div className={containerMap[containerSize]}>{children}</div>\n </section>\n );\n}\n","import { cn } from \"../../lib/utils\";\nimport { Button } from \"../ui/button\";\nimport { BrutalSection } from \"./section\";\n\ninterface BrutalHeroProps {\n badge?: string;\n headline: string;\n description: string;\n ctaText: string;\n ctaHref?: string;\n ctaVariant?: \"cta\" | \"brand\" | \"default\";\n visual?: React.ReactNode;\n color?: \"white\" | \"brand\" | \"brand-muted\" | \"gray\";\n proof?: string;\n className?: string;\n}\n\nexport function BrutalHero({\n badge,\n headline,\n description,\n ctaText,\n ctaHref = \"#\",\n ctaVariant = \"cta\",\n visual,\n color = \"brand\",\n proof,\n className,\n}: BrutalHeroProps) {\n return (\n <BrutalSection color={color} padding=\"lg\" className={className}>\n <div\n className={cn(\n \"grid items-center gap-12\",\n visual ? \"lg:grid-cols-2 lg:gap-16\" : \"max-w-3xl\"\n )}\n >\n {/* Text side */}\n <div className=\"flex flex-col gap-6\">\n {badge && (\n <div className=\"inline-flex w-fit border-brutal border-foreground bg-background px-3 py-1 font-mono text-xs font-bold uppercase tracking-widest shadow-brutal-sm\">\n {badge}\n </div>\n )}\n\n <h1 className=\"brutal-display text-balance\">{headline}</h1>\n\n <p className=\"brutal-body-lg max-w-lg opacity-80\">{description}</p>\n\n <div>\n <Button variant={ctaVariant} size=\"xl\" render={<a href={ctaHref} />}>\n {ctaText}\n </Button>\n </div>\n\n {proof && (\n <p className=\"flex items-center gap-2 text-sm font-medium opacity-70\">\n <span className=\"inline-flex size-5 items-center justify-center border border-current text-xs\">\n ✓\n </span>\n {proof}\n </p>\n )}\n </div>\n\n {/* Visual side */}\n {visual && <div className=\"flex items-center justify-center\">{visual}</div>}\n </div>\n </BrutalSection>\n );\n}\n"]}