@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/README.md +5 -5
- package/base/substrate.css +164 -1
- package/dist/index.d.mts +20 -3
- package/dist/index.d.ts +20 -3
- package/dist/index.js +318 -144
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +436 -264
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
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.
|
|
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
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
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(
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
853
|
+
var import_class_variance_authority6 = require("class-variance-authority");
|
|
823
854
|
var import_jsx_runtime12 = require("react/jsx-runtime");
|
|
824
|
-
var radioVariants = (0,
|
|
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,
|
|
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-
|
|
852
|
-
lg: "h-
|
|
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
|
|
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,
|
|
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
|
|
1257
|
+
var import_class_variance_authority8 = require("class-variance-authority");
|
|
1217
1258
|
var import_jsx_runtime19 = require("react/jsx-runtime");
|
|
1218
|
-
var alertVariants = (0,
|
|
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
|
|
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,
|
|
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
|
|
1380
|
+
var import_class_variance_authority10 = require("class-variance-authority");
|
|
1340
1381
|
var import_jsx_runtime21 = require("react/jsx-runtime");
|
|
1341
|
-
var loaderVariants = (0,
|
|
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
|
|
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,
|
|
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,
|
|
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
|
|
1577
|
+
var import_class_variance_authority12 = require("class-variance-authority");
|
|
1537
1578
|
var import_jsx_runtime23 = require("react/jsx-runtime");
|
|
1538
|
-
var dividerVariants = (0,
|
|
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
|
|
1623
|
+
var import_class_variance_authority13 = require("class-variance-authority");
|
|
1583
1624
|
var import_jsx_runtime24 = require("react/jsx-runtime");
|
|
1584
|
-
var stackVariants = (0,
|
|
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
|
|
1695
|
+
var import_class_variance_authority14 = require("class-variance-authority");
|
|
1655
1696
|
var import_jsx_runtime25 = require("react/jsx-runtime");
|
|
1656
|
-
var flexVariants = (0,
|
|
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
|
|
1779
|
+
var import_class_variance_authority15 = require("class-variance-authority");
|
|
1739
1780
|
var import_jsx_runtime26 = require("react/jsx-runtime");
|
|
1740
|
-
var gridVariants = (0,
|
|
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
|
|
1872
|
+
var import_class_variance_authority16 = require("class-variance-authority");
|
|
1832
1873
|
var import_jsx_runtime27 = require("react/jsx-runtime");
|
|
1833
|
-
var containerVariants = (0,
|
|
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
|
|
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,
|
|
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
|
-
|
|
3434
|
+
defaultColorTheme = "blue",
|
|
3435
|
+
storageKey = STORAGE_KEY,
|
|
3436
|
+
colorStorageKey = COLOR_STORAGE_KEY
|
|
3373
3437
|
}) {
|
|
3374
|
-
const [theme, setThemeState] = (0, import_react9.useState)(
|
|
3375
|
-
|
|
3376
|
-
|
|
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
|
|
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,
|
|
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
|
|
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,
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
5979
|
-
/* @__PURE__ */ (0,
|
|
5980
|
-
subtitle && /* @__PURE__ */ (0,
|
|
5981
|
-
actions && /* @__PURE__ */ (0,
|
|
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
|
|
5992
|
-
var
|
|
5993
|
-
var sectionVariants = (0,
|
|
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,
|
|
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,
|
|
6028
|
-
(title || subtitle) && /* @__PURE__ */ (0,
|
|
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,
|
|
6038
|
-
subtitle && /* @__PURE__ */ (0,
|
|
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
|
|
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,
|
|
6058
|
-
/* @__PURE__ */ (0,
|
|
6059
|
-
/* @__PURE__ */ (0,
|
|
6060
|
-
/* @__PURE__ */ (0,
|
|
6061
|
-
tagline && /* @__PURE__ */ (0,
|
|
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,
|
|
6064
|
-
/* @__PURE__ */ (0,
|
|
6065
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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
|
|
6250
|
+
var import_jsx_runtime69 = require("react/jsx-runtime");
|
|
6081
6251
|
function PricingTable({ tiers, className }) {
|
|
6082
|
-
return /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
6098
|
-
/* @__PURE__ */ (0,
|
|
6099
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
6103
|
-
tier.description && /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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,
|
|
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,
|
|
6155
|
-
/* @__PURE__ */ (0,
|
|
6156
|
-
/* @__PURE__ */ (0,
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
6186
|
-
t.avatar && /* @__PURE__ */ (0,
|
|
6187
|
-
/* @__PURE__ */ (0,
|
|
6188
|
-
/* @__PURE__ */ (0,
|
|
6189
|
-
(t.role || t.company) && /* @__PURE__ */ (0,
|
|
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
|
|
6369
|
+
var import_jsx_runtime72 = require("react/jsx-runtime");
|
|
6200
6370
|
function LogoCloud({ children, className }) {
|
|
6201
|
-
return /* @__PURE__ */ (0,
|
|
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
|
|
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,
|
|
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,
|
|
6229
|
-
/* @__PURE__ */ (0,
|
|
6230
|
-
subtitle && /* @__PURE__ */ (0,
|
|
6231
|
-
actions && /* @__PURE__ */ (0,
|
|
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
|
|
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,
|
|
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,
|
|
6246
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
6253
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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
|
|
6441
|
+
var import_jsx_runtime75 = require("react/jsx-runtime");
|
|
6272
6442
|
function StatsBar({ stats, className }) {
|
|
6273
|
-
return /* @__PURE__ */ (0,
|
|
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,
|
|
6281
|
-
/* @__PURE__ */ (0,
|
|
6282
|
-
/* @__PURE__ */ (0,
|
|
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
|
|
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
|
-
|
|
6299
|
-
|
|
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,
|
|
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,
|
|
6314
|
-
/* @__PURE__ */ (0,
|
|
6315
|
-
dismissible && /* @__PURE__ */ (0,
|
|
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,
|
|
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
|
|
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,
|
|
6339
|
-
title && /* @__PURE__ */ (0,
|
|
6340
|
-
subtitle && /* @__PURE__ */ (0,
|
|
6341
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|