@mikenotthepope/substrateui 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -76,6 +76,7 @@ __export(index_exports, {
76
76
  Chart: () => ChartComponent,
77
77
  Checkbox: () => Checkbox,
78
78
  Collapsible: () => CollapsibleComponent,
79
+ ColorThemeToggle: () => ColorThemeToggle,
79
80
  Combobox: () => ComboboxComponent,
80
81
  Command: () => CommandComponent,
81
82
  Container: () => Container,
@@ -137,6 +138,7 @@ __export(index_exports, {
137
138
  Tooltip: () => TooltipComponent,
138
139
  TwoColumnLayout: () => TwoColumnLayoutComponent,
139
140
  alertVariants: () => alertVariants,
141
+ avatarVariants: () => avatarVariants,
140
142
  badgeVariants: () => badgeVariants,
141
143
  buttonVariants: () => buttonVariants,
142
144
  cardVariants: () => cardVariants,
@@ -532,18 +534,41 @@ var DrawerComponent = Object.assign(Drawer, {
532
534
  // components/ui/Avatar.tsx
533
535
  var React5 = __toESM(require("react"));
534
536
  var AvatarPrimitive = __toESM(require("@radix-ui/react-avatar"));
537
+ var import_class_variance_authority4 = require("class-variance-authority");
535
538
  var import_jsx_runtime6 = require("react/jsx-runtime");
539
+ var avatarVariants = (0, import_class_variance_authority4.cva)(
540
+ "relative flex h-10 w-10 border-2 overflow-hidden",
541
+ {
542
+ variants: {
543
+ shape: {
544
+ circle: "rounded-full",
545
+ square: "rounded-none",
546
+ rounded: "rounded-lg",
547
+ hexagon: "rounded-none border-0 [clip-path:polygon(50%_0%,100%_25%,100%_75%,50%_100%,0%_75%,0%_25%)]",
548
+ diamond: "rounded-none rotate-45 border-2",
549
+ squircle: "rounded-none border-0 [clip-path:url(#squircle)]",
550
+ shield: "rounded-none border-0 [clip-path:polygon(50%_0%,100%_0%,100%_70%,50%_100%,0%_70%,0%_0%)]"
551
+ }
552
+ },
553
+ defaultVariants: {
554
+ shape: "circle"
555
+ }
556
+ }
557
+ );
536
558
  var Avatar = React5.forwardRef((_a, ref) => {
537
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
538
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
559
+ var _b = _a, { className, shape = "circle", children } = _b, props = __objRest(_b, ["className", "shape", "children"]);
560
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
539
561
  AvatarPrimitive.Root,
540
- __spreadValues({
562
+ __spreadProps(__spreadValues({
541
563
  ref,
542
- className: cn(
543
- "relative flex h-10 w-10 border-2 rounded-full overflow-hidden",
544
- className
545
- )
546
- }, props)
564
+ "data-shape": shape,
565
+ className: cn(avatarVariants({ shape }), className)
566
+ }, props), {
567
+ children: [
568
+ shape === "squircle" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("svg", { width: "0", height: "0", className: "absolute", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("defs", { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("clipPath", { id: "squircle", clipPathUnits: "objectBoundingBox", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("path", { d: "M 0.5 0 C 0.9 0, 1 0.1, 1 0.5 C 1 0.9, 0.9 1, 0.5 1 C 0.1 1, 0 0.9, 0 0.5 C 0 0.1, 0.1 0, 0.5 0" }) }) }) }),
569
+ children
570
+ ]
571
+ })
547
572
  );
548
573
  });
549
574
  Avatar.displayName = "Avatar";
@@ -553,7 +578,10 @@ var AvatarImage = React5.forwardRef((_a, ref) => {
553
578
  AvatarPrimitive.Image,
554
579
  __spreadValues({
555
580
  ref,
556
- className: cn("aspect-square h-full w-full", className)
581
+ className: cn(
582
+ "aspect-square h-full w-full [[data-shape=diamond]>&]:-rotate-45",
583
+ className
584
+ )
557
585
  }, props)
558
586
  );
559
587
  });
@@ -565,7 +593,10 @@ var AvatarFallback = React5.forwardRef((_a, ref) => {
565
593
  __spreadValues({
566
594
  ref,
567
595
  className: cn(
568
- "flex h-full w-full items-center justify-center rounded-full bg-primary text-primary-foreground font-head text-sm",
596
+ "flex h-full w-full items-center justify-center bg-primary text-primary-foreground font-head text-sm",
597
+ "[[data-shape=circle]>&]:rounded-full",
598
+ "[[data-shape=rounded]>&]:rounded-lg",
599
+ "[[data-shape=diamond]>&]:-rotate-45",
569
600
  className
570
601
  )
571
602
  }, props)
@@ -781,10 +812,10 @@ Textarea.displayName = "Textarea";
781
812
  // components/ui/Checkbox.tsx
782
813
  var React10 = __toESM(require("react"));
783
814
  var CheckboxPrimitive = __toESM(require("@radix-ui/react-checkbox"));
784
- var import_class_variance_authority4 = require("class-variance-authority");
815
+ var import_class_variance_authority5 = require("class-variance-authority");
785
816
  var import_lucide_react2 = require("lucide-react");
786
817
  var import_jsx_runtime11 = require("react/jsx-runtime");
787
- var checkboxVariants = (0, import_class_variance_authority4.cva)("border-2 shrink-0 cursor-pointer disabled:cursor-not-allowed disabled:opacity-50", {
818
+ var checkboxVariants = (0, import_class_variance_authority5.cva)("border-2 shrink-0 cursor-pointer disabled:cursor-not-allowed disabled:opacity-50", {
788
819
  variants: {
789
820
  variant: {
790
821
  default: "data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",
@@ -819,9 +850,9 @@ Checkbox.displayName = "Checkbox";
819
850
  // components/ui/RadioGroup.tsx
820
851
  var React11 = __toESM(require("react"));
821
852
  var RadioPrimitive = __toESM(require("@radix-ui/react-radio-group"));
822
- var import_class_variance_authority5 = require("class-variance-authority");
853
+ var import_class_variance_authority6 = require("class-variance-authority");
823
854
  var import_jsx_runtime12 = require("react/jsx-runtime");
824
- var radioVariants = (0, import_class_variance_authority5.cva)("border-2 border-border shrink-0 cursor-pointer disabled:cursor-not-allowed disabled:opacity-50", {
855
+ var radioVariants = (0, import_class_variance_authority6.cva)("border-2 border-border shrink-0 cursor-pointer disabled:cursor-not-allowed disabled:opacity-50", {
825
856
  variants: {
826
857
  variant: {
827
858
  default: "",
@@ -832,14 +863,19 @@ var radioVariants = (0, import_class_variance_authority5.cva)("border-2 border-b
832
863
  sm: "h-4 w-4",
833
864
  md: "h-5 w-5",
834
865
  lg: "h-6 w-6"
866
+ },
867
+ shape: {
868
+ circle: "rounded-full",
869
+ diamond: "rotate-45"
835
870
  }
836
871
  },
837
872
  defaultVariants: {
838
873
  variant: "default",
839
- size: "md"
874
+ size: "md",
875
+ shape: "circle"
840
876
  }
841
877
  });
842
- var radioIndicatorVariants = (0, import_class_variance_authority5.cva)("flex", {
878
+ var radioIndicatorVariants = (0, import_class_variance_authority6.cva)("flex", {
843
879
  variants: {
844
880
  variant: {
845
881
  default: "bg-primary border-2 border-border",
@@ -847,14 +883,19 @@ var radioIndicatorVariants = (0, import_class_variance_authority5.cva)("flex", {
847
883
  solid: "bg-border"
848
884
  },
849
885
  size: {
850
- sm: "h-2 w-2",
851
- md: "h-2.5 w-2.5",
852
- lg: "h-3.5 w-3.5"
886
+ sm: "h-2.5 w-2.5",
887
+ md: "h-3 w-3",
888
+ lg: "h-4 w-4"
889
+ },
890
+ shape: {
891
+ circle: "rounded-full",
892
+ diamond: ""
853
893
  }
854
894
  },
855
895
  defaultVariants: {
856
896
  variant: "default",
857
- size: "md"
897
+ size: "md",
898
+ shape: "circle"
858
899
  }
859
900
  });
860
901
  var RadioGroupRoot = React11.forwardRef((_a, ref) => {
@@ -869,15 +910,15 @@ var RadioGroupRoot = React11.forwardRef((_a, ref) => {
869
910
  });
870
911
  RadioGroupRoot.displayName = "RadioGroup";
871
912
  var RadioGroupItem = React11.forwardRef((_a, ref) => {
872
- var _b = _a, { className, size, variant, children } = _b, props = __objRest(_b, ["className", "size", "variant", "children"]);
913
+ var _b = _a, { className, size, variant, shape, children } = _b, props = __objRest(_b, ["className", "size", "variant", "shape", "children"]);
873
914
  return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
874
915
  RadioPrimitive.Item,
875
916
  __spreadProps(__spreadValues({
876
917
  ref,
877
- className: cn(radioVariants({ size, variant }), className)
918
+ className: cn(radioVariants({ size, variant, shape }), className)
878
919
  }, props), {
879
920
  children: [
880
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(RadioPrimitive.Indicator, { className: "flex justify-center items-center", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: radioIndicatorVariants({ size, variant }) }) }),
921
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(RadioPrimitive.Indicator, { className: "flex justify-center items-center", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: radioIndicatorVariants({ size, variant, shape }) }) }),
881
922
  children
882
923
  ]
883
924
  })
@@ -1139,7 +1180,7 @@ var FormActions = React15.forwardRef(
1139
1180
  __spreadValues({
1140
1181
  ref,
1141
1182
  className: cn(
1142
- "flex items-center gap-3 border-t-2 border-border pt-6",
1183
+ "flex items-center gap-3 border-t-2 border-border mt-6 pt-6",
1143
1184
  alignMap[align],
1144
1185
  className
1145
1186
  )
@@ -1156,11 +1197,11 @@ var FormLayout = Object.assign(FormLayoutRoot, {
1156
1197
  });
1157
1198
 
1158
1199
  // components/ui/Link.tsx
1159
- var import_class_variance_authority6 = require("class-variance-authority");
1200
+ var import_class_variance_authority7 = require("class-variance-authority");
1160
1201
  var import_react7 = __toESM(require("react"));
1161
1202
  var import_react_slot4 = require("@radix-ui/react-slot");
1162
1203
  var import_jsx_runtime18 = require("react/jsx-runtime");
1163
- var linkVariants = (0, import_class_variance_authority6.cva)(
1204
+ var linkVariants = (0, import_class_variance_authority7.cva)(
1164
1205
  "font-head inline-flex items-center gap-1 cursor-pointer transition-colors duration-200 underline-offset-4",
1165
1206
  {
1166
1207
  variants: {
@@ -1213,9 +1254,9 @@ Link.displayName = "Link";
1213
1254
 
1214
1255
  // components/ui/Alert.tsx
1215
1256
  var React17 = __toESM(require("react"));
1216
- var import_class_variance_authority7 = require("class-variance-authority");
1257
+ var import_class_variance_authority8 = require("class-variance-authority");
1217
1258
  var import_jsx_runtime19 = require("react/jsx-runtime");
1218
- var alertVariants = (0, import_class_variance_authority7.cva)(
1259
+ var alertVariants = (0, import_class_variance_authority8.cva)(
1219
1260
  "relative w-full border-2 border-border p-4",
1220
1261
  {
1221
1262
  variants: {
@@ -1279,11 +1320,11 @@ var AlertComponent = Object.assign(AlertRoot, {
1279
1320
  });
1280
1321
 
1281
1322
  // components/ui/IconButton.tsx
1282
- var import_class_variance_authority8 = require("class-variance-authority");
1323
+ var import_class_variance_authority9 = require("class-variance-authority");
1283
1324
  var import_react8 = __toESM(require("react"));
1284
1325
  var import_react_slot5 = require("@radix-ui/react-slot");
1285
1326
  var import_jsx_runtime20 = require("react/jsx-runtime");
1286
- var iconButtonVariants = (0, import_class_variance_authority8.cva)(
1327
+ var iconButtonVariants = (0, import_class_variance_authority9.cva)(
1287
1328
  "font-head transition-all outline-hidden cursor-pointer duration-200 inline-flex justify-center items-center disabled:opacity-60 disabled:cursor-not-allowed border-2 border-border",
1288
1329
  {
1289
1330
  variants: {
@@ -1336,9 +1377,9 @@ IconButton.displayName = "IconButton";
1336
1377
 
1337
1378
  // components/ui/Loader.tsx
1338
1379
  var React19 = __toESM(require("react"));
1339
- var import_class_variance_authority9 = require("class-variance-authority");
1380
+ var import_class_variance_authority10 = require("class-variance-authority");
1340
1381
  var import_jsx_runtime21 = require("react/jsx-runtime");
1341
- var loaderVariants = (0, import_class_variance_authority9.cva)("flex gap-1", {
1382
+ var loaderVariants = (0, import_class_variance_authority10.cva)("flex gap-1", {
1342
1383
  variants: {
1343
1384
  variant: {
1344
1385
  default: "[&>div]:bg-primary [&>div]:border-border",
@@ -1403,12 +1444,12 @@ Loader.displayName = "Loader";
1403
1444
  var React20 = __toESM(require("react"));
1404
1445
  var ReactDialog = __toESM(require("@radix-ui/react-dialog"));
1405
1446
  var import_react_visually_hidden = require("@radix-ui/react-visually-hidden");
1406
- var import_class_variance_authority10 = require("class-variance-authority");
1447
+ var import_class_variance_authority11 = require("class-variance-authority");
1407
1448
  var import_lucide_react4 = require("lucide-react");
1408
1449
  var import_jsx_runtime22 = require("react/jsx-runtime");
1409
1450
  var Dialog = ReactDialog.Root;
1410
1451
  var DialogTrigger = ReactDialog.Trigger;
1411
- var overlayVariants = (0, import_class_variance_authority10.cva)(
1452
+ var overlayVariants = (0, import_class_variance_authority11.cva)(
1412
1453
  "fixed inset-0 z-50 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=closed]:animate-out data-[state=closed]:fade-out-0",
1413
1454
  {
1414
1455
  variants: {
@@ -1435,7 +1476,7 @@ var DialogOverlay = React20.forwardRef(
1435
1476
  }
1436
1477
  );
1437
1478
  DialogOverlay.displayName = "Dialog.Overlay";
1438
- var dialogContentVariants = (0, import_class_variance_authority10.cva)(
1479
+ var dialogContentVariants = (0, import_class_variance_authority11.cva)(
1439
1480
  "fixed left-[50%] top-[50%] z-50 grid w-full translate-x-[-50%] translate-y-[-50%] border-2 border-border bg-background shadow-lg duration-200 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
1440
1481
  {
1441
1482
  variants: {
@@ -1533,9 +1574,9 @@ var DialogComponent = Object.assign(Dialog, {
1533
1574
 
1534
1575
  // components/ui/Divider.tsx
1535
1576
  var React21 = __toESM(require("react"));
1536
- var import_class_variance_authority11 = require("class-variance-authority");
1577
+ var import_class_variance_authority12 = require("class-variance-authority");
1537
1578
  var import_jsx_runtime23 = require("react/jsx-runtime");
1538
- var dividerVariants = (0, import_class_variance_authority11.cva)("border-border", {
1579
+ var dividerVariants = (0, import_class_variance_authority12.cva)("border-border", {
1539
1580
  variants: {
1540
1581
  orientation: {
1541
1582
  horizontal: "w-full border-t-2",
@@ -1579,9 +1620,9 @@ Divider.displayName = "Divider";
1579
1620
 
1580
1621
  // components/ui/Stack.tsx
1581
1622
  var React22 = __toESM(require("react"));
1582
- var import_class_variance_authority12 = require("class-variance-authority");
1623
+ var import_class_variance_authority13 = require("class-variance-authority");
1583
1624
  var import_jsx_runtime24 = require("react/jsx-runtime");
1584
- var stackVariants = (0, import_class_variance_authority12.cva)("flex", {
1625
+ var stackVariants = (0, import_class_variance_authority13.cva)("flex", {
1585
1626
  variants: {
1586
1627
  direction: {
1587
1628
  vertical: "flex-col",
@@ -1651,9 +1692,9 @@ Stack.displayName = "Stack";
1651
1692
 
1652
1693
  // components/ui/Flex.tsx
1653
1694
  var React23 = __toESM(require("react"));
1654
- var import_class_variance_authority13 = require("class-variance-authority");
1695
+ var import_class_variance_authority14 = require("class-variance-authority");
1655
1696
  var import_jsx_runtime25 = require("react/jsx-runtime");
1656
- var flexVariants = (0, import_class_variance_authority13.cva)("flex", {
1697
+ var flexVariants = (0, import_class_variance_authority14.cva)("flex", {
1657
1698
  variants: {
1658
1699
  direction: {
1659
1700
  row: "flex-row",
@@ -1735,9 +1776,9 @@ Flex.displayName = "Flex";
1735
1776
 
1736
1777
  // components/ui/Grid.tsx
1737
1778
  var React24 = __toESM(require("react"));
1738
- var import_class_variance_authority14 = require("class-variance-authority");
1779
+ var import_class_variance_authority15 = require("class-variance-authority");
1739
1780
  var import_jsx_runtime26 = require("react/jsx-runtime");
1740
- var gridVariants = (0, import_class_variance_authority14.cva)("grid", {
1781
+ var gridVariants = (0, import_class_variance_authority15.cva)("grid", {
1741
1782
  variants: {
1742
1783
  columns: {
1743
1784
  1: "grid-cols-1",
@@ -1828,9 +1869,9 @@ Grid.displayName = "Grid";
1828
1869
 
1829
1870
  // components/ui/Container.tsx
1830
1871
  var React25 = __toESM(require("react"));
1831
- var import_class_variance_authority15 = require("class-variance-authority");
1872
+ var import_class_variance_authority16 = require("class-variance-authority");
1832
1873
  var import_jsx_runtime27 = require("react/jsx-runtime");
1833
- var containerVariants = (0, import_class_variance_authority15.cva)("mx-auto px-4 sm:px-6 lg:px-8", {
1874
+ var containerVariants = (0, import_class_variance_authority16.cva)("mx-auto px-4 sm:px-6 lg:px-8", {
1834
1875
  variants: {
1835
1876
  size: {
1836
1877
  sm: "max-w-2xl",
@@ -2889,7 +2930,7 @@ var MenubarComponent = Object.assign(MenubarRoot, {
2889
2930
  // components/ui/NavigationMenu.tsx
2890
2931
  var React38 = __toESM(require("react"));
2891
2932
  var NavigationMenuPrimitive = __toESM(require("@radix-ui/react-navigation-menu"));
2892
- var import_class_variance_authority16 = require("class-variance-authority");
2933
+ var import_class_variance_authority17 = require("class-variance-authority");
2893
2934
  var import_lucide_react9 = require("lucide-react");
2894
2935
  var import_jsx_runtime40 = require("react/jsx-runtime");
2895
2936
  var NavigationMenuRoot = React38.forwardRef((_a, ref) => {
@@ -2937,7 +2978,7 @@ var NavigationMenuItem = React38.forwardRef((_a, ref) => {
2937
2978
  );
2938
2979
  });
2939
2980
  NavigationMenuItem.displayName = "NavigationMenu.Item";
2940
- var navigationMenuTriggerStyle = (0, import_class_variance_authority16.cva)(
2981
+ var navigationMenuTriggerStyle = (0, import_class_variance_authority17.cva)(
2941
2982
  "group inline-flex h-10 w-max items-center justify-center bg-background text-foreground px-4 py-2 text-sm font-head transition-colors hover:bg-muted focus:outline-none disabled:pointer-events-none disabled:opacity-50"
2942
2983
  );
2943
2984
  var NavigationMenuTrigger = React38.forwardRef((_a, ref) => {
@@ -3356,30 +3397,58 @@ var React40 = __toESM(require("react"));
3356
3397
  // components/ThemeProvider.tsx
3357
3398
  var import_react9 = require("react");
3358
3399
  var import_jsx_runtime43 = require("react/jsx-runtime");
3400
+ var VALID_THEMES = ["light", "dark", "system"];
3401
+ var COLOR_THEMES = ["blue", "plum", "plum-trio"];
3359
3402
  var ThemeContext = (0, import_react9.createContext)(void 0);
3360
3403
  var STORAGE_KEY = "substrateui-theme";
3404
+ var COLOR_STORAGE_KEY = "substrateui-color-theme";
3361
3405
  function getSystemTheme() {
3362
3406
  if (typeof window === "undefined") return "light";
3363
3407
  return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
3364
3408
  }
3409
+ function readStoredTheme(key, fallback) {
3410
+ if (typeof window === "undefined") return fallback;
3411
+ const stored = localStorage.getItem(key);
3412
+ return VALID_THEMES.includes(stored) ? stored : fallback;
3413
+ }
3414
+ function readStoredColorTheme(key, fallback) {
3415
+ if (typeof window === "undefined") return fallback;
3416
+ const stored = localStorage.getItem(key);
3417
+ return COLOR_THEMES.includes(stored != null ? stored : "") ? stored : fallback;
3418
+ }
3365
3419
  function applyClass(resolved) {
3366
3420
  document.documentElement.classList.remove("light", "dark");
3367
3421
  document.documentElement.classList.add(resolved);
3368
3422
  }
3423
+ function applyColorTheme(colorTheme) {
3424
+ for (const t of COLOR_THEMES) {
3425
+ document.documentElement.classList.remove(`theme-${t}`);
3426
+ }
3427
+ if (colorTheme !== "blue") {
3428
+ document.documentElement.classList.add(`theme-${colorTheme}`);
3429
+ }
3430
+ }
3369
3431
  function ThemeProvider({
3370
3432
  children,
3371
3433
  defaultTheme = "system",
3372
- storageKey = STORAGE_KEY
3434
+ defaultColorTheme = "blue",
3435
+ storageKey = STORAGE_KEY,
3436
+ colorStorageKey = COLOR_STORAGE_KEY
3373
3437
  }) {
3374
- const [theme, setThemeState] = (0, import_react9.useState)(() => {
3375
- if (typeof window === "undefined") return defaultTheme;
3376
- return localStorage.getItem(storageKey) || defaultTheme;
3377
- });
3438
+ const [theme, setThemeState] = (0, import_react9.useState)(
3439
+ () => readStoredTheme(storageKey, defaultTheme)
3440
+ );
3441
+ const [colorTheme, setColorThemeState] = (0, import_react9.useState)(
3442
+ () => readStoredColorTheme(colorStorageKey, defaultColorTheme)
3443
+ );
3378
3444
  const [systemTheme, setSystemTheme] = (0, import_react9.useState)(getSystemTheme);
3379
3445
  const resolvedTheme = theme === "system" ? systemTheme : theme;
3380
3446
  (0, import_react9.useEffect)(() => {
3381
3447
  applyClass(resolvedTheme);
3382
3448
  }, [resolvedTheme]);
3449
+ (0, import_react9.useEffect)(() => {
3450
+ applyColorTheme(colorTheme);
3451
+ }, [colorTheme]);
3383
3452
  (0, import_react9.useEffect)(() => {
3384
3453
  const mq = window.matchMedia("(prefers-color-scheme: dark)");
3385
3454
  const handler = (e) => {
@@ -3388,6 +3457,23 @@ function ThemeProvider({
3388
3457
  mq.addEventListener("change", handler);
3389
3458
  return () => mq.removeEventListener("change", handler);
3390
3459
  }, []);
3460
+ (0, import_react9.useEffect)(() => {
3461
+ const handler = (e) => {
3462
+ var _a;
3463
+ if (e.key === storageKey) {
3464
+ setThemeState(
3465
+ VALID_THEMES.includes(e.newValue) ? e.newValue : defaultTheme
3466
+ );
3467
+ }
3468
+ if (e.key === colorStorageKey) {
3469
+ setColorThemeState(
3470
+ COLOR_THEMES.includes((_a = e.newValue) != null ? _a : "") ? e.newValue : defaultColorTheme
3471
+ );
3472
+ }
3473
+ };
3474
+ window.addEventListener("storage", handler);
3475
+ return () => window.removeEventListener("storage", handler);
3476
+ }, [storageKey, colorStorageKey, defaultTheme, defaultColorTheme]);
3391
3477
  const setTheme = (0, import_react9.useCallback)(
3392
3478
  (newTheme) => {
3393
3479
  localStorage.setItem(storageKey, newTheme);
@@ -3395,9 +3481,16 @@ function ThemeProvider({
3395
3481
  },
3396
3482
  [storageKey]
3397
3483
  );
3484
+ const setColorTheme = (0, import_react9.useCallback)(
3485
+ (newColorTheme) => {
3486
+ localStorage.setItem(colorStorageKey, newColorTheme);
3487
+ setColorThemeState(newColorTheme);
3488
+ },
3489
+ [colorStorageKey]
3490
+ );
3398
3491
  const value = (0, import_react9.useMemo)(
3399
- () => ({ theme, resolvedTheme, setTheme }),
3400
- [theme, resolvedTheme, setTheme]
3492
+ () => ({ theme, resolvedTheme, setTheme, colorTheme, setColorTheme, colorThemes: COLOR_THEMES }),
3493
+ [theme, resolvedTheme, setTheme, colorTheme, setColorTheme]
3401
3494
  );
3402
3495
  return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(ThemeContext.Provider, { value, children });
3403
3496
  }
@@ -4206,7 +4299,7 @@ var Pagination = Object.assign(PaginationRoot, {
4206
4299
  // components/ui/Sheet.tsx
4207
4300
  var React49 = __toESM(require("react"));
4208
4301
  var SheetPrimitive = __toESM(require("@radix-ui/react-dialog"));
4209
- var import_class_variance_authority17 = require("class-variance-authority");
4302
+ var import_class_variance_authority18 = require("class-variance-authority");
4210
4303
  var import_lucide_react16 = require("lucide-react");
4211
4304
  var import_jsx_runtime53 = require("react/jsx-runtime");
4212
4305
  var Sheet = SheetPrimitive.Root;
@@ -4226,7 +4319,7 @@ var SheetOverlay = React49.forwardRef((_a, ref) => {
4226
4319
  );
4227
4320
  });
4228
4321
  SheetOverlay.displayName = "Sheet.Overlay";
4229
- var sheetContentVariants = (0, import_class_variance_authority17.cva)(
4322
+ var sheetContentVariants = (0, import_class_variance_authority18.cva)(
4230
4323
  "fixed z-50 flex flex-col gap-4 border-2 border-border bg-background transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
4231
4324
  {
4232
4325
  variants: {
@@ -4934,7 +5027,7 @@ var DataTableComponent = Object.assign(DataTableRoot, {
4934
5027
  // components/ui/Sidebar.tsx
4935
5028
  var React55 = __toESM(require("react"));
4936
5029
  var import_react_slot8 = require("@radix-ui/react-slot");
4937
- var import_class_variance_authority18 = require("class-variance-authority");
5030
+ var import_class_variance_authority19 = require("class-variance-authority");
4938
5031
  var import_lucide_react20 = require("lucide-react");
4939
5032
 
4940
5033
  // hooks/use-mobile.ts
@@ -5348,7 +5441,7 @@ var SidebarMenuItem = React55.forwardRef((_a, ref) => {
5348
5441
  );
5349
5442
  });
5350
5443
  SidebarMenuItem.displayName = "Sidebar.MenuItem";
5351
- var sidebarMenuButtonVariants = (0, import_class_variance_authority18.cva)(
5444
+ var sidebarMenuButtonVariants = (0, import_class_variance_authority19.cva)(
5352
5445
  "peer/menu-button flex w-full items-center gap-2 overflow-hidden outline-2 outline-transparent p-2 text-left text-sm ring-ring transition-[width,height,padding] hover:bg-primary hover:text-primary-foreground hover:outline-border focus-visible:outline-border focus-visible:text-primary-foreground focus-visible:bg-primary disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
5353
5446
  {
5354
5447
  variants: {
@@ -5909,6 +6002,83 @@ function ThemeToggle(_a) {
5909
6002
  );
5910
6003
  }
5911
6004
 
6005
+ // components/ColorThemeToggle.tsx
6006
+ var import_react15 = require("react");
6007
+ var import_jsx_runtime65 = require("react/jsx-runtime");
6008
+ var subscribe2 = () => () => {
6009
+ };
6010
+ var getSnapshot2 = () => true;
6011
+ var getServerSnapshot2 = () => false;
6012
+ var COLOR_SWATCHES = {
6013
+ blue: "#5294FF",
6014
+ plum: "#B254CF",
6015
+ "plum-trio": "#B254CF"
6016
+ };
6017
+ var COLOR_LABELS = {
6018
+ blue: "Blue",
6019
+ plum: "Plum",
6020
+ "plum-trio": "Plum Trio"
6021
+ };
6022
+ function ColorThemeToggle(_a) {
6023
+ var _b = _a, {
6024
+ variant = "ghost",
6025
+ size = "md",
6026
+ className
6027
+ } = _b, props = __objRest(_b, [
6028
+ "variant",
6029
+ "size",
6030
+ "className"
6031
+ ]);
6032
+ const { colorTheme, setColorTheme, colorThemes } = useTheme();
6033
+ const mounted = (0, import_react15.useSyncExternalStore)(subscribe2, getSnapshot2, getServerSnapshot2);
6034
+ return /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(DropdownMenuComponent, { children: [
6035
+ /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(DropdownMenuComponent.Trigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
6036
+ IconButton,
6037
+ __spreadProps(__spreadValues({
6038
+ variant,
6039
+ size,
6040
+ className,
6041
+ "aria-label": mounted ? `Color theme: ${colorTheme}` : "Color theme"
6042
+ }, props), {
6043
+ children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
6044
+ "span",
6045
+ {
6046
+ className: "block w-4 h-4 border-2 border-border",
6047
+ style: {
6048
+ backgroundColor: mounted ? COLOR_SWATCHES[colorTheme] : void 0,
6049
+ borderRadius: "var(--radius, 0)"
6050
+ }
6051
+ }
6052
+ )
6053
+ })
6054
+ ) }),
6055
+ /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(DropdownMenuComponent.Content, { align: "end", children: [
6056
+ /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(DropdownMenuComponent.Label, { children: "Color Theme" }),
6057
+ /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(DropdownMenuComponent.Separator, {}),
6058
+ /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
6059
+ DropdownMenuComponent.RadioGroup,
6060
+ {
6061
+ value: colorTheme,
6062
+ onValueChange: (v) => setColorTheme(v),
6063
+ children: colorThemes.map((theme) => /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(DropdownMenuComponent.RadioItem, { value: theme, children: [
6064
+ /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
6065
+ "span",
6066
+ {
6067
+ className: "inline-block w-3 h-3 border border-border mr-1",
6068
+ style: {
6069
+ backgroundColor: COLOR_SWATCHES[theme],
6070
+ borderRadius: "var(--radius, 0)"
6071
+ }
6072
+ }
6073
+ ),
6074
+ COLOR_LABELS[theme]
6075
+ ] }, theme))
6076
+ }
6077
+ )
6078
+ ] })
6079
+ ] });
6080
+ }
6081
+
5912
6082
  // lib/create-theme.ts
5913
6083
  function createTheme(name, config) {
5914
6084
  const declarations = [];
@@ -5949,7 +6119,7 @@ ${declarations.join("\n")}
5949
6119
  }
5950
6120
 
5951
6121
  // components/landing/Hero.tsx
5952
- var import_jsx_runtime65 = require("react/jsx-runtime");
6122
+ var import_jsx_runtime66 = require("react/jsx-runtime");
5953
6123
  function Hero({
5954
6124
  badge,
5955
6125
  title,
@@ -5959,14 +6129,14 @@ function Hero({
5959
6129
  className,
5960
6130
  align = "center"
5961
6131
  }) {
5962
- return /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
6132
+ return /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
5963
6133
  "section",
5964
6134
  {
5965
6135
  className: cn(
5966
6136
  "w-full border-b-2 bg-background",
5967
6137
  className
5968
6138
  ),
5969
- children: /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(
6139
+ children: /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(
5970
6140
  "div",
5971
6141
  {
5972
6142
  className: cn(
@@ -5975,10 +6145,10 @@ function Hero({
5975
6145
  align === "left" && "items-start text-left"
5976
6146
  ),
5977
6147
  children: [
5978
- badge && /* @__PURE__ */ (0, import_jsx_runtime65.jsx)("div", { children: badge }),
5979
- /* @__PURE__ */ (0, import_jsx_runtime65.jsx)("h1", { className: "font-head text-4xl sm:text-5xl lg:text-6xl max-w-4xl", children: title }),
5980
- subtitle && /* @__PURE__ */ (0, import_jsx_runtime65.jsx)("p", { className: "font-sans text-lg lg:text-xl text-muted-foreground max-w-2xl", children: subtitle }),
5981
- actions && /* @__PURE__ */ (0, import_jsx_runtime65.jsx)("div", { className: "flex flex-wrap gap-3 mt-2", children: actions }),
6148
+ badge && /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("div", { children: badge }),
6149
+ /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("h1", { className: "font-head text-4xl sm:text-5xl lg:text-6xl max-w-4xl", children: title }),
6150
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("p", { className: "font-sans text-lg lg:text-xl text-muted-foreground max-w-2xl", children: subtitle }),
6151
+ actions && /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("div", { className: "flex flex-wrap gap-3 mt-2", children: actions }),
5982
6152
  children
5983
6153
  ]
5984
6154
  }
@@ -5988,9 +6158,9 @@ function Hero({
5988
6158
  }
5989
6159
 
5990
6160
  // components/landing/Section.tsx
5991
- var import_class_variance_authority19 = require("class-variance-authority");
5992
- var import_jsx_runtime66 = require("react/jsx-runtime");
5993
- var sectionVariants = (0, import_class_variance_authority19.cva)("w-full py-16 lg:py-24 scroll-mt-[120px]", {
6161
+ var import_class_variance_authority20 = require("class-variance-authority");
6162
+ var import_jsx_runtime67 = require("react/jsx-runtime");
6163
+ var sectionVariants = (0, import_class_variance_authority20.cva)("w-full py-16 lg:py-24 scroll-mt-[120px]", {
5994
6164
  variants: {
5995
6165
  background: {
5996
6166
  default: "bg-background",
@@ -6019,13 +6189,13 @@ function Section(_a) {
6019
6189
  "background",
6020
6190
  "align"
6021
6191
  ]);
6022
- return /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
6192
+ return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
6023
6193
  "section",
6024
6194
  __spreadProps(__spreadValues({
6025
6195
  className: cn(sectionVariants({ background }), className)
6026
6196
  }, props), {
6027
- children: /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)("div", { className: "mx-auto max-w-6xl px-4", children: [
6028
- (title || subtitle) && /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(
6197
+ children: /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)("div", { className: "mx-auto max-w-6xl px-4", children: [
6198
+ (title || subtitle) && /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(
6029
6199
  "div",
6030
6200
  {
6031
6201
  className: cn(
@@ -6034,8 +6204,8 @@ function Section(_a) {
6034
6204
  align === "left" && "text-left"
6035
6205
  ),
6036
6206
  children: [
6037
- title && /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("h2", { className: "font-head text-3xl lg:text-4xl mb-3", children: title }),
6038
- subtitle && /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("p", { className: "font-sans text-lg text-muted-foreground max-w-2xl mx-auto", children: subtitle })
6207
+ title && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("h2", { className: "font-head text-3xl lg:text-4xl mb-3", children: title }),
6208
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("p", { className: "font-sans text-lg text-muted-foreground max-w-2xl mx-auto", children: subtitle })
6039
6209
  ]
6040
6210
  }
6041
6211
  ),
@@ -6046,7 +6216,7 @@ function Section(_a) {
6046
6216
  }
6047
6217
 
6048
6218
  // components/landing/Footer.tsx
6049
- var import_jsx_runtime67 = require("react/jsx-runtime");
6219
+ var import_jsx_runtime68 = require("react/jsx-runtime");
6050
6220
  function Footer({
6051
6221
  brand,
6052
6222
  tagline,
@@ -6054,15 +6224,15 @@ function Footer({
6054
6224
  bottom,
6055
6225
  className
6056
6226
  }) {
6057
- return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("footer", { className: cn("w-full border-t-2 bg-background", className), children: /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)("div", { className: "mx-auto max-w-6xl px-4 py-12 lg:py-16", children: [
6058
- /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)("div", { className: "grid gap-8 lg:grid-cols-[1.5fr_repeat(auto-fit,1fr)]", children: [
6059
- /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)("div", { className: "max-w-xs", children: [
6060
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("div", { className: "font-head text-2xl mb-2", children: brand }),
6061
- tagline && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("p", { className: "font-sans text-sm text-muted-foreground", children: tagline })
6227
+ return /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("footer", { className: cn("w-full border-t-2 bg-background", className), children: /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "mx-auto max-w-6xl px-4 py-12 lg:py-16", children: [
6228
+ /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "grid gap-8 lg:grid-cols-[1.5fr_repeat(auto-fit,1fr)]", children: [
6229
+ /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "max-w-xs", children: [
6230
+ /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "font-head text-2xl mb-2", children: brand }),
6231
+ tagline && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("p", { className: "font-sans text-sm text-muted-foreground", children: tagline })
6062
6232
  ] }),
6063
- groups.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("div", { className: "grid gap-8 sm:grid-cols-2 lg:grid-cols-3 col-span-full lg:col-span-1", children: groups.map((group) => /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)("div", { children: [
6064
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("h4", { className: "font-head text-sm uppercase mb-3", children: group.title }),
6065
- /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("ul", { className: "flex flex-col gap-2", children: group.links.map((link) => /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
6233
+ groups.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "grid gap-8 sm:grid-cols-2 lg:grid-cols-3 col-span-full lg:col-span-1", children: groups.map((group) => /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { children: [
6234
+ /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("h4", { className: "font-head text-sm uppercase mb-3", children: group.title }),
6235
+ /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("ul", { className: "flex flex-col gap-2", children: group.links.map((link) => /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
6066
6236
  "a",
6067
6237
  {
6068
6238
  href: link.href,
@@ -6072,21 +6242,21 @@ function Footer({
6072
6242
  ) }, link.label)) })
6073
6243
  ] }, group.title)) })
6074
6244
  ] }),
6075
- bottom && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("div", { className: "mt-12 pt-6 border-t-2 font-sans text-sm text-muted-foreground", children: bottom })
6245
+ bottom && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "mt-12 pt-6 border-t-2 font-sans text-sm text-muted-foreground", children: bottom })
6076
6246
  ] }) });
6077
6247
  }
6078
6248
 
6079
6249
  // components/landing/PricingTable.tsx
6080
- var import_jsx_runtime68 = require("react/jsx-runtime");
6250
+ var import_jsx_runtime69 = require("react/jsx-runtime");
6081
6251
  function PricingTable({ tiers, className }) {
6082
- return /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
6252
+ return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
6083
6253
  "div",
6084
6254
  {
6085
6255
  className: cn(
6086
6256
  "grid gap-6 sm:grid-cols-2 lg:grid-cols-3",
6087
6257
  className
6088
6258
  ),
6089
- children: tiers.map((tier) => /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
6259
+ children: tiers.map((tier) => /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
6090
6260
  "div",
6091
6261
  {
6092
6262
  className: cn(
@@ -6094,15 +6264,15 @@ function PricingTable({ tiers, className }) {
6094
6264
  tier.highlighted ? "shadow-lg border-primary ring-2 ring-primary scale-[1.02]" : "shadow-md"
6095
6265
  ),
6096
6266
  children: [
6097
- /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "p-6 border-b-2", children: [
6098
- /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex items-center justify-between mb-2", children: [
6099
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("h3", { className: "font-head text-xl", children: tier.name }),
6267
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "p-6 border-b-2", children: [
6268
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "flex items-center justify-between mb-2", children: [
6269
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("h3", { className: "font-head text-xl", children: tier.name }),
6100
6270
  tier.badge
6101
6271
  ] }),
6102
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "font-head text-4xl mb-1", children: tier.price }),
6103
- tier.description && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("p", { className: "font-sans text-sm text-muted-foreground", children: tier.description })
6272
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "font-head text-4xl mb-1", children: tier.price }),
6273
+ tier.description && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("p", { className: "font-sans text-sm text-muted-foreground", children: tier.description })
6104
6274
  ] }),
6105
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "p-6 flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("ul", { className: "flex flex-col gap-3", children: tier.features.map((feature) => /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
6275
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "p-6 flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("ul", { className: "flex flex-col gap-3", children: tier.features.map((feature) => /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
6106
6276
  "li",
6107
6277
  {
6108
6278
  className: cn(
@@ -6110,7 +6280,7 @@ function PricingTable({ tiers, className }) {
6110
6280
  !feature.included && "text-muted-foreground line-through"
6111
6281
  ),
6112
6282
  children: [
6113
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
6283
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
6114
6284
  "span",
6115
6285
  {
6116
6286
  className: cn(
@@ -6125,7 +6295,7 @@ function PricingTable({ tiers, className }) {
6125
6295
  },
6126
6296
  feature.text
6127
6297
  )) }) }),
6128
- /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "p-6 border-t-2", children: tier.cta })
6298
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "p-6 border-t-2", children: tier.cta })
6129
6299
  ]
6130
6300
  },
6131
6301
  tier.name
@@ -6135,7 +6305,7 @@ function PricingTable({ tiers, className }) {
6135
6305
  }
6136
6306
 
6137
6307
  // components/landing/FeatureSection.tsx
6138
- var import_jsx_runtime69 = require("react/jsx-runtime");
6308
+ var import_jsx_runtime70 = require("react/jsx-runtime");
6139
6309
  var columnClasses2 = {
6140
6310
  2: "grid gap-6 sm:grid-cols-2",
6141
6311
  3: "grid gap-6 sm:grid-cols-2 lg:grid-cols-3",
@@ -6146,14 +6316,14 @@ function FeatureSection({
6146
6316
  columns = 3,
6147
6317
  className
6148
6318
  }) {
6149
- return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: cn(columnClasses2[columns], className), children: features.map((feature) => /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
6319
+ return /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("div", { className: cn(columnClasses2[columns], className), children: features.map((feature) => /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)(
6150
6320
  "div",
6151
6321
  {
6152
6322
  className: "border-2 p-6 bg-card shadow-md",
6153
6323
  children: [
6154
- feature.icon && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "mb-4 inline-flex items-center justify-center h-12 w-12 border-2 bg-primary text-primary-foreground shadow-sm", children: feature.icon }),
6155
- /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("h3", { className: "font-head text-lg mb-2", children: feature.title }),
6156
- /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("p", { className: "font-sans text-sm text-muted-foreground", children: feature.description })
6324
+ feature.icon && /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("div", { className: "mb-4 inline-flex items-center justify-center h-12 w-12 border-2 bg-primary text-primary-foreground shadow-sm", children: feature.icon }),
6325
+ /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("h3", { className: "font-head text-lg mb-2", children: feature.title }),
6326
+ /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("p", { className: "font-sans text-sm text-muted-foreground", children: feature.description })
6157
6327
  ]
6158
6328
  },
6159
6329
  feature.title
@@ -6161,7 +6331,7 @@ function FeatureSection({
6161
6331
  }
6162
6332
 
6163
6333
  // components/landing/Testimonial.tsx
6164
- var import_jsx_runtime70 = require("react/jsx-runtime");
6334
+ var import_jsx_runtime71 = require("react/jsx-runtime");
6165
6335
  var columnClasses3 = {
6166
6336
  1: "grid gap-6 max-w-2xl mx-auto",
6167
6337
  2: "grid gap-6 sm:grid-cols-2",
@@ -6172,21 +6342,21 @@ function Testimonial({
6172
6342
  columns = 3,
6173
6343
  className
6174
6344
  }) {
6175
- return /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("div", { className: cn(columnClasses3[columns], className), children: testimonials.map((t) => /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)(
6345
+ return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("div", { className: cn(columnClasses3[columns], className), children: testimonials.map((t) => /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(
6176
6346
  "div",
6177
6347
  {
6178
6348
  className: "border-2 p-6 bg-card shadow-md flex flex-col",
6179
6349
  children: [
6180
- /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)("blockquote", { className: "font-sans text-sm leading-relaxed flex-1 mb-6", children: [
6350
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("blockquote", { className: "font-sans text-sm leading-relaxed flex-1 mb-6", children: [
6181
6351
  "\u201C",
6182
6352
  t.quote,
6183
6353
  "\u201D"
6184
6354
  ] }),
6185
- /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)("div", { className: "flex items-center gap-3 border-t-2 pt-4", children: [
6186
- t.avatar && /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("div", { className: "h-10 w-10 shrink-0 border-2 overflow-hidden", children: t.avatar }),
6187
- /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)("div", { children: [
6188
- /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("p", { className: "font-head text-sm", children: t.name }),
6189
- (t.role || t.company) && /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("p", { className: "font-sans text-xs text-muted-foreground", children: [t.role, t.company].filter(Boolean).join(", ") })
6355
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("div", { className: "flex items-center gap-3 border-t-2 pt-4", children: [
6356
+ t.avatar && /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("div", { className: "h-10 w-10 shrink-0 border-2 overflow-hidden", children: t.avatar }),
6357
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("div", { children: [
6358
+ /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("p", { className: "font-head text-sm", children: t.name }),
6359
+ (t.role || t.company) && /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("p", { className: "font-sans text-xs text-muted-foreground", children: [t.role, t.company].filter(Boolean).join(", ") })
6190
6360
  ] })
6191
6361
  ] })
6192
6362
  ]
@@ -6196,9 +6366,9 @@ function Testimonial({
6196
6366
  }
6197
6367
 
6198
6368
  // components/landing/LogoCloud.tsx
6199
- var import_jsx_runtime71 = require("react/jsx-runtime");
6369
+ var import_jsx_runtime72 = require("react/jsx-runtime");
6200
6370
  function LogoCloud({ children, className }) {
6201
- return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
6371
+ return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
6202
6372
  "div",
6203
6373
  {
6204
6374
  className: cn(
@@ -6211,24 +6381,24 @@ function LogoCloud({ children, className }) {
6211
6381
  }
6212
6382
 
6213
6383
  // components/landing/CTABanner.tsx
6214
- var import_jsx_runtime72 = require("react/jsx-runtime");
6384
+ var import_jsx_runtime73 = require("react/jsx-runtime");
6215
6385
  function CTABanner({
6216
6386
  title,
6217
6387
  subtitle,
6218
6388
  actions,
6219
6389
  className
6220
6390
  }) {
6221
- return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
6391
+ return /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
6222
6392
  "section",
6223
6393
  {
6224
6394
  className: cn(
6225
6395
  "w-full border-y-2 bg-primary text-primary-foreground",
6226
6396
  className
6227
6397
  ),
6228
- children: /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)("div", { className: "mx-auto max-w-6xl px-4 py-16 lg:py-20 flex flex-col items-center text-center gap-4", children: [
6229
- /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("h2", { className: "font-head text-3xl lg:text-4xl", children: title }),
6230
- subtitle && /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("p", { className: "font-sans text-lg max-w-xl", children: subtitle }),
6231
- actions && /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("div", { className: "flex flex-wrap gap-3 mt-2", children: actions })
6398
+ children: /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("div", { className: "mx-auto max-w-6xl px-4 py-16 lg:py-20 flex flex-col items-center text-center gap-4", children: [
6399
+ /* @__PURE__ */ (0, import_jsx_runtime73.jsx)("h2", { className: "font-head text-3xl lg:text-4xl", children: title }),
6400
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime73.jsx)("p", { className: "font-sans text-lg max-w-xl", children: subtitle }),
6401
+ actions && /* @__PURE__ */ (0, import_jsx_runtime73.jsx)("div", { className: "flex flex-wrap gap-3 mt-2", children: actions })
6232
6402
  ] })
6233
6403
  }
6234
6404
  );
@@ -6237,20 +6407,20 @@ function CTABanner({
6237
6407
  // components/landing/FAQ.tsx
6238
6408
  var React60 = __toESM(require("react"));
6239
6409
  var import_lucide_react23 = require("lucide-react");
6240
- var import_jsx_runtime73 = require("react/jsx-runtime");
6410
+ var import_jsx_runtime74 = require("react/jsx-runtime");
6241
6411
  function FAQ({ items, className }) {
6242
6412
  const [openIndex, setOpenIndex] = React60.useState(null);
6243
- return /* @__PURE__ */ (0, import_jsx_runtime73.jsx)("div", { className: cn("w-full max-w-3xl mx-auto", className), children: items.map((item, i) => {
6413
+ return /* @__PURE__ */ (0, import_jsx_runtime74.jsx)("div", { className: cn("w-full max-w-3xl mx-auto", className), children: items.map((item, i) => {
6244
6414
  const isOpen = openIndex === i;
6245
- return /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("div", { className: "border-2 border-b-0 last:border-b-2", children: [
6246
- /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)(
6415
+ return /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)("div", { className: "border-2 border-b-0 last:border-b-2", children: [
6416
+ /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)(
6247
6417
  "button",
6248
6418
  {
6249
6419
  onClick: () => setOpenIndex(isOpen ? null : i),
6250
6420
  className: "w-full flex items-center justify-between p-4 text-left cursor-pointer hover:bg-accent/30 transition-colors",
6251
6421
  children: [
6252
- /* @__PURE__ */ (0, import_jsx_runtime73.jsx)("span", { className: "font-head text-sm pr-4", children: item.question }),
6253
- /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
6422
+ /* @__PURE__ */ (0, import_jsx_runtime74.jsx)("span", { className: "font-head text-sm pr-4", children: item.question }),
6423
+ /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(
6254
6424
  import_lucide_react23.ChevronDown,
6255
6425
  {
6256
6426
  className: cn(
@@ -6262,24 +6432,24 @@ function FAQ({ items, className }) {
6262
6432
  ]
6263
6433
  }
6264
6434
  ),
6265
- isOpen && /* @__PURE__ */ (0, import_jsx_runtime73.jsx)("div", { className: "px-4 pb-4 font-sans text-sm text-muted-foreground", children: item.answer })
6435
+ isOpen && /* @__PURE__ */ (0, import_jsx_runtime74.jsx)("div", { className: "px-4 pb-4 font-sans text-sm text-muted-foreground", children: item.answer })
6266
6436
  ] }, i);
6267
6437
  }) });
6268
6438
  }
6269
6439
 
6270
6440
  // components/landing/StatsBar.tsx
6271
- var import_jsx_runtime74 = require("react/jsx-runtime");
6441
+ var import_jsx_runtime75 = require("react/jsx-runtime");
6272
6442
  function StatsBar({ stats, className }) {
6273
- return /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(
6443
+ return /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(
6274
6444
  "div",
6275
6445
  {
6276
6446
  className: cn(
6277
6447
  "w-full border-y-2 bg-card",
6278
6448
  className
6279
6449
  ),
6280
- children: /* @__PURE__ */ (0, import_jsx_runtime74.jsx)("div", { className: "mx-auto max-w-6xl px-4 py-10 grid grid-cols-2 lg:grid-cols-4 gap-8", children: stats.map((stat) => /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)("div", { className: "text-center", children: [
6281
- /* @__PURE__ */ (0, import_jsx_runtime74.jsx)("div", { className: "font-head text-3xl lg:text-4xl mb-1", children: stat.value }),
6282
- /* @__PURE__ */ (0, import_jsx_runtime74.jsx)("div", { className: "font-sans text-sm text-muted-foreground uppercase", children: stat.label })
6450
+ children: /* @__PURE__ */ (0, import_jsx_runtime75.jsx)("div", { className: "mx-auto max-w-6xl px-4 py-10 grid grid-cols-2 lg:grid-cols-4 gap-8", children: stats.map((stat) => /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)("div", { className: "text-center", children: [
6451
+ /* @__PURE__ */ (0, import_jsx_runtime75.jsx)("div", { className: "font-head text-3xl lg:text-4xl mb-1", children: stat.value }),
6452
+ /* @__PURE__ */ (0, import_jsx_runtime75.jsx)("div", { className: "font-sans text-sm text-muted-foreground uppercase", children: stat.label })
6283
6453
  ] }, stat.label)) })
6284
6454
  }
6285
6455
  );
@@ -6288,37 +6458,39 @@ function StatsBar({ stats, className }) {
6288
6458
  // components/landing/AnnouncementBanner.tsx
6289
6459
  var React61 = __toESM(require("react"));
6290
6460
  var import_lucide_react24 = require("lucide-react");
6291
- var import_jsx_runtime75 = require("react/jsx-runtime");
6461
+ var import_jsx_runtime76 = require("react/jsx-runtime");
6292
6462
  function AnnouncementBanner({
6293
6463
  children,
6294
6464
  dismissible = true,
6295
6465
  className
6296
6466
  }) {
6297
- const [visible, setVisible] = React61.useState(() => {
6298
- if (typeof window === "undefined") return true;
6299
- return sessionStorage.getItem("announcement-dismissed") !== "true";
6300
- });
6467
+ const [visible, setVisible] = React61.useState(true);
6468
+ React61.useEffect(() => {
6469
+ if (sessionStorage.getItem("announcement-dismissed") === "true") {
6470
+ setVisible(false);
6471
+ }
6472
+ }, []);
6301
6473
  const handleDismiss = () => {
6302
6474
  setVisible(false);
6303
6475
  sessionStorage.setItem("announcement-dismissed", "true");
6304
6476
  };
6305
6477
  if (!visible) return null;
6306
- return /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(
6478
+ return /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(
6307
6479
  "div",
6308
6480
  {
6309
6481
  className: cn(
6310
6482
  "w-full bg-primary text-primary-foreground border-b-2",
6311
6483
  className
6312
6484
  ),
6313
- children: /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)("div", { className: "mx-auto max-w-6xl px-4 py-2 flex items-center justify-center gap-3", children: [
6314
- /* @__PURE__ */ (0, import_jsx_runtime75.jsx)("p", { className: "font-sans text-sm text-center flex-1", children }),
6315
- dismissible && /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(
6485
+ children: /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("div", { className: "mx-auto max-w-6xl px-4 py-2 flex items-center justify-center gap-3", children: [
6486
+ /* @__PURE__ */ (0, import_jsx_runtime76.jsx)("p", { className: "font-sans text-sm text-center flex-1", children }),
6487
+ dismissible && /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(
6316
6488
  "button",
6317
6489
  {
6318
6490
  onClick: handleDismiss,
6319
6491
  className: "shrink-0 p-2 min-w-[44px] min-h-[44px] inline-flex items-center justify-center hover:bg-foreground/10 transition-colors cursor-pointer",
6320
6492
  "aria-label": "Dismiss",
6321
- children: /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(import_lucide_react24.X, { className: "h-4 w-4" })
6493
+ children: /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(import_lucide_react24.X, { className: "h-4 w-4" })
6322
6494
  }
6323
6495
  )
6324
6496
  ] })
@@ -6327,7 +6499,7 @@ function AnnouncementBanner({
6327
6499
  }
6328
6500
 
6329
6501
  // components/landing/NewsletterSignup.tsx
6330
- var import_jsx_runtime76 = require("react/jsx-runtime");
6502
+ var import_jsx_runtime77 = require("react/jsx-runtime");
6331
6503
  function NewsletterSignup({
6332
6504
  title = "Stay in the loop",
6333
6505
  subtitle,
@@ -6335,16 +6507,16 @@ function NewsletterSignup({
6335
6507
  buttonLabel = "Subscribe",
6336
6508
  className
6337
6509
  }) {
6338
- return /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("div", { className: cn("w-full max-w-md mx-auto", className), children: [
6339
- title && /* @__PURE__ */ (0, import_jsx_runtime76.jsx)("h3", { className: "font-head text-xl mb-2 text-center", children: title }),
6340
- subtitle && /* @__PURE__ */ (0, import_jsx_runtime76.jsx)("p", { className: "font-sans text-sm text-muted-foreground text-center mb-4", children: subtitle }),
6341
- /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)(
6510
+ return /* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("div", { className: cn("w-full max-w-md mx-auto", className), children: [
6511
+ title && /* @__PURE__ */ (0, import_jsx_runtime77.jsx)("h3", { className: "font-head text-xl mb-2 text-center", children: title }),
6512
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime77.jsx)("p", { className: "font-sans text-sm text-muted-foreground text-center mb-4", children: subtitle }),
6513
+ /* @__PURE__ */ (0, import_jsx_runtime77.jsxs)(
6342
6514
  "form",
6343
6515
  {
6344
6516
  onSubmit: (e) => e.preventDefault(),
6345
6517
  className: "flex gap-2",
6346
6518
  children: [
6347
- /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(
6519
+ /* @__PURE__ */ (0, import_jsx_runtime77.jsx)(
6348
6520
  "input",
6349
6521
  {
6350
6522
  type: "email",
@@ -6353,7 +6525,7 @@ function NewsletterSignup({
6353
6525
  required: true
6354
6526
  }
6355
6527
  ),
6356
- /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(
6528
+ /* @__PURE__ */ (0, import_jsx_runtime77.jsx)(
6357
6529
  "button",
6358
6530
  {
6359
6531
  type: "submit",
@@ -6384,6 +6556,7 @@ function NewsletterSignup({
6384
6556
  Chart,
6385
6557
  Checkbox,
6386
6558
  Collapsible,
6559
+ ColorThemeToggle,
6387
6560
  Combobox,
6388
6561
  Command,
6389
6562
  Container,
@@ -6445,6 +6618,7 @@ function NewsletterSignup({
6445
6618
  Tooltip,
6446
6619
  TwoColumnLayout,
6447
6620
  alertVariants,
6621
+ avatarVariants,
6448
6622
  badgeVariants,
6449
6623
  buttonVariants,
6450
6624
  cardVariants,