@evinvest/uikit 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1173,168 +1173,6 @@ function Footer({
1173
1173
  );
1174
1174
  }
1175
1175
 
1176
- // src/components/header.tsx
1177
- import * as React23 from "react";
1178
- import { jsx as jsx14, jsxs as jsxs4 } from "react/jsx-runtime";
1179
- function Header({
1180
- nav,
1181
- cta,
1182
- mobileCta,
1183
- tagline = "Quy Nhon Fund",
1184
- homeHref = "/",
1185
- className,
1186
- linkComponent,
1187
- variant = "marketing",
1188
- hideNav = false
1189
- }) {
1190
- const L = linkComponent ?? "a";
1191
- const compact = variant === "compact";
1192
- const [hasScrolled, setHasScrolled] = React23.useState(false);
1193
- React23.useEffect(() => {
1194
- if (compact) return;
1195
- const handleScroll = () => setHasScrolled(window.scrollY > 50);
1196
- window.addEventListener("scroll", handleScroll);
1197
- return () => window.removeEventListener("scroll", handleScroll);
1198
- }, [compact]);
1199
- return /* @__PURE__ */ jsx14(
1200
- "header",
1201
- {
1202
- "data-slot": "header",
1203
- "data-variant": variant,
1204
- className: cn(
1205
- "fixed top-0 left-0 w-full z-[60] border-b",
1206
- compact ? (
1207
- // Fixed 4rem bar (py-3 + the 40px lockup): opaque by default so app
1208
- // content beneath it never bleeds through.
1209
- "h-16 bg-main-black/90 backdrop-blur-md border-main-mist/10"
1210
- ) : cn(
1211
- "transition-all duration-500",
1212
- hasScrolled ? "bg-main-black/90 backdrop-blur-md border-main-mist/10 py-4" : "bg-transparent border-transparent py-6"
1213
- ),
1214
- className
1215
- ),
1216
- children: /* @__PURE__ */ jsxs4(Container, { className: "flex h-full items-center justify-between gap-4", children: [
1217
- /* @__PURE__ */ jsxs4(
1218
- L,
1219
- {
1220
- href: homeHref,
1221
- className: "flex items-center gap-3",
1222
- "aria-label": "EV Investment \u2014 home",
1223
- children: [
1224
- /* @__PURE__ */ jsx14(Logo, { className: "w-10 h-10 text-white" }),
1225
- /* @__PURE__ */ jsxs4("div", { className: "flex flex-col", children: [
1226
- /* @__PURE__ */ jsx14("span", { className: "font-serif-display font-bold text-lg tracking-wider text-white", children: "EV INVESTMENT" }),
1227
- /* @__PURE__ */ jsx14("span", { className: "text-[9px] font-mono-tech tracking-[0.3em] text-main-accent-t1 uppercase", children: tagline })
1228
- ] })
1229
- ]
1230
- }
1231
- ),
1232
- !hideNav && /* @__PURE__ */ jsx14("nav", { className: "hidden lg:flex items-center gap-6 font-mono-tech text-xs tracking-widest uppercase", children: nav.map((item) => /* @__PURE__ */ jsx14(
1233
- L,
1234
- {
1235
- href: item.href,
1236
- className: "text-main-mist/80 hover:text-main-accent-t1 transition-colors",
1237
- children: item.label
1238
- },
1239
- item.href
1240
- )) }),
1241
- /* @__PURE__ */ jsxs4("div", { className: "flex items-center gap-3", children: [
1242
- cta,
1243
- !hideNav && /* @__PURE__ */ jsx14(MobileMenu, { nav, cta: mobileCta ?? cta, linkComponent: L })
1244
- ] })
1245
- ] })
1246
- }
1247
- );
1248
- }
1249
- function MobileMenu({
1250
- nav,
1251
- cta,
1252
- linkComponent: L
1253
- }) {
1254
- const [open, setOpen] = React23.useState(false);
1255
- React23.useEffect(() => {
1256
- if (!open) return;
1257
- document.body.style.overflow = "hidden";
1258
- const onKeyDown = (e) => {
1259
- if (e.key === "Escape") setOpen(false);
1260
- };
1261
- window.addEventListener("keydown", onKeyDown);
1262
- return () => {
1263
- document.body.style.overflow = "";
1264
- window.removeEventListener("keydown", onKeyDown);
1265
- };
1266
- }, [open]);
1267
- const closeOnNavigation = (e) => {
1268
- if (e.target.closest("a, button")) setOpen(false);
1269
- };
1270
- return /* @__PURE__ */ jsxs4("div", { className: "lg:hidden", children: [
1271
- /* @__PURE__ */ jsx14(
1272
- "button",
1273
- {
1274
- type: "button",
1275
- "aria-label": "Open menu",
1276
- "aria-expanded": open,
1277
- "aria-haspopup": "menu",
1278
- onClick: () => setOpen(true),
1279
- className: "flex size-10 items-center justify-center text-white",
1280
- children: /* @__PURE__ */ jsx14(
1281
- "svg",
1282
- {
1283
- className: "size-6",
1284
- viewBox: "0 0 24 24",
1285
- fill: "none",
1286
- stroke: "currentColor",
1287
- strokeWidth: 2,
1288
- strokeLinecap: "round",
1289
- strokeLinejoin: "round",
1290
- children: /* @__PURE__ */ jsx14("path", { d: "M4 6h16M4 12h16M4 18h16" })
1291
- }
1292
- )
1293
- }
1294
- ),
1295
- open && /* @__PURE__ */ jsx14(Portal, { children: /* @__PURE__ */ jsxs4(
1296
- "div",
1297
- {
1298
- onClick: closeOnNavigation,
1299
- className: "fixed inset-0 z-[70] flex flex-col bg-main-black px-6 pb-10 duration-200 animate-in fade-in lg:hidden",
1300
- children: [
1301
- /* @__PURE__ */ jsx14("div", { className: "flex h-20 shrink-0 items-center justify-end", children: /* @__PURE__ */ jsx14(
1302
- "button",
1303
- {
1304
- type: "button",
1305
- "aria-label": "Close menu",
1306
- className: "flex size-10 items-center justify-center text-white",
1307
- children: /* @__PURE__ */ jsx14(
1308
- "svg",
1309
- {
1310
- className: "size-6",
1311
- viewBox: "0 0 24 24",
1312
- fill: "none",
1313
- stroke: "currentColor",
1314
- strokeWidth: 2,
1315
- strokeLinecap: "round",
1316
- strokeLinejoin: "round",
1317
- children: /* @__PURE__ */ jsx14("path", { d: "M18 6 6 18M6 6l12 12" })
1318
- }
1319
- )
1320
- }
1321
- ) }),
1322
- /* @__PURE__ */ jsx14("nav", { className: "flex flex-col font-mono-tech text-sm uppercase tracking-widest duration-300 ease-out animate-in fade-in slide-in-from-top-4", children: nav.map((item) => /* @__PURE__ */ jsx14(
1323
- L,
1324
- {
1325
- href: item.href,
1326
- className: "border-b border-main-mist/10 py-4 text-main-mist/80 transition-colors hover:text-main-accent-t1",
1327
- children: item.label
1328
- },
1329
- item.href
1330
- )) }),
1331
- cta && /* @__PURE__ */ jsx14("div", { className: "mt-8 w-full block", children: cta })
1332
- ]
1333
- }
1334
- ) })
1335
- ] });
1336
- }
1337
-
1338
1176
  // src/components/input.tsx
1339
1177
  import "react";
1340
1178
 
@@ -1342,9 +1180,9 @@ import "react";
1342
1180
  var INPUT_BASE = "file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 aria-invalid:border-destructive";
1343
1181
 
1344
1182
  // src/components/input.tsx
1345
- import { jsx as jsx15 } from "react/jsx-runtime";
1183
+ import { jsx as jsx14 } from "react/jsx-runtime";
1346
1184
  function Input({ className, type, ...props }) {
1347
- return /* @__PURE__ */ jsx15(
1185
+ return /* @__PURE__ */ jsx14(
1348
1186
  "input",
1349
1187
  {
1350
1188
  type,
@@ -1362,9 +1200,9 @@ import "react";
1362
1200
  var TEXTAREA_BASE = "border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 aria-invalid:border-destructive flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm";
1363
1201
 
1364
1202
  // src/components/textarea.tsx
1365
- import { jsx as jsx16 } from "react/jsx-runtime";
1203
+ import { jsx as jsx15 } from "react/jsx-runtime";
1366
1204
  function Textarea({ className, ...props }) {
1367
- return /* @__PURE__ */ jsx16("textarea", { "data-slot": "textarea", className: cn(TEXTAREA_BASE, className), ...props });
1205
+ return /* @__PURE__ */ jsx15("textarea", { "data-slot": "textarea", className: cn(TEXTAREA_BASE, className), ...props });
1368
1206
  }
1369
1207
 
1370
1208
  // src/components/input-group.tsx
@@ -1391,12 +1229,12 @@ var INPUT_GROUP_INPUT_CONTROL = "flex-1 rounded-none border-0 bg-transparent sha
1391
1229
  var INPUT_GROUP_TEXTAREA_CONTROL = "flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:ring-0";
1392
1230
 
1393
1231
  // src/components/input-group.tsx
1394
- import { jsx as jsx17 } from "react/jsx-runtime";
1232
+ import { jsx as jsx16 } from "react/jsx-runtime";
1395
1233
  function InputGroup({
1396
1234
  className,
1397
1235
  ...props
1398
1236
  }) {
1399
- return /* @__PURE__ */ jsx17(
1237
+ return /* @__PURE__ */ jsx16(
1400
1238
  "div",
1401
1239
  {
1402
1240
  "data-slot": "input-group",
@@ -1411,7 +1249,7 @@ function InputGroupAddon({
1411
1249
  align = "inline-start",
1412
1250
  ...props
1413
1251
  }) {
1414
- return /* @__PURE__ */ jsx17(
1252
+ return /* @__PURE__ */ jsx16(
1415
1253
  "div",
1416
1254
  {
1417
1255
  role: "group",
@@ -1437,7 +1275,7 @@ function InputGroupButton({
1437
1275
  size = "xs",
1438
1276
  ...props
1439
1277
  }) {
1440
- return /* @__PURE__ */ jsx17(
1278
+ return /* @__PURE__ */ jsx16(
1441
1279
  Button,
1442
1280
  {
1443
1281
  type,
@@ -1456,7 +1294,7 @@ function InputGroupText({
1456
1294
  className,
1457
1295
  ...props
1458
1296
  }) {
1459
- return /* @__PURE__ */ jsx17(
1297
+ return /* @__PURE__ */ jsx16(
1460
1298
  "span",
1461
1299
  {
1462
1300
  className: cn(INPUT_GROUP_TEXT, className),
@@ -1468,7 +1306,7 @@ function InputGroupInput({
1468
1306
  className,
1469
1307
  ...props
1470
1308
  }) {
1471
- return /* @__PURE__ */ jsx17(
1309
+ return /* @__PURE__ */ jsx16(
1472
1310
  Input,
1473
1311
  {
1474
1312
  "data-slot": "input-group-control",
@@ -1481,7 +1319,7 @@ function InputGroupTextarea({
1481
1319
  className,
1482
1320
  ...props
1483
1321
  }) {
1484
- return /* @__PURE__ */ jsx17(
1322
+ return /* @__PURE__ */ jsx16(
1485
1323
  Textarea,
1486
1324
  {
1487
1325
  "data-slot": "input-group-control",
@@ -1505,13 +1343,13 @@ var separatorOrientations = {
1505
1343
  };
1506
1344
 
1507
1345
  // src/components/separator.tsx
1508
- import { jsx as jsx18 } from "react/jsx-runtime";
1346
+ import { jsx as jsx17 } from "react/jsx-runtime";
1509
1347
  function Separator({
1510
1348
  className,
1511
1349
  orientation = "horizontal",
1512
1350
  ...props
1513
1351
  }) {
1514
- return /* @__PURE__ */ jsx18(
1352
+ return /* @__PURE__ */ jsx17(
1515
1353
  "div",
1516
1354
  {
1517
1355
  role: "separator",
@@ -1554,9 +1392,9 @@ var ITEM_HEADER = "flex basis-full items-center justify-between gap-2";
1554
1392
  var ITEM_FOOTER = "flex basis-full items-center justify-between gap-2";
1555
1393
 
1556
1394
  // src/components/item.tsx
1557
- import { jsx as jsx19 } from "react/jsx-runtime";
1395
+ import { jsx as jsx18 } from "react/jsx-runtime";
1558
1396
  function ItemGroup({ className, ...props }) {
1559
- return /* @__PURE__ */ jsx19(
1397
+ return /* @__PURE__ */ jsx18(
1560
1398
  "div",
1561
1399
  {
1562
1400
  role: "list",
@@ -1570,7 +1408,7 @@ function ItemSeparator({
1570
1408
  className,
1571
1409
  ...props
1572
1410
  }) {
1573
- return /* @__PURE__ */ jsx19(
1411
+ return /* @__PURE__ */ jsx18(
1574
1412
  Separator,
1575
1413
  {
1576
1414
  "data-slot": "item-separator",
@@ -1588,7 +1426,7 @@ function Item({
1588
1426
  ...props
1589
1427
  }) {
1590
1428
  const Comp = asChild ? Slot : "div";
1591
- return /* @__PURE__ */ jsx19(
1429
+ return /* @__PURE__ */ jsx18(
1592
1430
  Comp,
1593
1431
  {
1594
1432
  "data-slot": "item",
@@ -1604,7 +1442,7 @@ function ItemMedia({
1604
1442
  variant = "default",
1605
1443
  ...props
1606
1444
  }) {
1607
- return /* @__PURE__ */ jsx19(
1445
+ return /* @__PURE__ */ jsx18(
1608
1446
  "div",
1609
1447
  {
1610
1448
  "data-slot": "item-media",
@@ -1618,7 +1456,7 @@ function ItemContent({
1618
1456
  className,
1619
1457
  ...props
1620
1458
  }) {
1621
- return /* @__PURE__ */ jsx19(
1459
+ return /* @__PURE__ */ jsx18(
1622
1460
  "div",
1623
1461
  {
1624
1462
  "data-slot": "item-content",
@@ -1628,7 +1466,7 @@ function ItemContent({
1628
1466
  );
1629
1467
  }
1630
1468
  function ItemTitle({ className, ...props }) {
1631
- return /* @__PURE__ */ jsx19(
1469
+ return /* @__PURE__ */ jsx18(
1632
1470
  "div",
1633
1471
  {
1634
1472
  "data-slot": "item-title",
@@ -1641,7 +1479,7 @@ function ItemDescription({
1641
1479
  className,
1642
1480
  ...props
1643
1481
  }) {
1644
- return /* @__PURE__ */ jsx19(
1482
+ return /* @__PURE__ */ jsx18(
1645
1483
  "p",
1646
1484
  {
1647
1485
  "data-slot": "item-description",
@@ -1654,7 +1492,7 @@ function ItemActions({
1654
1492
  className,
1655
1493
  ...props
1656
1494
  }) {
1657
- return /* @__PURE__ */ jsx19(
1495
+ return /* @__PURE__ */ jsx18(
1658
1496
  "div",
1659
1497
  {
1660
1498
  "data-slot": "item-actions",
@@ -1667,7 +1505,7 @@ function ItemHeader({
1667
1505
  className,
1668
1506
  ...props
1669
1507
  }) {
1670
- return /* @__PURE__ */ jsx19(
1508
+ return /* @__PURE__ */ jsx18(
1671
1509
  "div",
1672
1510
  {
1673
1511
  "data-slot": "item-header",
@@ -1680,7 +1518,7 @@ function ItemFooter({
1680
1518
  className,
1681
1519
  ...props
1682
1520
  }) {
1683
- return /* @__PURE__ */ jsx19(
1521
+ return /* @__PURE__ */ jsx18(
1684
1522
  "div",
1685
1523
  {
1686
1524
  "data-slot": "item-footer",
@@ -1698,9 +1536,9 @@ var KBD_BASE = "bg-muted text-muted-foreground pointer-events-none inline-flex h
1698
1536
  var KBD_GROUP_BASE = "inline-flex items-center gap-1";
1699
1537
 
1700
1538
  // src/components/kbd.tsx
1701
- import { jsx as jsx20 } from "react/jsx-runtime";
1539
+ import { jsx as jsx19 } from "react/jsx-runtime";
1702
1540
  function Kbd({ className, ...props }) {
1703
- return /* @__PURE__ */ jsx20(
1541
+ return /* @__PURE__ */ jsx19(
1704
1542
  "kbd",
1705
1543
  {
1706
1544
  "data-slot": "kbd",
@@ -1710,7 +1548,7 @@ function Kbd({ className, ...props }) {
1710
1548
  );
1711
1549
  }
1712
1550
  function KbdGroup({ className, ...props }) {
1713
- return /* @__PURE__ */ jsx20(
1551
+ return /* @__PURE__ */ jsx19(
1714
1552
  "kbd",
1715
1553
  {
1716
1554
  "data-slot": "kbd-group",
@@ -1722,9 +1560,9 @@ function KbdGroup({ className, ...props }) {
1722
1560
 
1723
1561
  // src/components/pagination.tsx
1724
1562
  import "react";
1725
- import { jsx as jsx21, jsxs as jsxs5 } from "react/jsx-runtime";
1563
+ import { jsx as jsx20, jsxs as jsxs4 } from "react/jsx-runtime";
1726
1564
  function Pagination({ className, ...props }) {
1727
- return /* @__PURE__ */ jsx21(
1565
+ return /* @__PURE__ */ jsx20(
1728
1566
  "nav",
1729
1567
  {
1730
1568
  role: "navigation",
@@ -1739,7 +1577,7 @@ function PaginationContent({
1739
1577
  className,
1740
1578
  ...props
1741
1579
  }) {
1742
- return /* @__PURE__ */ jsx21(
1580
+ return /* @__PURE__ */ jsx20(
1743
1581
  "ul",
1744
1582
  {
1745
1583
  "data-slot": "pagination-content",
@@ -1749,7 +1587,7 @@ function PaginationContent({
1749
1587
  );
1750
1588
  }
1751
1589
  function PaginationItem(props) {
1752
- return /* @__PURE__ */ jsx21("li", { "data-slot": "pagination-item", ...props });
1590
+ return /* @__PURE__ */ jsx20("li", { "data-slot": "pagination-item", ...props });
1753
1591
  }
1754
1592
  function PaginationLink({
1755
1593
  className,
@@ -1757,7 +1595,7 @@ function PaginationLink({
1757
1595
  size = "icon",
1758
1596
  ...props
1759
1597
  }) {
1760
- return /* @__PURE__ */ jsx21(
1598
+ return /* @__PURE__ */ jsx20(
1761
1599
  "a",
1762
1600
  {
1763
1601
  "aria-current": isActive ? "page" : void 0,
@@ -1774,9 +1612,9 @@ function PaginationLink({
1774
1612
  }
1775
1613
  );
1776
1614
  }
1777
- var ChevronLeft = () => /* @__PURE__ */ jsx21("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx21("path", { d: "m15 18-6-6 6-6" }) });
1778
- var ChevronRight = () => /* @__PURE__ */ jsx21("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx21("path", { d: "m9 18 6-6-6-6" }) });
1779
- var MoreHorizontal = () => /* @__PURE__ */ jsxs5(
1615
+ var ChevronLeft = () => /* @__PURE__ */ jsx20("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx20("path", { d: "m15 18-6-6 6-6" }) });
1616
+ var ChevronRight = () => /* @__PURE__ */ jsx20("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx20("path", { d: "m9 18 6-6-6-6" }) });
1617
+ var MoreHorizontal = () => /* @__PURE__ */ jsxs4(
1780
1618
  "svg",
1781
1619
  {
1782
1620
  className: "size-4",
@@ -1785,9 +1623,9 @@ var MoreHorizontal = () => /* @__PURE__ */ jsxs5(
1785
1623
  stroke: "currentColor",
1786
1624
  strokeWidth: 2,
1787
1625
  children: [
1788
- /* @__PURE__ */ jsx21("circle", { cx: "12", cy: "12", r: "1" }),
1789
- /* @__PURE__ */ jsx21("circle", { cx: "19", cy: "12", r: "1" }),
1790
- /* @__PURE__ */ jsx21("circle", { cx: "5", cy: "12", r: "1" })
1626
+ /* @__PURE__ */ jsx20("circle", { cx: "12", cy: "12", r: "1" }),
1627
+ /* @__PURE__ */ jsx20("circle", { cx: "19", cy: "12", r: "1" }),
1628
+ /* @__PURE__ */ jsx20("circle", { cx: "5", cy: "12", r: "1" })
1791
1629
  ]
1792
1630
  }
1793
1631
  );
@@ -1795,7 +1633,7 @@ function PaginationPrevious({
1795
1633
  className,
1796
1634
  ...props
1797
1635
  }) {
1798
- return /* @__PURE__ */ jsxs5(
1636
+ return /* @__PURE__ */ jsxs4(
1799
1637
  PaginationLink,
1800
1638
  {
1801
1639
  "aria-label": "Go to previous page",
@@ -1803,8 +1641,8 @@ function PaginationPrevious({
1803
1641
  className: cn("gap-1 px-2.5 sm:pl-2.5", className),
1804
1642
  ...props,
1805
1643
  children: [
1806
- /* @__PURE__ */ jsx21(ChevronLeft, {}),
1807
- /* @__PURE__ */ jsx21("span", { className: "hidden sm:block", children: "Previous" })
1644
+ /* @__PURE__ */ jsx20(ChevronLeft, {}),
1645
+ /* @__PURE__ */ jsx20("span", { className: "hidden sm:block", children: "Previous" })
1808
1646
  ]
1809
1647
  }
1810
1648
  );
@@ -1813,7 +1651,7 @@ function PaginationNext({
1813
1651
  className,
1814
1652
  ...props
1815
1653
  }) {
1816
- return /* @__PURE__ */ jsxs5(
1654
+ return /* @__PURE__ */ jsxs4(
1817
1655
  PaginationLink,
1818
1656
  {
1819
1657
  "aria-label": "Go to next page",
@@ -1821,8 +1659,8 @@ function PaginationNext({
1821
1659
  className: cn("gap-1 px-2.5 sm:pr-2.5", className),
1822
1660
  ...props,
1823
1661
  children: [
1824
- /* @__PURE__ */ jsx21("span", { className: "hidden sm:block", children: "Next" }),
1825
- /* @__PURE__ */ jsx21(ChevronRight, {})
1662
+ /* @__PURE__ */ jsx20("span", { className: "hidden sm:block", children: "Next" }),
1663
+ /* @__PURE__ */ jsx20(ChevronRight, {})
1826
1664
  ]
1827
1665
  }
1828
1666
  );
@@ -1831,7 +1669,7 @@ function PaginationEllipsis({
1831
1669
  className,
1832
1670
  ...props
1833
1671
  }) {
1834
- return /* @__PURE__ */ jsxs5(
1672
+ return /* @__PURE__ */ jsxs4(
1835
1673
  "span",
1836
1674
  {
1837
1675
  "aria-hidden": true,
@@ -1839,8 +1677,8 @@ function PaginationEllipsis({
1839
1677
  className: cn("flex size-9 items-center justify-center", className),
1840
1678
  ...props,
1841
1679
  children: [
1842
- /* @__PURE__ */ jsx21(MoreHorizontal, {}),
1843
- /* @__PURE__ */ jsx21("span", { className: "sr-only", children: "More pages" })
1680
+ /* @__PURE__ */ jsx20(MoreHorizontal, {}),
1681
+ /* @__PURE__ */ jsx20("span", { className: "sr-only", children: "More pages" })
1844
1682
  ]
1845
1683
  }
1846
1684
  );
@@ -1854,9 +1692,9 @@ var PROGRESS_TRACK = "bg-primary/20 relative h-2 w-full overflow-hidden rounded-
1854
1692
  var PROGRESS_INDICATOR = "bg-primary h-full w-full flex-1 transition-all";
1855
1693
 
1856
1694
  // src/components/progress.tsx
1857
- import { jsx as jsx22 } from "react/jsx-runtime";
1695
+ import { jsx as jsx21 } from "react/jsx-runtime";
1858
1696
  function Progress({ className, value = 0, ...props }) {
1859
- return /* @__PURE__ */ jsx22(
1697
+ return /* @__PURE__ */ jsx21(
1860
1698
  "div",
1861
1699
  {
1862
1700
  "data-slot": "progress",
@@ -1866,7 +1704,7 @@ function Progress({ className, value = 0, ...props }) {
1866
1704
  "aria-valuemax": 100,
1867
1705
  className: cn(PROGRESS_TRACK, className),
1868
1706
  ...props,
1869
- children: /* @__PURE__ */ jsx22(
1707
+ children: /* @__PURE__ */ jsx21(
1870
1708
  "div",
1871
1709
  {
1872
1710
  "data-slot": "progress-indicator",
@@ -1885,9 +1723,9 @@ import "react";
1885
1723
  var SKELETON_BASE = "bg-accent animate-pulse rounded-md";
1886
1724
 
1887
1725
  // src/components/skeleton.tsx
1888
- import { jsx as jsx23 } from "react/jsx-runtime";
1726
+ import { jsx as jsx22 } from "react/jsx-runtime";
1889
1727
  function Skeleton({ className, ...props }) {
1890
- return /* @__PURE__ */ jsx23(
1728
+ return /* @__PURE__ */ jsx22(
1891
1729
  "div",
1892
1730
  {
1893
1731
  "data-slot": "skeleton",
@@ -1899,9 +1737,9 @@ function Skeleton({ className, ...props }) {
1899
1737
 
1900
1738
  // src/components/spinner.tsx
1901
1739
  import "react";
1902
- import { jsx as jsx24 } from "react/jsx-runtime";
1740
+ import { jsx as jsx23 } from "react/jsx-runtime";
1903
1741
  function Spinner({ className, ...props }) {
1904
- return /* @__PURE__ */ jsx24(
1742
+ return /* @__PURE__ */ jsx23(
1905
1743
  "svg",
1906
1744
  {
1907
1745
  role: "status",
@@ -1912,7 +1750,165 @@ function Spinner({ className, ...props }) {
1912
1750
  stroke: "currentColor",
1913
1751
  strokeWidth: 2,
1914
1752
  ...props,
1915
- children: /* @__PURE__ */ jsx24("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" })
1753
+ children: /* @__PURE__ */ jsx23("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" })
1754
+ }
1755
+ );
1756
+ }
1757
+
1758
+ // src/components/status-screen.tsx
1759
+ import "react";
1760
+ import { jsx as jsx24, jsxs as jsxs5 } from "react/jsx-runtime";
1761
+ var ACCENT_TEXT = {
1762
+ teal: "text-main-accent-t1",
1763
+ gold: "text-main-accent-t3",
1764
+ red: "text-destructive",
1765
+ blue: "text-[#5e9be6]"
1766
+ };
1767
+ var BTN_BASE = "inline-flex items-center justify-center rounded-md px-6 py-3.5 font-mono-tech text-xs uppercase tracking-widest transition-colors";
1768
+ var BTN_FILLED = {
1769
+ teal: "bg-main-accent-t1 text-main-black hover:bg-main-accent-t1/90",
1770
+ gold: "bg-main-accent-t3 text-main-black hover:bg-main-accent-t3/90",
1771
+ red: "bg-destructive text-white hover:bg-destructive/90",
1772
+ blue: "bg-[#5e9be6] text-main-black hover:bg-[#5e9be6]/90"
1773
+ };
1774
+ var BTN_OUTLINE = {
1775
+ teal: "border border-main-accent-t1/40 text-main-accent-t1 hover:bg-main-accent-t1/10",
1776
+ gold: "border border-main-accent-t3/40 text-main-accent-t3 hover:bg-main-accent-t3/10",
1777
+ red: "border border-destructive/40 text-destructive hover:bg-destructive/10",
1778
+ blue: "border border-[#5e9be6]/40 text-[#5e9be6] hover:bg-[#5e9be6]/10"
1779
+ };
1780
+ function statusButtonClass(accent, variant) {
1781
+ return cn(BTN_BASE, variant === "filled" ? BTN_FILLED[accent] : BTN_OUTLINE[accent]);
1782
+ }
1783
+ function LogoMark({ className }) {
1784
+ return /* @__PURE__ */ jsx24("svg", { viewBox: "0 0 140 48", className, "aria-hidden": true, children: /* @__PURE__ */ jsxs5("g", { fill: "currentColor", children: [
1785
+ /* @__PURE__ */ jsx24("path", { d: "M0.0437012 47.3326L50.9499 40.5805V22.3378L56.4881 23.6408V37.9071L59.1984 37.5005V24.1147L64.6189 25.1808V37.0269L67.2113 36.553V22.1009L56.606 17.481L43.408 21.864V36.553L0.0437012 47.3326Z" }),
1786
+ /* @__PURE__ */ jsx24("path", { d: "M77.2277 40.5804L85.9478 41.4099L85.8299 0.304321L73.1033 7.17499V26.3654L77.2277 28.2608V40.5804Z" }),
1787
+ /* @__PURE__ */ jsx24("path", { d: "M87.126 0.304321L99.9705 7.29343V42.5943L94.3141 41.8835V9.54417L87.126 5.75347V0.304321Z" }),
1788
+ /* @__PURE__ */ jsx24("path", { d: "M103.034 42.9496L139.682 46.0296L110.104 39.7513V26.8393L103.034 23.0486V42.9496Z" })
1789
+ ] }) });
1790
+ }
1791
+ function ArrowLeftIcon({ className }) {
1792
+ return /* @__PURE__ */ jsxs5(
1793
+ "svg",
1794
+ {
1795
+ className,
1796
+ viewBox: "0 0 24 24",
1797
+ fill: "none",
1798
+ stroke: "currentColor",
1799
+ strokeWidth: 2,
1800
+ strokeLinecap: "round",
1801
+ strokeLinejoin: "round",
1802
+ "aria-hidden": true,
1803
+ children: [
1804
+ /* @__PURE__ */ jsx24("path", { d: "m12 19-7-7 7-7" }),
1805
+ /* @__PURE__ */ jsx24("path", { d: "M19 12H5" })
1806
+ ]
1807
+ }
1808
+ );
1809
+ }
1810
+ function StatusScreen({
1811
+ accent,
1812
+ eyebrow,
1813
+ code,
1814
+ headlineLead,
1815
+ headlineAccent,
1816
+ headlineTail = ".",
1817
+ subtext,
1818
+ links,
1819
+ children,
1820
+ linkComponent
1821
+ }) {
1822
+ const L = linkComponent ?? "a";
1823
+ const accentText = ACCENT_TEXT[accent];
1824
+ return /* @__PURE__ */ jsxs5("section", { className: "relative flex min-h-screen flex-col items-center justify-center overflow-hidden bg-main-black px-6 py-32 text-center", children: [
1825
+ /* @__PURE__ */ jsx24(
1826
+ "div",
1827
+ {
1828
+ "aria-hidden": true,
1829
+ className: cn(
1830
+ "pointer-events-none absolute inset-0 opacity-[0.07] [background:radial-gradient(55%_45%_at_50%_30%,currentColor,transparent_70%)]",
1831
+ accentText
1832
+ )
1833
+ }
1834
+ ),
1835
+ /* @__PURE__ */ jsxs5("div", { className: "relative z-10 flex w-full max-w-2xl flex-col items-center", children: [
1836
+ /* @__PURE__ */ jsx24(LogoMark, { className: cn("mb-7 h-10 w-auto", accentText) }),
1837
+ /* @__PURE__ */ jsx24("p", { className: cn("mb-6 font-mono-tech text-[11px] uppercase tracking-[0.34em]", accentText), children: eyebrow }),
1838
+ /* @__PURE__ */ jsx24("p", { className: cn("font-serif-display text-[110px] font-medium leading-[0.9] sm:text-[180px]", accentText), children: code }),
1839
+ /* @__PURE__ */ jsxs5("h1", { className: "mt-4 font-serif-display text-3xl font-light leading-tight text-white sm:text-5xl", children: [
1840
+ headlineLead,
1841
+ /* @__PURE__ */ jsx24("span", { className: cn("font-serif italic", accentText), children: headlineAccent }),
1842
+ headlineTail
1843
+ ] }),
1844
+ /* @__PURE__ */ jsx24("p", { className: "mx-auto mt-5 max-w-md text-sm leading-relaxed text-main-mist/60 sm:text-base", children: subtext }),
1845
+ /* @__PURE__ */ jsxs5("div", { className: "mt-9 flex flex-col items-center gap-3 sm:flex-row", children: [
1846
+ children,
1847
+ links?.map((link) => /* @__PURE__ */ jsxs5(L, { href: link.href, className: statusButtonClass(accent, link.variant ?? "filled"), children: [
1848
+ link.leadingArrow ? /* @__PURE__ */ jsx24(ArrowLeftIcon, { className: "mr-2 h-4 w-4" }) : null,
1849
+ link.label
1850
+ ] }, link.label))
1851
+ ] })
1852
+ ] })
1853
+ ] });
1854
+ }
1855
+ function NotFound({ linkComponent = "a", homeHref = "/", contactHref = "/contact" }) {
1856
+ return /* @__PURE__ */ jsx24(
1857
+ StatusScreen,
1858
+ {
1859
+ accent: "teal",
1860
+ eyebrow: "Page not found",
1861
+ code: "404",
1862
+ headlineLead: "You've reached ",
1863
+ headlineAccent: "open water",
1864
+ subtext: "The page you're looking for has drifted off our coastline \u2014 moved, renamed, or never charted. Let's get you back to shore.",
1865
+ linkComponent,
1866
+ links: [
1867
+ { label: "Back to home", href: homeHref, leadingArrow: true },
1868
+ { label: "Contact the team", href: contactHref, variant: "outline" }
1869
+ ]
1870
+ }
1871
+ );
1872
+ }
1873
+ function Forbidden({ linkComponent = "a", homeHref = "/", contactHref = "/contact" }) {
1874
+ return /* @__PURE__ */ jsx24(
1875
+ StatusScreen,
1876
+ {
1877
+ accent: "gold",
1878
+ eyebrow: "Access forbidden",
1879
+ code: "403",
1880
+ headlineLead: "This harbour is ",
1881
+ headlineAccent: "private",
1882
+ subtext: "You don't have the credentials to view this page. If you believe you should, our team can open the right doors.",
1883
+ linkComponent,
1884
+ links: [
1885
+ { label: "Back to home", href: homeHref, leadingArrow: true },
1886
+ { label: "Request access", href: contactHref, variant: "outline" }
1887
+ ]
1888
+ }
1889
+ );
1890
+ }
1891
+ function ServerError({ linkComponent = "a", homeHref = "/", reset }) {
1892
+ return /* @__PURE__ */ jsx24(
1893
+ StatusScreen,
1894
+ {
1895
+ accent: "red",
1896
+ eyebrow: "Server error",
1897
+ code: "500",
1898
+ headlineLead: "Our systems are ",
1899
+ headlineAccent: "recalibrating",
1900
+ subtext: "Something broke on our end \u2014 not yours. We've been alerted and are restoring service. Please try again in a moment.",
1901
+ linkComponent,
1902
+ links: [{ label: "Back to home", href: homeHref, variant: "outline", leadingArrow: true }],
1903
+ children: /* @__PURE__ */ jsx24(
1904
+ "button",
1905
+ {
1906
+ type: "button",
1907
+ className: statusButtonClass("red", "filled"),
1908
+ onClick: () => reset ? reset() : window.location.reload(),
1909
+ children: "Try again"
1910
+ }
1911
+ )
1916
1912
  }
1917
1913
  );
1918
1914
  }
@@ -7212,13 +7208,13 @@ export {
7212
7208
  FieldSet,
7213
7209
  FieldTitle,
7214
7210
  Footer,
7211
+ Forbidden,
7215
7212
  Form,
7216
7213
  FormControl,
7217
7214
  FormDescription,
7218
7215
  FormItem,
7219
7216
  FormLabel,
7220
7217
  FormMessage,
7221
- Header,
7222
7218
  HoverCard,
7223
7219
  HoverCardContent,
7224
7220
  HoverCardTrigger,
@@ -7270,6 +7266,7 @@ export {
7270
7266
  NavigationMenuList,
7271
7267
  NavigationMenuTrigger,
7272
7268
  NavigationMenuViewport,
7269
+ NotFound,
7273
7270
  Pagination,
7274
7271
  PaginationContent,
7275
7272
  PaginationEllipsis,
@@ -7299,6 +7296,7 @@ export {
7299
7296
  SelectTrigger,
7300
7297
  SelectValue,
7301
7298
  Separator,
7299
+ ServerError,
7302
7300
  Sheet,
7303
7301
  SheetClose,
7304
7302
  SheetContent,
@@ -7327,6 +7325,7 @@ export {
7327
7325
  Slider,
7328
7326
  Slot,
7329
7327
  Spinner,
7328
+ StatusScreen,
7330
7329
  Switch,
7331
7330
  Table,
7332
7331
  TableBody,
@@ -7353,6 +7352,7 @@ export {
7353
7352
  cn,
7354
7353
  mergeRefs,
7355
7354
  navigationMenuTriggerStyle,
7355
+ statusButtonClass,
7356
7356
  toast,
7357
7357
  toggleVariants,
7358
7358
  useControllableState,