@snow-labs/brutal-ui 0.4.0 → 0.5.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/comparison-table.js +2 -2
- package/dist/components/brutal/comparison-table.js.map +1 -1
- package/dist/components/brutal/cta-section.js +2 -2
- package/dist/components/brutal/cta-section.js.map +1 -1
- package/dist/components/brutal/faq.js +2 -2
- package/dist/components/brutal/faq.js.map +1 -1
- package/dist/components/brutal/feature-grid.js +2 -2
- package/dist/components/brutal/feature-grid.js.map +1 -1
- package/dist/components/brutal/feature-showcase.js +2 -2
- package/dist/components/brutal/feature-showcase.js.map +1 -1
- package/dist/components/brutal/footer.js +1 -2
- package/dist/components/brutal/footer.js.map +1 -1
- package/dist/components/brutal/hero.js +2 -2
- package/dist/components/brutal/hero.js.map +1 -1
- package/dist/components/brutal/index.js +10 -16
- package/dist/components/brutal/index.js.map +1 -1
- package/dist/components/brutal/integration-grid.js +3 -3
- package/dist/components/brutal/integration-grid.js.map +1 -1
- package/dist/components/brutal/logo-cloud.js +2 -2
- package/dist/components/brutal/logo-cloud.js.map +1 -1
- package/dist/components/brutal/nav.js +1 -1
- package/dist/components/brutal/nav.js.map +1 -1
- package/dist/components/brutal/newsletter.js +2 -2
- package/dist/components/brutal/newsletter.js.map +1 -1
- package/dist/components/brutal/pricing-table.js +2 -2
- package/dist/components/brutal/pricing-table.js.map +1 -1
- package/dist/components/brutal/section.js +2 -2
- package/dist/components/brutal/section.js.map +1 -1
- package/dist/components/brutal/stats-bar.js +3 -3
- package/dist/components/brutal/stats-bar.js.map +1 -1
- package/dist/components/brutal/testimonials.js +6 -11
- package/dist/components/brutal/testimonials.js.map +1 -1
- package/dist/index.js +10 -16
- package/dist/index.js.map +1 -1
- package/dist/templates/index.js +9 -15
- package/dist/templates/index.js.map +1 -1
- package/dist/templates/saas-launch.js +9 -15
- package/dist/templates/saas-launch.js.map +1 -1
- package/dist/templates/studio.js +8 -14
- package/dist/templates/studio.js.map +1 -1
- package/dist/theme.css +41 -4
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/brutal/section.tsx","../../../src/components/brutal/testimonials.tsx"],"names":["jsx"],"mappings":"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","file":"testimonials.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\nexport type SectionColor =\n | \"white\"\n | \"brand\"\n | \"brand-muted\"\n | \"blue\"\n | \"gray\"\n | \"cream\"\n | \"black\"\n | \"cta\";\n\nexport type SectionPattern =\n | \"dots\"\n | \"stripes\"\n | \"noise\"\n | \"grain\"\n | \"crosshatch\"\n | \"grid-dots\"\n | \"gradient-mesh\"\n | \"none\";\n\ninterface BrutalSectionProps {\n children: React.ReactNode;\n color?: SectionColor;\n className?: string;\n containerSize?: \"sm\" | \"default\" | \"lg\";\n padding?: \"sm\" | \"default\" | \"lg\";\n pattern?: SectionPattern;\n /** @deprecated Use pattern=\"dots\" instead */\n dots?: boolean;\n /** @deprecated Use pattern=\"stripes\" instead */\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\nconst patternMap: Record<SectionPattern, string> = {\n dots: \"brutal-dots\",\n stripes: \"brutal-stripes\",\n noise: \"brutal-noise\",\n grain: \"brutal-grain\",\n crosshatch: \"brutal-crosshatch\",\n \"grid-dots\": \"brutal-grid-dots\",\n \"gradient-mesh\": \"brutal-gradient-mesh\",\n none: \"\",\n};\n\nexport function BrutalSection({\n children,\n color = \"white\",\n className,\n containerSize = \"default\",\n padding = \"default\",\n pattern,\n dots = false,\n stripes = false,\n id,\n}: BrutalSectionProps) {\n const resolvedPattern = pattern\n ?? (dots ? \"dots\" : undefined)\n ?? (stripes ? \"stripes\" : undefined)\n ?? \"none\";\n\n return (\n <section\n id={id}\n className={cn(\n paddingMap[padding],\n colorMap[color],\n patternMap[resolvedPattern],\n className\n )}\n >\n <div className={containerMap[containerSize]}>{children}</div>\n </section>\n );\n}\n","import { cn } from \"../../lib/utils\";\nimport { BrutalSection } from \"./section\";\nimport type { SectionColor, SectionPattern } from \"./section\";\n\nexport interface Testimonial {\n name: string;\n handle?: string;\n avatar?: string;\n text: string;\n role?: string;\n company?: string;\n companyLogo?: string;\n rating?: 1 | 2 | 3 | 4 | 5;\n featured?: boolean;\n}\n\ninterface BrutalTestimonialsProps {\n badge?: string;\n headline?: string;\n testimonials: Testimonial[];\n variant?: \"masonry\" | \"featured-grid\" | \"carousel\" | \"wall-of-love\";\n color?: SectionColor;\n pattern?: SectionPattern;\n className?: string;\n}\n\nfunction StarRating({ rating }: { rating: number }) {\n return (\n <div className=\"flex gap-0.5\">\n {Array.from({ length: 5 }, (_, i) => (\n <span\n key={i}\n className={cn(\n \"text-sm\",\n i < rating ? \"text-amber-500\" : \"text-foreground/20\"\n )}\n >\n ★\n </span>\n ))}\n </div>\n );\n}\n\nfunction TestimonialCard({\n t,\n className,\n}: {\n t: Testimonial;\n className?: string;\n}) {\n return (\n <div\n className={cn(\n \"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\",\n className\n )}\n >\n {/* Decorative quote mark */}\n <span className=\"pointer-events-none absolute top-3 right-4 select-none font-serif text-5xl leading-none text-foreground/[0.06]\">\n “\n </span>\n\n {t.rating && (\n <div className=\"mb-3\">\n <StarRating rating={t.rating} />\n </div>\n )}\n\n <p className=\"relative mb-4 text-sm leading-relaxed\">{t.text}</p>\n\n <div className=\"flex items-center gap-3\">\n {t.avatar ? (\n <img\n src={t.avatar}\n alt={t.name}\n className=\"size-9 border-2 object-cover\"\n style={{ borderColor: \"hsl(var(--brand))\" }}\n />\n ) : (\n <div\n className=\"flex size-9 items-center justify-center border-2 font-bold text-brand-foreground\"\n style={{\n borderColor: \"hsl(var(--brand))\",\n backgroundColor: \"hsl(var(--brand))\",\n }}\n >\n {t.name[0]}\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-bold\">{t.name}</p>\n {(t.role || t.company) && (\n <p className=\"truncate text-xs text-muted-foreground\">\n {t.role}\n {t.role && t.company && \" · \"}\n {t.company}\n </p>\n )}\n {!t.role && !t.company && t.handle && (\n <p className=\"font-mono text-xs text-muted-foreground\">\n {t.handle}\n </p>\n )}\n </div>\n {t.companyLogo && (\n <img\n src={t.companyLogo}\n alt={t.company || \"\"}\n className=\"h-5 object-contain opacity-60\"\n />\n )}\n </div>\n </div>\n );\n}\n\nfunction MasonryLayout({ testimonials }: { testimonials: Testimonial[] }) {\n return (\n <div className=\"columns-1 gap-6 sm:columns-2 lg:columns-3\">\n {testimonials.map((t, i) => (\n <TestimonialCard key={i} t={t} className=\"mb-6\" />\n ))}\n </div>\n );\n}\n\nfunction FeaturedGridLayout({\n testimonials,\n}: {\n testimonials: Testimonial[];\n}) {\n const featured = testimonials.find((t) => t.featured) || testimonials[0];\n const rest = testimonials.filter((t) => t !== featured);\n\n return (\n <div className=\"grid gap-6 lg:grid-cols-2\">\n {/* Large featured card */}\n {featured && (\n <TestimonialCard\n t={featured}\n className=\"flex flex-col justify-between p-8 lg:row-span-2\"\n />\n )}\n {/* Smaller grid */}\n {rest.map((t, i) => (\n <TestimonialCard key={i} t={t} />\n ))}\n </div>\n );\n}\n\nfunction CarouselLayout({ testimonials }: { testimonials: Testimonial[] }) {\n return (\n <div className=\"-mx-6 flex snap-x snap-mandatory gap-6 overflow-x-auto px-6 pb-4\">\n {testimonials.map((t, i) => (\n <TestimonialCard\n key={i}\n t={t}\n className=\"w-80 flex-none snap-center\"\n />\n ))}\n </div>\n );\n}\n\nfunction WallOfLoveLayout({ testimonials }: { testimonials: Testimonial[] }) {\n return (\n <div className=\"relative max-h-[600px] overflow-hidden\">\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n {testimonials.map((t, i) => (\n <TestimonialCard key={i} t={t} />\n ))}\n </div>\n {/* Fade overlay at bottom */}\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 h-32 bg-gradient-to-t from-background to-transparent\" />\n </div>\n );\n}\n\nexport function BrutalTestimonials({\n badge,\n headline,\n testimonials,\n variant = \"masonry\",\n color = \"blue\",\n pattern,\n className,\n}: BrutalTestimonialsProps) {\n return (\n <BrutalSection color={color} pattern={pattern} className={className}>\n {(headline || badge) && (\n <div className=\"mb-12 text-center\">\n {badge && <p className=\"brutal-label mb-4 opacity-70\">{badge}</p>}\n {headline && <h2 className=\"brutal-h2\">{headline}</h2>}\n </div>\n )}\n\n {variant === \"masonry\" && <MasonryLayout testimonials={testimonials} />}\n {variant === \"featured-grid\" && (\n <FeaturedGridLayout testimonials={testimonials} />\n )}\n {variant === \"carousel\" && (\n <CarouselLayout testimonials={testimonials} />\n )}\n {variant === \"wall-of-love\" && (\n <WallOfLoveLayout testimonials={testimonials} />\n )}\n </BrutalSection>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/brutal/section.tsx","../../../src/components/brutal/testimonials.tsx"],"names":["jsx"],"mappings":"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","file":"testimonials.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\nexport type SectionColor =\n | \"white\"\n | \"brand\"\n | \"brand-muted\"\n | \"blue\"\n | \"gray\"\n | \"cream\"\n | \"black\"\n | \"cta\";\n\nexport type SectionPattern =\n | \"dots\"\n | \"stripes\"\n | \"noise\"\n | \"grain\"\n | \"crosshatch\"\n | \"grid-dots\"\n | \"gradient-mesh\"\n | \"none\";\n\ninterface BrutalSectionProps {\n children: React.ReactNode;\n color?: SectionColor;\n className?: string;\n containerSize?: \"sm\" | \"default\" | \"lg\";\n padding?: \"sm\" | \"default\" | \"lg\";\n pattern?: SectionPattern;\n /** @deprecated Use pattern=\"dots\" instead */\n dots?: boolean;\n /** @deprecated Use pattern=\"stripes\" instead */\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-muted text-foreground\",\n cream: \"bg-secondary 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\nconst patternMap: Record<SectionPattern, string> = {\n dots: \"brutal-dots\",\n stripes: \"brutal-stripes\",\n noise: \"brutal-noise\",\n grain: \"brutal-grain\",\n crosshatch: \"brutal-crosshatch\",\n \"grid-dots\": \"brutal-grid-dots\",\n \"gradient-mesh\": \"brutal-gradient-mesh\",\n none: \"\",\n};\n\nexport function BrutalSection({\n children,\n color = \"white\",\n className,\n containerSize = \"default\",\n padding = \"default\",\n pattern,\n dots = false,\n stripes = false,\n id,\n}: BrutalSectionProps) {\n const resolvedPattern = pattern\n ?? (dots ? \"dots\" : undefined)\n ?? (stripes ? \"stripes\" : undefined)\n ?? \"none\";\n\n return (\n <section\n id={id}\n className={cn(\n paddingMap[padding],\n colorMap[color],\n patternMap[resolvedPattern],\n className\n )}\n >\n <div className={containerMap[containerSize]}>{children}</div>\n </section>\n );\n}\n","import { cn } from \"../../lib/utils\";\nimport { BrutalSection } from \"./section\";\nimport type { SectionColor, SectionPattern } from \"./section\";\n\nexport interface Testimonial {\n name: string;\n handle?: string;\n avatar?: string;\n text: string;\n role?: string;\n company?: string;\n companyLogo?: string;\n rating?: 1 | 2 | 3 | 4 | 5;\n featured?: boolean;\n}\n\ninterface BrutalTestimonialsProps {\n badge?: string;\n headline?: string;\n testimonials: Testimonial[];\n variant?: \"masonry\" | \"featured-grid\" | \"carousel\" | \"wall-of-love\";\n color?: SectionColor;\n pattern?: SectionPattern;\n className?: string;\n}\n\nfunction StarRating({ rating }: { rating: number }) {\n return (\n <div className=\"flex gap-0.5\">\n {Array.from({ length: 5 }, (_, i) => (\n <span\n key={i}\n className={cn(\n \"text-sm\",\n i < rating ? \"text-brand\" : \"text-foreground/20\"\n )}\n >\n ★\n </span>\n ))}\n </div>\n );\n}\n\nfunction TestimonialCard({\n t,\n className,\n}: {\n t: Testimonial;\n className?: string;\n}) {\n return (\n <div\n className={cn(\n \"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\",\n className\n )}\n >\n {/* Decorative quote mark */}\n <span className=\"pointer-events-none absolute top-3 right-4 select-none font-serif text-5xl leading-none text-foreground/[0.06]\">\n “\n </span>\n\n {t.rating && (\n <div className=\"mb-3\">\n <StarRating rating={t.rating} />\n </div>\n )}\n\n <p className=\"relative mb-4 text-sm leading-relaxed\">{t.text}</p>\n\n <div className=\"flex items-center gap-3\">\n {t.avatar ? (\n <img\n src={t.avatar}\n alt={t.name}\n className=\"size-9 border-2 border-brand object-cover\"\n />\n ) : (\n <div\n className=\"flex size-9 items-center justify-center border-2 border-brand bg-brand font-bold text-brand-foreground\"\n >\n {t.name[0]}\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-bold\">{t.name}</p>\n {(t.role || t.company) && (\n <p className=\"truncate text-xs text-muted-foreground\">\n {t.role}\n {t.role && t.company && \" · \"}\n {t.company}\n </p>\n )}\n {!t.role && !t.company && t.handle && (\n <p className=\"font-mono text-xs text-muted-foreground\">\n {t.handle}\n </p>\n )}\n </div>\n {t.companyLogo && (\n <img\n src={t.companyLogo}\n alt={t.company || \"\"}\n className=\"h-5 object-contain opacity-60\"\n />\n )}\n </div>\n </div>\n );\n}\n\nfunction MasonryLayout({ testimonials }: { testimonials: Testimonial[] }) {\n return (\n <div className=\"columns-1 gap-6 sm:columns-2 lg:columns-3\">\n {testimonials.map((t, i) => (\n <TestimonialCard key={i} t={t} className=\"mb-6\" />\n ))}\n </div>\n );\n}\n\nfunction FeaturedGridLayout({\n testimonials,\n}: {\n testimonials: Testimonial[];\n}) {\n const featured = testimonials.find((t) => t.featured) || testimonials[0];\n const rest = testimonials.filter((t) => t !== featured);\n\n return (\n <div className=\"grid gap-6 lg:grid-cols-2\">\n {/* Large featured card */}\n {featured && (\n <TestimonialCard\n t={featured}\n className=\"flex flex-col justify-between p-8 lg:row-span-2\"\n />\n )}\n {/* Smaller grid */}\n {rest.map((t, i) => (\n <TestimonialCard key={i} t={t} />\n ))}\n </div>\n );\n}\n\nfunction CarouselLayout({ testimonials }: { testimonials: Testimonial[] }) {\n return (\n <div className=\"-mx-6 flex snap-x snap-mandatory gap-6 overflow-x-auto px-6 pb-4\">\n {testimonials.map((t, i) => (\n <TestimonialCard\n key={i}\n t={t}\n className=\"w-80 flex-none snap-center\"\n />\n ))}\n </div>\n );\n}\n\nfunction WallOfLoveLayout({ testimonials }: { testimonials: Testimonial[] }) {\n return (\n <div className=\"relative max-h-[600px] overflow-hidden\">\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n {testimonials.map((t, i) => (\n <TestimonialCard key={i} t={t} />\n ))}\n </div>\n {/* Fade overlay at bottom */}\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 h-32 bg-gradient-to-t from-background to-transparent\" />\n </div>\n );\n}\n\nexport function BrutalTestimonials({\n badge,\n headline,\n testimonials,\n variant = \"masonry\",\n color = \"white\",\n pattern,\n className,\n}: BrutalTestimonialsProps) {\n return (\n <BrutalSection color={color} pattern={pattern} className={className}>\n {(headline || badge) && (\n <div className=\"mb-12 text-center\">\n {badge && <p className=\"brutal-label mb-4 opacity-70\">{badge}</p>}\n {headline && <h2 className=\"brutal-h2\">{headline}</h2>}\n </div>\n )}\n\n {variant === \"masonry\" && <MasonryLayout testimonials={testimonials} />}\n {variant === \"featured-grid\" && (\n <FeaturedGridLayout testimonials={testimonials} />\n )}\n {variant === \"carousel\" && (\n <CarouselLayout testimonials={testimonials} />\n )}\n {variant === \"wall-of-love\" && (\n <WallOfLoveLayout testimonials={testimonials} />\n )}\n </BrutalSection>\n );\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -2901,8 +2901,8 @@ var colorMap = {
|
|
|
2901
2901
|
brand: "bg-brand",
|
|
2902
2902
|
"brand-muted": "bg-brand-muted text-foreground",
|
|
2903
2903
|
blue: "bg-section-blue",
|
|
2904
|
-
gray: "bg-
|
|
2905
|
-
cream: "bg-
|
|
2904
|
+
gray: "bg-muted text-foreground",
|
|
2905
|
+
cream: "bg-secondary text-foreground",
|
|
2906
2906
|
black: "bg-foreground text-background",
|
|
2907
2907
|
cta: "bg-cta"
|
|
2908
2908
|
};
|
|
@@ -3225,7 +3225,7 @@ function StarRating({ rating }) {
|
|
|
3225
3225
|
{
|
|
3226
3226
|
className: cn(
|
|
3227
3227
|
"text-sm",
|
|
3228
|
-
i < rating ? "text-
|
|
3228
|
+
i < rating ? "text-brand" : "text-foreground/20"
|
|
3229
3229
|
),
|
|
3230
3230
|
children: "\u2605"
|
|
3231
3231
|
},
|
|
@@ -3253,17 +3253,12 @@ function TestimonialCard({
|
|
|
3253
3253
|
{
|
|
3254
3254
|
src: t.avatar,
|
|
3255
3255
|
alt: t.name,
|
|
3256
|
-
className: "size-9 border-2 object-cover"
|
|
3257
|
-
style: { borderColor: "hsl(var(--brand))" }
|
|
3256
|
+
className: "size-9 border-2 border-brand object-cover"
|
|
3258
3257
|
}
|
|
3259
3258
|
) : /* @__PURE__ */ jsx(
|
|
3260
3259
|
"div",
|
|
3261
3260
|
{
|
|
3262
|
-
className: "flex size-9 items-center justify-center border-2 font-bold text-brand-foreground",
|
|
3263
|
-
style: {
|
|
3264
|
-
borderColor: "hsl(var(--brand))",
|
|
3265
|
-
backgroundColor: "hsl(var(--brand))"
|
|
3266
|
-
},
|
|
3261
|
+
className: "flex size-9 items-center justify-center border-2 border-brand bg-brand font-bold text-brand-foreground",
|
|
3267
3262
|
children: t.name[0]
|
|
3268
3263
|
}
|
|
3269
3264
|
),
|
|
@@ -3329,7 +3324,7 @@ function BrutalTestimonials({
|
|
|
3329
3324
|
headline,
|
|
3330
3325
|
testimonials,
|
|
3331
3326
|
variant = "masonry",
|
|
3332
|
-
color = "
|
|
3327
|
+
color = "white",
|
|
3333
3328
|
pattern,
|
|
3334
3329
|
className
|
|
3335
3330
|
}) {
|
|
@@ -3356,7 +3351,7 @@ function BrutalIntegrationGrid({
|
|
|
3356
3351
|
/* @__PURE__ */ jsxs("div", { className: "mb-12 text-center", children: [
|
|
3357
3352
|
badge && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-4 opacity-70", children: badge }),
|
|
3358
3353
|
/* @__PURE__ */ jsx("h2", { className: "brutal-h2 mb-4", children: headline }),
|
|
3359
|
-
description && /* @__PURE__ */ jsx("p", { className: "brutal-body mx-auto max-w-lg
|
|
3354
|
+
description && /* @__PURE__ */ jsx("p", { className: "brutal-body mx-auto max-w-lg opacity-80", children: description })
|
|
3360
3355
|
] }),
|
|
3361
3356
|
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center justify-center gap-6", children: integrations.map((item) => {
|
|
3362
3357
|
const inner = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
@@ -3583,7 +3578,7 @@ function BrutalNav({
|
|
|
3583
3578
|
solid: "sticky top-0 z-50 w-full border-b-brutal border-foreground bg-brand",
|
|
3584
3579
|
transparent: cn(
|
|
3585
3580
|
"fixed top-0 left-0 right-0 z-50 w-full transition-all duration-200",
|
|
3586
|
-
isScrolled ? "bg-background/80 text-foreground backdrop-blur-md border-b border-
|
|
3581
|
+
isScrolled ? "bg-background/80 text-foreground backdrop-blur-md border-b border-border/30" : "bg-transparent text-foreground"
|
|
3587
3582
|
),
|
|
3588
3583
|
"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"
|
|
3589
3584
|
};
|
|
@@ -3778,10 +3773,9 @@ function BrutalFooter({
|
|
|
3778
3773
|
"footer",
|
|
3779
3774
|
{
|
|
3780
3775
|
className: cn(
|
|
3781
|
-
"w-full border-t-4 bg-background px-6 py-12 text-foreground",
|
|
3776
|
+
"w-full border-t-4 border-t-brand bg-background px-6 py-12 text-foreground",
|
|
3782
3777
|
className
|
|
3783
3778
|
),
|
|
3784
|
-
style: { borderTopColor: "hsl(var(--brand))" },
|
|
3785
3779
|
children: /* @__PURE__ */ jsxs("div", { className: "brutal-container", children: [
|
|
3786
3780
|
variant === "newsletter" && newsletter && /* @__PURE__ */ jsx(NewsletterSection, { newsletter }),
|
|
3787
3781
|
variant === "minimal" ? /* @__PURE__ */ jsx(MinimalContent, { logo, columns, socials }) : /* @__PURE__ */ jsx(
|
|
@@ -3940,7 +3934,7 @@ function StatItem({ stat, inView }) {
|
|
|
3940
3934
|
count.toLocaleString(),
|
|
3941
3935
|
stat.suffix
|
|
3942
3936
|
] }),
|
|
3943
|
-
/* @__PURE__ */ jsx("p", { className: "brutal-label mt-2
|
|
3937
|
+
/* @__PURE__ */ jsx("p", { className: "brutal-label mt-2 opacity-70", children: stat.label })
|
|
3944
3938
|
] });
|
|
3945
3939
|
}
|
|
3946
3940
|
function StatsBar({ stats, color = "white", className }) {
|