@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.
Files changed (42) hide show
  1. package/dist/components/brutal/comparison-table.js +2 -2
  2. package/dist/components/brutal/comparison-table.js.map +1 -1
  3. package/dist/components/brutal/cta-section.js +2 -2
  4. package/dist/components/brutal/cta-section.js.map +1 -1
  5. package/dist/components/brutal/faq.js +2 -2
  6. package/dist/components/brutal/faq.js.map +1 -1
  7. package/dist/components/brutal/feature-grid.js +2 -2
  8. package/dist/components/brutal/feature-grid.js.map +1 -1
  9. package/dist/components/brutal/feature-showcase.js +2 -2
  10. package/dist/components/brutal/feature-showcase.js.map +1 -1
  11. package/dist/components/brutal/footer.js +1 -2
  12. package/dist/components/brutal/footer.js.map +1 -1
  13. package/dist/components/brutal/hero.js +2 -2
  14. package/dist/components/brutal/hero.js.map +1 -1
  15. package/dist/components/brutal/index.js +10 -16
  16. package/dist/components/brutal/index.js.map +1 -1
  17. package/dist/components/brutal/integration-grid.js +3 -3
  18. package/dist/components/brutal/integration-grid.js.map +1 -1
  19. package/dist/components/brutal/logo-cloud.js +2 -2
  20. package/dist/components/brutal/logo-cloud.js.map +1 -1
  21. package/dist/components/brutal/nav.js +1 -1
  22. package/dist/components/brutal/nav.js.map +1 -1
  23. package/dist/components/brutal/newsletter.js +2 -2
  24. package/dist/components/brutal/newsletter.js.map +1 -1
  25. package/dist/components/brutal/pricing-table.js +2 -2
  26. package/dist/components/brutal/pricing-table.js.map +1 -1
  27. package/dist/components/brutal/section.js +2 -2
  28. package/dist/components/brutal/section.js.map +1 -1
  29. package/dist/components/brutal/stats-bar.js +3 -3
  30. package/dist/components/brutal/stats-bar.js.map +1 -1
  31. package/dist/components/brutal/testimonials.js +6 -11
  32. package/dist/components/brutal/testimonials.js.map +1 -1
  33. package/dist/index.js +10 -16
  34. package/dist/index.js.map +1 -1
  35. package/dist/templates/index.js +9 -15
  36. package/dist/templates/index.js.map +1 -1
  37. package/dist/templates/saas-launch.js +9 -15
  38. package/dist/templates/saas-launch.js.map +1 -1
  39. package/dist/templates/studio.js +8 -14
  40. package/dist/templates/studio.js.map +1 -1
  41. package/dist/theme.css +41 -4
  42. 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":";;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;AC+BA,IAAM,QAAA,GAAyC;AAAA,EAC7C,KAAA,EAAO,+BAAA;AAAA,EACP,KAAA,EAAO,UAAA;AAAA,EACP,aAAA,EAAe,gCAAA;AAAA,EACf,IAAA,EAAM,iBAAA;AAAA,EACN,IAAA,EAAM,iCAAA;AAAA,EACN,KAAA,EAAO,kCAAA;AAAA,EACP,KAAA,EAAO,+BAAA;AAAA,EACP,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,YAAA,GAAe;AAAA,EACnB,EAAA,EAAI,qBAAA;AAAA,EACJ,OAAA,EAAS,kBAAA;AAAA,EACT,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,UAAA,GAAa;AAAA,EACjB,EAAA,EAAI,mBAAA;AAAA,EACJ,OAAA,EAAS,gBAAA;AAAA,EACT,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,UAAA,GAA6C;AAAA,EACjD,IAAA,EAAM,aAAA;AAAA,EACN,OAAA,EAAS,gBAAA;AAAA,EACT,KAAA,EAAO,cAAA;AAAA,EACP,KAAA,EAAO,cAAA;AAAA,EACP,UAAA,EAAY,mBAAA;AAAA,EACZ,WAAA,EAAa,kBAAA;AAAA,EACb,eAAA,EAAiB,sBAAA;AAAA,EACjB,IAAA,EAAM;AACR,CAAA;AAEO,SAAS,aAAA,CAAc;AAAA,EAC5B,QAAA;AAAA,EACA,KAAA,GAAQ,OAAA;AAAA,EACR,SAAA;AAAA,EACA,aAAA,GAAgB,SAAA;AAAA,EAChB,OAAA,GAAU,SAAA;AAAA,EACV,OAAA;AAAA,EACA,IAAA,GAAO,KAAA;AAAA,EACP,OAAA,GAAU,KAAA;AAAA,EACV;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,kBAAkB,OAAA,KAClB,IAAA,GAAO,SAAS,MAAA,CAAA,KAChB,OAAA,GAAU,YAAY,MAAA,CAAA,IACvB,MAAA;AAEL,EAAA,uBACE,GAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,EAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,WAAW,OAAO,CAAA;AAAA,QAClB,SAAS,KAAK,CAAA;AAAA,QACd,WAAW,eAAe,CAAA;AAAA,QAC1B;AAAA,OACF;AAAA,MAEA,8BAAC,KAAA,EAAA,EAAI,SAAA,EAAW,YAAA,CAAa,aAAa,GAAI,QAAA,EAAS;AAAA;AAAA,GACzD;AAEJ;ACzEA,SAAS,UAAA,CAAW,EAAE,MAAA,EAAO,EAAuB;AAClD,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBACZ,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,EAAE,EAAG,CAAC,CAAA,EAAG,sBAC7BA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MAEC,SAAA,EAAW,EAAA;AAAA,QACT,SAAA;AAAA,QACA,CAAA,GAAI,SAAS,gBAAA,GAAmB;AAAA,OAClC;AAAA,MACD,QAAA,EAAA;AAAA,KAAA;AAAA,IALM;AAAA,GAQR,CAAA,EACH,CAAA;AAEJ;AAEA,SAAS,eAAA,CAAgB;AAAA,EACvB,CAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,8MAAA;AAAA,QACA;AAAA,OACF;AAAA,MAGA,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gHAAA,EAAiH,QAAA,EAAA,QAAA,EAEjI,CAAA;AAAA,QAEC,CAAA,CAAE,MAAA,oBACDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,MAAA,EAAQ,CAAA,CAAE,QAAQ,CAAA,EAChC,CAAA;AAAA,wBAGFA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uCAAA,EAAyC,YAAE,IAAA,EAAK,CAAA;AAAA,wBAE7D,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,UAAA,CAAA,CAAE,yBACDA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAK,CAAA,CAAE,MAAA;AAAA,cACP,KAAK,CAAA,CAAE,IAAA;AAAA,cACP,SAAA,EAAU,8BAAA;AAAA,cACV,KAAA,EAAO,EAAE,WAAA,EAAa,mBAAA;AAAoB;AAAA,8BAG5CA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,kFAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,WAAA,EAAa,mBAAA;AAAA,gBACb,eAAA,EAAiB;AAAA,eACnB;AAAA,cAEC,QAAA,EAAA,CAAA,CAAE,KAAK,CAAC;AAAA;AAAA,WACX;AAAA,0BAEF,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mBAAA,EAAqB,YAAE,IAAA,EAAK,CAAA;AAAA,YAAA,CACvC,EAAE,IAAA,IAAQ,CAAA,CAAE,4BACZ,IAAA,CAAC,GAAA,EAAA,EAAE,WAAU,wCAAA,EACV,QAAA,EAAA;AAAA,cAAA,CAAA,CAAE,IAAA;AAAA,cACF,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,OAAA,IAAW,QAAA;AAAA,cACvB,CAAA,CAAE;AAAA,aAAA,EACL,CAAA;AAAA,YAED,CAAC,CAAA,CAAE,IAAA,IAAQ,CAAC,EAAE,OAAA,IAAW,CAAA,CAAE,MAAA,oBAC1BA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yCAAA,EACV,YAAE,MAAA,EACL;AAAA,WAAA,EAEJ,CAAA;AAAA,UACC,CAAA,CAAE,+BACDA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAK,CAAA,CAAE,WAAA;AAAA,cACP,GAAA,EAAK,EAAE,OAAA,IAAW,EAAA;AAAA,cAClB,SAAA,EAAU;AAAA;AAAA;AACZ,SAAA,EAEJ;AAAA;AAAA;AAAA,GACF;AAEJ;AAEA,SAAS,aAAA,CAAc,EAAE,YAAA,EAAa,EAAoC;AACxE,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2CAAA,EACZ,QAAA,EAAA,YAAA,CAAa,IAAI,CAAC,CAAA,EAAG,CAAA,qBACpBA,IAAC,eAAA,EAAA,EAAwB,CAAA,EAAM,WAAU,MAAA,EAAA,EAAnB,CAA0B,CACjD,CAAA,EACH,CAAA;AAEJ;AAEA,SAAS,kBAAA,CAAmB;AAAA,EAC1B;AACF,CAAA,EAEG;AACD,EAAA,MAAM,QAAA,GAAW,aAAa,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,QAAQ,CAAA,IAAK,YAAA,CAAa,CAAC,CAAA;AACvE,EAAA,MAAM,OAAO,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,QAAQ,CAAA;AAEtD,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAEZ,QAAA,EAAA;AAAA,IAAA,QAAA,oBACCA,GAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAG,QAAA;AAAA,QACH,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,IAGD,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACZA,GAAAA,CAAC,eAAA,EAAA,EAAwB,CAAA,EAAA,EAAH,CAAS,CAChC;AAAA,GAAA,EACH,CAAA;AAEJ;AAEA,SAAS,cAAA,CAAe,EAAE,YAAA,EAAa,EAAoC;AACzE,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EACZ,uBAAa,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACpBA,GAAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MAEC,CAAA;AAAA,MACA,SAAA,EAAU;AAAA,KAAA;AAAA,IAFL;AAAA,GAIR,CAAA,EACH,CAAA;AAEJ;AAEA,SAAS,gBAAA,CAAiB,EAAE,YAAA,EAAa,EAAoC;AAC3E,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EACZ,uBAAa,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACpBA,GAAAA,CAAC,eAAA,EAAA,EAAwB,CAAA,EAAA,EAAH,CAAS,CAChC,CAAA,EACH,CAAA;AAAA,oBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sGAAA,EAAuG;AAAA,GAAA,EACxH,CAAA;AAEJ;AAEO,SAAS,kBAAA,CAAmB;AAAA,EACjC,KAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,KAAA,GAAQ,MAAA;AAAA,EACR,OAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,uBACE,IAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAc,OAAA,EAAkB,SAAA,EAC3C,QAAA,EAAA;AAAA,IAAA,CAAA,QAAA,IAAY,KAAA,qBACZ,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,oBAASA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gCAAgC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAC5D,4BAAYA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,aAAa,QAAA,EAAA,QAAA,EAAS;AAAA,KAAA,EACnD,CAAA;AAAA,IAGD,OAAA,KAAY,SAAA,oBAAaA,GAAAA,CAAC,iBAAc,YAAA,EAA4B,CAAA;AAAA,IACpE,OAAA,KAAY,eAAA,oBACXA,GAAAA,CAAC,sBAAmB,YAAA,EAA4B,CAAA;AAAA,IAEjD,OAAA,KAAY,UAAA,oBACXA,GAAAA,CAAC,kBAAe,YAAA,EAA4B,CAAA;AAAA,IAE7C,OAAA,KAAY,cAAA,oBACXA,GAAAA,CAAC,oBAAiB,YAAA,EAA4B;AAAA,GAAA,EAElD,CAAA;AAEJ","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 &ldquo;\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 &ldquo;\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-section-gray text-foreground",
2905
- cream: "bg-section-cream text-foreground",
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-amber-500" : "text-foreground/20"
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 = "blue",
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 text-muted-foreground", children: description })
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-foreground/10" : "bg-transparent text-white"
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 text-muted-foreground", children: stat.label })
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 }) {