@snow-labs/brutal-ui 0.1.1 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/dist/components/brutal/cta-section.d.ts +7 -2
  2. package/dist/components/brutal/cta-section.js +136 -32
  3. package/dist/components/brutal/cta-section.js.map +1 -1
  4. package/dist/components/brutal/faq.d.ts +16 -0
  5. package/dist/components/brutal/faq.js +163 -0
  6. package/dist/components/brutal/faq.js.map +1 -0
  7. package/dist/components/brutal/feature-grid.d.ts +6 -2
  8. package/dist/components/brutal/feature-grid.js +73 -10
  9. package/dist/components/brutal/feature-grid.js.map +1 -1
  10. package/dist/components/brutal/footer.d.ts +14 -1
  11. package/dist/components/brutal/footer.js +181 -18
  12. package/dist/components/brutal/footer.js.map +1 -1
  13. package/dist/components/brutal/hero.d.ts +9 -2
  14. package/dist/components/brutal/hero.js +67 -22
  15. package/dist/components/brutal/hero.js.map +1 -1
  16. package/dist/components/brutal/index.d.ts +7 -2
  17. package/dist/components/brutal/index.js +1035 -128
  18. package/dist/components/brutal/index.js.map +1 -1
  19. package/dist/components/brutal/integration-grid.d.ts +1 -1
  20. package/dist/components/brutal/integration-grid.js +13 -5
  21. package/dist/components/brutal/integration-grid.js.map +1 -1
  22. package/dist/components/brutal/logo-cloud.d.ts +17 -0
  23. package/dist/components/brutal/logo-cloud.js +93 -0
  24. package/dist/components/brutal/logo-cloud.js.map +1 -0
  25. package/dist/components/brutal/nav.d.ts +3 -1
  26. package/dist/components/brutal/nav.js +166 -9
  27. package/dist/components/brutal/nav.js.map +1 -1
  28. package/dist/components/brutal/newsletter.d.ts +14 -0
  29. package/dist/components/brutal/newsletter.js +169 -0
  30. package/dist/components/brutal/newsletter.js.map +1 -0
  31. package/dist/components/brutal/pricing-table.d.ts +27 -0
  32. package/dist/components/brutal/pricing-table.js +251 -0
  33. package/dist/components/brutal/pricing-table.js.map +1 -0
  34. package/dist/components/brutal/section-divider.d.ts +14 -0
  35. package/dist/components/brutal/section-divider.js +70 -0
  36. package/dist/components/brutal/section-divider.js.map +1 -0
  37. package/dist/components/brutal/section.d.ts +7 -3
  38. package/dist/components/brutal/section.js +13 -5
  39. package/dist/components/brutal/section.js.map +1 -1
  40. package/dist/components/brutal/stats-bar.d.ts +16 -0
  41. package/dist/components/brutal/stats-bar.js +127 -0
  42. package/dist/components/brutal/stats-bar.js.map +1 -0
  43. package/dist/components/brutal/testimonials.d.ts +11 -3
  44. package/dist/components/brutal/testimonials.js +126 -33
  45. package/dist/components/brutal/testimonials.js.map +1 -1
  46. package/dist/components/brutal/wave-divider.d.ts +2 -12
  47. package/dist/components/brutal/wave-divider.js +54 -26
  48. package/dist/components/brutal/wave-divider.js.map +1 -1
  49. package/dist/components/dashboard/activity-feed.d.ts +18 -0
  50. package/dist/components/dashboard/activity-feed.js +105 -0
  51. package/dist/components/dashboard/activity-feed.js.map +1 -0
  52. package/dist/components/dashboard/app-shell.d.ts +19 -0
  53. package/dist/components/dashboard/app-shell.js +206 -0
  54. package/dist/components/dashboard/app-shell.js.map +1 -0
  55. package/dist/components/dashboard/empty-state.d.ts +14 -0
  56. package/dist/components/dashboard/empty-state.js +96 -0
  57. package/dist/components/dashboard/empty-state.js.map +1 -0
  58. package/dist/components/dashboard/file-upload.d.ts +12 -0
  59. package/dist/components/dashboard/file-upload.js +86 -0
  60. package/dist/components/dashboard/file-upload.js.map +1 -0
  61. package/dist/components/dashboard/index.d.ts +10 -0
  62. package/dist/components/dashboard/index.js +755 -0
  63. package/dist/components/dashboard/index.js.map +1 -0
  64. package/dist/components/dashboard/search-bar.d.ts +12 -0
  65. package/dist/components/dashboard/search-bar.js +49 -0
  66. package/dist/components/dashboard/search-bar.js.map +1 -0
  67. package/dist/components/dashboard/sidebar.d.ts +23 -0
  68. package/dist/components/dashboard/sidebar.js +113 -0
  69. package/dist/components/dashboard/sidebar.js.map +1 -0
  70. package/dist/components/dashboard/stat-card.d.ts +13 -0
  71. package/dist/components/dashboard/stat-card.js +55 -0
  72. package/dist/components/dashboard/stat-card.js.map +1 -0
  73. package/dist/components/dashboard/user-menu.d.ts +16 -0
  74. package/dist/components/dashboard/user-menu.js +179 -0
  75. package/dist/components/dashboard/user-menu.js.map +1 -0
  76. package/dist/components/dashboard/view-switcher.d.ts +12 -0
  77. package/dist/components/dashboard/view-switcher.js +130 -0
  78. package/dist/components/dashboard/view-switcher.js.map +1 -0
  79. package/dist/components/views/calendar-view.d.ts +17 -0
  80. package/dist/components/views/calendar-view.js +182 -0
  81. package/dist/components/views/calendar-view.js.map +1 -0
  82. package/dist/components/views/data-table.d.ts +15 -0
  83. package/dist/components/views/data-table.js +204 -0
  84. package/dist/components/views/data-table.js.map +1 -0
  85. package/dist/components/views/grid-view.d.ts +11 -0
  86. package/dist/components/views/grid-view.js +31 -0
  87. package/dist/components/views/grid-view.js.map +1 -0
  88. package/dist/components/views/index.d.ts +7 -0
  89. package/dist/components/views/index.js +542 -0
  90. package/dist/components/views/index.js.map +1 -0
  91. package/dist/components/views/kanban-board.d.ts +21 -0
  92. package/dist/components/views/kanban-board.js +153 -0
  93. package/dist/components/views/kanban-board.js.map +1 -0
  94. package/dist/components/views/list-view.d.ts +19 -0
  95. package/dist/components/views/list-view.js +96 -0
  96. package/dist/components/views/list-view.js.map +1 -0
  97. package/dist/index.d.ts +27 -3
  98. package/dist/index.js +1881 -142
  99. package/dist/index.js.map +1 -1
  100. package/dist/lib/animations.d.ts +68 -0
  101. package/dist/lib/animations.js +44 -0
  102. package/dist/lib/animations.js.map +1 -0
  103. package/dist/templates/dashboard.d.ts +40 -0
  104. package/dist/templates/dashboard.js +658 -0
  105. package/dist/templates/dashboard.js.map +1 -0
  106. package/dist/templates/index.d.ts +4 -0
  107. package/dist/templates/index.js +2001 -0
  108. package/dist/templates/index.js.map +1 -0
  109. package/dist/templates/saas-launch.d.ts +113 -0
  110. package/dist/templates/saas-launch.js +1394 -0
  111. package/dist/templates/saas-launch.js.map +1 -0
  112. package/dist/templates/studio.d.ts +72 -0
  113. package/dist/templates/studio.js +1099 -0
  114. package/dist/templates/studio.js.map +1 -0
  115. package/dist/theme.css +58 -15
  116. package/package.json +48 -2
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import { clsx } from 'clsx';
3
3
  import { twMerge } from 'tailwind-merge';
4
4
  import { Accordion as Accordion$1 } from '@base-ui/react/accordion';
5
- import { ChevronDownIcon, ChevronUpIcon, ChevronRightIcon, MoreHorizontalIcon, CheckIcon, XIcon, SearchIcon, ChevronLeftIcon } from 'lucide-react';
5
+ import { ChevronDownIcon, ChevronUpIcon, ChevronRightIcon, MoreHorizontalIcon, CheckIcon, XIcon, SearchIcon, ChevronLeftIcon, Menu as Menu$1 } from 'lucide-react';
6
6
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
7
7
  import { cva } from 'class-variance-authority';
8
8
  import { Avatar as Avatar$1 } from '@base-ui/react/avatar';
@@ -28,12 +28,15 @@ import { ScrollArea as ScrollArea$1 } from '@base-ui/react/scroll-area';
28
28
  import { Select as Select$1 } from '@base-ui/react/select';
29
29
  import { Separator as Separator$1 } from '@base-ui/react/separator';
30
30
  import * as React2 from 'react';
31
+ import { createContext, useContext, useState, useEffect, useRef, useCallback } from 'react';
31
32
  import { Slider as Slider$1 } from '@base-ui/react/slider';
32
33
  import { Switch as Switch$1 } from '@base-ui/react/switch';
33
34
  import { Tabs as Tabs$1 } from '@base-ui/react/tabs';
34
35
  import { Toggle as Toggle$1 } from '@base-ui/react/toggle';
35
36
  import { ToggleGroup as ToggleGroup$1 } from '@base-ui/react/toggle-group';
36
37
  import { Tooltip as Tooltip$1 } from '@base-ui/react/tooltip';
38
+ import { useReactTable, getPaginationRowModel, getFilteredRowModel, getSortedRowModel, getCoreRowModel, flexRender } from '@tanstack/react-table';
39
+ import { dropTargetForElements, draggable } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';
37
40
 
38
41
  // src/lib/utils.ts
39
42
  function cn(...inputs) {
@@ -2853,13 +2856,50 @@ function TooltipContent({
2853
2856
  }
2854
2857
  ) });
2855
2858
  }
2859
+
2860
+ // src/lib/animations.ts
2861
+ var fadeInUp = {
2862
+ hidden: { opacity: 0, y: 20 },
2863
+ visible: { opacity: 1, y: 0 }
2864
+ };
2865
+ var fadeIn = {
2866
+ hidden: { opacity: 0 },
2867
+ visible: { opacity: 1 }
2868
+ };
2869
+ var staggerContainer = {
2870
+ hidden: {},
2871
+ visible: {
2872
+ transition: {
2873
+ staggerChildren: 0.08,
2874
+ delayChildren: 0.1
2875
+ }
2876
+ }
2877
+ };
2878
+ var scaleIn = {
2879
+ hidden: { opacity: 0, scale: 0.95 },
2880
+ visible: { opacity: 1, scale: 1 }
2881
+ };
2882
+ var slideInLeft = {
2883
+ hidden: { opacity: 0, x: -30 },
2884
+ visible: { opacity: 1, x: 0 }
2885
+ };
2886
+ var slideInRight = {
2887
+ hidden: { opacity: 0, x: 30 },
2888
+ visible: { opacity: 1, x: 0 }
2889
+ };
2890
+ var defaultTransition = {
2891
+ duration: 0.5,
2892
+ ease: [0.25, 0.1, 0.25, 1]
2893
+ };
2894
+ var springTransition = {
2895
+ type: "spring",
2896
+ stiffness: 300,
2897
+ damping: 30
2898
+ };
2856
2899
  var colorMap = {
2857
2900
  white: "bg-background text-foreground",
2858
2901
  brand: "bg-brand",
2859
2902
  "brand-muted": "bg-brand-muted text-foreground",
2860
- blue: "bg-section-blue",
2861
- gray: "bg-section-gray text-foreground",
2862
- cream: "bg-section-cream text-foreground",
2863
2903
  black: "bg-foreground text-background",
2864
2904
  cta: "bg-cta"
2865
2905
  };
@@ -2873,16 +2913,28 @@ var paddingMap = {
2873
2913
  default: "brutal-section",
2874
2914
  lg: "brutal-section py-28 sm:py-36 md:py-44"
2875
2915
  };
2916
+ var patternMap = {
2917
+ dots: "brutal-dots",
2918
+ stripes: "brutal-stripes",
2919
+ noise: "brutal-noise",
2920
+ grain: "brutal-grain",
2921
+ crosshatch: "brutal-crosshatch",
2922
+ "grid-dots": "brutal-grid-dots",
2923
+ "gradient-mesh": "brutal-gradient-mesh",
2924
+ none: ""
2925
+ };
2876
2926
  function BrutalSection({
2877
2927
  children,
2878
2928
  color = "white",
2879
2929
  className,
2880
2930
  containerSize = "default",
2881
2931
  padding = "default",
2932
+ pattern,
2882
2933
  dots = false,
2883
2934
  stripes = false,
2884
2935
  id
2885
2936
  }) {
2937
+ const resolvedPattern = pattern ?? (dots ? "dots" : void 0) ?? (stripes ? "stripes" : void 0) ?? "none";
2886
2938
  return /* @__PURE__ */ jsx(
2887
2939
  "section",
2888
2940
  {
@@ -2890,82 +2942,141 @@ function BrutalSection({
2890
2942
  className: cn(
2891
2943
  paddingMap[padding],
2892
2944
  colorMap[color],
2893
- dots && "brutal-dots",
2894
- stripes && "brutal-stripes",
2945
+ patternMap[resolvedPattern],
2895
2946
  className
2896
2947
  ),
2897
2948
  children: /* @__PURE__ */ jsx("div", { className: containerMap[containerSize], children })
2898
2949
  }
2899
2950
  );
2900
2951
  }
2952
+ var paths = {
2953
+ wave: "M0,64 C160,128 320,0 480,64 C640,128 800,0 960,64 L960,160 L0,160 Z",
2954
+ jagged: "M0,80 L80,40 L160,80 L240,20 L320,80 L400,40 L480,80 L560,20 L640,80 L720,40 L800,80 L880,20 L960,80 L960,160 L0,160 Z",
2955
+ curve: "M0,128 Q480,-32 960,128 L960,160 L0,160 Z",
2956
+ castle: "M0,80 L0,60 L80,60 L80,80 L120,80 L120,40 L200,40 L200,80 L240,80 L240,60 L320,60 L320,80 L360,80 L360,40 L440,40 L440,80 L480,80 L480,60 L560,60 L560,80 L600,80 L600,40 L680,40 L680,80 L720,80 L720,60 L800,60 L800,80 L840,80 L840,40 L920,40 L920,80 L960,80 L960,160 L0,160 Z",
2957
+ "torn-paper": "M0,70 C30,65 45,85 80,72 C115,59 130,90 170,78 C210,66 225,88 270,75 C315,62 340,92 380,79 C420,66 445,86 490,73 C535,60 560,88 600,76 C640,64 665,90 710,77 C755,64 780,84 830,71 C875,58 900,86 960,80 L960,160 L0,160 Z",
2958
+ "brush-stroke": "M0,90 C80,50 120,100 200,60 C280,20 360,110 480,70 C600,30 640,100 720,80 C800,60 880,100 960,70 L960,160 L0,160 Z",
2959
+ geometric: "M0,100 L120,60 L240,80 L360,40 L480,90 L600,50 L720,70 L840,30 L960,80 L960,160 L0,160 Z",
2960
+ blob: "M0,80 C80,120 160,40 280,80 C400,120 440,30 560,70 C680,110 760,40 960,80 L960,160 L0,160 Z",
2961
+ diagonal: "M0,160 L960,60 L960,160 Z",
2962
+ zigzag: "M0,80 L60,40 L120,80 L180,40 L240,80 L300,40 L360,80 L420,40 L480,80 L540,40 L600,80 L660,40 L720,80 L780,40 L840,80 L900,40 L960,80 L960,160 L0,160 Z",
2963
+ "hand-drawn": "M0,72 C20,68 35,82 60,75 C85,68 95,84 125,76 C155,68 170,85 200,77 C230,69 245,83 275,75 C305,67 320,86 350,78 C380,70 395,82 425,74 C455,66 470,84 500,76 C530,68 545,83 575,75 C605,67 620,85 650,77 C680,69 695,82 725,74 C755,66 770,84 800,76 C830,68 845,83 875,75 C905,67 920,82 960,74 L960,160 L0,160 Z"
2964
+ };
2965
+ function SectionDivider({
2966
+ from = "hsl(var(--background))",
2967
+ to = "hsl(var(--background))",
2968
+ flip = false,
2969
+ className = "",
2970
+ variant = "wave",
2971
+ layers = false
2972
+ }) {
2973
+ return /* @__PURE__ */ jsxs(
2974
+ "div",
2975
+ {
2976
+ className: cn("relative -my-px w-full overflow-hidden", className),
2977
+ style: { backgroundColor: from },
2978
+ children: [
2979
+ layers && /* @__PURE__ */ jsx(
2980
+ "svg",
2981
+ {
2982
+ viewBox: "0 0 960 160",
2983
+ preserveAspectRatio: "none",
2984
+ className: "absolute inset-0 block w-full opacity-30",
2985
+ style: {
2986
+ height: "clamp(40px, 6vw, 80px)",
2987
+ transform: flip ? "scaleY(-1) translateY(4px)" : "translateY(-4px)"
2988
+ },
2989
+ children: /* @__PURE__ */ jsx("path", { d: paths[variant], fill: to })
2990
+ }
2991
+ ),
2992
+ /* @__PURE__ */ jsx(
2993
+ "svg",
2994
+ {
2995
+ viewBox: "0 0 960 160",
2996
+ preserveAspectRatio: "none",
2997
+ className: "relative block w-full",
2998
+ style: {
2999
+ height: "clamp(40px, 6vw, 80px)",
3000
+ transform: flip ? "scaleY(-1)" : void 0
3001
+ },
3002
+ children: /* @__PURE__ */ jsx("path", { d: paths[variant], fill: to })
3003
+ }
3004
+ )
3005
+ ]
3006
+ }
3007
+ );
3008
+ }
2901
3009
  function BrutalHero({
3010
+ variant = "split",
2902
3011
  badge,
3012
+ badgePosition = "above",
2903
3013
  headline,
2904
3014
  description,
2905
3015
  ctaText,
2906
3016
  ctaHref = "#",
2907
3017
  ctaVariant = "cta",
3018
+ secondaryText,
3019
+ secondaryHref,
2908
3020
  visual,
2909
3021
  color = "brand",
3022
+ pattern,
2910
3023
  proof,
2911
3024
  className
2912
3025
  }) {
2913
- return /* @__PURE__ */ jsx(BrutalSection, { color, padding: "lg", className, children: /* @__PURE__ */ jsxs(
3026
+ const badgeElement = badge && /* @__PURE__ */ jsx(
2914
3027
  "div",
2915
3028
  {
2916
3029
  className: cn(
2917
- "grid items-center gap-12",
2918
- visual ? "lg:grid-cols-2 lg:gap-16" : "max-w-3xl"
3030
+ "inline-flex w-fit border-brutal border-foreground bg-background px-3 py-1 font-mono text-xs font-bold uppercase tracking-widest text-foreground shadow-brutal-sm",
3031
+ badgePosition === "floating" && "absolute -top-3 left-6 z-10"
2919
3032
  ),
2920
- children: [
2921
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-6", children: [
2922
- 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 }),
2923
- /* @__PURE__ */ jsx("h1", { className: "brutal-display text-balance", children: headline }),
2924
- /* @__PURE__ */ jsx("p", { className: "brutal-body-lg max-w-lg opacity-80", children: description }),
2925
- /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Button, { variant: ctaVariant, size: "xl", render: /* @__PURE__ */ jsx("a", { href: ctaHref }), children: ctaText }) }),
2926
- proof && /* @__PURE__ */ jsxs("p", { className: "flex items-center gap-2 text-sm font-medium opacity-70", children: [
2927
- /* @__PURE__ */ jsx("span", { className: "inline-flex size-5 items-center justify-center border border-current text-xs", children: "\u2713" }),
2928
- proof
2929
- ] })
2930
- ] }),
2931
- visual && /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center", children: visual })
2932
- ]
2933
- }
2934
- ) });
2935
- }
2936
- function WaveDivider({
2937
- from = "hsl(var(--background))",
2938
- to = "hsl(var(--background))",
2939
- flip = false,
2940
- className = "",
2941
- variant = "wave"
2942
- }) {
2943
- const paths = {
2944
- wave: "M0,64 C160,128 320,0 480,64 C640,128 800,0 960,64 L960,160 L0,160 Z",
2945
- jagged: "M0,80 L80,40 L160,80 L240,20 L320,80 L400,40 L480,80 L560,20 L640,80 L720,40 L800,80 L880,20 L960,80 L960,160 L0,160 Z",
2946
- curve: "M0,128 Q480,-32 960,128 L960,160 L0,160 Z",
2947
- castle: "M0,80 L0,60 L80,60 L80,80 L120,80 L120,40 L200,40 L200,80 L240,80 L240,60 L320,60 L320,80 L360,80 L360,40 L440,40 L440,80 L480,80 L480,60 L560,60 L560,80 L600,80 L600,40 L680,40 L680,80 L720,80 L720,60 L800,60 L800,80 L840,80 L840,40 L920,40 L920,80 L960,80 L960,160 L0,160 Z"
2948
- };
2949
- return /* @__PURE__ */ jsx(
2950
- "div",
2951
- {
2952
- className: `relative -my-px w-full overflow-hidden ${className}`,
2953
- style: { backgroundColor: from },
2954
- children: /* @__PURE__ */ jsx(
2955
- "svg",
2956
- {
2957
- viewBox: "0 0 960 160",
2958
- preserveAspectRatio: "none",
2959
- className: "block w-full",
2960
- style: {
2961
- height: "clamp(40px, 6vw, 80px)",
2962
- transform: flip ? "scaleY(-1)" : void 0
2963
- },
2964
- children: /* @__PURE__ */ jsx("path", { d: paths[variant], fill: to })
2965
- }
2966
- )
2967
- }
2968
- );
3033
+ children: badge
3034
+ }
3035
+ );
3036
+ const textContent = /* @__PURE__ */ jsxs("div", { className: cn(
3037
+ "flex flex-col gap-6",
3038
+ variant === "centered" && "items-center text-center"
3039
+ ), children: [
3040
+ badgePosition === "above" && badgeElement,
3041
+ /* @__PURE__ */ jsxs("h1", { className: cn(
3042
+ "brutal-display text-balance",
3043
+ variant === "centered" && "mx-auto max-w-4xl"
3044
+ ), children: [
3045
+ badgePosition === "inline" && badgeElement,
3046
+ headline
3047
+ ] }),
3048
+ /* @__PURE__ */ jsx("p", { className: cn(
3049
+ "brutal-body-lg max-w-lg opacity-80",
3050
+ variant === "centered" && "mx-auto"
3051
+ ), children: description }),
3052
+ /* @__PURE__ */ jsxs("div", { className: cn(
3053
+ "flex flex-col gap-4 sm:flex-row sm:flex-wrap",
3054
+ variant === "centered" && "sm:justify-center"
3055
+ ), children: [
3056
+ /* @__PURE__ */ jsx(Button, { variant: ctaVariant, size: "xl", className: "w-full sm:w-auto", render: /* @__PURE__ */ jsx("a", { href: ctaHref }), children: ctaText }),
3057
+ secondaryText && /* @__PURE__ */ jsx(Button, { variant: "outline", size: "xl", className: "w-full sm:w-auto", render: /* @__PURE__ */ jsx("a", { href: secondaryHref || "#" }), children: secondaryText })
3058
+ ] }),
3059
+ proof && /* @__PURE__ */ jsxs("p", { className: "flex items-center gap-2 text-sm font-medium opacity-70", children: [
3060
+ /* @__PURE__ */ jsx("span", { className: "inline-flex size-5 items-center justify-center border border-current text-xs", children: "\u2713" }),
3061
+ proof
3062
+ ] })
3063
+ ] });
3064
+ const layoutClass = {
3065
+ split: "grid items-center gap-12 lg:grid-cols-2 lg:gap-16",
3066
+ centered: "flex flex-col items-center gap-12",
3067
+ overlap: "relative",
3068
+ asymmetric: "grid items-center gap-12 lg:grid-cols-[3fr_2fr] lg:gap-16"
3069
+ }[variant];
3070
+ return /* @__PURE__ */ jsxs(BrutalSection, { color, padding: "lg", pattern, className: cn("relative", className), children: [
3071
+ badgePosition === "floating" && badgeElement,
3072
+ /* @__PURE__ */ jsxs("div", { className: layoutClass, children: [
3073
+ textContent,
3074
+ visual && variant === "overlap" ? /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-center opacity-20", children: visual }) : visual ? /* @__PURE__ */ jsx("div", { className: cn(
3075
+ "flex items-center justify-center",
3076
+ variant === "asymmetric" && "-rotate-2 transform"
3077
+ ), children: visual }) : null
3078
+ ] })
3079
+ ] });
2969
3080
  }
2970
3081
  var colMap = {
2971
3082
  2: "sm:grid-cols-2",
@@ -2973,6 +3084,7 @@ var colMap = {
2973
3084
  4: "sm:grid-cols-2 lg:grid-cols-4"
2974
3085
  };
2975
3086
  function BrutalFeatureGrid({
3087
+ variant = "icon-top",
2976
3088
  badge,
2977
3089
  headline,
2978
3090
  description,
@@ -2983,57 +3095,196 @@ function BrutalFeatureGrid({
2983
3095
  }) {
2984
3096
  return /* @__PURE__ */ jsxs(BrutalSection, { color, className, children: [
2985
3097
  /* @__PURE__ */ jsxs("div", { className: "mb-12 max-w-2xl", children: [
2986
- badge && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-4 text-muted-foreground", children: badge }),
3098
+ badge && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-4 text-brand", children: badge }),
2987
3099
  /* @__PURE__ */ jsx("h2", { className: "brutal-h2 mb-4", children: headline }),
2988
3100
  description && /* @__PURE__ */ jsx("p", { className: "brutal-body text-muted-foreground", children: description })
2989
3101
  ] }),
2990
- /* @__PURE__ */ jsx("div", { className: cn("grid gap-6", colMap[columns]), children: features.map((feature) => /* @__PURE__ */ jsxs(Card, { children: [
3102
+ /* @__PURE__ */ jsx(
3103
+ "div",
3104
+ {
3105
+ className: cn(
3106
+ "grid gap-6",
3107
+ variant === "bento" ? "sm:grid-cols-2 lg:grid-cols-3" : colMap[columns]
3108
+ ),
3109
+ children: features.map((feature, i) => /* @__PURE__ */ jsx(
3110
+ FeatureCard,
3111
+ {
3112
+ feature,
3113
+ variant,
3114
+ index: i
3115
+ },
3116
+ feature.title
3117
+ ))
3118
+ }
3119
+ )
3120
+ ] });
3121
+ }
3122
+ function FeatureCard({
3123
+ feature,
3124
+ variant,
3125
+ index
3126
+ }) {
3127
+ const isBentoFeatured = variant === "bento" && feature.featured;
3128
+ if (variant === "icon-left") {
3129
+ return /* @__PURE__ */ jsxs("div", { className: "flex gap-4 border-brutal border-foreground border-l-4 border-l-brand bg-background p-5 shadow-brutal transition-all duration-150 hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg", children: [
3130
+ feature.icon && /* @__PURE__ */ jsx("div", { className: "flex size-12 shrink-0 items-center justify-center border-brutal border-foreground bg-brand-muted text-2xl shadow-brutal-sm", children: feature.icon }),
3131
+ /* @__PURE__ */ jsxs("div", { children: [
3132
+ feature.stat && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-1 text-brand", children: feature.stat }),
3133
+ /* @__PURE__ */ jsx("h3", { className: "brutal-h4 mb-1", children: feature.title }),
3134
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: feature.description })
3135
+ ] })
3136
+ ] });
3137
+ }
3138
+ if (variant === "numbered") {
3139
+ return /* @__PURE__ */ jsxs(Card, { children: [
2991
3140
  /* @__PURE__ */ jsxs(CardHeader, { children: [
2992
- 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 }),
3141
+ /* @__PURE__ */ jsx("span", { className: "brutal-display mb-2 block text-brand opacity-20", children: String(index + 1).padStart(2, "0") }),
3142
+ feature.stat && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-1 text-brand", children: feature.stat }),
2993
3143
  /* @__PURE__ */ jsx(CardTitle, { children: feature.title })
2994
3144
  ] }),
2995
3145
  /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx(CardDescription, { children: feature.description }) })
2996
- ] }, feature.title)) })
3146
+ ] });
3147
+ }
3148
+ return /* @__PURE__ */ jsxs(
3149
+ Card,
3150
+ {
3151
+ className: cn(
3152
+ isBentoFeatured && "sm:col-span-2 bg-brand-muted"
3153
+ ),
3154
+ children: [
3155
+ /* @__PURE__ */ jsxs(CardHeader, { children: [
3156
+ feature.icon && /* @__PURE__ */ jsx("div", { className: "mb-2 inline-flex size-12 items-center justify-center border-brutal border-foreground border-b-brand bg-brand-muted text-2xl shadow-brutal-sm", children: feature.icon }),
3157
+ feature.stat && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-1 text-brand", children: feature.stat }),
3158
+ /* @__PURE__ */ jsx(CardTitle, { children: feature.title })
3159
+ ] }),
3160
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx(CardDescription, { children: feature.description }) })
3161
+ ]
3162
+ }
3163
+ );
3164
+ }
3165
+ function StarRating({ rating }) {
3166
+ return /* @__PURE__ */ jsx("div", { className: "flex gap-0.5", children: Array.from({ length: 5 }, (_, i) => /* @__PURE__ */ jsx(
3167
+ "span",
3168
+ {
3169
+ className: cn(
3170
+ "text-sm",
3171
+ i < rating ? "text-amber-500" : "text-foreground/20"
3172
+ ),
3173
+ children: "\u2605"
3174
+ },
3175
+ i
3176
+ )) });
3177
+ }
3178
+ function TestimonialCard({
3179
+ t,
3180
+ className
3181
+ }) {
3182
+ return /* @__PURE__ */ jsxs(
3183
+ "div",
3184
+ {
3185
+ className: cn(
3186
+ "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",
3187
+ className
3188
+ ),
3189
+ children: [
3190
+ /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute top-3 right-4 select-none font-serif text-5xl leading-none text-foreground/[0.06]", children: "\u201C" }),
3191
+ t.rating && /* @__PURE__ */ jsx("div", { className: "mb-3", children: /* @__PURE__ */ jsx(StarRating, { rating: t.rating }) }),
3192
+ /* @__PURE__ */ jsx("p", { className: "relative mb-4 text-sm leading-relaxed", children: t.text }),
3193
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
3194
+ t.avatar ? /* @__PURE__ */ jsx(
3195
+ "img",
3196
+ {
3197
+ src: t.avatar,
3198
+ alt: t.name,
3199
+ className: "size-9 border-2 object-cover",
3200
+ style: { borderColor: "hsl(var(--brand))" }
3201
+ }
3202
+ ) : /* @__PURE__ */ jsx(
3203
+ "div",
3204
+ {
3205
+ className: "flex size-9 items-center justify-center border-2 font-bold text-brand-foreground",
3206
+ style: {
3207
+ borderColor: "hsl(var(--brand))",
3208
+ backgroundColor: "hsl(var(--brand))"
3209
+ },
3210
+ children: t.name[0]
3211
+ }
3212
+ ),
3213
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
3214
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-bold", children: t.name }),
3215
+ (t.role || t.company) && /* @__PURE__ */ jsxs("p", { className: "truncate text-xs text-muted-foreground", children: [
3216
+ t.role,
3217
+ t.role && t.company && " \xB7 ",
3218
+ t.company
3219
+ ] }),
3220
+ !t.role && !t.company && t.handle && /* @__PURE__ */ jsx("p", { className: "font-mono text-xs text-muted-foreground", children: t.handle })
3221
+ ] }),
3222
+ t.companyLogo && /* @__PURE__ */ jsx(
3223
+ "img",
3224
+ {
3225
+ src: t.companyLogo,
3226
+ alt: t.company || "",
3227
+ className: "h-5 object-contain opacity-60"
3228
+ }
3229
+ )
3230
+ ] })
3231
+ ]
3232
+ }
3233
+ );
3234
+ }
3235
+ function MasonryLayout({ testimonials }) {
3236
+ return /* @__PURE__ */ jsx("div", { className: "columns-1 gap-6 sm:columns-2 lg:columns-3", children: testimonials.map((t, i) => /* @__PURE__ */ jsx(TestimonialCard, { t, className: "mb-6" }, i)) });
3237
+ }
3238
+ function FeaturedGridLayout({
3239
+ testimonials
3240
+ }) {
3241
+ const featured = testimonials.find((t) => t.featured) || testimonials[0];
3242
+ const rest = testimonials.filter((t) => t !== featured);
3243
+ return /* @__PURE__ */ jsxs("div", { className: "grid gap-6 lg:grid-cols-2", children: [
3244
+ featured && /* @__PURE__ */ jsx(
3245
+ TestimonialCard,
3246
+ {
3247
+ t: featured,
3248
+ className: "flex flex-col justify-between p-8 lg:row-span-2"
3249
+ }
3250
+ ),
3251
+ rest.map((t, i) => /* @__PURE__ */ jsx(TestimonialCard, { t }, i))
3252
+ ] });
3253
+ }
3254
+ function CarouselLayout({ testimonials }) {
3255
+ return /* @__PURE__ */ jsx("div", { className: "-mx-6 flex snap-x snap-mandatory gap-6 overflow-x-auto px-6 pb-4", children: testimonials.map((t, i) => /* @__PURE__ */ jsx(
3256
+ TestimonialCard,
3257
+ {
3258
+ t,
3259
+ className: "w-80 flex-none snap-center"
3260
+ },
3261
+ i
3262
+ )) });
3263
+ }
3264
+ function WallOfLoveLayout({ testimonials }) {
3265
+ return /* @__PURE__ */ jsxs("div", { className: "relative max-h-[600px] overflow-hidden", children: [
3266
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4", children: testimonials.map((t, i) => /* @__PURE__ */ jsx(TestimonialCard, { t }, i)) }),
3267
+ /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-x-0 bottom-0 h-32 bg-gradient-to-t from-background to-transparent" })
2997
3268
  ] });
2998
3269
  }
2999
3270
  function BrutalTestimonials({
3000
3271
  badge,
3001
3272
  headline,
3002
3273
  testimonials,
3003
- color = "blue",
3274
+ variant = "masonry",
3275
+ color = "brand-muted",
3276
+ pattern,
3004
3277
  className
3005
3278
  }) {
3006
- return /* @__PURE__ */ jsxs(BrutalSection, { color, className, children: [
3279
+ return /* @__PURE__ */ jsxs(BrutalSection, { color, pattern, className, children: [
3007
3280
  (headline || badge) && /* @__PURE__ */ jsxs("div", { className: "mb-12 text-center", children: [
3008
3281
  badge && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-4 opacity-70", children: badge }),
3009
3282
  headline && /* @__PURE__ */ jsx("h2", { className: "brutal-h2", children: headline })
3010
3283
  ] }),
3011
- /* @__PURE__ */ jsx("div", { className: "columns-1 gap-6 sm:columns-2 lg:columns-3", children: testimonials.map((t, i) => /* @__PURE__ */ jsxs(
3012
- "div",
3013
- {
3014
- className: cn(
3015
- "mb-6 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"
3016
- ),
3017
- children: [
3018
- /* @__PURE__ */ jsx("p", { className: "mb-4 text-sm leading-relaxed", children: t.text }),
3019
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
3020
- t.avatar ? /* @__PURE__ */ jsx(
3021
- "img",
3022
- {
3023
- src: t.avatar,
3024
- alt: t.name,
3025
- className: "size-9 border-brutal border-foreground object-cover"
3026
- }
3027
- ) : /* @__PURE__ */ jsx("div", { className: "flex size-9 items-center justify-center border-brutal border-foreground bg-brand font-bold text-brand-foreground", children: t.name[0] }),
3028
- /* @__PURE__ */ jsxs("div", { children: [
3029
- /* @__PURE__ */ jsx("p", { className: "text-sm font-bold", children: t.name }),
3030
- t.handle && /* @__PURE__ */ jsx("p", { className: "font-mono text-xs text-muted-foreground", children: t.handle })
3031
- ] })
3032
- ] })
3033
- ]
3034
- },
3035
- i
3036
- )) })
3284
+ variant === "masonry" && /* @__PURE__ */ jsx(MasonryLayout, { testimonials }),
3285
+ variant === "featured-grid" && /* @__PURE__ */ jsx(FeaturedGridLayout, { testimonials }),
3286
+ variant === "carousel" && /* @__PURE__ */ jsx(CarouselLayout, { testimonials }),
3287
+ variant === "wall-of-love" && /* @__PURE__ */ jsx(WallOfLoveLayout, { testimonials })
3037
3288
  ] });
3038
3289
  }
3039
3290
  function BrutalIntegrationGrid({
@@ -3074,63 +3325,180 @@ function BrutalIntegrationGrid({
3074
3325
  }) })
3075
3326
  ] });
3076
3327
  }
3077
- function BrutalCTA({
3078
- headline,
3079
- description,
3328
+ function CTAButtons({
3080
3329
  ctaText,
3081
3330
  ctaHref = "#",
3082
3331
  ctaVariant = "cta",
3083
3332
  secondaryText,
3084
- secondaryHref,
3085
- color = "black",
3086
- className
3333
+ secondaryHref
3087
3334
  }) {
3088
- return /* @__PURE__ */ jsx(BrutalSection, { color, className, children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-2xl text-center", children: [
3089
- /* @__PURE__ */ jsx("h2", { className: "brutal-h1 mb-6", children: headline }),
3090
- description && /* @__PURE__ */ jsx("p", { className: "brutal-body mb-8 opacity-80", children: description }),
3091
- /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-center gap-4", children: [
3335
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 sm:flex-row sm:flex-wrap sm:items-center sm:justify-center", children: [
3336
+ /* @__PURE__ */ jsx(
3337
+ Button,
3338
+ {
3339
+ variant: ctaVariant,
3340
+ size: "xl",
3341
+ className: "w-full sm:w-auto",
3342
+ render: /* @__PURE__ */ jsx("a", { href: ctaHref }),
3343
+ children: ctaText
3344
+ }
3345
+ ),
3346
+ secondaryText && /* @__PURE__ */ jsx(
3347
+ Button,
3348
+ {
3349
+ variant: "outline",
3350
+ size: "xl",
3351
+ className: "w-full sm:w-auto",
3352
+ render: /* @__PURE__ */ jsx("a", { href: secondaryHref || "#" }),
3353
+ children: secondaryText
3354
+ }
3355
+ )
3356
+ ] });
3357
+ }
3358
+ function CenteredCTA(props) {
3359
+ return /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-2xl text-center", children: [
3360
+ /* @__PURE__ */ jsx("h2", { className: "brutal-h1 mb-6", children: props.headline }),
3361
+ props.description && /* @__PURE__ */ jsx("p", { className: "brutal-body mb-4 opacity-80", children: props.description }),
3362
+ props.stats && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-8 opacity-60", children: props.stats }),
3363
+ /* @__PURE__ */ jsx(
3364
+ CTAButtons,
3365
+ {
3366
+ ctaText: props.ctaText,
3367
+ ctaHref: props.ctaHref,
3368
+ ctaVariant: props.ctaVariant,
3369
+ secondaryText: props.secondaryText,
3370
+ secondaryHref: props.secondaryHref
3371
+ }
3372
+ )
3373
+ ] });
3374
+ }
3375
+ function SplitCTA(props) {
3376
+ return /* @__PURE__ */ jsxs("div", { className: "grid items-center gap-12 lg:grid-cols-2", children: [
3377
+ /* @__PURE__ */ jsxs("div", { children: [
3378
+ /* @__PURE__ */ jsx("h2", { className: "brutal-h1 mb-6", children: props.headline }),
3379
+ props.description && /* @__PURE__ */ jsx("p", { className: "brutal-body mb-4 opacity-80", children: props.description }),
3380
+ props.stats && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-8 opacity-60", children: props.stats }),
3381
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 sm:flex-row sm:flex-wrap", children: [
3382
+ /* @__PURE__ */ jsx(
3383
+ Button,
3384
+ {
3385
+ variant: props.ctaVariant || "cta",
3386
+ size: "xl",
3387
+ className: "w-full sm:w-auto",
3388
+ render: /* @__PURE__ */ jsx("a", { href: props.ctaHref || "#" }),
3389
+ children: props.ctaText
3390
+ }
3391
+ ),
3392
+ props.secondaryText && /* @__PURE__ */ jsx(
3393
+ Button,
3394
+ {
3395
+ variant: "outline",
3396
+ size: "xl",
3397
+ className: "w-full sm:w-auto",
3398
+ render: /* @__PURE__ */ jsx("a", { href: props.secondaryHref || "#" }),
3399
+ children: props.secondaryText
3400
+ }
3401
+ )
3402
+ ] })
3403
+ ] }),
3404
+ props.visual && /* @__PURE__ */ jsx("div", { children: props.visual })
3405
+ ] });
3406
+ }
3407
+ function WithVisualCTA(props) {
3408
+ return /* @__PURE__ */ jsxs("div", { className: "relative", children: [
3409
+ props.visual && /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-center opacity-10", children: props.visual }),
3410
+ /* @__PURE__ */ jsxs("div", { className: "relative mx-auto max-w-2xl text-center", children: [
3411
+ /* @__PURE__ */ jsx("h2", { className: "brutal-h1 mb-6", children: props.headline }),
3412
+ props.description && /* @__PURE__ */ jsx("p", { className: "brutal-body mb-4 opacity-80", children: props.description }),
3413
+ props.stats && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-8 opacity-60", children: props.stats }),
3092
3414
  /* @__PURE__ */ jsx(
3093
- Button,
3094
- {
3095
- variant: ctaVariant,
3096
- size: "xl",
3097
- render: /* @__PURE__ */ jsx("a", { href: ctaHref }),
3098
- children: ctaText
3099
- }
3100
- ),
3101
- secondaryText && /* @__PURE__ */ jsx(
3102
- Button,
3415
+ CTAButtons,
3103
3416
  {
3104
- variant: "outline",
3105
- size: "lg",
3106
- render: /* @__PURE__ */ jsx("a", { href: secondaryHref || "#" }),
3107
- children: secondaryText
3417
+ ctaText: props.ctaText,
3418
+ ctaHref: props.ctaHref,
3419
+ ctaVariant: props.ctaVariant,
3420
+ secondaryText: props.secondaryText,
3421
+ secondaryHref: props.secondaryHref
3108
3422
  }
3109
3423
  )
3110
3424
  ] })
3425
+ ] });
3426
+ }
3427
+ function FloatingCardCTA(props) {
3428
+ return /* @__PURE__ */ jsx("div", { className: "relative z-10 -mt-16", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-2xl border-brutal border-foreground bg-background p-8 text-center text-foreground shadow-brutal-lg", children: [
3429
+ /* @__PURE__ */ jsx("h2", { className: "brutal-h1 mb-6", children: props.headline }),
3430
+ props.description && /* @__PURE__ */ jsx("p", { className: "brutal-body mb-4 opacity-80", children: props.description }),
3431
+ props.stats && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-8 opacity-60", children: props.stats }),
3432
+ /* @__PURE__ */ jsx(
3433
+ CTAButtons,
3434
+ {
3435
+ ctaText: props.ctaText,
3436
+ ctaHref: props.ctaHref,
3437
+ ctaVariant: props.ctaVariant,
3438
+ secondaryText: props.secondaryText,
3439
+ secondaryHref: props.secondaryHref
3440
+ }
3441
+ )
3111
3442
  ] }) });
3112
3443
  }
3444
+ function BrutalCTA({
3445
+ variant = "centered",
3446
+ color = "black",
3447
+ className,
3448
+ pattern,
3449
+ ...props
3450
+ }) {
3451
+ if (variant === "floating-card") {
3452
+ return /* @__PURE__ */ jsx("div", { className: cn("brutal-container px-6", className), children: /* @__PURE__ */ jsx(FloatingCardCTA, { ...props, variant, color }) });
3453
+ }
3454
+ return /* @__PURE__ */ jsxs(BrutalSection, { color, pattern, className, children: [
3455
+ variant === "centered" && /* @__PURE__ */ jsx(CenteredCTA, { ...props, variant, color }),
3456
+ variant === "split" && /* @__PURE__ */ jsx(SplitCTA, { ...props, variant, color }),
3457
+ variant === "with-visual" && /* @__PURE__ */ jsx(WithVisualCTA, { ...props, variant, color })
3458
+ ] });
3459
+ }
3113
3460
  function BrutalNav({
3114
3461
  logo,
3115
3462
  links,
3116
3463
  ctaText = "Sign In",
3117
3464
  ctaHref = "/admin",
3465
+ variant = "solid",
3118
3466
  className
3119
3467
  }) {
3120
- return /* @__PURE__ */ jsx(
3121
- "header",
3468
+ const [mobileOpen, setMobileOpen] = useState(false);
3469
+ const [isScrolled, setIsScrolled] = useState(false);
3470
+ useEffect(() => {
3471
+ if (variant !== "transparent") return;
3472
+ const onScroll = () => setIsScrolled(window.scrollY > 20);
3473
+ onScroll();
3474
+ window.addEventListener("scroll", onScroll, { passive: true });
3475
+ return () => window.removeEventListener("scroll", onScroll);
3476
+ }, [variant]);
3477
+ const variantStyles = {
3478
+ solid: "sticky top-0 z-50 w-full border-b-brutal border-foreground bg-brand",
3479
+ transparent: cn(
3480
+ "fixed top-0 left-0 right-0 z-50 w-full transition-all duration-200",
3481
+ isScrolled ? "bg-background/80 text-foreground backdrop-blur-md border-b border-foreground/10" : "bg-transparent text-white"
3482
+ ),
3483
+ "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"
3484
+ };
3485
+ return /* @__PURE__ */ jsx("header", { className: cn(variantStyles[variant], className), children: /* @__PURE__ */ jsxs(
3486
+ "div",
3122
3487
  {
3123
3488
  className: cn(
3124
- "sticky top-0 z-50 w-full border-b-brutal border-foreground bg-brand",
3125
- className
3489
+ "flex h-14 items-center justify-between px-6",
3490
+ variant === "floating-pill" ? "mx-auto max-w-7xl" : "brutal-container"
3126
3491
  ),
3127
- children: /* @__PURE__ */ jsxs("div", { className: "brutal-container flex h-14 items-center justify-between px-6", children: [
3492
+ children: [
3128
3493
  /* @__PURE__ */ jsx("a", { href: "/", className: "flex items-center gap-2 text-lg font-black", children: logo }),
3129
3494
  /* @__PURE__ */ jsx("nav", { className: "hidden items-center gap-1 md:flex", children: links.map((link) => /* @__PURE__ */ jsxs(
3130
3495
  "a",
3131
3496
  {
3132
3497
  href: link.href,
3133
- className: "relative px-3 py-1.5 text-sm font-bold transition-colors hover:opacity-70",
3498
+ className: cn(
3499
+ "relative rounded-md px-3 py-1.5 text-sm font-bold transition-colors hover:opacity-70",
3500
+ link.active && "bg-foreground/10"
3501
+ ),
3134
3502
  children: [
3135
3503
  link.label,
3136
3504
  link.badge && /* @__PURE__ */ jsx("span", { className: "absolute -top-1 -right-1 border border-foreground bg-background px-1 font-mono text-[9px] font-bold uppercase text-foreground", children: link.badge })
@@ -3138,10 +3506,157 @@ function BrutalNav({
3138
3506
  },
3139
3507
  link.href
3140
3508
  )) }),
3141
- /* @__PURE__ */ jsx(Button, { variant: "nav", size: "sm", render: /* @__PURE__ */ jsx("a", { href: ctaHref }), children: ctaText })
3142
- ] })
3509
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
3510
+ /* @__PURE__ */ jsx(
3511
+ Button,
3512
+ {
3513
+ variant: "nav",
3514
+ size: "sm",
3515
+ render: /* @__PURE__ */ jsx("a", { href: ctaHref }),
3516
+ className: "hidden md:inline-flex",
3517
+ children: ctaText
3518
+ }
3519
+ ),
3520
+ /* @__PURE__ */ jsxs(Sheet, { open: mobileOpen, onOpenChange: setMobileOpen, children: [
3521
+ /* @__PURE__ */ jsxs(
3522
+ SheetTrigger,
3523
+ {
3524
+ render: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "icon-sm", className: "md:hidden" }),
3525
+ children: [
3526
+ /* @__PURE__ */ jsx(Menu$1, { className: "size-5" }),
3527
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Menu" })
3528
+ ]
3529
+ }
3530
+ ),
3531
+ /* @__PURE__ */ jsxs(SheetContent, { side: "right", showCloseButton: true, children: [
3532
+ /* @__PURE__ */ jsx(SheetTitle, { children: "Navigation" }),
3533
+ /* @__PURE__ */ jsxs("nav", { className: "flex flex-col gap-1 px-2 pt-4", children: [
3534
+ links.map((link) => /* @__PURE__ */ jsxs(
3535
+ "a",
3536
+ {
3537
+ href: link.href,
3538
+ onClick: () => setMobileOpen(false),
3539
+ className: cn(
3540
+ "flex items-center gap-2 rounded-md px-3 py-2.5 text-sm font-bold transition-colors hover:bg-foreground/5",
3541
+ link.active && "bg-foreground/10"
3542
+ ),
3543
+ children: [
3544
+ link.label,
3545
+ link.badge && /* @__PURE__ */ jsx("span", { className: "border border-foreground bg-background px-1 font-mono text-[9px] font-bold uppercase text-foreground", children: link.badge })
3546
+ ]
3547
+ },
3548
+ link.href
3549
+ )),
3550
+ /* @__PURE__ */ jsx("div", { className: "mt-4 border-t border-foreground/10 pt-4", children: /* @__PURE__ */ jsx(
3551
+ Button,
3552
+ {
3553
+ variant: "default",
3554
+ size: "default",
3555
+ render: /* @__PURE__ */ jsx("a", { href: ctaHref }),
3556
+ className: "w-full",
3557
+ children: ctaText
3558
+ }
3559
+ ) })
3560
+ ] })
3561
+ ] })
3562
+ ] })
3563
+ ] })
3564
+ ]
3143
3565
  }
3144
- );
3566
+ ) });
3567
+ }
3568
+ function SocialsRow({
3569
+ socials
3570
+ }) {
3571
+ const items = [
3572
+ { key: "twitter", label: "Twitter", url: socials.twitter },
3573
+ { key: "github", label: "GitHub", url: socials.github },
3574
+ { key: "linkedin", label: "LinkedIn", url: socials.linkedin },
3575
+ { key: "discord", label: "Discord", url: socials.discord }
3576
+ ].filter((s) => s.url);
3577
+ if (items.length === 0) return null;
3578
+ return /* @__PURE__ */ jsx("div", { className: "flex items-center gap-4", children: items.map((s) => /* @__PURE__ */ jsx(
3579
+ "a",
3580
+ {
3581
+ href: s.url,
3582
+ target: "_blank",
3583
+ rel: "noopener noreferrer",
3584
+ className: "text-sm font-bold transition-colors hover:text-muted-foreground",
3585
+ children: s.label
3586
+ },
3587
+ s.key
3588
+ )) });
3589
+ }
3590
+ function NewsletterSection({
3591
+ newsletter
3592
+ }) {
3593
+ return /* @__PURE__ */ jsx("div", { className: "mb-10 border-b-brutal border-foreground pb-10", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-lg text-center", children: [
3594
+ /* @__PURE__ */ jsx("h3", { className: "brutal-h4 mb-2", children: newsletter.headline || "Stay in the loop" }),
3595
+ newsletter.description && /* @__PURE__ */ jsx("p", { className: "brutal-caption mb-4", children: newsletter.description }),
3596
+ /* @__PURE__ */ jsxs(
3597
+ "form",
3598
+ {
3599
+ onSubmit: (e) => e.preventDefault(),
3600
+ className: "flex gap-2",
3601
+ children: [
3602
+ /* @__PURE__ */ jsx(
3603
+ Input,
3604
+ {
3605
+ type: "email",
3606
+ placeholder: newsletter.placeholder || "you@email.com",
3607
+ className: "flex-1"
3608
+ }
3609
+ ),
3610
+ /* @__PURE__ */ jsx(Button, { variant: "default", size: "default", type: "submit", children: newsletter.buttonText || "Subscribe" })
3611
+ ]
3612
+ }
3613
+ )
3614
+ ] }) });
3615
+ }
3616
+ function MegaContent({
3617
+ logo,
3618
+ tagline,
3619
+ columns,
3620
+ socials
3621
+ }) {
3622
+ return /* @__PURE__ */ jsxs("div", { className: "mb-10 flex flex-col gap-8 sm:flex-row sm:items-start sm:justify-between", children: [
3623
+ /* @__PURE__ */ jsxs("div", { className: "max-w-xs", children: [
3624
+ /* @__PURE__ */ jsx("div", { className: "mb-2 text-xl font-black", children: logo }),
3625
+ tagline && /* @__PURE__ */ jsx("p", { className: "mb-4 text-sm text-muted-foreground", children: tagline }),
3626
+ socials && /* @__PURE__ */ jsx(SocialsRow, { socials })
3627
+ ] }),
3628
+ /* @__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: [
3629
+ /* @__PURE__ */ jsx("h3", { className: "brutal-label mb-3 text-muted-foreground", children: col.title }),
3630
+ /* @__PURE__ */ jsx("ul", { className: "flex flex-col gap-2", children: col.links.map((link) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
3631
+ "a",
3632
+ {
3633
+ href: link.href,
3634
+ className: "text-sm font-medium transition-colors hover:text-muted-foreground",
3635
+ children: link.label
3636
+ }
3637
+ ) }, link.href)) })
3638
+ ] }, col.title)) })
3639
+ ] });
3640
+ }
3641
+ function MinimalContent({
3642
+ logo,
3643
+ columns,
3644
+ socials
3645
+ }) {
3646
+ const allLinks = columns.flatMap((col) => col.links);
3647
+ return /* @__PURE__ */ jsxs("div", { className: "mb-6 flex flex-col items-center gap-4 sm:flex-row sm:justify-between", children: [
3648
+ /* @__PURE__ */ jsx("div", { className: "text-xl font-black", children: logo }),
3649
+ /* @__PURE__ */ jsx("nav", { className: "flex flex-wrap items-center justify-center gap-x-6 gap-y-2", children: allLinks.map((link) => /* @__PURE__ */ jsx(
3650
+ "a",
3651
+ {
3652
+ href: link.href,
3653
+ className: "text-sm font-medium transition-colors hover:text-muted-foreground",
3654
+ children: link.label
3655
+ },
3656
+ link.href
3657
+ )) }),
3658
+ socials && /* @__PURE__ */ jsx(SocialsRow, { socials })
3659
+ ] });
3145
3660
  }
3146
3661
  function BrutalFooter({
3147
3662
  logo,
@@ -3149,33 +3664,30 @@ function BrutalFooter({
3149
3664
  columns,
3150
3665
  bottomLeft,
3151
3666
  bottomRight,
3667
+ variant = "mega",
3668
+ socials,
3669
+ newsletter,
3152
3670
  className
3153
3671
  }) {
3154
3672
  return /* @__PURE__ */ jsx(
3155
3673
  "footer",
3156
3674
  {
3157
3675
  className: cn(
3158
- "w-full border-t-brutal border-foreground bg-background px-6 py-12 text-foreground",
3676
+ "w-full border-t-4 bg-background px-6 py-12 text-foreground",
3159
3677
  className
3160
3678
  ),
3679
+ style: { borderTopColor: "hsl(var(--brand))" },
3161
3680
  children: /* @__PURE__ */ jsxs("div", { className: "brutal-container", children: [
3162
- /* @__PURE__ */ jsxs("div", { className: "mb-10 flex flex-col gap-8 sm:flex-row sm:items-start sm:justify-between", children: [
3163
- /* @__PURE__ */ jsxs("div", { className: "max-w-xs", children: [
3164
- /* @__PURE__ */ jsx("div", { className: "mb-2 text-xl font-black", children: logo }),
3165
- tagline && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: tagline })
3166
- ] }),
3167
- /* @__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: [
3168
- /* @__PURE__ */ jsx("h3", { className: "brutal-label mb-3 text-muted-foreground", children: col.title }),
3169
- /* @__PURE__ */ jsx("ul", { className: "flex flex-col gap-2", children: col.links.map((link) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
3170
- "a",
3171
- {
3172
- href: link.href,
3173
- className: "text-sm font-medium transition-colors hover:text-muted-foreground",
3174
- children: link.label
3175
- }
3176
- ) }, link.href)) })
3177
- ] }, col.title)) })
3178
- ] }),
3681
+ variant === "newsletter" && newsletter && /* @__PURE__ */ jsx(NewsletterSection, { newsletter }),
3682
+ variant === "minimal" ? /* @__PURE__ */ jsx(MinimalContent, { logo, columns, socials }) : /* @__PURE__ */ jsx(
3683
+ MegaContent,
3684
+ {
3685
+ logo,
3686
+ tagline,
3687
+ columns,
3688
+ socials
3689
+ }
3690
+ ),
3179
3691
  /* @__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: [
3180
3692
  /* @__PURE__ */ jsx("span", { children: bottomLeft || "Built with care" }),
3181
3693
  /* @__PURE__ */ jsx("span", { children: bottomRight || (/* @__PURE__ */ new Date()).getFullYear() })
@@ -3184,7 +3696,1234 @@ function BrutalFooter({
3184
3696
  }
3185
3697
  );
3186
3698
  }
3699
+ function PricingTable({
3700
+ badge,
3701
+ headline,
3702
+ description,
3703
+ tiers,
3704
+ popularIndex,
3705
+ billingToggle = true,
3706
+ color = "white",
3707
+ className
3708
+ }) {
3709
+ const [annual, setAnnual] = useState(false);
3710
+ return /* @__PURE__ */ jsxs(BrutalSection, { color, className, children: [
3711
+ (headline || badge) && /* @__PURE__ */ jsxs("div", { className: "mb-8 text-center", children: [
3712
+ badge && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-4 text-muted-foreground", children: badge }),
3713
+ headline && /* @__PURE__ */ jsx("h2", { className: "brutal-h2 mb-4", children: headline }),
3714
+ description && /* @__PURE__ */ jsx("p", { className: "brutal-body mx-auto max-w-lg text-muted-foreground", children: description })
3715
+ ] }),
3716
+ billingToggle && /* @__PURE__ */ jsxs("div", { className: "mb-10 flex items-center justify-center gap-3", children: [
3717
+ /* @__PURE__ */ jsx("span", { className: cn("text-sm font-bold", !annual && "text-brand"), children: "Monthly" }),
3718
+ /* @__PURE__ */ jsx(
3719
+ "button",
3720
+ {
3721
+ onClick: () => setAnnual(!annual),
3722
+ className: cn(
3723
+ "relative h-8 w-14 border-brutal border-foreground transition-colors",
3724
+ annual ? "bg-brand" : "bg-secondary"
3725
+ ),
3726
+ children: /* @__PURE__ */ jsx(
3727
+ "span",
3728
+ {
3729
+ className: cn(
3730
+ "absolute top-1 size-6 border border-foreground bg-background transition-transform",
3731
+ annual ? "left-7" : "left-1"
3732
+ )
3733
+ }
3734
+ )
3735
+ }
3736
+ ),
3737
+ /* @__PURE__ */ jsx("span", { className: cn("text-sm font-bold", annual && "text-brand"), children: "Annual" }),
3738
+ annual && /* @__PURE__ */ jsx(Badge, { variant: "cta", children: "Save 20%" })
3739
+ ] }),
3740
+ /* @__PURE__ */ jsx("div", { className: cn(
3741
+ "grid gap-6",
3742
+ tiers.length === 2 && "mx-auto max-w-2xl sm:grid-cols-2",
3743
+ tiers.length === 3 && "lg:grid-cols-3",
3744
+ tiers.length >= 4 && "sm:grid-cols-2 lg:grid-cols-4"
3745
+ ), children: tiers.map((tier, i) => {
3746
+ const isPopular = i === popularIndex;
3747
+ const price = annual ? tier.price.annual : tier.price.monthly;
3748
+ return /* @__PURE__ */ jsxs(
3749
+ "div",
3750
+ {
3751
+ className: cn(
3752
+ "relative flex flex-col border-brutal border-foreground bg-background p-6 shadow-brutal",
3753
+ isPopular && "border-brand shadow-brutal-lg ring-2 ring-brand z-10 scale-105"
3754
+ ),
3755
+ children: [
3756
+ isPopular && /* @__PURE__ */ jsx(Badge, { variant: "brand", className: "absolute -top-3 left-1/2 -translate-x-1/2", children: "Popular" }),
3757
+ /* @__PURE__ */ jsx("h3", { className: "brutal-h4 mb-1", children: tier.name }),
3758
+ tier.description && /* @__PURE__ */ jsx("p", { className: "mb-4 text-sm text-muted-foreground", children: tier.description }),
3759
+ /* @__PURE__ */ jsxs("div", { className: "mb-6", children: [
3760
+ /* @__PURE__ */ jsx("span", { className: "brutal-h1", children: typeof price === "number" ? `$${price}` : price }),
3761
+ typeof price === "number" && /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: "/mo" })
3762
+ ] }),
3763
+ /* @__PURE__ */ jsx("ul", { className: "mb-8 flex flex-1 flex-col gap-2", children: tier.features.map((feature) => /* @__PURE__ */ jsxs("li", { className: "flex items-start gap-2 text-sm", children: [
3764
+ /* @__PURE__ */ jsx("span", { className: "mt-0.5 text-brand", children: "\u2713" }),
3765
+ feature
3766
+ ] }, feature)) }),
3767
+ /* @__PURE__ */ jsx(
3768
+ Button,
3769
+ {
3770
+ variant: tier.ctaVariant || (isPopular ? "cta" : "outline"),
3771
+ size: "lg",
3772
+ className: "w-full",
3773
+ render: tier.ctaHref ? /* @__PURE__ */ jsx("a", { href: tier.ctaHref }) : void 0,
3774
+ children: tier.ctaText
3775
+ }
3776
+ )
3777
+ ]
3778
+ },
3779
+ tier.name
3780
+ );
3781
+ }) })
3782
+ ] });
3783
+ }
3784
+ function LogoCloud({
3785
+ title,
3786
+ logos,
3787
+ marquee = false,
3788
+ color = "white",
3789
+ className
3790
+ }) {
3791
+ const logoElements = logos.map((logo) => {
3792
+ const img = /* @__PURE__ */ jsx(
3793
+ "img",
3794
+ {
3795
+ src: logo.src,
3796
+ alt: logo.alt,
3797
+ className: "h-8 max-w-[120px] object-contain opacity-50 grayscale transition-all duration-200 hover:opacity-100 hover:grayscale-0"
3798
+ },
3799
+ logo.alt
3800
+ );
3801
+ return logo.href ? /* @__PURE__ */ jsx("a", { href: logo.href, className: "flex items-center px-6", children: img }, logo.alt) : /* @__PURE__ */ jsx("div", { className: "flex items-center px-6", children: img }, logo.alt);
3802
+ });
3803
+ return /* @__PURE__ */ jsxs(BrutalSection, { color, padding: "sm", className, children: [
3804
+ title && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-6 text-center text-muted-foreground", children: title }),
3805
+ marquee ? /* @__PURE__ */ jsx("div", { className: "relative overflow-hidden", children: /* @__PURE__ */ jsxs("div", { className: "flex animate-marquee", children: [
3806
+ logoElements,
3807
+ logoElements
3808
+ ] }) }) : /* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center justify-center gap-8", children: logoElements })
3809
+ ] });
3810
+ }
3811
+ function useCountUp(target, inView) {
3812
+ const [count, setCount] = useState(0);
3813
+ useEffect(() => {
3814
+ if (!inView) return;
3815
+ let frame;
3816
+ const duration = 1500;
3817
+ const start = performance.now();
3818
+ function animate(now) {
3819
+ const elapsed = now - start;
3820
+ const progress = Math.min(elapsed / duration, 1);
3821
+ const eased = 1 - Math.pow(1 - progress, 3);
3822
+ setCount(Math.round(eased * target));
3823
+ if (progress < 1) frame = requestAnimationFrame(animate);
3824
+ }
3825
+ frame = requestAnimationFrame(animate);
3826
+ return () => cancelAnimationFrame(frame);
3827
+ }, [target, inView]);
3828
+ return count;
3829
+ }
3830
+ function StatItem({ stat, inView }) {
3831
+ const count = useCountUp(stat.value, inView);
3832
+ return /* @__PURE__ */ jsxs("div", { className: "text-center", children: [
3833
+ /* @__PURE__ */ jsxs("p", { className: "brutal-display", children: [
3834
+ stat.prefix,
3835
+ count.toLocaleString(),
3836
+ stat.suffix
3837
+ ] }),
3838
+ /* @__PURE__ */ jsx("p", { className: "brutal-label mt-2 text-muted-foreground", children: stat.label })
3839
+ ] });
3840
+ }
3841
+ function StatsBar({ stats, color = "white", className }) {
3842
+ const ref = useRef(null);
3843
+ const [inView, setInView] = useState(false);
3844
+ useEffect(() => {
3845
+ if (!ref.current) return;
3846
+ const observer = new IntersectionObserver(
3847
+ ([entry]) => {
3848
+ if (entry.isIntersecting) {
3849
+ setInView(true);
3850
+ observer.disconnect();
3851
+ }
3852
+ },
3853
+ { threshold: 0.3 }
3854
+ );
3855
+ observer.observe(ref.current);
3856
+ return () => observer.disconnect();
3857
+ }, []);
3858
+ return /* @__PURE__ */ jsx(BrutalSection, { color, padding: "sm", className, children: /* @__PURE__ */ jsx(
3859
+ "div",
3860
+ {
3861
+ ref,
3862
+ className: cn(
3863
+ "grid gap-8",
3864
+ stats.length === 2 && "grid-cols-2",
3865
+ stats.length === 3 && "grid-cols-3",
3866
+ stats.length >= 4 && "grid-cols-2 sm:grid-cols-4"
3867
+ ),
3868
+ children: stats.map((stat) => /* @__PURE__ */ jsx(StatItem, { stat, inView }, stat.label))
3869
+ }
3870
+ ) });
3871
+ }
3872
+ function FAQ({
3873
+ badge,
3874
+ headline,
3875
+ items,
3876
+ color = "white",
3877
+ className
3878
+ }) {
3879
+ return /* @__PURE__ */ jsxs(BrutalSection, { color, className, children: [
3880
+ (headline || badge) && /* @__PURE__ */ jsxs("div", { className: "mb-10 mx-auto max-w-2xl", children: [
3881
+ badge && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-4 text-brand", children: badge }),
3882
+ headline && /* @__PURE__ */ jsx("h2", { className: "brutal-h2", children: headline })
3883
+ ] }),
3884
+ /* @__PURE__ */ jsx(Accordion, { className: "mx-auto max-w-2xl", children: items.map((item, i) => /* @__PURE__ */ jsxs(
3885
+ AccordionItem,
3886
+ {
3887
+ value: `faq-${i}`,
3888
+ className: cn(
3889
+ "border-brutal border-foreground mb-3 px-5",
3890
+ i % 2 === 0 ? "bg-background" : "bg-secondary"
3891
+ ),
3892
+ children: [
3893
+ /* @__PURE__ */ jsx(AccordionTrigger, { className: "brutal-h4 py-4 text-left", children: item.question }),
3894
+ /* @__PURE__ */ jsx(AccordionContent, { className: "brutal-body pb-4 text-muted-foreground", children: item.answer })
3895
+ ]
3896
+ },
3897
+ i
3898
+ )) })
3899
+ ] });
3900
+ }
3901
+ function Newsletter({
3902
+ headline = "Stay in the loop",
3903
+ description,
3904
+ placeholder = "you@example.com",
3905
+ buttonText = "Subscribe",
3906
+ onSubmit,
3907
+ color = "white",
3908
+ className
3909
+ }) {
3910
+ return /* @__PURE__ */ jsx(BrutalSection, { color, padding: "sm", className, children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-md border-brutal border-foreground bg-background p-8 text-foreground shadow-brutal-lg", children: [
3911
+ /* @__PURE__ */ jsx("h3", { className: "brutal-h3 mb-2", children: headline }),
3912
+ description && /* @__PURE__ */ jsx("p", { className: "brutal-body mb-6 text-muted-foreground", children: description }),
3913
+ /* @__PURE__ */ jsxs(
3914
+ "form",
3915
+ {
3916
+ onSubmit: (e) => {
3917
+ e.preventDefault();
3918
+ const form = e.target;
3919
+ const email = new FormData(form).get("email");
3920
+ onSubmit?.(email);
3921
+ },
3922
+ className: "flex gap-3",
3923
+ children: [
3924
+ /* @__PURE__ */ jsx(Input, { type: "email", name: "email", placeholder, required: true, className: "flex-1" }),
3925
+ /* @__PURE__ */ jsx(Button, { type: "submit", variant: "cta", children: buttonText })
3926
+ ]
3927
+ }
3928
+ )
3929
+ ] }) });
3930
+ }
3931
+ var AppShellContext = createContext({
3932
+ collapsed: false,
3933
+ setCollapsed: () => {
3934
+ },
3935
+ mobileOpen: false,
3936
+ setMobileOpen: () => {
3937
+ }
3938
+ });
3939
+ var useAppShell = () => useContext(AppShellContext);
3940
+ function AppShell({
3941
+ sidebar,
3942
+ header,
3943
+ children,
3944
+ defaultCollapsed = false,
3945
+ className
3946
+ }) {
3947
+ const [collapsed, setCollapsed] = useState(defaultCollapsed);
3948
+ const [mobileOpen, setMobileOpen] = useState(false);
3949
+ return /* @__PURE__ */ jsx(
3950
+ AppShellContext.Provider,
3951
+ {
3952
+ value: { collapsed, setCollapsed, mobileOpen, setMobileOpen },
3953
+ children: /* @__PURE__ */ jsxs("div", { className: cn("flex h-screen bg-background", className), children: [
3954
+ /* @__PURE__ */ jsx(
3955
+ "aside",
3956
+ {
3957
+ className: cn(
3958
+ "hidden border-r-brutal border-foreground bg-background transition-all duration-200 md:block",
3959
+ collapsed ? "w-16" : "w-64"
3960
+ ),
3961
+ children: sidebar
3962
+ }
3963
+ ),
3964
+ /* @__PURE__ */ jsx(Sheet, { open: mobileOpen, onOpenChange: setMobileOpen, children: /* @__PURE__ */ jsxs(SheetContent, { side: "left", className: "w-64 p-0 md:hidden", children: [
3965
+ /* @__PURE__ */ jsx(SheetTitle, { className: "sr-only", children: "Navigation" }),
3966
+ sidebar
3967
+ ] }) }),
3968
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-col overflow-hidden", children: [
3969
+ header && /* @__PURE__ */ jsxs("header", { className: "flex h-14 items-center gap-4 border-b-brutal border-foreground px-6", children: [
3970
+ /* @__PURE__ */ jsx(
3971
+ Button,
3972
+ {
3973
+ variant: "ghost",
3974
+ size: "sm",
3975
+ className: "md:hidden",
3976
+ onClick: () => setMobileOpen(true),
3977
+ children: "\u2630"
3978
+ }
3979
+ ),
3980
+ header
3981
+ ] }),
3982
+ /* @__PURE__ */ jsx("main", { className: "flex-1 overflow-auto p-6", children })
3983
+ ] })
3984
+ ] })
3985
+ }
3986
+ );
3987
+ }
3988
+ function Sidebar({
3989
+ logo,
3990
+ logoCollapsed,
3991
+ groups,
3992
+ footer,
3993
+ className
3994
+ }) {
3995
+ const { collapsed, setCollapsed } = useAppShell();
3996
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex h-full flex-col", className), children: [
3997
+ /* @__PURE__ */ jsxs("div", { className: "flex h-14 items-center justify-between border-b-brutal border-foreground px-4", children: [
3998
+ /* @__PURE__ */ jsx("div", { className: "font-black", children: collapsed ? logoCollapsed || logo : logo }),
3999
+ /* @__PURE__ */ jsx(
4000
+ "button",
4001
+ {
4002
+ onClick: () => setCollapsed(!collapsed),
4003
+ className: "hidden text-xs text-muted-foreground hover:text-foreground md:block",
4004
+ children: collapsed ? "\u2192" : "\u2190"
4005
+ }
4006
+ )
4007
+ ] }),
4008
+ /* @__PURE__ */ jsx("nav", { className: "flex-1 overflow-auto p-2", children: groups.map((group, gi) => /* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
4009
+ group.title && !collapsed && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-2 px-2 text-muted-foreground", children: group.title }),
4010
+ /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-0.5", children: group.links.map((link) => /* @__PURE__ */ jsxs(
4011
+ "a",
4012
+ {
4013
+ href: link.href,
4014
+ className: cn(
4015
+ "flex items-center gap-3 rounded-sm px-3 py-2 text-sm font-medium transition-colors",
4016
+ link.active ? "bg-brand text-brand-foreground" : "hover:bg-secondary",
4017
+ collapsed && "justify-center"
4018
+ ),
4019
+ title: collapsed ? link.label : void 0,
4020
+ children: [
4021
+ /* @__PURE__ */ jsx("span", { className: "size-5 shrink-0", children: link.icon }),
4022
+ !collapsed && /* @__PURE__ */ jsxs(Fragment, { children: [
4023
+ /* @__PURE__ */ jsx("span", { className: "flex-1", children: link.label }),
4024
+ link.badge !== void 0 && /* @__PURE__ */ jsx("span", { className: "border border-foreground bg-brand-muted px-1.5 font-mono text-[10px] font-bold", children: link.badge })
4025
+ ] })
4026
+ ]
4027
+ },
4028
+ link.href
4029
+ )) })
4030
+ ] }, gi)) }),
4031
+ footer && /* @__PURE__ */ jsx("div", { className: "border-t-brutal border-foreground p-3", children: footer })
4032
+ ] });
4033
+ }
4034
+ function StatCard({
4035
+ label,
4036
+ value,
4037
+ change,
4038
+ changeLabel,
4039
+ icon,
4040
+ className
4041
+ }) {
4042
+ return /* @__PURE__ */ jsxs(
4043
+ "div",
4044
+ {
4045
+ className: cn(
4046
+ "border-brutal border-foreground bg-background p-5 shadow-brutal",
4047
+ className
4048
+ ),
4049
+ children: [
4050
+ /* @__PURE__ */ jsxs("div", { className: "mb-3 flex items-center justify-between", children: [
4051
+ /* @__PURE__ */ jsx("p", { className: "brutal-label text-muted-foreground", children: label }),
4052
+ icon && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: icon })
4053
+ ] }),
4054
+ /* @__PURE__ */ jsx("p", { className: "brutal-h1 mb-1", children: value }),
4055
+ change !== void 0 && /* @__PURE__ */ jsxs(
4056
+ "p",
4057
+ {
4058
+ className: cn(
4059
+ "flex items-center gap-1 font-mono text-xs font-bold",
4060
+ change >= 0 ? "text-cta" : "text-destructive"
4061
+ ),
4062
+ children: [
4063
+ /* @__PURE__ */ jsx("span", { children: change >= 0 ? "\u2191" : "\u2193" }),
4064
+ /* @__PURE__ */ jsxs("span", { children: [
4065
+ Math.abs(change),
4066
+ "%"
4067
+ ] }),
4068
+ changeLabel && /* @__PURE__ */ jsx("span", { className: "font-normal text-muted-foreground", children: changeLabel })
4069
+ ]
4070
+ }
4071
+ )
4072
+ ]
4073
+ }
4074
+ );
4075
+ }
4076
+ var viewLabels = {
4077
+ table: "Table",
4078
+ kanban: "Board",
4079
+ grid: "Grid",
4080
+ calendar: "Calendar",
4081
+ list: "List"
4082
+ };
4083
+ function ViewSwitcher({
4084
+ value,
4085
+ onChange,
4086
+ views = ["table", "kanban", "grid", "calendar", "list"],
4087
+ className
4088
+ }) {
4089
+ return /* @__PURE__ */ jsx(
4090
+ ToggleGroup,
4091
+ {
4092
+ value: [value],
4093
+ onValueChange: (vals) => {
4094
+ if (vals.length > 0) {
4095
+ onChange(vals[0]);
4096
+ }
4097
+ },
4098
+ className,
4099
+ children: views.map((view) => /* @__PURE__ */ jsx(ToggleGroupItem, { value: view, className: "brutal-label text-xs", children: viewLabels[view] }, view))
4100
+ }
4101
+ );
4102
+ }
4103
+ function SearchBar({
4104
+ placeholder = "Search...",
4105
+ shortcut = "\u2318K",
4106
+ value,
4107
+ onChange,
4108
+ className
4109
+ }) {
4110
+ return /* @__PURE__ */ jsxs("div", { className: cn("relative", className), children: [
4111
+ /* @__PURE__ */ jsx(
4112
+ Input,
4113
+ {
4114
+ type: "search",
4115
+ placeholder,
4116
+ value,
4117
+ onChange: (e) => onChange?.(e.target.value),
4118
+ className: "pr-12"
4119
+ }
4120
+ ),
4121
+ shortcut && /* @__PURE__ */ jsx("span", { className: "absolute right-2 top-1/2 -translate-y-1/2 border border-foreground bg-secondary px-1.5 font-mono text-[10px] text-muted-foreground", children: shortcut })
4122
+ ] });
4123
+ }
4124
+ function UserMenu({ name, email, avatar, items, onSignOut }) {
4125
+ return /* @__PURE__ */ jsxs(DropdownMenu, { children: [
4126
+ /* @__PURE__ */ jsxs(
4127
+ DropdownMenuTrigger,
4128
+ {
4129
+ className: "inline-flex shrink-0 cursor-pointer items-center gap-2 rounded-lg px-3 py-1.5 text-sm font-medium outline-none hover:bg-secondary",
4130
+ children: [
4131
+ /* @__PURE__ */ jsxs(Avatar, { className: "size-7", children: [
4132
+ avatar && /* @__PURE__ */ jsx(AvatarImage, { src: avatar, alt: name }),
4133
+ /* @__PURE__ */ jsx(AvatarFallback, { children: name[0] })
4134
+ ] }),
4135
+ /* @__PURE__ */ jsx("span", { className: "hidden text-sm font-medium sm:inline", children: name })
4136
+ ]
4137
+ }
4138
+ ),
4139
+ /* @__PURE__ */ jsxs(DropdownMenuContent, { align: "end", className: "w-48", children: [
4140
+ /* @__PURE__ */ jsxs(DropdownMenuLabel, { children: [
4141
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-bold", children: name }),
4142
+ email && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: email })
4143
+ ] }),
4144
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
4145
+ items && /* @__PURE__ */ jsx(DropdownMenuGroup, { children: items.map((item) => /* @__PURE__ */ jsx(DropdownMenuItem, { onClick: item.onClick, children: item.href ? /* @__PURE__ */ jsx("a", { href: item.href, children: item.label }) : item.label }, item.label)) }),
4146
+ onSignOut && /* @__PURE__ */ jsxs(Fragment, { children: [
4147
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
4148
+ /* @__PURE__ */ jsx(DropdownMenuItem, { onClick: onSignOut, children: "Sign out" })
4149
+ ] })
4150
+ ] })
4151
+ ] });
4152
+ }
4153
+ function EmptyState({
4154
+ icon,
4155
+ headline,
4156
+ description,
4157
+ ctaText,
4158
+ ctaHref,
4159
+ onAction,
4160
+ className
4161
+ }) {
4162
+ return /* @__PURE__ */ jsxs(
4163
+ "div",
4164
+ {
4165
+ className: cn(
4166
+ "flex flex-col items-center justify-center py-16 text-center",
4167
+ className
4168
+ ),
4169
+ children: [
4170
+ icon && /* @__PURE__ */ jsx("div", { className: "mb-4 flex size-16 items-center justify-center border-brutal border-foreground bg-secondary text-3xl shadow-brutal-sm", children: icon }),
4171
+ /* @__PURE__ */ jsx("h3", { className: "brutal-h3 mb-2", children: headline }),
4172
+ description && /* @__PURE__ */ jsx("p", { className: "brutal-body mb-6 max-w-sm text-muted-foreground", children: description }),
4173
+ ctaText && (ctaHref ? /* @__PURE__ */ jsx(Button, { variant: "cta", render: /* @__PURE__ */ jsx("a", { href: ctaHref }), children: ctaText }) : /* @__PURE__ */ jsx(Button, { variant: "cta", onClick: onAction, children: ctaText }))
4174
+ ]
4175
+ }
4176
+ );
4177
+ }
4178
+ function formatDate(d) {
4179
+ const date = typeof d === "string" ? new Date(d) : d;
4180
+ return date.toLocaleDateString("en-US", { month: "short", day: "numeric" });
4181
+ }
4182
+ function formatTime(d) {
4183
+ const date = typeof d === "string" ? new Date(d) : d;
4184
+ return date.toLocaleTimeString("en-US", {
4185
+ hour: "numeric",
4186
+ minute: "2-digit"
4187
+ });
4188
+ }
4189
+ function ActivityFeed({
4190
+ entries,
4191
+ groupByDate = true,
4192
+ className
4193
+ }) {
4194
+ const grouped = groupByDate ? entries.reduce((acc, entry) => {
4195
+ const key = formatDate(entry.timestamp);
4196
+ (acc[key] ?? (acc[key] = [])).push(entry);
4197
+ return acc;
4198
+ }, {}) : { "": entries };
4199
+ return /* @__PURE__ */ jsx("div", { className: cn("flex flex-col gap-6", className), children: Object.entries(grouped).map(([date, items]) => /* @__PURE__ */ jsxs("div", { children: [
4200
+ date && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-3 text-muted-foreground", children: date }),
4201
+ /* @__PURE__ */ jsxs("div", { className: "relative flex flex-col gap-0 pl-6", children: [
4202
+ /* @__PURE__ */ jsx("div", { className: "absolute bottom-2 left-2 top-2 w-px bg-foreground/10" }),
4203
+ items.map((entry) => /* @__PURE__ */ jsxs("div", { className: "relative flex items-start gap-3 py-2", children: [
4204
+ /* @__PURE__ */ jsx("div", { className: "absolute left-[-18px] top-3 size-2 border border-foreground bg-brand" }),
4205
+ /* @__PURE__ */ jsxs(Avatar, { className: "size-7 shrink-0", children: [
4206
+ entry.avatar && /* @__PURE__ */ jsx(AvatarImage, { src: entry.avatar, alt: entry.name }),
4207
+ /* @__PURE__ */ jsx(AvatarFallback, { className: "text-[10px]", children: entry.name[0] })
4208
+ ] }),
4209
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
4210
+ /* @__PURE__ */ jsxs("p", { className: "text-sm", children: [
4211
+ /* @__PURE__ */ jsx("span", { className: "font-bold", children: entry.name }),
4212
+ " ",
4213
+ entry.action
4214
+ ] }),
4215
+ /* @__PURE__ */ jsx("p", { className: "font-mono text-xs text-muted-foreground", children: formatTime(entry.timestamp) }),
4216
+ entry.metadata
4217
+ ] })
4218
+ ] }, entry.id))
4219
+ ] })
4220
+ ] }, date)) });
4221
+ }
4222
+ function FileUpload({
4223
+ onFiles,
4224
+ accept,
4225
+ maxFiles = 10,
4226
+ maxSize,
4227
+ className
4228
+ }) {
4229
+ const [isDragging, setIsDragging] = useState(false);
4230
+ const [files, setFiles] = useState([]);
4231
+ const handleFiles = useCallback(
4232
+ (newFiles) => {
4233
+ const arr = Array.from(newFiles).slice(0, maxFiles);
4234
+ setFiles(arr);
4235
+ onFiles(arr);
4236
+ },
4237
+ [maxFiles, onFiles]
4238
+ );
4239
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-4", className), children: [
4240
+ /* @__PURE__ */ jsxs(
4241
+ "div",
4242
+ {
4243
+ onDragOver: (e) => {
4244
+ e.preventDefault();
4245
+ setIsDragging(true);
4246
+ },
4247
+ onDragLeave: () => setIsDragging(false),
4248
+ onDrop: (e) => {
4249
+ e.preventDefault();
4250
+ setIsDragging(false);
4251
+ handleFiles(e.dataTransfer.files);
4252
+ },
4253
+ className: cn(
4254
+ "flex cursor-pointer flex-col items-center justify-center border-2 border-dashed border-foreground p-8 text-center transition-colors",
4255
+ isDragging && "border-brand bg-brand-muted"
4256
+ ),
4257
+ onClick: () => {
4258
+ const input = document.createElement("input");
4259
+ input.type = "file";
4260
+ input.multiple = maxFiles > 1;
4261
+ if (accept) input.accept = accept;
4262
+ input.onchange = (e) => {
4263
+ const target = e.target;
4264
+ if (target.files) handleFiles(target.files);
4265
+ };
4266
+ input.click();
4267
+ },
4268
+ children: [
4269
+ /* @__PURE__ */ jsx("p", { className: "brutal-h4 mb-1", children: "Drop files here" }),
4270
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "or click to browse" }),
4271
+ maxSize && /* @__PURE__ */ jsxs("p", { className: "mt-2 font-mono text-xs text-muted-foreground", children: [
4272
+ "Max ",
4273
+ Math.round(maxSize / 1024 / 1024),
4274
+ "MB"
4275
+ ] })
4276
+ ]
4277
+ }
4278
+ ),
4279
+ files.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2", children: files.map((file, i) => /* @__PURE__ */ jsxs(
4280
+ "div",
4281
+ {
4282
+ className: "flex items-center justify-between border border-foreground bg-secondary px-3 py-2 text-sm",
4283
+ children: [
4284
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: file.name }),
4285
+ /* @__PURE__ */ jsxs("span", { className: "font-mono text-xs text-muted-foreground", children: [
4286
+ (file.size / 1024).toFixed(0),
4287
+ "KB"
4288
+ ] })
4289
+ ]
4290
+ },
4291
+ i
4292
+ )) })
4293
+ ] });
4294
+ }
4295
+ function DataTable({
4296
+ columns,
4297
+ data,
4298
+ searchColumn,
4299
+ searchPlaceholder = "Search...",
4300
+ pageSize = 10,
4301
+ emptyMessage = "No data",
4302
+ className
4303
+ }) {
4304
+ const [sorting, setSorting] = useState([]);
4305
+ const [globalFilter, setGlobalFilter] = useState("");
4306
+ const table = useReactTable({
4307
+ data,
4308
+ columns,
4309
+ state: { sorting, globalFilter },
4310
+ onSortingChange: setSorting,
4311
+ onGlobalFilterChange: setGlobalFilter,
4312
+ getCoreRowModel: getCoreRowModel(),
4313
+ getSortedRowModel: getSortedRowModel(),
4314
+ getFilteredRowModel: getFilteredRowModel(),
4315
+ getPaginationRowModel: getPaginationRowModel(),
4316
+ initialState: { pagination: { pageSize } }
4317
+ });
4318
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-4", className), children: [
4319
+ searchColumn !== void 0 && /* @__PURE__ */ jsx(
4320
+ Input,
4321
+ {
4322
+ placeholder: searchPlaceholder,
4323
+ value: globalFilter,
4324
+ onChange: (e) => setGlobalFilter(e.target.value),
4325
+ className: "max-w-sm"
4326
+ }
4327
+ ),
4328
+ /* @__PURE__ */ jsx("div", { className: "overflow-auto border-brutal border-foreground shadow-brutal", children: /* @__PURE__ */ jsxs("table", { className: "w-full text-sm", children: [
4329
+ /* @__PURE__ */ jsx("thead", { children: table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ jsx(
4330
+ "tr",
4331
+ {
4332
+ className: "border-b-brutal border-foreground bg-secondary",
4333
+ children: headerGroup.headers.map((header) => /* @__PURE__ */ jsxs(
4334
+ "th",
4335
+ {
4336
+ className: cn(
4337
+ "brutal-label px-4 py-3 text-left",
4338
+ header.column.getCanSort() && "cursor-pointer select-none"
4339
+ ),
4340
+ onClick: header.column.getToggleSortingHandler(),
4341
+ children: [
4342
+ flexRender(
4343
+ header.column.columnDef.header,
4344
+ header.getContext()
4345
+ ),
4346
+ {
4347
+ asc: " \u2191",
4348
+ desc: " \u2193"
4349
+ }[header.column.getIsSorted()] ?? ""
4350
+ ]
4351
+ },
4352
+ header.id
4353
+ ))
4354
+ },
4355
+ headerGroup.id
4356
+ )) }),
4357
+ /* @__PURE__ */ jsx("tbody", { children: table.getRowModel().rows.length === 0 ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx(
4358
+ "td",
4359
+ {
4360
+ colSpan: columns.length,
4361
+ className: "px-4 py-8 text-center text-muted-foreground",
4362
+ children: emptyMessage
4363
+ }
4364
+ ) }) : table.getRowModel().rows.map((row, i) => /* @__PURE__ */ jsx(
4365
+ "tr",
4366
+ {
4367
+ className: cn(
4368
+ "border-b border-foreground/10 transition-colors hover:bg-brand-muted",
4369
+ i % 2 === 1 && "bg-secondary/30"
4370
+ ),
4371
+ children: row.getVisibleCells().map((cell) => /* @__PURE__ */ jsx("td", { className: "px-4 py-3", children: flexRender(
4372
+ cell.column.columnDef.cell,
4373
+ cell.getContext()
4374
+ ) }, cell.id))
4375
+ },
4376
+ row.id
4377
+ )) })
4378
+ ] }) }),
4379
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
4380
+ /* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground", children: [
4381
+ "Page ",
4382
+ table.getState().pagination.pageIndex + 1,
4383
+ " of",
4384
+ " ",
4385
+ table.getPageCount()
4386
+ ] }),
4387
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
4388
+ /* @__PURE__ */ jsx(
4389
+ Button,
4390
+ {
4391
+ variant: "outline",
4392
+ size: "sm",
4393
+ onClick: () => table.previousPage(),
4394
+ disabled: !table.getCanPreviousPage(),
4395
+ children: "Previous"
4396
+ }
4397
+ ),
4398
+ /* @__PURE__ */ jsx(
4399
+ Button,
4400
+ {
4401
+ variant: "outline",
4402
+ size: "sm",
4403
+ onClick: () => table.nextPage(),
4404
+ disabled: !table.getCanNextPage(),
4405
+ children: "Next"
4406
+ }
4407
+ )
4408
+ ] })
4409
+ ] })
4410
+ ] });
4411
+ }
4412
+ function KanbanBoard({
4413
+ columns,
4414
+ renderCard,
4415
+ onCardMove,
4416
+ onCardAdd,
4417
+ className
4418
+ }) {
4419
+ return /* @__PURE__ */ jsx("div", { className: cn("flex gap-4 overflow-x-auto pb-4", className), children: columns.map((column) => /* @__PURE__ */ jsx(
4420
+ KanbanColumnComponent,
4421
+ {
4422
+ column,
4423
+ renderCard,
4424
+ onCardMove,
4425
+ onCardAdd
4426
+ },
4427
+ column.id
4428
+ )) });
4429
+ }
4430
+ function KanbanColumnComponent({
4431
+ column,
4432
+ renderCard,
4433
+ onCardMove,
4434
+ onCardAdd
4435
+ }) {
4436
+ const ref = useRef(null);
4437
+ const [isDragOver, setIsDragOver] = useState(false);
4438
+ const [addText, setAddText] = useState("");
4439
+ useEffect(() => {
4440
+ if (!ref.current) return;
4441
+ return dropTargetForElements({
4442
+ element: ref.current,
4443
+ getData: () => ({ columnId: column.id }),
4444
+ onDragEnter: () => setIsDragOver(true),
4445
+ onDragLeave: () => setIsDragOver(false),
4446
+ onDrop: ({ source }) => {
4447
+ setIsDragOver(false);
4448
+ const data = source.data;
4449
+ if (data.columnId !== column.id) {
4450
+ onCardMove?.(
4451
+ data.cardId,
4452
+ data.columnId,
4453
+ column.id,
4454
+ column.cards.length
4455
+ );
4456
+ }
4457
+ }
4458
+ });
4459
+ }, [column.id, column.cards.length, onCardMove]);
4460
+ return /* @__PURE__ */ jsxs(
4461
+ "div",
4462
+ {
4463
+ ref,
4464
+ className: cn(
4465
+ "flex min-w-[280px] flex-col border-brutal border-foreground bg-secondary/30 p-3",
4466
+ isDragOver && "ring-2 ring-brand"
4467
+ ),
4468
+ children: [
4469
+ /* @__PURE__ */ jsxs("div", { className: "brutal-label mb-3 flex items-center justify-between", children: [
4470
+ /* @__PURE__ */ jsx("span", { children: column.title }),
4471
+ /* @__PURE__ */ jsx("span", { className: "bg-foreground px-1.5 font-mono text-xs text-background", children: column.cards.length })
4472
+ ] }),
4473
+ /* @__PURE__ */ jsx("div", { className: "flex flex-1 flex-col gap-2", children: column.cards.map((card) => /* @__PURE__ */ jsx(
4474
+ KanbanCard,
4475
+ {
4476
+ card,
4477
+ columnId: column.id,
4478
+ renderCard
4479
+ },
4480
+ card.id
4481
+ )) }),
4482
+ onCardAdd && /* @__PURE__ */ jsx(
4483
+ "form",
4484
+ {
4485
+ className: "mt-3",
4486
+ onSubmit: (e) => {
4487
+ e.preventDefault();
4488
+ if (addText.trim()) {
4489
+ onCardAdd(column.id, addText.trim());
4490
+ setAddText("");
4491
+ }
4492
+ },
4493
+ children: /* @__PURE__ */ jsx(
4494
+ Input,
4495
+ {
4496
+ value: addText,
4497
+ onChange: (e) => setAddText(e.target.value),
4498
+ placeholder: "+ Add card...",
4499
+ className: "text-sm"
4500
+ }
4501
+ )
4502
+ }
4503
+ )
4504
+ ]
4505
+ }
4506
+ );
4507
+ }
4508
+ function KanbanCard({
4509
+ card,
4510
+ columnId,
4511
+ renderCard
4512
+ }) {
4513
+ const ref = useRef(null);
4514
+ const [isDragging, setIsDragging] = useState(false);
4515
+ useEffect(() => {
4516
+ if (!ref.current) return;
4517
+ return draggable({
4518
+ element: ref.current,
4519
+ getInitialData: () => ({ cardId: card.id, columnId }),
4520
+ onDragStart: () => setIsDragging(true),
4521
+ onDrop: () => setIsDragging(false)
4522
+ });
4523
+ }, [card.id, columnId]);
4524
+ return /* @__PURE__ */ jsx(
4525
+ "div",
4526
+ {
4527
+ ref,
4528
+ className: cn(
4529
+ "cursor-grab border-brutal border-foreground bg-background p-3 shadow-brutal-sm transition-opacity active:cursor-grabbing",
4530
+ isDragging && "opacity-50"
4531
+ ),
4532
+ children: renderCard(card)
4533
+ }
4534
+ );
4535
+ }
4536
+ function GridView({
4537
+ children,
4538
+ columns = 3,
4539
+ gap = 6,
4540
+ className
4541
+ }) {
4542
+ return /* @__PURE__ */ jsx(
4543
+ "div",
4544
+ {
4545
+ className: cn("grid", className),
4546
+ style: {
4547
+ gridTemplateColumns: `repeat(auto-fill, minmax(${Math.floor(100 / columns) - 2}%, 1fr))`,
4548
+ gap: `${gap * 4}px`
4549
+ },
4550
+ children
4551
+ }
4552
+ );
4553
+ }
4554
+ var DAYS = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
4555
+ function getDaysInMonth(year, month) {
4556
+ return new Date(year, month + 1, 0).getDate();
4557
+ }
4558
+ function getFirstDayOfMonth(year, month) {
4559
+ return new Date(year, month, 1).getDay();
4560
+ }
4561
+ function CalendarView({
4562
+ events = [],
4563
+ onEventClick,
4564
+ onDateClick,
4565
+ className
4566
+ }) {
4567
+ const [currentDate, setCurrentDate] = useState(/* @__PURE__ */ new Date());
4568
+ const year = currentDate.getFullYear();
4569
+ const month = currentDate.getMonth();
4570
+ const daysInMonth = getDaysInMonth(year, month);
4571
+ const firstDay = getFirstDayOfMonth(year, month);
4572
+ const monthName = currentDate.toLocaleDateString("en-US", {
4573
+ month: "long",
4574
+ year: "numeric"
4575
+ });
4576
+ const cells = [];
4577
+ for (let i = 0; i < firstDay; i++) cells.push(null);
4578
+ for (let d = 1; d <= daysInMonth; d++) cells.push(d);
4579
+ const getEventsForDay = (day) => events.filter((e) => {
4580
+ const d = typeof e.date === "string" ? new Date(e.date) : e.date;
4581
+ return d.getFullYear() === year && d.getMonth() === month && d.getDate() === day;
4582
+ });
4583
+ const today = /* @__PURE__ */ new Date();
4584
+ const isToday = (day) => day === today.getDate() && month === today.getMonth() && year === today.getFullYear();
4585
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-4", className), children: [
4586
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
4587
+ /* @__PURE__ */ jsx(
4588
+ Button,
4589
+ {
4590
+ variant: "outline",
4591
+ size: "sm",
4592
+ onClick: () => setCurrentDate(new Date(year, month - 1)),
4593
+ children: "\u2190"
4594
+ }
4595
+ ),
4596
+ /* @__PURE__ */ jsx("h3", { className: "brutal-h4", children: monthName }),
4597
+ /* @__PURE__ */ jsx(
4598
+ Button,
4599
+ {
4600
+ variant: "outline",
4601
+ size: "sm",
4602
+ onClick: () => setCurrentDate(new Date(year, month + 1)),
4603
+ children: "\u2192"
4604
+ }
4605
+ )
4606
+ ] }),
4607
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-7 border-brutal border-foreground", children: [
4608
+ DAYS.map((day) => /* @__PURE__ */ jsx(
4609
+ "div",
4610
+ {
4611
+ className: "brutal-label border-b-brutal border-foreground bg-secondary px-2 py-2 text-center text-xs",
4612
+ children: day
4613
+ },
4614
+ day
4615
+ )),
4616
+ cells.map((day, i) => {
4617
+ const dayEvents = day ? getEventsForDay(day) : [];
4618
+ return /* @__PURE__ */ jsx(
4619
+ "div",
4620
+ {
4621
+ className: cn(
4622
+ "min-h-[80px] border-b border-r border-foreground/10 p-1",
4623
+ day && onDateClick && "cursor-pointer hover:bg-secondary/50",
4624
+ isToday(day ?? 0) && "bg-brand-muted"
4625
+ ),
4626
+ onClick: () => day && onDateClick?.(new Date(year, month, day)),
4627
+ children: day && /* @__PURE__ */ jsxs(Fragment, { children: [
4628
+ /* @__PURE__ */ jsx(
4629
+ "span",
4630
+ {
4631
+ className: cn(
4632
+ "text-xs font-bold",
4633
+ isToday(day) && "text-brand"
4634
+ ),
4635
+ children: day
4636
+ }
4637
+ ),
4638
+ /* @__PURE__ */ jsxs("div", { className: "mt-1 flex flex-col gap-0.5", children: [
4639
+ dayEvents.slice(0, 3).map((event) => /* @__PURE__ */ jsx(
4640
+ "div",
4641
+ {
4642
+ onClick: (e) => {
4643
+ e.stopPropagation();
4644
+ onEventClick?.(event);
4645
+ },
4646
+ className: "cursor-pointer truncate border border-foreground/20 bg-brand-muted px-1 text-[10px] font-medium hover:bg-brand",
4647
+ style: event.color ? { borderLeftColor: event.color, borderLeftWidth: 2 } : void 0,
4648
+ children: event.title
4649
+ },
4650
+ event.id
4651
+ )),
4652
+ dayEvents.length > 3 && /* @__PURE__ */ jsxs("span", { className: "text-[10px] text-muted-foreground", children: [
4653
+ "+",
4654
+ dayEvents.length - 3
4655
+ ] })
4656
+ ] })
4657
+ ] })
4658
+ },
4659
+ i
4660
+ );
4661
+ })
4662
+ ] })
4663
+ ] });
4664
+ }
4665
+ function ListView({
4666
+ items,
4667
+ onItemClick,
4668
+ emptyMessage = "No items",
4669
+ className
4670
+ }) {
4671
+ if (items.length === 0) {
4672
+ return /* @__PURE__ */ jsx("p", { className: "py-8 text-center text-muted-foreground", children: emptyMessage });
4673
+ }
4674
+ return /* @__PURE__ */ jsx("div", { className: cn("border-brutal border-foreground shadow-brutal", className), children: items.map((item, i) => /* @__PURE__ */ jsxs(
4675
+ "div",
4676
+ {
4677
+ onClick: () => onItemClick?.(item),
4678
+ className: cn(
4679
+ "flex items-center gap-4 px-4 py-3 transition-colors",
4680
+ onItemClick && "cursor-pointer",
4681
+ "hover:bg-secondary/50",
4682
+ i < items.length - 1 && "border-b border-foreground/10"
4683
+ ),
4684
+ children: [
4685
+ item.avatar && /* @__PURE__ */ jsxs(Avatar, { className: "size-8", children: [
4686
+ /* @__PURE__ */ jsx(AvatarImage, { src: item.avatar, alt: item.title }),
4687
+ /* @__PURE__ */ jsx(AvatarFallback, { children: item.title[0] })
4688
+ ] }),
4689
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
4690
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-bold", children: item.title }),
4691
+ item.subtitle && /* @__PURE__ */ jsx("p", { className: "truncate text-xs text-muted-foreground", children: item.subtitle })
4692
+ ] }),
4693
+ item.metadata && /* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground", children: item.metadata }),
4694
+ item.actions && /* @__PURE__ */ jsx("div", { children: item.actions })
4695
+ ]
4696
+ },
4697
+ item.id
4698
+ )) });
4699
+ }
4700
+ function SaaSLaunchTemplate({
4701
+ brand,
4702
+ logo,
4703
+ nav,
4704
+ hero,
4705
+ logos,
4706
+ features,
4707
+ stats,
4708
+ testimonials,
4709
+ pricing,
4710
+ faq,
4711
+ cta,
4712
+ footer
4713
+ }) {
4714
+ return /* @__PURE__ */ jsxs("div", { children: [
4715
+ /* @__PURE__ */ jsx(BrutalNav, { logo, links: nav.links, ctaText: nav.ctaText, ctaHref: nav.ctaHref, variant: "solid" }),
4716
+ /* @__PURE__ */ jsx(
4717
+ BrutalHero,
4718
+ {
4719
+ variant: "split",
4720
+ badge: hero.badge,
4721
+ headline: hero.headline,
4722
+ description: hero.description,
4723
+ ctaText: hero.ctaText,
4724
+ ctaHref: hero.ctaHref,
4725
+ secondaryText: hero.secondaryText,
4726
+ secondaryHref: hero.secondaryHref,
4727
+ visual: hero.visual,
4728
+ proof: hero.proof,
4729
+ color: "brand",
4730
+ pattern: "noise"
4731
+ }
4732
+ ),
4733
+ /* @__PURE__ */ jsx(SectionDivider, { from: "hsl(var(--brand))", to: "hsl(var(--background))", variant: "wave" }),
4734
+ logos && logos.length > 0 && /* @__PURE__ */ jsx(LogoCloud, { logos, marquee: true, title: "Trusted by teams everywhere" }),
4735
+ /* @__PURE__ */ jsx(
4736
+ BrutalFeatureGrid,
4737
+ {
4738
+ variant: "bento",
4739
+ badge: features.badge,
4740
+ headline: features.headline,
4741
+ description: features.description,
4742
+ features: features.items,
4743
+ color: "white"
4744
+ }
4745
+ ),
4746
+ stats && stats.length > 0 && /* @__PURE__ */ jsx(StatsBar, { stats, color: "brand" }),
4747
+ /* @__PURE__ */ jsx(SectionDivider, { from: "hsl(var(--brand))", to: "hsl(var(--brand-muted))", variant: "torn-paper" }),
4748
+ /* @__PURE__ */ jsx(
4749
+ BrutalTestimonials,
4750
+ {
4751
+ variant: "wall-of-love",
4752
+ badge: testimonials.badge,
4753
+ headline: testimonials.headline,
4754
+ testimonials: testimonials.items,
4755
+ color: "brand-muted"
4756
+ }
4757
+ ),
4758
+ /* @__PURE__ */ jsx(SectionDivider, { from: "hsl(var(--brand-muted))", to: "hsl(var(--background))", variant: "wave" }),
4759
+ pricing && /* @__PURE__ */ jsx(
4760
+ PricingTable,
4761
+ {
4762
+ badge: pricing.badge,
4763
+ headline: pricing.headline,
4764
+ description: pricing.description,
4765
+ tiers: pricing.tiers,
4766
+ popularIndex: pricing.popularIndex,
4767
+ color: "white"
4768
+ }
4769
+ ),
4770
+ faq && faq.length > 0 && /* @__PURE__ */ jsx(FAQ, { badge: "FAQ", headline: "Common Questions", items: faq, color: "white" }),
4771
+ /* @__PURE__ */ jsx(
4772
+ BrutalCTA,
4773
+ {
4774
+ variant: "with-visual",
4775
+ headline: cta.headline,
4776
+ description: cta.description,
4777
+ ctaText: cta.ctaText,
4778
+ ctaHref: cta.ctaHref,
4779
+ secondaryText: cta.secondaryText,
4780
+ secondaryHref: cta.secondaryHref,
4781
+ color: "black",
4782
+ pattern: "gradient-mesh"
4783
+ }
4784
+ ),
4785
+ /* @__PURE__ */ jsx(
4786
+ BrutalFooter,
4787
+ {
4788
+ variant: "mega",
4789
+ logo,
4790
+ tagline: footer.tagline,
4791
+ columns: footer.columns,
4792
+ socials: footer.socials
4793
+ }
4794
+ )
4795
+ ] });
4796
+ }
4797
+ function StudioTemplate({
4798
+ logo,
4799
+ nav,
4800
+ hero,
4801
+ features,
4802
+ testimonials,
4803
+ newsletter,
4804
+ cta,
4805
+ footer
4806
+ }) {
4807
+ return /* @__PURE__ */ jsxs("div", { children: [
4808
+ /* @__PURE__ */ jsx(BrutalNav, { logo, links: nav.links, ctaText: nav.ctaText, ctaHref: nav.ctaHref, variant: "floating-pill" }),
4809
+ /* @__PURE__ */ jsx(
4810
+ BrutalHero,
4811
+ {
4812
+ variant: "asymmetric",
4813
+ badge: hero.badge,
4814
+ headline: hero.headline,
4815
+ description: hero.description,
4816
+ ctaText: hero.ctaText,
4817
+ ctaHref: hero.ctaHref,
4818
+ visual: hero.visual,
4819
+ proof: hero.proof,
4820
+ color: "brand",
4821
+ pattern: "grain"
4822
+ }
4823
+ ),
4824
+ /* @__PURE__ */ jsx(SectionDivider, { from: "hsl(var(--brand))", to: "hsl(var(--background))", variant: "brush-stroke" }),
4825
+ /* @__PURE__ */ jsx(
4826
+ BrutalFeatureGrid,
4827
+ {
4828
+ variant: "numbered",
4829
+ badge: features.badge,
4830
+ headline: features.headline,
4831
+ description: features.description,
4832
+ features: features.items,
4833
+ color: "white"
4834
+ }
4835
+ ),
4836
+ testimonials && /* @__PURE__ */ jsxs(Fragment, { children: [
4837
+ /* @__PURE__ */ jsx(SectionDivider, { from: "hsl(var(--background))", to: "hsl(var(--brand-muted))", variant: "diagonal" }),
4838
+ /* @__PURE__ */ jsx(
4839
+ BrutalTestimonials,
4840
+ {
4841
+ variant: "featured-grid",
4842
+ badge: testimonials.badge,
4843
+ headline: testimonials.headline,
4844
+ testimonials: testimonials.items,
4845
+ color: "brand-muted"
4846
+ }
4847
+ ),
4848
+ /* @__PURE__ */ jsx(SectionDivider, { from: "hsl(var(--brand-muted))", to: "hsl(var(--background))", variant: "diagonal", flip: true })
4849
+ ] }),
4850
+ newsletter && /* @__PURE__ */ jsx(
4851
+ Newsletter,
4852
+ {
4853
+ headline: newsletter.headline,
4854
+ description: newsletter.description,
4855
+ onSubmit: newsletter.onSubmit
4856
+ }
4857
+ ),
4858
+ /* @__PURE__ */ jsx(
4859
+ BrutalCTA,
4860
+ {
4861
+ variant: "floating-card",
4862
+ headline: cta.headline,
4863
+ description: cta.description,
4864
+ ctaText: cta.ctaText,
4865
+ ctaHref: cta.ctaHref,
4866
+ color: "brand"
4867
+ }
4868
+ ),
4869
+ /* @__PURE__ */ jsx(
4870
+ BrutalFooter,
4871
+ {
4872
+ variant: "minimal",
4873
+ logo,
4874
+ tagline: footer.tagline,
4875
+ columns: footer.columns
4876
+ }
4877
+ )
4878
+ ] });
4879
+ }
4880
+ function DashboardTemplate({
4881
+ logo,
4882
+ logoCollapsed,
4883
+ sidebarGroups,
4884
+ user,
4885
+ userMenuItems,
4886
+ onSignOut,
4887
+ stats,
4888
+ views,
4889
+ children,
4890
+ sidebarFooter
4891
+ }) {
4892
+ const [view, setView] = useState("table");
4893
+ return /* @__PURE__ */ jsxs(
4894
+ AppShell,
4895
+ {
4896
+ sidebar: /* @__PURE__ */ jsx(
4897
+ Sidebar,
4898
+ {
4899
+ logo,
4900
+ logoCollapsed,
4901
+ groups: sidebarGroups,
4902
+ footer: sidebarFooter
4903
+ }
4904
+ ),
4905
+ header: /* @__PURE__ */ jsxs(Fragment, { children: [
4906
+ /* @__PURE__ */ jsx(SearchBar, { className: "flex-1 max-w-sm" }),
4907
+ /* @__PURE__ */ jsx("div", { className: "ml-auto", children: /* @__PURE__ */ jsx(
4908
+ UserMenu,
4909
+ {
4910
+ name: user.name,
4911
+ email: user.email,
4912
+ avatar: user.avatar,
4913
+ items: userMenuItems,
4914
+ onSignOut
4915
+ }
4916
+ ) })
4917
+ ] }),
4918
+ children: [
4919
+ stats && stats.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-6 grid gap-4 sm:grid-cols-2 lg:grid-cols-4", children: stats.map((stat) => /* @__PURE__ */ jsx(StatCard, { ...stat }, stat.label)) }),
4920
+ views && views.length > 1 && /* @__PURE__ */ jsx("div", { className: "mb-4", children: /* @__PURE__ */ jsx(ViewSwitcher, { value: view, onChange: setView, views }) }),
4921
+ children
4922
+ ]
4923
+ }
4924
+ );
4925
+ }
3187
4926
 
3188
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertTitle, Avatar, AvatarFallback, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, BrutalCTA, BrutalFeatureGrid, BrutalFooter, BrutalHero, BrutalIntegrationGrid, BrutalNav, BrutalSection, BrutalTestimonials, Button, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, HoverCard, HoverCardContent, HoverCardTrigger, Input, InputGroup, InputGroupAddon, InputGroupInput, InputGroupTextarea, Label, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuPositioner, NavigationMenuTrigger, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger, Progress, RadioGroup, RadioGroupItem, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Skeleton, Slider, Switch, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, WaveDivider, badgeVariants, buttonVariants, cn, navigationMenuTriggerStyle, tabsListVariants, toggleVariants };
4927
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActivityFeed, Alert, AlertDescription, AlertTitle, AppShell, Avatar, AvatarFallback, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, BrutalCTA, BrutalFeatureGrid, BrutalFooter, BrutalHero, BrutalIntegrationGrid, BrutalNav, BrutalSection, BrutalTestimonials, Button, CalendarView, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DashboardTemplate, DataTable, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, FAQ, FileUpload, GridView, HoverCard, HoverCardContent, HoverCardTrigger, Input, InputGroup, InputGroupAddon, InputGroupInput, InputGroupTextarea, KanbanBoard, Label, ListView, LogoCloud, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuPositioner, NavigationMenuTrigger, Newsletter, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger, PricingTable, Progress, RadioGroup, RadioGroupItem, SaaSLaunchTemplate, ScrollArea, ScrollBar, SearchBar, SectionDivider, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, Skeleton, Slider, StatCard, StatsBar, StudioTemplate, Switch, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, UserMenu, ViewSwitcher, SectionDivider as WaveDivider, badgeVariants, buttonVariants, cn, defaultTransition, fadeIn, fadeInUp, navigationMenuTriggerStyle, scaleIn, slideInLeft, slideInRight, springTransition, staggerContainer, tabsListVariants, toggleVariants, useAppShell };
3189
4928
  //# sourceMappingURL=index.js.map
3190
4929
  //# sourceMappingURL=index.js.map