@orangecheck/app-design 0.6.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +4 -3
  2. package/dist/brand.js.map +1 -1
  3. package/dist/brand.mjs.map +1 -1
  4. package/dist/chrome.d.mts +49 -15
  5. package/dist/chrome.d.ts +49 -15
  6. package/dist/chrome.js +619 -55
  7. package/dist/chrome.js.map +1 -1
  8. package/dist/chrome.mjs +617 -57
  9. package/dist/chrome.mjs.map +1 -1
  10. package/dist/components.d.mts +231 -1
  11. package/dist/components.d.ts +231 -1
  12. package/dist/components.js +1187 -2
  13. package/dist/components.js.map +1 -1
  14. package/dist/components.mjs +1162 -5
  15. package/dist/components.mjs.map +1 -1
  16. package/dist/family.d.mts +2 -0
  17. package/dist/family.d.ts +2 -0
  18. package/dist/family.js +167 -0
  19. package/dist/family.js.map +1 -0
  20. package/dist/family.mjs +154 -0
  21. package/dist/family.mjs.map +1 -0
  22. package/dist/index-C6hDqOOS.d.mts +58 -0
  23. package/dist/index-C6hDqOOS.d.ts +58 -0
  24. package/dist/index.d.mts +5 -3
  25. package/dist/index.d.ts +5 -3
  26. package/dist/index.js +1619 -132
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs +1575 -134
  29. package/dist/index.mjs.map +1 -1
  30. package/dist/primitives.d.mts +52 -1
  31. package/dist/primitives.d.ts +52 -1
  32. package/dist/primitives.js +280 -3
  33. package/dist/primitives.js.map +1 -1
  34. package/dist/primitives.mjs +271 -6
  35. package/dist/primitives.mjs.map +1 -1
  36. package/dist/status-badge-BEOxeY9j.d.ts +13 -0
  37. package/dist/status-badge-DRwGhB0h.d.mts +13 -0
  38. package/dist/styles/fonts.css +1 -1
  39. package/dist/styles/tokens.css +4 -2
  40. package/dist/tokens.d.mts +3 -1
  41. package/dist/tokens.d.ts +3 -1
  42. package/dist/tokens.js +5 -3
  43. package/dist/tokens.js.map +1 -1
  44. package/dist/tokens.mjs +5 -3
  45. package/dist/tokens.mjs.map +1 -1
  46. package/package.json +9 -2
package/dist/index.js CHANGED
@@ -19,7 +19,8 @@ var DropdownMenuPrimitive = require('@radix-ui/react-dropdown-menu');
19
19
  var PopoverPrimitive = require('@radix-ui/react-popover');
20
20
  var TooltipPrimitive = require('@radix-ui/react-tooltip');
21
21
  var TabsPrimitive = require('@radix-ui/react-tabs');
22
- var Link2 = require('next/link');
22
+ var QRCode = require('qrcode');
23
+ var Link5 = require('next/link');
23
24
  var nextThemes = require('next-themes');
24
25
 
25
26
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -53,7 +54,8 @@ var DropdownMenuPrimitive__namespace = /*#__PURE__*/_interopNamespace(DropdownMe
53
54
  var PopoverPrimitive__namespace = /*#__PURE__*/_interopNamespace(PopoverPrimitive);
54
55
  var TooltipPrimitive__namespace = /*#__PURE__*/_interopNamespace(TooltipPrimitive);
55
56
  var TabsPrimitive__namespace = /*#__PURE__*/_interopNamespace(TabsPrimitive);
56
- var Link2__default = /*#__PURE__*/_interopDefault(Link2);
57
+ var QRCode__default = /*#__PURE__*/_interopDefault(QRCode);
58
+ var Link5__default = /*#__PURE__*/_interopDefault(Link5);
57
59
 
58
60
  // src/tokens/index.ts
59
61
  var APP_ATTRIBUTE = "data-oc-app";
@@ -69,7 +71,8 @@ var appColors = {
69
71
  border: "#ECECEC",
70
72
  hairlineStrong: "#DADADA",
71
73
  accentDisplay: "#F55819",
72
- accentInk: "#C73F09"
74
+ accentInk: "#C73F09",
75
+ ring: "#EA580B"
73
76
  },
74
77
  dark: {
75
78
  background: "#0A0A0A",
@@ -78,10 +81,11 @@ var appColors = {
78
81
  muted: "#1E1E1E",
79
82
  mutedForeground: "#A3A6AA",
80
83
  subtleForeground: "#8B8E93",
81
- border: "#262626",
84
+ border: "#2A2A2A",
82
85
  hairlineStrong: "#333333",
83
86
  accentDisplay: "#F66D36",
84
- accentInk: "#F0835A"
87
+ accentInk: "#F0835A",
88
+ ring: "#F66D36"
85
89
  },
86
90
  brand: {
87
91
  orange: "#F66D36",
@@ -283,13 +287,13 @@ var badgeVariants = classVarianceAuthority.cva(
283
287
  tone: {
284
288
  neutral: "border-border bg-card text-foreground",
285
289
  muted: "border-transparent bg-muted text-muted-foreground",
286
- brand: "border-transparent bg-[color-mix(in_oklab,var(--oca-orange)_12%,var(--card))] text-oca-accent-ink",
290
+ brand: "border-transparent bg-[color-mix(in_oklab,var(--oca-orange)_9%,var(--card))] text-oca-accent-ink",
287
291
  danger: "border-transparent bg-[color-mix(in_oklab,var(--destructive)_12%,var(--card))] text-destructive",
288
292
  // A good state is a neutral pill with a green dot, not a green pill.
289
293
  success: GOOD_DOT,
290
294
  // Aliases kept so older call sites keep compiling: attention is
291
295
  // the brand accent, information is neutral.
292
- warning: "border-transparent bg-[color-mix(in_oklab,var(--oca-orange)_12%,var(--card))] text-oca-accent-ink",
296
+ warning: "border-transparent bg-[color-mix(in_oklab,var(--oca-orange)_9%,var(--card))] text-oca-accent-ink",
293
297
  info: "border-border bg-card text-foreground",
294
298
  // Inverted in dark mode, where ink would sit on a card of nearly its own colour.
295
299
  ink: "border-transparent bg-oca-ink text-oca-ink-foreground dark:bg-foreground dark:text-background",
@@ -327,6 +331,30 @@ function StatusPill({
327
331
  }
328
332
  );
329
333
  }
334
+ var WORD = {
335
+ live: "Live",
336
+ testing: "In testing",
337
+ "not-yet": "Not yet",
338
+ paused: "Paused",
339
+ good: "Good",
340
+ caution: "Caution",
341
+ refused: "Refused"
342
+ };
343
+ var TONE = {
344
+ live: "success",
345
+ testing: "brand",
346
+ "not-yet": "muted",
347
+ paused: "muted",
348
+ good: "success",
349
+ caution: "brand",
350
+ refused: "danger"
351
+ };
352
+ function statusWord(status) {
353
+ return WORD[status];
354
+ }
355
+ function StatusBadge({ status, className, ...props }) {
356
+ return /* @__PURE__ */ jsxRuntime.jsx(Badge, { tone: TONE[status], "data-status": status, className: cn(className), ...props, children: WORD[status] });
357
+ }
330
358
  var cardVariants = classVarianceAuthority.cva("relative rounded-[1.25rem] border", {
331
359
  variants: {
332
360
  tone: {
@@ -510,7 +538,8 @@ var Switch = react.forwardRef(function Switch2({ className, ...props }, ref) {
510
538
  className: cn(
511
539
  "peer inline-flex h-6 w-11 shrink-0 items-center rounded-full border border-transparent bg-input p-0.5",
512
540
  "outline-none transition-colors focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
513
- "data-[state=checked]:bg-brand disabled:cursor-not-allowed disabled:opacity-50",
541
+ // The deep orange: the track is the state, so it must clear 3:1 on a card.
542
+ "data-[state=checked]:bg-oca-orange-deep disabled:cursor-not-allowed disabled:opacity-50",
514
543
  className
515
544
  ),
516
545
  ...props,
@@ -802,6 +831,245 @@ var TabsTrigger = react.forwardRef(function TabsTrigger2({ className, ...props }
802
831
  var TabsContent = react.forwardRef(function TabsContent2({ className, ...props }, ref) {
803
832
  return /* @__PURE__ */ jsxRuntime.jsx(TabsPrimitive__namespace.Content, { ref, className: cn("mt-6 outline-none", className), ...props });
804
833
  });
834
+ var GroupName = react.createContext(void 0);
835
+ function Accordion({
836
+ single = false,
837
+ children,
838
+ className
839
+ }) {
840
+ const name = react.useId();
841
+ return /* @__PURE__ */ jsxRuntime.jsx(GroupName.Provider, { value: single ? name : void 0, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("divide-y divide-border overflow-hidden rounded-[1.25rem] border border-border bg-card", className), children }) });
842
+ }
843
+ function AccordionItem({
844
+ title,
845
+ children,
846
+ defaultOpen = false,
847
+ id,
848
+ className
849
+ }) {
850
+ const name = react.useContext(GroupName);
851
+ return /* @__PURE__ */ jsxRuntime.jsxs("details", { id, name, open: defaultOpen || void 0, className: cn("group scroll-mt-24", className), children: [
852
+ /* @__PURE__ */ jsxRuntime.jsxs(
853
+ "summary",
854
+ {
855
+ className: cn(
856
+ "flex min-h-14 cursor-pointer list-none items-center justify-between gap-4 px-5 py-4 text-[1rem] font-medium leading-snug md:px-6",
857
+ // Inside the card's clip, so the ring is drawn within the row.
858
+ "transition-colors hover:bg-accent/60 focus-visible:outline-offset-[-2px] [&::-webkit-details-marker]:hidden"
859
+ ),
860
+ children: [
861
+ title,
862
+ /* @__PURE__ */ jsxRuntime.jsx(
863
+ lucideReact.ChevronDown,
864
+ {
865
+ "aria-hidden": true,
866
+ className: "size-4 shrink-0 text-muted-foreground transition-transform duration-200 group-open:rotate-180"
867
+ }
868
+ )
869
+ ]
870
+ }
871
+ ),
872
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "oca-body px-5 pb-5 text-[0.9375rem] md:px-6 md:pb-6", children })
873
+ ] });
874
+ }
875
+ var queue = [];
876
+ var asked = 0;
877
+ var hosts = 0;
878
+ var listeners = /* @__PURE__ */ new Set();
879
+ var emit = () => listeners.forEach((l) => l());
880
+ function ask(item) {
881
+ queue = [...queue, { ...item, id: ++asked }];
882
+ emit();
883
+ }
884
+ function done() {
885
+ queue = queue.slice(1);
886
+ emit();
887
+ }
888
+ function confirm(options) {
889
+ if (hosts === 0) {
890
+ console.error("confirm(): no <DialogHost /> is mounted, so nothing was asked; treating it as no.");
891
+ return Promise.resolve(false);
892
+ }
893
+ return new Promise((resolve) => ask({ id: 0, kind: "confirm", options, settle: resolve }));
894
+ }
895
+ function prompt(options) {
896
+ if (hosts === 0) {
897
+ console.error("prompt(): no <DialogHost /> is mounted, so nothing was asked; treating it as cancelled.");
898
+ return Promise.resolve(null);
899
+ }
900
+ return new Promise((resolve) => ask({ id: 0, kind: "prompt", options, settle: resolve }));
901
+ }
902
+ function subscribe(listener) {
903
+ listeners.add(listener);
904
+ hosts++;
905
+ return () => {
906
+ listeners.delete(listener);
907
+ hosts--;
908
+ };
909
+ }
910
+ var current = () => queue[0] ?? null;
911
+ var none = () => null;
912
+ function PromptBody({ ask: a }) {
913
+ const o = a.options;
914
+ const [value, setValue] = react.useState(o.defaultValue ?? "");
915
+ const [error, setError] = react.useState(null);
916
+ const submit = (e) => {
917
+ e.preventDefault();
918
+ if (o.minLength && value.length < o.minLength) {
919
+ setError(`At least ${o.minLength} characters.`);
920
+ return;
921
+ }
922
+ const refused = o.validate?.(value);
923
+ if (refused) {
924
+ setError(refused);
925
+ return;
926
+ }
927
+ a.settle(value);
928
+ done();
929
+ };
930
+ return /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: submit, noValidate: true, children: [
931
+ /* @__PURE__ */ jsxRuntime.jsx(Field, { label: o.label ?? "Your answer", hint: o.hint, error, children: /* @__PURE__ */ jsxRuntime.jsx(
932
+ Input,
933
+ {
934
+ autoFocus: true,
935
+ type: o.secret ? "password" : "text",
936
+ autoComplete: o.secret ? "new-password" : "off",
937
+ placeholder: o.placeholder,
938
+ value,
939
+ onChange: (e) => {
940
+ setValue(e.target.value);
941
+ setError(null);
942
+ }
943
+ }
944
+ ) }),
945
+ /* @__PURE__ */ jsxRuntime.jsxs(DialogFooter, { children: [
946
+ /* @__PURE__ */ jsxRuntime.jsx(
947
+ Button,
948
+ {
949
+ variant: "secondary",
950
+ onClick: () => {
951
+ a.settle(null);
952
+ done();
953
+ },
954
+ children: o.cancelLabel ?? "Cancel"
955
+ }
956
+ ),
957
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "submit", variant: o.destructive ? "danger" : "primary", children: o.confirmLabel ?? "Continue" })
958
+ ] })
959
+ ] });
960
+ }
961
+ function DialogHost() {
962
+ const a = react.useSyncExternalStore(subscribe, current, none);
963
+ const cancel = () => {
964
+ if (!a) return;
965
+ if (a.kind === "confirm") a.settle(false);
966
+ else a.settle(null);
967
+ done();
968
+ };
969
+ return /* @__PURE__ */ jsxRuntime.jsx(Dialog, { open: a !== null, onOpenChange: (open) => open ? void 0 : cancel(), children: a ? /* @__PURE__ */ jsxRuntime.jsxs(
970
+ DialogContent,
971
+ {
972
+ role: "alertdialog",
973
+ ...a.options.message ? {} : { "aria-describedby": void 0 },
974
+ className: "w-[min(92vw,28rem)]",
975
+ children: [
976
+ /* @__PURE__ */ jsxRuntime.jsxs(DialogHeader, { children: [
977
+ /* @__PURE__ */ jsxRuntime.jsx(DialogTitle, { children: a.options.title }),
978
+ a.options.message ? /* @__PURE__ */ jsxRuntime.jsx(DialogDescription, { children: a.options.message }) : null
979
+ ] }),
980
+ a.kind === "prompt" ? (
981
+ // Keyed by the ask, so a second prompt starts empty.
982
+ /* @__PURE__ */ jsxRuntime.jsx(PromptBody, { ask: a }, a.id)
983
+ ) : /* @__PURE__ */ jsxRuntime.jsxs(DialogFooter, { children: [
984
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "secondary", onClick: cancel, children: a.options.cancelLabel ?? "Cancel" }),
985
+ /* @__PURE__ */ jsxRuntime.jsx(
986
+ Button,
987
+ {
988
+ variant: a.options.destructive ? "danger" : "primary",
989
+ onClick: () => {
990
+ a.settle(true);
991
+ done();
992
+ },
993
+ children: a.options.confirmLabel ?? "Continue"
994
+ }
995
+ )
996
+ ] })
997
+ ]
998
+ }
999
+ ) : null });
1000
+ }
1001
+ var N = new Intl.NumberFormat("en-US");
1002
+ function Pagination({
1003
+ pageIndex,
1004
+ pageSize,
1005
+ total,
1006
+ onPage,
1007
+ label = "Pages",
1008
+ className
1009
+ }) {
1010
+ const pages = Math.max(1, Math.ceil(total / pageSize));
1011
+ const index = Math.min(Math.max(0, pageIndex), pages - 1);
1012
+ if (index !== pageIndex && typeof process !== "undefined" && process.env.NODE_ENV !== "production") {
1013
+ console.warn(`Pagination: pageIndex ${pageIndex} is outside 0\u2013${pages - 1}; it counts from 0.`);
1014
+ }
1015
+ if (total <= pageSize) return null;
1016
+ const from = index * pageSize + 1;
1017
+ const to = Math.min(total, (index + 1) * pageSize);
1018
+ return /* @__PURE__ */ jsxRuntime.jsxs("nav", { "aria-label": label, className: cn("flex items-center justify-between gap-4", className), children: [
1019
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { "aria-live": "polite", className: "oca-tabular text-[0.875rem] text-muted-foreground", children: [
1020
+ N.format(from),
1021
+ "\u2013",
1022
+ N.format(to),
1023
+ " of ",
1024
+ N.format(total)
1025
+ ] }),
1026
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
1027
+ /* @__PURE__ */ jsxRuntime.jsxs(Button, { variant: "secondary", size: "sm", disabled: index === 0, onClick: () => onPage(index - 1), className: "pl-3", children: [
1028
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { "aria-hidden": true }),
1029
+ "Previous"
1030
+ ] }),
1031
+ /* @__PURE__ */ jsxRuntime.jsxs(Button, { variant: "secondary", size: "sm", disabled: index >= pages - 1, onClick: () => onPage(index + 1), className: "pr-3", children: [
1032
+ "Next",
1033
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { "aria-hidden": true })
1034
+ ] })
1035
+ ] })
1036
+ ] });
1037
+ }
1038
+ function QrCode({
1039
+ value,
1040
+ size = 200,
1041
+ label,
1042
+ className
1043
+ }) {
1044
+ const matrix = react.useMemo(() => {
1045
+ try {
1046
+ return QRCode__default.default.create(value, { errorCorrectionLevel: "M" }).modules;
1047
+ } catch {
1048
+ return null;
1049
+ }
1050
+ }, [value]);
1051
+ const path = react.useMemo(() => {
1052
+ if (!matrix) return "";
1053
+ let d = "";
1054
+ for (let y = 0; y < matrix.size; y++) {
1055
+ for (let x = 0; x < matrix.size; x++) {
1056
+ if (matrix.get(y, x)) d += `M${x} ${y}h1v1h-1z`;
1057
+ }
1058
+ }
1059
+ return d;
1060
+ }, [matrix]);
1061
+ const short = value.length > 28 ? `${value.slice(0, 28)}\u2026` : value;
1062
+ return /* @__PURE__ */ jsxRuntime.jsx(
1063
+ "div",
1064
+ {
1065
+ role: "img",
1066
+ "aria-label": matrix ? label ?? `QR code for ${short}` : "Too long for a QR code",
1067
+ className: cn("inline-block shrink-0 rounded-2xl bg-white p-3 ring-1 ring-border", className),
1068
+ style: { width: size, height: size },
1069
+ children: matrix ? /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: `0 0 ${matrix.size} ${matrix.size}`, shapeRendering: "crispEdges", "aria-hidden": true, className: "block size-full", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: path, fill: "#0a0a0a" }) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { "aria-hidden": true, className: "flex size-full items-center justify-center text-center text-[0.8125rem] text-[#54585e]", children: "Too long for a QR code" })
1070
+ }
1071
+ );
1072
+ }
805
1073
  var TOP = "0,3 2,2 6,4 14,0 16,1 6,6";
806
1074
  var LEFT = "0,3 6,6 6,8 0,5";
807
1075
  var RIGHT = "6,6 16,1 16,3 6,8";
@@ -826,6 +1094,20 @@ function Mark({ title, size, className, ...rest }) {
826
1094
  }
827
1095
  );
828
1096
  }
1097
+ function MarkOutline({ className }) {
1098
+ return /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "-0.2 -0.2 16.4 8.4", "aria-hidden": true, className: cn("shrink-0 overflow-visible", className), children: [TOP, LEFT, RIGHT].map((points) => /* @__PURE__ */ jsxRuntime.jsx(
1099
+ "polygon",
1100
+ {
1101
+ points,
1102
+ fill: "none",
1103
+ stroke: "currentColor",
1104
+ strokeWidth: "1",
1105
+ strokeLinejoin: "round",
1106
+ vectorEffect: "non-scaling-stroke"
1107
+ },
1108
+ points
1109
+ )) });
1110
+ }
829
1111
  function AppIcon({ title, size = 32, className, ...rest }) {
830
1112
  return /* @__PURE__ */ jsxRuntime.jsxs(
831
1113
  "svg",
@@ -2150,7 +2432,7 @@ var LABEL = {
2150
2432
  "not-yet": "Not yet",
2151
2433
  no: "No"
2152
2434
  };
2153
- var TONE = {
2435
+ var TONE2 = {
2154
2436
  yes: "text-oca-accent-ink",
2155
2437
  testing: "text-foreground",
2156
2438
  "not-yet": "text-muted-foreground",
@@ -2171,7 +2453,7 @@ function TruthTable({
2171
2453
  className
2172
2454
  ),
2173
2455
  children: rows.map((r, i) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex flex-col gap-1.5 px-4 py-3.5", children: [
2174
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("text-[0.875rem] font-medium", TONE[r.status]), children: LABEL[r.status] }),
2456
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("text-[0.875rem] font-medium", TONE2[r.status]), children: LABEL[r.status] }),
2175
2457
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[0.9375rem] leading-relaxed", children: r.what })
2176
2458
  ] }, i))
2177
2459
  }
@@ -2188,7 +2470,7 @@ function TruthTable({
2188
2470
  className: cn(
2189
2471
  "border-t border-oca-hairline-strong px-4 py-3 font-medium",
2190
2472
  i === 0 && "border-t-0",
2191
- TONE[r.status]
2473
+ TONE2[r.status]
2192
2474
  ),
2193
2475
  children: LABEL[r.status]
2194
2476
  }
@@ -2447,126 +2729,1286 @@ var ErrorBoundary = class extends react.Component {
2447
2729
  ) });
2448
2730
  }
2449
2731
  };
2450
- function NavLink({ item, className, onNavigate }) {
2451
- const cls = cn(
2452
- "rounded-full px-3 py-2 text-[0.9375rem] transition-colors",
2453
- item.active ? "text-foreground" : "text-muted-foreground hover:text-foreground",
2454
- className
2455
- );
2456
- if (item.external) {
2457
- return /* @__PURE__ */ jsxRuntime.jsx("a", { href: item.href, className: cls, rel: "noreferrer", onClick: onNavigate, children: item.label });
2732
+ var WORDS = {
2733
+ 404: {
2734
+ name: "Not found",
2735
+ title: "This page isn\u2019t here.",
2736
+ detail: "The link may be old, or the address mistyped."
2737
+ },
2738
+ 500: {
2739
+ name: "Server error",
2740
+ title: "Something broke on our side.",
2741
+ detail: "Try again in a moment."
2458
2742
  }
2459
- return /* @__PURE__ */ jsxRuntime.jsx(Link2__default.default, { href: item.href, className: cls, "aria-current": item.active ? "page" : void 0, onClick: onNavigate, children: item.label });
2460
- }
2461
- function SiteHeader({
2462
- home = "/",
2463
- brand,
2464
- nav = [],
2743
+ };
2744
+ function ErrorPage({
2745
+ code = 404,
2746
+ title,
2747
+ detail,
2465
2748
  actions,
2749
+ home = "/",
2750
+ art,
2466
2751
  className
2467
2752
  }) {
2468
- const [open, setOpen] = react.useState(false);
2469
- return /* @__PURE__ */ jsxRuntime.jsx(
2470
- "header",
2753
+ const words = WORDS[code] ?? (code >= 500 ? WORDS[500] : WORDS[404]);
2754
+ const server = code >= 500;
2755
+ return /* @__PURE__ */ jsxRuntime.jsx(Section, { space: "none", className: cn("flex min-h-[min(40rem,72dvh)] items-center py-16 md:py-24", className), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 items-center gap-12 md:grid-cols-12", children: [
2756
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex max-w-[40rem] flex-col items-start gap-6 md:col-span-7", children: [
2757
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "oca-eyebrow oca-enter", children: [
2758
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "oca-tabular", children: code }),
2759
+ " \xB7 ",
2760
+ WORDS[code]?.name ?? (server ? "Error" : "Not available")
2761
+ ] }),
2762
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "oca-display-2 oca-enter [--enter-delay:70ms]", children: title ?? words.title }),
2763
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "oca-lead oca-enter [--enter-delay:150ms]", children: detail ?? words.detail }),
2764
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "oca-enter flex flex-wrap gap-3 [--enter-delay:230ms]", children: actions ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2765
+ server ? /* @__PURE__ */ jsxRuntime.jsx(Button, { onClick: () => window.location.reload(), children: "Try again" }) : null,
2766
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { asChild: true, variant: server ? "secondary" : "primary", children: /* @__PURE__ */ jsxRuntime.jsx(Link5__default.default, { href: home, children: "Go home" }) })
2767
+ ] }) })
2768
+ ] }),
2769
+ art !== null ? /* @__PURE__ */ jsxRuntime.jsx("div", { "aria-hidden": true, className: "oca-enter hidden justify-center md:col-span-5 md:flex [--enter-delay:120ms]", children: art ?? /* @__PURE__ */ jsxRuntime.jsx(MarkOutline, { className: "w-full max-w-[20rem] text-oca-hairline-strong" }) }) : null
2770
+ ] }) });
2771
+ }
2772
+ function SectionHeading({
2773
+ eyebrow,
2774
+ title,
2775
+ lead,
2776
+ id,
2777
+ onInk = false,
2778
+ level = 2,
2779
+ as = "h2",
2780
+ align = "start",
2781
+ reveal = true,
2782
+ className
2783
+ }) {
2784
+ return /* @__PURE__ */ jsxRuntime.jsxs(SectionIntro, { align, reveal, className: cn("max-w-3xl gap-4 md:gap-4", className), children: [
2785
+ eyebrow ? /* @__PURE__ */ jsxRuntime.jsx(Eyebrow, { onInk, children: eyebrow }) : null,
2786
+ /* @__PURE__ */ jsxRuntime.jsx(Display, { level, as, id, className: "scroll-mt-24", children: title }),
2787
+ lead ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("oca-lead", onInk && "text-oca-ink-muted"), children: lead }) : null
2788
+ ] });
2789
+ }
2790
+ function FactBlock({
2791
+ id,
2792
+ title,
2793
+ description,
2794
+ aside,
2795
+ children,
2796
+ className
2797
+ }) {
2798
+ return /* @__PURE__ */ jsxRuntime.jsxs("section", { id, className: cn("flex scroll-mt-24 flex-col gap-6", className), children: [
2799
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3 md:flex-row md:items-end md:justify-between md:gap-8", children: [
2800
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex max-w-[44rem] flex-col gap-3", children: [
2801
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "oca-display-3", children: title }),
2802
+ description ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "oca-body text-[1.0625rem]", children: description }) : null
2803
+ ] }),
2804
+ aside ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex shrink-0 flex-wrap gap-x-5 gap-y-2 text-[0.9375rem]", children: aside }) : null
2805
+ ] }),
2806
+ children
2807
+ ] });
2808
+ }
2809
+ function FactRows({
2810
+ rows,
2811
+ columns = 1,
2812
+ label,
2813
+ className
2814
+ }) {
2815
+ return /* @__PURE__ */ jsxRuntime.jsx("ul", { "aria-label": label, className: cn("divide-y divide-border rounded-[1.25rem] border border-border bg-card", className), children: rows.map((r) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex flex-col gap-5 px-5 py-6 md:px-8 md:py-7", children: [
2816
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-baseline justify-between gap-x-6", children: [
2817
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "oca-title min-w-0 text-pretty", children: r.title }),
2818
+ r.figure ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "oca-tabular shrink-0 whitespace-nowrap text-[1.75rem] leading-none tracking-[-0.02em]", children: r.figure }) : null
2819
+ ] }),
2820
+ /* @__PURE__ */ jsxRuntime.jsx("dl", { className: columns === 2 ? "grid grid-cols-1 gap-x-10 gap-y-4 md:grid-cols-2" : "flex flex-col gap-4", children: r.fields.map((f, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-col gap-1", children: [
2821
+ /* @__PURE__ */ jsxRuntime.jsx("dt", { className: "text-[0.875rem] font-medium text-muted-foreground", children: f.label }),
2822
+ /* @__PURE__ */ jsxRuntime.jsx("dd", { className: "break-words text-[1rem] leading-relaxed", children: f.value })
2823
+ ] }, i)) })
2824
+ ] }, r.key)) });
2825
+ }
2826
+ function EndpointList({ items, label, className }) {
2827
+ return /* @__PURE__ */ jsxRuntime.jsx("ul", { "aria-label": label, className: cn("divide-y divide-border rounded-[1.25rem] border border-border bg-card", className), children: items.map((a) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsxs(
2828
+ "a",
2471
2829
  {
2472
- className: cn(
2473
- "sticky top-0 z-40 w-full border-b border-transparent bg-background/95 backdrop-blur-md supports-[backdrop-filter]:bg-background/90",
2474
- className
2475
- ),
2476
- children: /* @__PURE__ */ jsxRuntime.jsxs(
2477
- "div",
2478
- {
2479
- className: cn(
2480
- "oca-container flex h-16 items-center justify-between gap-4 md:h-[4.5rem]",
2481
- // Three columns, the outer two each at least their content: the
2482
- // navigation stays centred whatever the actions hold, so it does
2483
- // not shift when they change (signed out to signed in).
2484
- nav.length > 0 && "md:grid md:grid-cols-[minmax(max-content,1fr)_auto_minmax(max-content,1fr)]"
2485
- ),
2486
- children: [
2487
- /* @__PURE__ */ jsxRuntime.jsxs(Link2__default.default, { href: home, className: "-ml-1 justify-self-start rounded-lg p-1", children: [
2488
- brand ?? /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 28 }),
2489
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: " home" })
2490
- ] }),
2491
- nav.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Main", className: "hidden items-center gap-1 md:flex", children: nav.map((n) => /* @__PURE__ */ jsxRuntime.jsx(NavLink, { item: n }, n.href)) }) : null,
2492
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 justify-self-end", children: [
2493
- actions,
2494
- nav.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(Sheet, { open, onOpenChange: setOpen, children: [
2495
- /* @__PURE__ */ jsxRuntime.jsx(
2496
- SheetTrigger,
2497
- {
2498
- className: "inline-flex size-10 items-center justify-center rounded-full text-foreground hover:bg-accent md:hidden",
2499
- "aria-label": "Open menu",
2500
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Menu, { className: "size-5" })
2501
- }
2502
- ),
2503
- /* @__PURE__ */ jsxRuntime.jsxs(SheetContent, { side: "right", className: "pt-16", children: [
2504
- /* @__PURE__ */ jsxRuntime.jsx(SheetTitle, { className: "sr-only", children: "Menu" }),
2505
- /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Main", className: "flex flex-col", children: nav.map((n) => /* @__PURE__ */ jsxRuntime.jsx(
2506
- NavLink,
2507
- {
2508
- item: n,
2509
- className: "rounded-xl px-3 py-3 text-[1.0625rem]",
2510
- onNavigate: () => setOpen(false)
2511
- },
2512
- n.href
2513
- )) })
2514
- ] })
2515
- ] }) : null
2516
- ] })
2517
- ]
2518
- }
2519
- )
2830
+ href: a.href,
2831
+ target: "_blank",
2832
+ rel: "noreferrer",
2833
+ className: "flex flex-col gap-1 px-5 py-3.5 transition-colors hover:bg-accent/60 sm:flex-row sm:items-baseline sm:justify-between sm:gap-6",
2834
+ children: [
2835
+ /* @__PURE__ */ jsxRuntime.jsx("code", { className: "break-all text-[0.875rem] text-foreground", children: a.label ?? a.href }),
2836
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-[0.875rem] text-muted-foreground sm:text-right", children: [
2837
+ a.description,
2838
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: " (opens in a new tab)" })
2839
+ ] })
2840
+ ]
2520
2841
  }
2521
- );
2842
+ ) }, a.href)) });
2522
2843
  }
2523
- function SiteFooter({
2524
- columns = [],
2525
- fineprint,
2526
- meta,
2527
- signature = true,
2844
+ function ProofStrip({ items, className }) {
2845
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("border-y border-border", className), children: /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "oca-container grid grid-cols-2 gap-x-6 gap-y-4 py-6 md:grid-cols-4", children: items.map((it, i) => /* @__PURE__ */ jsxRuntime.jsxs(
2846
+ "li",
2847
+ {
2848
+ className: "flex items-center gap-3 text-[0.9375rem] [&_svg]:size-[1.1rem] [&_svg]:shrink-0 [&_svg]:text-oca-accent-ink",
2849
+ children: [
2850
+ it.icon ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "flex", children: it.icon }) : null,
2851
+ it.label
2852
+ ]
2853
+ },
2854
+ i
2855
+ )) }) });
2856
+ }
2857
+ function Closing({
2858
+ title,
2859
+ lead,
2860
+ actions,
2861
+ art,
2528
2862
  className
2529
2863
  }) {
2530
- return /* @__PURE__ */ jsxRuntime.jsxs("footer", { className: cn("border-t border-border bg-background", className), children: [
2531
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "oca-container grid grid-cols-2 gap-x-6 gap-y-10 py-14 md:grid-cols-[1.3fr_repeat(3,1fr)] md:py-16", children: [
2532
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "col-span-2 flex flex-col gap-4 md:col-span-1", children: [
2533
- /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 26 }),
2534
- fineprint ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "max-w-xs text-[0.9375rem] leading-relaxed text-muted-foreground", children: fineprint }) : null
2864
+ return /* @__PURE__ */ jsxRuntime.jsx(Section, { className: cn("overflow-hidden", className), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 items-center gap-12 md:grid-cols-12", children: [
2865
+ /* @__PURE__ */ jsxRuntime.jsxs(Reveal, { className: "flex flex-col items-start gap-8 md:col-span-7", children: [
2866
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-5", children: [
2867
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "oca-display-1 text-[clamp(2.5rem,1.5rem+4vw,5rem)] leading-[1]", children: title }),
2868
+ lead ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "oca-lead max-w-[34rem]", children: lead }) : null
2535
2869
  ] }),
2536
- columns.map((col, i) => {
2537
- const spans = columns.length % 2 === 1 && i === columns.length - 1;
2538
- return /* @__PURE__ */ jsxRuntime.jsxs(
2539
- "div",
2540
- {
2541
- className: cn("flex min-w-0 flex-col gap-1", spans && "col-span-2 md:col-span-1"),
2542
- children: [
2543
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-[0.875rem] font-medium", children: col.heading }),
2544
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex flex-col gap-1", spans && "grid grid-cols-2 gap-x-6 md:flex md:flex-col"), children: col.links.map((l) => /* @__PURE__ */ jsxRuntime.jsx(
2545
- NavLink,
2546
- {
2547
- item: l,
2548
- className: "-mx-3 py-2.5 text-[0.9375rem] md:py-1.5"
2549
- },
2550
- l.href
2551
- )) })
2552
- ]
2553
- },
2554
- col.heading
2555
- );
2556
- })
2870
+ actions ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-3", children: actions }) : null
2557
2871
  ] }),
2558
- signature ? /* @__PURE__ */ jsxRuntime.jsx("div", { "aria-hidden": true, className: "oca-container select-none overflow-hidden pb-8 md:pb-12", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-end gap-[0.18em] text-[clamp(3rem,11.5vw,10rem)] leading-[0.78] tracking-[-0.065em] [font-family:var(--oc-font-display)]", children: [
2559
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mb-[0.06em] inline-block w-[1.1em] shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(Mark, { className: "block h-auto w-full" }) }),
2560
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: "orangecheck" })
2561
- ] }) }) : null,
2562
- meta ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "oca-container", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-t border-border py-6 text-[0.875rem] text-muted-foreground", children: meta }) }) : null
2872
+ art !== null ? (
2873
+ // Room under the check on a phone, so its glow fades before the band ends.
2874
+ /* @__PURE__ */ jsxRuntime.jsx("div", { "aria-hidden": true, className: "flex justify-center max-md:pb-16 md:col-span-5", children: art ?? /* @__PURE__ */ jsxRuntime.jsx(IsoCheck, { size: 340, settle: true, tilt: true, className: "max-w-full" }) })
2875
+ ) : null
2876
+ ] }) });
2877
+ }
2878
+ function Faq({
2879
+ items,
2880
+ className
2881
+ }) {
2882
+ return /* @__PURE__ */ jsxRuntime.jsx(Accordion, { single: true, className, children: items.map((it, i) => /* @__PURE__ */ jsxRuntime.jsx(AccordionItem, { id: it.id, title: it.q, children: it.a }, it.id ?? i)) });
2883
+ }
2884
+ var LINK = "text-foreground underline decoration-foreground/35 underline-offset-4 transition-colors hover:decoration-foreground";
2885
+ function TextLink({
2886
+ href,
2887
+ children,
2888
+ external,
2889
+ className
2890
+ }) {
2891
+ const internal = href.startsWith("/") && !href.startsWith("/api/") && !href.startsWith("/.well-known/");
2892
+ const offsite = external ?? /^https?:\/\//.test(href);
2893
+ if (internal && !offsite) {
2894
+ return /* @__PURE__ */ jsxRuntime.jsx(Link5__default.default, { href, className: cn(LINK, className), children });
2895
+ }
2896
+ return /* @__PURE__ */ jsxRuntime.jsxs("a", { href, className: cn(LINK, className), ...offsite ? { target: "_blank", rel: "noreferrer" } : {}, children: [
2897
+ children,
2898
+ offsite ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: " (opens in a new tab)" }) : null
2563
2899
  ] });
2564
2900
  }
2901
+ var PROPER = {
2902
+ kyc: "KYC",
2903
+ pii: "PII",
2904
+ ccpa: "CCPA",
2905
+ cpra: "CPRA",
2906
+ gdpr: "GDPR",
2907
+ uk: "UK",
2908
+ eu: "EU",
2909
+ california: "California",
2910
+ europe: "Europe",
2911
+ united: "United",
2912
+ kingdom: "Kingdom"
2913
+ };
2914
+ function headingCase(text) {
2915
+ const words = text.replace(/\b[a-z]+\b/g, (w) => PROPER[w] ?? w);
2916
+ if (/^orangecheck\b/.test(words)) return `OrangeCheck${words.slice("orangecheck".length)}`;
2917
+ return words.length === 0 ? words : words[0].toUpperCase() + words.slice(1);
2918
+ }
2919
+ function sentencesCase(text) {
2920
+ return text.split(/(?<=[.!?])\s+/).map((s) => headingCase(s)).join(" ");
2921
+ }
2922
+ function openSentence(text) {
2923
+ const first = /^\S+/.exec(text)?.[0] ?? "";
2924
+ if (!/^[a-z][a-z'’-]*,?$/.test(first)) return text;
2925
+ return text[0].toUpperCase() + text.slice(1);
2926
+ }
2927
+ var INLINE = /(\*\*[^*]+\*\*|`[^`]+`|\[[^\]]+\]\([^)]+\))/g;
2928
+ var LINK2 = /^\[([^\]]+)\]\(([^)]+)\)$/;
2929
+ function Inline({ text }) {
2930
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: text.split(INLINE).map((part, i) => {
2931
+ if (!part) return null;
2932
+ if (part.startsWith("**") && part.endsWith("**") && part.length > 4) {
2933
+ return /* @__PURE__ */ jsxRuntime.jsx("strong", { children: /* @__PURE__ */ jsxRuntime.jsx(Inline, { text: part.slice(2, -2) }) }, i);
2934
+ }
2935
+ if (part.startsWith("`") && part.endsWith("`") && part.length > 2) return /* @__PURE__ */ jsxRuntime.jsx("code", { children: part.slice(1, -1) }, i);
2936
+ const link = LINK2.exec(part);
2937
+ if (link) {
2938
+ return /* @__PURE__ */ jsxRuntime.jsx(TextLink, { href: link[2] ?? "", children: link[1] }, i);
2939
+ }
2940
+ return /* @__PURE__ */ jsxRuntime.jsx(react.Fragment, { children: part }, i);
2941
+ }) });
2942
+ }
2943
+ function BlockView({ block }) {
2944
+ switch (block.kind) {
2945
+ case "para":
2946
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: block.text.split(/\n{2,}/).map((para, i) => /* @__PURE__ */ jsxRuntime.jsx("p", { children: /* @__PURE__ */ jsxRuntime.jsx(Inline, { text: para }) }, i)) });
2947
+ case "subhead":
2948
+ return /* @__PURE__ */ jsxRuntime.jsx("h3", { children: /* @__PURE__ */ jsxRuntime.jsx(Inline, { text: headingCase(block.text) }) });
2949
+ case "bullets":
2950
+ return /* @__PURE__ */ jsxRuntime.jsx("ul", { children: block.items.map(
2951
+ (item, i) => typeof item === "string" ? /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(Inline, { text: item }) }, i) : /* @__PURE__ */ jsxRuntime.jsxs("li", { children: [
2952
+ /* @__PURE__ */ jsxRuntime.jsxs("strong", { children: [
2953
+ headingCase(item.k),
2954
+ "."
2955
+ ] }),
2956
+ " ",
2957
+ /* @__PURE__ */ jsxRuntime.jsx(Inline, { text: openSentence(item.v) })
2958
+ ] }, i)
2959
+ ) });
2960
+ case "callout":
2961
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "not-prose my-6", children: /* @__PURE__ */ jsxRuntime.jsx(Notice, { tone: block.emphatic ? "brand" : "neutral", children: /* @__PURE__ */ jsxRuntime.jsx(Inline, { text: block.text }) }) });
2962
+ case "stub":
2963
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "not-prose my-6", children: /* @__PURE__ */ jsxRuntime.jsx(Notice, { tone: "brand", title: "Pending counsel review", children: /* @__PURE__ */ jsxRuntime.jsx(Inline, { text: block.text }) }) });
2964
+ }
2965
+ }
2966
+ function LegalDocument({ doc, className }) {
2967
+ return /* @__PURE__ */ jsxRuntime.jsx(
2968
+ DocLayout,
2969
+ {
2970
+ className,
2971
+ header: /* @__PURE__ */ jsxRuntime.jsx(
2972
+ DocHeader,
2973
+ {
2974
+ eyebrow: headingCase(doc.eyebrow),
2975
+ title: doc.title,
2976
+ lead: doc.description,
2977
+ meta: `Effective ${doc.effective} \xB7 last updated ${doc.updated}`
2978
+ }
2979
+ ),
2980
+ toc: doc.sections.map((s) => ({ id: s.id, label: headingCase(s.heading) })),
2981
+ children: /* @__PURE__ */ jsxRuntime.jsx("article", { className: "min-w-0", children: /* @__PURE__ */ jsxRuntime.jsxs(Prose, { children: [
2982
+ doc.preamble?.map((b, i) => /* @__PURE__ */ jsxRuntime.jsx(BlockView, { block: b }, i)),
2983
+ doc.sections.map((s) => /* @__PURE__ */ jsxRuntime.jsxs("section", { children: [
2984
+ /* @__PURE__ */ jsxRuntime.jsxs("h2", { id: s.id, className: "scroll-mt-24", children: [
2985
+ s.num ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "oca-tabular text-muted-foreground", children: [
2986
+ s.num,
2987
+ " "
2988
+ ] }) : null,
2989
+ headingCase(s.heading)
2990
+ ] }),
2991
+ s.hint ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[0.9375rem]", children: headingCase(s.hint) }) : null,
2992
+ s.blocks.map((b, i) => /* @__PURE__ */ jsxRuntime.jsx(BlockView, { block: b }, i))
2993
+ ] }, s.id)),
2994
+ doc.summary ? /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mt-14 border-t border-border pt-6 text-[0.9375rem]", children: [
2995
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "In short." }),
2996
+ " ",
2997
+ sentencesCase(doc.summary.replace(/^summary:\s*/i, ""))
2998
+ ] }) : null
2999
+ ] }) })
3000
+ }
3001
+ );
3002
+ }
3003
+
3004
+ // src/family/index.ts
3005
+ var OCHK_IO = "https://ochk.io";
3006
+ var DOCS_HREF = `${OCHK_IO}/docs`;
3007
+ function protocol(slug, verb, line, kinds) {
3008
+ return {
3009
+ slug,
3010
+ label: slug,
3011
+ href: `${OCHK_IO}/${slug}`,
3012
+ group: "protocol",
3013
+ line,
3014
+ status: "live",
3015
+ verb,
3016
+ pageHref: `${OCHK_IO}/${slug}`,
3017
+ toolHref: `https://${slug}.ochk.io`,
3018
+ specHref: `https://github.com/orangecheck/oc-${slug}-protocol`,
3019
+ kinds
3020
+ };
3021
+ }
3022
+ var PROTOCOLS = [
3023
+ protocol("attest", "identity", "Show that an address holds bitcoin, and for how long.", "30078"),
3024
+ protocol("lock", "confidentiality", "Encrypt to a Bitcoin address, so only its holder can open it.", "30078"),
3025
+ protocol("vote", "legitimacy", "Polls weighed in sats, that anyone can tally.", "30080\u201330082"),
3026
+ protocol("stamp", "provenance", "Prove who signed something, and when.", "30083"),
3027
+ protocol("agent", "authority", "Give software scoped, revocable permission to act for you.", "30083\u201330086"),
3028
+ protocol("pledge", "commitment", "Make a promise with bitcoin behind it, on a public record.", "30078")
3029
+ ];
3030
+ var PROTOCOL_ORDER = PROTOCOLS.map((p) => p.slug);
3031
+ var FAMILY = [
3032
+ {
3033
+ slug: "home",
3034
+ label: "ochk.io",
3035
+ href: OCHK_IO,
3036
+ group: "orangecheck",
3037
+ line: "The open protocols, and the company behind them.",
3038
+ status: "live"
3039
+ },
3040
+ {
3041
+ slug: "me",
3042
+ label: "ochk.app",
3043
+ href: "https://ochk.app",
3044
+ group: "orangecheck",
3045
+ line: "One account, with Bitcoin behind it.",
3046
+ status: "testing"
3047
+ },
3048
+ {
3049
+ slug: "docs",
3050
+ label: "docs",
3051
+ href: DOCS_HREF,
3052
+ group: "orangecheck",
3053
+ line: "Specs, SDKs and guides for every protocol.",
3054
+ status: "live"
3055
+ },
3056
+ ...PROTOCOLS,
3057
+ {
3058
+ slug: "vault",
3059
+ label: "vault",
3060
+ href: "https://vault.ochk.io",
3061
+ group: "app",
3062
+ line: "A password manager, encrypted in your browser.",
3063
+ status: "live",
3064
+ protocols: ["lock"]
3065
+ },
3066
+ {
3067
+ slug: "chat",
3068
+ label: "chat",
3069
+ href: "https://chat.ochk.io",
3070
+ group: "app",
3071
+ line: "Messages only the holder of a Bitcoin address can read.",
3072
+ status: "testing",
3073
+ protocols: ["lock"]
3074
+ },
3075
+ {
3076
+ slug: "cosign",
3077
+ label: "cosign",
3078
+ href: "https://cosign.ochk.io",
3079
+ group: "app",
3080
+ line: "Builders find co-founders and backers.",
3081
+ status: "testing",
3082
+ protocols: ["attest"]
3083
+ },
3084
+ {
3085
+ slug: "me-demo",
3086
+ // "demo", not the made-up app's own name, so nobody takes it for ours.
3087
+ label: "demo",
3088
+ href: "https://me-demo.ochk.io",
3089
+ group: "app",
3090
+ line: "Lumen Notes, a made-up app that signs in with orangecheck.",
3091
+ status: "live"
3092
+ },
3093
+ {
3094
+ slug: "globe",
3095
+ label: "globe",
3096
+ href: "https://globe.ochk.io",
3097
+ group: "public-good",
3098
+ line: "The Bitcoin network, live, on a globe.",
3099
+ status: "live"
3100
+ },
3101
+ {
3102
+ slug: "btc",
3103
+ label: "btc",
3104
+ href: "https://btc.ochk.io",
3105
+ group: "public-good",
3106
+ line: "A free desk for reading the Bitcoin market.",
3107
+ status: "live"
3108
+ }
3109
+ ];
3110
+ var FAMILY_GROUPS = [
3111
+ { id: "orangecheck", label: "orangecheck" },
3112
+ { id: "protocol", label: "Protocols" },
3113
+ { id: "app", label: "Apps" },
3114
+ { id: "public-good", label: "Public goods" }
3115
+ ];
3116
+ var BY_SLUG = new Map(FAMILY.map((s) => [s.slug, s]));
3117
+ function familySite(slug) {
3118
+ return BY_SLUG.get(slug);
3119
+ }
3120
+ function protocolSite(slug) {
3121
+ return BY_SLUG.get(slug);
3122
+ }
3123
+ function familyByGroup() {
3124
+ return FAMILY_GROUPS.map((g) => ({ ...g, sites: FAMILY.filter((s) => s.group === g.id) }));
3125
+ }
3126
+ var LEGAL_LINKS = [
3127
+ { href: `${OCHK_IO}/privacy`, label: "Privacy" },
3128
+ { href: `${OCHK_IO}/terms`, label: "Terms" },
3129
+ { href: `${OCHK_IO}/security`, label: "Security" },
3130
+ { href: `${OCHK_IO}/trademark`, label: "Trademarks" },
3131
+ { href: `${OCHK_IO}/contact`, label: "Contact" }
3132
+ ];
3133
+ var OCHK_IO_NAV = [
3134
+ {
3135
+ href: `${OCHK_IO}/protocols`,
3136
+ label: "Protocols",
3137
+ children: PROTOCOLS.map((p) => ({ href: p.pageHref, label: p.label, description: p.line }))
3138
+ },
3139
+ { href: `${OCHK_IO}/apps`, label: "Apps" },
3140
+ { href: DOCS_HREF, label: "Docs" },
3141
+ { href: `${OCHK_IO}/trust`, label: "Trust" },
3142
+ { href: `${OCHK_IO}/about`, label: "About" }
3143
+ ];
3144
+ var OCHK_IO_FOOTER = [
3145
+ {
3146
+ heading: "Company",
3147
+ links: [
3148
+ { href: `${OCHK_IO}/about`, label: "About" },
3149
+ { href: `${OCHK_IO}/trust`, label: "Trust" },
3150
+ { href: "https://github.com/orangecheck", label: "GitHub", external: true }
3151
+ ]
3152
+ }
3153
+ ];
3154
+ var CARD = "group relative flex h-full flex-col rounded-[1.25rem] border border-border bg-card p-6 transition-colors hover:border-oca-hairline-strong md:p-7 has-[a:focus-visible]:ring-2 has-[a:focus-visible]:ring-ring has-[a:focus-visible]:ring-offset-2 has-[a:focus-visible]:ring-offset-background";
3155
+ var STRETCH = 'outline-none after:absolute after:inset-0 after:rounded-[1.25rem] after:content-[""]';
3156
+ var pad2 = (n) => String(n + 1).padStart(2, "0");
3157
+ function ProtocolGrid({
3158
+ protocols = PROTOCOL_ORDER,
3159
+ link = "page",
3160
+ className
3161
+ }) {
3162
+ return /* @__PURE__ */ jsxRuntime.jsx("ul", { className: cn("grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 md:gap-5", className), children: protocols.map((slug) => {
3163
+ const p = protocolSite(slug);
3164
+ const i = PROTOCOL_ORDER.indexOf(slug);
3165
+ return /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(CARD, "gap-4"), children: [
3166
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-3", children: [
3167
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "oca-numeral", children: [
3168
+ pad2(i),
3169
+ " ",
3170
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1.5 capitalize", children: p.verb })
3171
+ ] }),
3172
+ p.status !== "live" ? /* @__PURE__ */ jsxRuntime.jsx(StatusBadge, { status: p.status }) : null
3173
+ ] }),
3174
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "oca-display-3", children: /* @__PURE__ */ jsxRuntime.jsx("a", { href: link === "tool" ? p.toolHref : p.pageHref, className: STRETCH, children: p.label }) }),
3175
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "oca-body", children: p.line }),
3176
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-auto flex items-center justify-between gap-3 pt-2 text-[0.875rem] text-muted-foreground", children: [
3177
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "oca-tabular", children: [
3178
+ "Nostr kind ",
3179
+ p.kinds
3180
+ ] }),
3181
+ /* @__PURE__ */ jsxRuntime.jsx(
3182
+ lucideReact.ArrowUpRight,
3183
+ {
3184
+ "aria-hidden": true,
3185
+ className: "size-4 transition-transform duration-200 group-hover:-translate-y-0.5 group-hover:translate-x-0.5 group-hover:text-foreground"
3186
+ }
3187
+ )
3188
+ ] })
3189
+ ] }) }, slug);
3190
+ }) });
3191
+ }
3192
+ function AppCard({ name, line, href, protocols = [], status = "live", className }) {
3193
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(CARD, "gap-3", className), children: [
3194
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between gap-3", children: [
3195
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "oca-title", children: /* @__PURE__ */ jsxRuntime.jsx("a", { href, className: STRETCH, children: name }) }),
3196
+ status !== "live" ? /* @__PURE__ */ jsxRuntime.jsx(StatusBadge, { status }) : null
3197
+ ] }),
3198
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "oca-body text-[0.9375rem]", children: line }),
3199
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-auto flex items-end justify-between gap-3 pt-3", children: [
3200
+ protocols.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "flex flex-wrap items-center gap-1.5 text-[0.8125rem] text-muted-foreground", children: [
3201
+ "Shows",
3202
+ protocols.map((p) => /* @__PURE__ */ jsxRuntime.jsx(Badge, { tone: "muted", children: p }, p))
3203
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx("span", {}),
3204
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex shrink-0 items-center gap-1 text-[0.875rem] text-muted-foreground transition-colors group-hover:text-foreground", children: [
3205
+ href.replace(/^https?:\/\//, ""),
3206
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowUpRight, { "aria-hidden": true, className: "size-4" })
3207
+ ] })
3208
+ ] })
3209
+ ] });
3210
+ }
3211
+ function AppGrid({
3212
+ group = "app",
3213
+ sites,
3214
+ className
3215
+ }) {
3216
+ const list = sites ? sites.map((slug) => FAMILY.find((s) => s.slug === slug)).filter((s) => s !== void 0) : FAMILY.filter((s) => s.group === group);
3217
+ return /* @__PURE__ */ jsxRuntime.jsx("ul", { className: cn("grid grid-cols-1 gap-4 sm:grid-cols-2 md:gap-5", className), children: list.map((s) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(AppCard, { name: s.label, line: s.line, href: s.href, protocols: s.protocols, status: s.status }) }, s.slug)) });
3218
+ }
3219
+ function ProtocolHero({
3220
+ protocol: protocol2,
3221
+ title,
3222
+ lead,
3223
+ actions,
3224
+ art,
3225
+ children,
3226
+ className
3227
+ }) {
3228
+ const p = protocolSite(protocol2);
3229
+ return /* @__PURE__ */ jsxRuntime.jsx(
3230
+ PageHero,
3231
+ {
3232
+ className,
3233
+ eyebrow: `Protocol \xB7 ${p.verb}`,
3234
+ title,
3235
+ lead,
3236
+ actions,
3237
+ art,
3238
+ children: p.status !== "live" || children ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-start gap-4", children: [
3239
+ p.status !== "live" ? /* @__PURE__ */ jsxRuntime.jsx(StatusBadge, { status: p.status }) : null,
3240
+ children
3241
+ ] }) : null
3242
+ }
3243
+ );
3244
+ }
3245
+ function ProtocolNav({
3246
+ current: current2,
3247
+ link = "page",
3248
+ className
3249
+ }) {
3250
+ return /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Protocols", className, children: /* @__PURE__ */ jsxRuntime.jsx(ScrollFade, { fade: "var(--background)", children: /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex w-max min-w-full items-center gap-6 border-b border-border", children: PROTOCOLS.map((p) => {
3251
+ const on = p.slug === current2;
3252
+ return /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
3253
+ "a",
3254
+ {
3255
+ href: link === "tool" ? p.toolHref : p.pageHref,
3256
+ "aria-current": on ? "page" : void 0,
3257
+ className: cn(
3258
+ "-mb-px inline-flex h-11 items-center border-b-2 text-[0.9375rem] transition-colors",
3259
+ on ? "border-foreground text-foreground" : "border-transparent text-muted-foreground hover:text-foreground"
3260
+ ),
3261
+ children: p.label
3262
+ }
3263
+ ) }, p.slug);
3264
+ }) }) }) });
3265
+ }
3266
+ function SpecCard({
3267
+ protocol: protocol2,
3268
+ version,
3269
+ license,
3270
+ vectors,
3271
+ size = "md",
3272
+ className
3273
+ }) {
3274
+ const p = protocolSite(protocol2);
3275
+ const repo = `oc-${p.slug}-protocol`;
3276
+ const facts = [
3277
+ ["Version", version],
3278
+ ...license ? [["Licence", license]] : [],
3279
+ ["Nostr kind", p.kinds],
3280
+ ...vectors !== void 0 ? [["Test vectors", String(vectors)]] : []
3281
+ ];
3282
+ if (size === "sm") {
3283
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3284
+ "a",
3285
+ {
3286
+ href: p.specHref,
3287
+ className: cn(
3288
+ "group flex flex-wrap items-center gap-x-4 gap-y-1 rounded-2xl border border-border bg-card px-4 py-3 text-[0.875rem] transition-colors hover:border-oca-hairline-strong",
3289
+ className
3290
+ ),
3291
+ children: [
3292
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-mono text-[0.8125rem] text-foreground", children: repo }),
3293
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: facts.map(([k, v]) => k === "Version" ? `v${v}` : k === "Nostr kind" ? `kind ${v}` : v).join(" \xB7 ") }),
3294
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ml-auto flex items-center gap-1 text-muted-foreground group-hover:text-foreground", children: [
3295
+ "Read the spec ",
3296
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowUpRight, { "aria-hidden": true, className: "size-4" })
3297
+ ] })
3298
+ ]
3299
+ }
3300
+ );
3301
+ }
3302
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-6 rounded-[1.25rem] border border-border bg-card p-6 md:p-8", className), children: [
3303
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between gap-4", children: [
3304
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-col gap-1.5", children: [
3305
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[0.875rem] text-muted-foreground", children: "The spec" }),
3306
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "oca-title break-all font-mono text-[1.0625rem] tracking-normal", children: repo })
3307
+ ] }),
3308
+ p.status !== "live" ? /* @__PURE__ */ jsxRuntime.jsx(StatusBadge, { status: p.status }) : null
3309
+ ] }),
3310
+ /* @__PURE__ */ jsxRuntime.jsx("dl", { className: "grid grid-cols-2 gap-x-6 gap-y-4 sm:grid-cols-4", children: facts.map(([k, v]) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
3311
+ /* @__PURE__ */ jsxRuntime.jsx("dt", { className: "text-[0.8125rem] text-muted-foreground", children: k }),
3312
+ /* @__PURE__ */ jsxRuntime.jsx("dd", { className: "oca-tabular text-[1.0625rem]", children: v })
3313
+ ] }, k)) }),
3314
+ /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(Button, { asChild: true, variant: "secondary", size: "sm", children: /* @__PURE__ */ jsxRuntime.jsxs("a", { href: p.specHref, children: [
3315
+ "Read the spec ",
3316
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowUpRight, { "aria-hidden": true })
3317
+ ] }) }) })
3318
+ ] });
3319
+ }
3320
+ function VerifyBox({
3321
+ action,
3322
+ param = "q",
3323
+ title,
3324
+ description,
3325
+ label = "Id, envelope or link",
3326
+ placeholder,
3327
+ hint,
3328
+ submitLabel = "Verify",
3329
+ multiline = false,
3330
+ onVerify,
3331
+ className
3332
+ }) {
3333
+ const [value, setValue] = react.useState("");
3334
+ const submit = (e) => {
3335
+ if (!onVerify) return;
3336
+ e.preventDefault();
3337
+ if (value.trim()) onVerify(value.trim());
3338
+ };
3339
+ const button = /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "submit", className: multiline ? void 0 : "w-full sm:w-auto", children: submitLabel });
3340
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3341
+ "form",
3342
+ {
3343
+ action,
3344
+ method: "get",
3345
+ onSubmit: submit,
3346
+ className: cn("flex flex-col gap-5 rounded-[1.25rem] border border-border bg-card p-6 md:p-8", className),
3347
+ children: [
3348
+ title || description ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
3349
+ title ? /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "oca-title", children: title }) : null,
3350
+ description ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "oca-body text-[0.9375rem]", children: description }) : null
3351
+ ] }) : null,
3352
+ multiline ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3353
+ /* @__PURE__ */ jsxRuntime.jsx(Field, { label, hint, children: /* @__PURE__ */ jsxRuntime.jsx(
3354
+ Textarea,
3355
+ {
3356
+ name: param,
3357
+ required: true,
3358
+ value,
3359
+ onChange: (e) => setValue(e.target.value),
3360
+ placeholder,
3361
+ spellCheck: false,
3362
+ className: "min-h-32 font-mono text-base md:text-[0.8125rem]"
3363
+ }
3364
+ ) }),
3365
+ /* @__PURE__ */ jsxRuntime.jsx("div", { children: button })
3366
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx(Field, { label, hint, action: button, children: /* @__PURE__ */ jsxRuntime.jsx(
3367
+ Input,
3368
+ {
3369
+ name: param,
3370
+ required: true,
3371
+ value,
3372
+ onChange: (e) => setValue(e.target.value),
3373
+ placeholder,
3374
+ spellCheck: false,
3375
+ autoComplete: "off",
3376
+ className: "font-mono text-base md:text-[0.875rem]"
3377
+ }
3378
+ ) })
3379
+ ]
3380
+ }
3381
+ );
3382
+ }
3383
+ var TINT = "bg-[color-mix(in_oklab,var(--oca-orange)_9%,var(--card))]";
3384
+ function ComparisonTable({
3385
+ columns,
3386
+ rows,
3387
+ label,
3388
+ propertyHeading = "Property",
3389
+ className
3390
+ }) {
3391
+ const wide = columns.length > 3;
3392
+ const grid = wide ? "lg:grid lg:grid-cols-[var(--oca-compare)]" : "md:grid md:grid-cols-[var(--oca-compare)]";
3393
+ const desk = wide ? "lg" : "md";
3394
+ const style = {
3395
+ // The argued-for column gets a little more room: its answers carry the page.
3396
+ "--oca-compare": ["minmax(0, 1.4fr)", ...columns.map((c) => c.highlight ? "minmax(0, 1.3fr)" : "minmax(0, 1fr)")].join(" ")
3397
+ };
3398
+ const ordered = [...columns].sort((a, b) => Number(Boolean(b.highlight)) - Number(Boolean(a.highlight)));
3399
+ return /* @__PURE__ */ jsxRuntime.jsxs("ul", { "aria-label": label, style, className: cn("divide-y divide-border rounded-[1.25rem] border border-border bg-card", className), children: [
3400
+ /* @__PURE__ */ jsxRuntime.jsxs(
3401
+ "li",
3402
+ {
3403
+ "aria-hidden": true,
3404
+ className: cn(
3405
+ "hidden gap-5 px-5 py-4 text-[0.875rem] font-medium text-muted-foreground",
3406
+ wide ? "lg:grid lg:px-8" : "md:grid md:px-8",
3407
+ grid
3408
+ ),
3409
+ children: [
3410
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: propertyHeading }),
3411
+ columns.map((c) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(c.highlight && cn(TINT, "-my-4 px-4 py-4 text-oca-accent-ink")), children: c.label }, c.key))
3412
+ ]
3413
+ }
3414
+ ),
3415
+ rows.map((r, ri) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: cn("grid grid-cols-1 gap-3 px-5 py-5", wide ? "lg:items-start lg:gap-5 lg:px-8" : "md:items-start md:gap-5 md:px-8", grid), children: [
3416
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-col gap-1", children: [
3417
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "oca-title-sm", children: r.label }),
3418
+ r.note ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[0.875rem] leading-snug text-muted-foreground", children: r.note }) : null
3419
+ ] }),
3420
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("grid grid-cols-2 gap-1", desk === "lg" ? "lg:contents" : "md:contents"), children: columns.map((c) => {
3421
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3422
+ "div",
3423
+ {
3424
+ style: { "--oca-order": ordered.indexOf(c) },
3425
+ className: cn(
3426
+ // Two rows of the pair's grid (name, answer), so answers line up
3427
+ // across a pair even when one name wraps.
3428
+ "order-[var(--oca-order)] row-span-2 grid min-w-0 grid-rows-subgrid gap-1 rounded-xl px-3 py-2.5",
3429
+ desk === "lg" ? "lg:order-none lg:row-span-1 lg:flex lg:flex-col" : "md:order-none md:row-span-1 md:flex md:flex-col",
3430
+ c.highlight ? cn(
3431
+ TINT,
3432
+ "col-span-2",
3433
+ desk === "lg" ? "lg:col-span-1 lg:-my-5 lg:self-stretch lg:rounded-none lg:px-4 lg:py-5" : "md:col-span-1 md:-my-5 md:self-stretch md:rounded-none md:px-4 md:py-5"
3434
+ ) : desk === "lg" ? "lg:p-0" : "md:p-0"
3435
+ ),
3436
+ children: [
3437
+ /* @__PURE__ */ jsxRuntime.jsx(
3438
+ "span",
3439
+ {
3440
+ className: cn(
3441
+ "text-[0.8125rem]",
3442
+ c.highlight ? "text-oca-accent-ink" : "text-muted-foreground",
3443
+ desk === "lg" ? "lg:sr-only" : "md:sr-only"
3444
+ ),
3445
+ children: c.label
3446
+ }
3447
+ ),
3448
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("text-[0.9375rem]", c.highlight && "font-medium"), children: r.values[c.key] ?? "\u2014" })
3449
+ ]
3450
+ },
3451
+ c.key
3452
+ );
3453
+ }) })
3454
+ ] }, ri))
3455
+ ] });
3456
+ }
3457
+ var CHECK = {
3458
+ ok: { word: "Passed", icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CircleCheck, {}), tone: "text-success" },
3459
+ fail: { word: "Failed", icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CircleX, {}), tone: "text-destructive" },
3460
+ pending: { word: "Pending", icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Clock, {}), tone: "text-oca-accent-ink" },
3461
+ skipped: { word: "Skipped", icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CircleMinus, {}), tone: "text-muted-foreground" },
3462
+ unchecked: { word: "Not checked", icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CircleDashed, {}), tone: "text-oca-subtle" }
3463
+ };
3464
+ function VerifyReport({
3465
+ verdict,
3466
+ title,
3467
+ summary,
3468
+ checks,
3469
+ facts,
3470
+ notChecked,
3471
+ actions,
3472
+ className
3473
+ }) {
3474
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3475
+ "section",
3476
+ {
3477
+ "aria-label": "Verification result",
3478
+ className: cn("overflow-hidden rounded-[1.25rem] border border-border bg-card", className),
3479
+ children: [
3480
+ /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "flex flex-col items-start gap-3 p-6 md:p-8", children: [
3481
+ /* @__PURE__ */ jsxRuntime.jsx(StatusBadge, { status: verdict }),
3482
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "oca-display-3", children: title }),
3483
+ summary ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "oca-body max-w-[40rem]", children: summary }) : null
3484
+ ] }),
3485
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { "aria-label": "Checks", className: "divide-y divide-border border-t border-border", children: checks.map((c, i) => {
3486
+ const k = CHECK[c.state];
3487
+ return /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start gap-3 px-6 py-3.5 md:px-8", children: [
3488
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: cn("mt-0.5 shrink-0 [&_svg]:size-[1.125rem]", k.tone), children: k.icon }),
3489
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-0.5 sm:flex-row sm:items-baseline sm:justify-between sm:gap-6", children: [
3490
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-col gap-0.5", children: [
3491
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[0.9375rem]", children: c.label }),
3492
+ c.note ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "break-words text-[0.8125rem] leading-snug text-muted-foreground", children: c.note }) : null
3493
+ ] }),
3494
+ /* @__PURE__ */ jsxRuntime.jsx(
3495
+ "span",
3496
+ {
3497
+ className: cn(
3498
+ "shrink-0 text-[0.8125rem]",
3499
+ c.state === "fail" ? "text-destructive" : "text-muted-foreground"
3500
+ ),
3501
+ children: k.word
3502
+ }
3503
+ )
3504
+ ] })
3505
+ ] }, i);
3506
+ }) }),
3507
+ facts && facts.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(KeyValueList, { items: facts, className: "rounded-none border-x-0 border-b-0 bg-transparent [&>div]:px-6 md:[&>div]:px-8" }) : null,
3508
+ notChecked && notChecked.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2 border-t border-border bg-muted/50 px-6 py-5 md:px-8", children: [
3509
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[0.875rem] font-medium", children: "What this did not check" }),
3510
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex list-disc flex-col gap-1 pl-5 text-[0.875rem] leading-relaxed text-muted-foreground", children: notChecked.map((n, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: n }, i)) })
3511
+ ] }) : null,
3512
+ actions ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-3 border-t border-border px-6 py-5 md:px-8", children: actions }) : null
3513
+ ]
3514
+ }
3515
+ );
3516
+ }
3517
+ function SignMessage({
3518
+ lead,
3519
+ address,
3520
+ message,
3521
+ wallets,
3522
+ busy = false,
3523
+ error,
3524
+ submitLabel = "Confirm",
3525
+ secondary,
3526
+ onSignature,
3527
+ className
3528
+ }) {
3529
+ const [pasted, setPasted] = react.useState("");
3530
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-5", className), children: [
3531
+ lead ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[0.9375rem] leading-relaxed", children: lead }) : null,
3532
+ wallets ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3533
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-2", children: wallets }),
3534
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 text-[0.8125rem] text-muted-foreground", children: [
3535
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-px flex-1 bg-border" }),
3536
+ "or sign it in any wallet",
3537
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-px flex-1 bg-border" })
3538
+ ] })
3539
+ ] }) : null,
3540
+ /* @__PURE__ */ jsxRuntime.jsx(CodeBlock, { code: message, caption: "Message to sign" }),
3541
+ /* @__PURE__ */ jsxRuntime.jsxs(
3542
+ "form",
3543
+ {
3544
+ className: "flex flex-col gap-4",
3545
+ onSubmit: (e) => {
3546
+ e.preventDefault();
3547
+ if (pasted.trim()) onSignature(pasted.trim());
3548
+ },
3549
+ children: [
3550
+ /* @__PURE__ */ jsxRuntime.jsx(
3551
+ Field,
3552
+ {
3553
+ label: "Signature",
3554
+ error,
3555
+ hint: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3556
+ "From your wallet\u2019s \u201Csign message\u201D (BIP-322), signed by",
3557
+ " ",
3558
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "break-all font-mono", children: address }),
3559
+ "."
3560
+ ] }),
3561
+ children: /* @__PURE__ */ jsxRuntime.jsx(
3562
+ Textarea,
3563
+ {
3564
+ value: pasted,
3565
+ onChange: (e) => setPasted(e.target.value),
3566
+ rows: 3,
3567
+ spellCheck: false,
3568
+ className: "min-h-24 font-mono text-base md:text-[0.8125rem]"
3569
+ }
3570
+ )
3571
+ }
3572
+ ),
3573
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap gap-2", children: [
3574
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "submit", loading: busy, disabled: !pasted.trim(), children: submitLabel }),
3575
+ secondary
3576
+ ] })
3577
+ ]
3578
+ }
3579
+ )
3580
+ ] });
3581
+ }
3582
+ function SiteRow({ site, here, onNavigate }) {
3583
+ return /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsxs(
3584
+ "a",
3585
+ {
3586
+ href: site.href,
3587
+ onClick: onNavigate,
3588
+ "aria-current": here ? "page" : void 0,
3589
+ className: cn(
3590
+ "flex flex-col gap-0.5 rounded-xl px-3 py-2 transition-colors hover:bg-accent",
3591
+ here && "bg-muted hover:bg-muted dark:bg-white/[0.06]"
3592
+ ),
3593
+ children: [
3594
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2 text-[0.9375rem] font-medium leading-6", children: [
3595
+ site.label,
3596
+ site.status !== "live" ? /* @__PURE__ */ jsxRuntime.jsx(StatusBadge, { status: site.status }) : null,
3597
+ here ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "(this site)" }) : null
3598
+ ] }),
3599
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[0.8125rem] leading-snug text-muted-foreground", children: site.line })
3600
+ ]
3601
+ }
3602
+ ) });
3603
+ }
3604
+ var PLACE = {
3605
+ orangecheck: "sm:col-start-1 sm:row-start-1 lg:row-span-2",
3606
+ protocol: "sm:col-start-1 sm:row-start-2 lg:col-start-2 lg:row-start-1 lg:row-span-2",
3607
+ app: "sm:col-start-2 sm:row-start-1 lg:col-start-3",
3608
+ "public-good": "sm:col-start-2 sm:row-start-2 lg:col-start-3"
3609
+ };
3610
+ function FamilyList({
3611
+ current: current2,
3612
+ onNavigate,
3613
+ stack = false,
3614
+ className
3615
+ }) {
3616
+ const id = react.useId();
3617
+ return /* @__PURE__ */ jsxRuntime.jsx(
3618
+ "div",
3619
+ {
3620
+ className: cn(
3621
+ "grid grid-cols-1 gap-x-2 gap-y-4",
3622
+ // The second desk row takes the slack, so the public goods sit right under the apps.
3623
+ !stack && "sm:grid-cols-2 lg:grid-cols-3 lg:grid-rows-[auto_1fr]",
3624
+ className
3625
+ ),
3626
+ children: familyByGroup().map((g) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-1", !stack && PLACE[g.id]), children: [
3627
+ /* @__PURE__ */ jsxRuntime.jsx("p", { id: `${id}-${g.id}`, className: "px-3 pt-1 text-[0.8125rem] text-muted-foreground", children: g.label }),
3628
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { "aria-labelledby": `${id}-${g.id}`, className: "flex flex-col", children: g.sites.map((s) => /* @__PURE__ */ jsxRuntime.jsx(SiteRow, { site: s, here: s.slug === current2, onNavigate }, s.slug)) })
3629
+ ] }, g.id))
3630
+ }
3631
+ );
3632
+ }
3633
+ function FamilyMenu({ current: current2, className }) {
3634
+ const [open, setOpen] = react.useState(false);
3635
+ return /* @__PURE__ */ jsxRuntime.jsxs(Popover, { open, onOpenChange: setOpen, children: [
3636
+ /* @__PURE__ */ jsxRuntime.jsx(
3637
+ PopoverTrigger,
3638
+ {
3639
+ "aria-label": "All orangecheck sites",
3640
+ className: cn(
3641
+ "group inline-flex size-8 shrink-0 items-center justify-center rounded-full text-muted-foreground transition-colors",
3642
+ "hover:bg-accent hover:text-foreground data-[state=open]:bg-accent data-[state=open]:text-foreground",
3643
+ className
3644
+ ),
3645
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { "aria-hidden": true, className: "size-4 transition-transform duration-200 group-data-[state=open]:rotate-180" })
3646
+ }
3647
+ ),
3648
+ /* @__PURE__ */ jsxRuntime.jsx(
3649
+ PopoverContent,
3650
+ {
3651
+ align: "start",
3652
+ sideOffset: 14,
3653
+ collisionPadding: 16,
3654
+ className: "max-h-[min(40rem,var(--radix-popover-content-available-height))] w-[min(calc(100vw-2rem),42rem)] overflow-y-auto p-3 lg:w-[min(calc(100vw-2rem),56rem)]",
3655
+ children: /* @__PURE__ */ jsxRuntime.jsx(FamilyList, { current: current2, onNavigate: () => setOpen(false) })
3656
+ }
3657
+ )
3658
+ ] });
3659
+ }
3660
+ function NavLink({ item, className, onNavigate }) {
3661
+ const cls = cn(
3662
+ "rounded-full px-3 py-2 text-[0.9375rem] transition-colors",
3663
+ item.active ? "text-foreground" : "text-muted-foreground hover:text-foreground",
3664
+ className
3665
+ );
3666
+ if (item.external) {
3667
+ return /* @__PURE__ */ jsxRuntime.jsx("a", { href: item.href, className: cls, rel: "noreferrer", onClick: onNavigate, children: item.label });
3668
+ }
3669
+ return /* @__PURE__ */ jsxRuntime.jsx(Link5__default.default, { href: item.href, className: cls, "aria-current": item.active ? "page" : void 0, onClick: onNavigate, children: item.label });
3670
+ }
3671
+ function NavRow({ item, onNavigate }) {
3672
+ const body = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3673
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[0.9375rem] font-medium leading-6 text-foreground", children: item.label }),
3674
+ item.description ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[0.8125rem] leading-snug text-muted-foreground", children: item.description }) : null
3675
+ ] });
3676
+ const cls = cn(
3677
+ "flex flex-col gap-0.5 rounded-xl px-3 py-2 transition-colors hover:bg-accent",
3678
+ item.active && "bg-muted hover:bg-muted dark:bg-white/[0.06]"
3679
+ );
3680
+ return item.external ? /* @__PURE__ */ jsxRuntime.jsx("a", { href: item.href, className: cls, rel: "noreferrer", onClick: onNavigate, children: body }) : /* @__PURE__ */ jsxRuntime.jsx(Link5__default.default, { href: item.href, className: cls, "aria-current": item.active ? "page" : void 0, onClick: onNavigate, children: body });
3681
+ }
3682
+ var seeAll = (item) => typeof item.label === "string" ? `All ${item.label.toLowerCase()}` : "See all";
3683
+ function NavDropdown({ item }) {
3684
+ const [open, setOpen] = react.useState(false);
3685
+ const active = item.active || item.children?.some((c) => c.active);
3686
+ return /* @__PURE__ */ jsxRuntime.jsxs(Popover, { open, onOpenChange: setOpen, children: [
3687
+ /* @__PURE__ */ jsxRuntime.jsxs(
3688
+ PopoverTrigger,
3689
+ {
3690
+ className: cn(
3691
+ "group inline-flex items-center gap-1 rounded-full py-2 pl-3 pr-2.5 text-[0.9375rem] transition-colors",
3692
+ active ? "text-foreground" : "text-muted-foreground hover:text-foreground data-[state=open]:text-foreground"
3693
+ ),
3694
+ children: [
3695
+ item.label,
3696
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { "aria-hidden": true, className: "size-3.5 transition-transform duration-200 group-data-[state=open]:rotate-180" })
3697
+ ]
3698
+ }
3699
+ ),
3700
+ /* @__PURE__ */ jsxRuntime.jsxs(PopoverContent, { align: "center", sideOffset: 10, className: "w-[min(calc(100vw-2rem),26rem)] p-2", children: [
3701
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col", children: item.children?.map((c) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(NavRow, { item: c, onNavigate: () => setOpen(false) }) }, c.href)) }),
3702
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1.5 border-t border-border px-1 pt-1.5", children: /* @__PURE__ */ jsxRuntime.jsx(
3703
+ NavLink,
3704
+ {
3705
+ item: { ...item, label: seeAll(item), children: void 0 },
3706
+ className: "block rounded-xl px-2 py-2 text-[0.875rem]",
3707
+ onNavigate: () => setOpen(false)
3708
+ }
3709
+ ) })
3710
+ ] })
3711
+ ] });
3712
+ }
3713
+ function SiteHeader({
3714
+ home = "/",
3715
+ brand,
3716
+ product,
3717
+ family,
3718
+ nav = [],
3719
+ search,
3720
+ actions,
3721
+ variant = "site",
3722
+ className
3723
+ }) {
3724
+ const [open, setOpen] = react.useState(false);
3725
+ const tool = variant === "tool";
3726
+ const size = tool ? 24 : 28;
3727
+ const current2 = typeof family === "string" ? family : void 0;
3728
+ const menu = nav.length > 0 || Boolean(family);
3729
+ const brandNode = brand ?? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center", children: [
3730
+ /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size }),
3731
+ product ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3732
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "mx-3 h-5 w-px bg-oca-hairline-strong" }),
3733
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium tracking-[-0.01em]", style: { fontSize: size * 0.56 }, children: product })
3734
+ ] }) : null
3735
+ ] });
3736
+ const navigation = nav.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Main", className: "hidden items-center gap-1 md:flex", children: nav.map((n) => n.children?.length ? /* @__PURE__ */ jsxRuntime.jsx(NavDropdown, { item: n }, n.href) : /* @__PURE__ */ jsxRuntime.jsx(NavLink, { item: n }, n.href)) }) : null;
3737
+ return /* @__PURE__ */ jsxRuntime.jsx(
3738
+ "header",
3739
+ {
3740
+ className: cn(
3741
+ "sticky top-0 z-40 w-full border-b bg-background/95 backdrop-blur-md supports-[backdrop-filter]:bg-background/90",
3742
+ tool ? "border-border" : "border-transparent",
3743
+ className
3744
+ ),
3745
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
3746
+ "div",
3747
+ {
3748
+ className: cn(
3749
+ "flex items-center justify-between gap-4",
3750
+ tool ? "h-14 px-4 md:px-6" : "oca-container h-16 md:h-[4.5rem]",
3751
+ // Three columns, the outer two each at least their content: the
3752
+ // navigation stays centred whatever the actions hold, so it does
3753
+ // not shift when they change (signed out to signed in).
3754
+ !tool && nav.length > 0 && "md:grid md:grid-cols-[minmax(max-content,1fr)_auto_minmax(max-content,1fr)]"
3755
+ ),
3756
+ children: [
3757
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex min-w-0 items-center gap-1", tool ? "md:gap-1" : "justify-self-start"), children: [
3758
+ /* @__PURE__ */ jsxRuntime.jsxs(Link5__default.default, { href: home, className: "-ml-1 min-w-0 rounded-lg p-1", children: [
3759
+ brandNode,
3760
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: " home" })
3761
+ ] }),
3762
+ family ? /* @__PURE__ */ jsxRuntime.jsx(FamilyMenu, { current: current2, className: "max-md:hidden" }) : null,
3763
+ tool && navigation ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-5", children: navigation }) : null
3764
+ ] }),
3765
+ !tool ? navigation : null,
3766
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 justify-self-end", children: [
3767
+ search,
3768
+ actions,
3769
+ menu ? /* @__PURE__ */ jsxRuntime.jsxs(Sheet, { open, onOpenChange: setOpen, children: [
3770
+ /* @__PURE__ */ jsxRuntime.jsx(
3771
+ SheetTrigger,
3772
+ {
3773
+ className: "inline-flex size-10 items-center justify-center rounded-full text-foreground hover:bg-accent md:hidden",
3774
+ "aria-label": "Open menu",
3775
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Menu, { className: "size-5" })
3776
+ }
3777
+ ),
3778
+ /* @__PURE__ */ jsxRuntime.jsxs(SheetContent, { side: "right", className: "pt-16", children: [
3779
+ /* @__PURE__ */ jsxRuntime.jsx(SheetTitle, { className: "sr-only", children: "Menu" }),
3780
+ nav.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Main", className: "flex flex-col", children: nav.map(
3781
+ (n) => n.children?.length ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col py-2", children: [
3782
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "px-3 pb-1 text-[0.8125rem] text-muted-foreground", children: n.label }),
3783
+ n.children.map((c) => /* @__PURE__ */ jsxRuntime.jsx(
3784
+ NavLink,
3785
+ {
3786
+ item: c,
3787
+ className: "rounded-xl px-3 py-2.5 text-[1.0625rem]",
3788
+ onNavigate: () => setOpen(false)
3789
+ },
3790
+ c.href
3791
+ ))
3792
+ ] }, n.href) : /* @__PURE__ */ jsxRuntime.jsx(
3793
+ NavLink,
3794
+ {
3795
+ item: n,
3796
+ className: "rounded-xl px-3 py-3 text-[1.0625rem]",
3797
+ onNavigate: () => setOpen(false)
3798
+ },
3799
+ n.href
3800
+ )
3801
+ ) }) : null,
3802
+ family ? /* @__PURE__ */ jsxRuntime.jsxs("details", { className: cn("group", nav.length > 0 && "mt-2 border-t border-border pt-4"), children: [
3803
+ /* @__PURE__ */ jsxRuntime.jsxs("summary", { className: "flex cursor-pointer list-none items-center justify-between rounded-xl px-3 py-2.5 text-[1.0625rem] [&::-webkit-details-marker]:hidden", children: [
3804
+ "All orangecheck sites",
3805
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { "aria-hidden": true, className: "size-4 text-muted-foreground transition-transform group-open:rotate-180" })
3806
+ ] }),
3807
+ /* @__PURE__ */ jsxRuntime.jsx(FamilyList, { current: current2, onNavigate: () => setOpen(false), stack: true, className: "mt-2" })
3808
+ ] }) : null
3809
+ ] })
3810
+ ] }) : null
3811
+ ] })
3812
+ ]
3813
+ }
3814
+ )
3815
+ }
3816
+ );
3817
+ }
3818
+ function SkipLink({ href = "#main-content", children = "Skip to content" }) {
3819
+ return /* @__PURE__ */ jsxRuntime.jsx(
3820
+ "a",
3821
+ {
3822
+ href,
3823
+ className: "sr-only focus:not-sr-only focus:fixed focus:left-4 focus:top-3 focus:z-50 focus:rounded-full focus:border focus:border-border focus:bg-card focus:px-4 focus:py-2 focus:text-[0.9375rem] focus:font-medium focus:text-foreground focus:shadow-md",
3824
+ children
3825
+ }
3826
+ );
3827
+ }
3828
+ var BANNER_TONE = {
3829
+ neutral: "border-border bg-muted",
3830
+ brand: "border-[color-mix(in_oklab,var(--oca-orange)_30%,var(--border))] bg-[color-mix(in_oklab,var(--oca-orange)_9%,var(--background))]",
3831
+ danger: "border-[color-mix(in_oklab,var(--destructive)_35%,var(--border))] bg-[color-mix(in_oklab,var(--destructive)_8%,var(--background))]"
3832
+ };
3833
+ function SiteBanner({
3834
+ tone = "neutral",
3835
+ children,
3836
+ action,
3837
+ className
3838
+ }) {
3839
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { role: "status", "aria-live": "polite", "data-tone": tone, className: cn("border-b text-[0.875rem]", BANNER_TONE[tone], className), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "oca-container flex flex-wrap items-center justify-between gap-x-4 gap-y-1 py-2.5", children: [
3840
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "flex min-w-0 items-baseline gap-2.5 leading-snug", children: [
3841
+ tone !== "neutral" ? /* @__PURE__ */ jsxRuntime.jsx(
3842
+ "span",
3843
+ {
3844
+ "aria-hidden": true,
3845
+ className: cn(
3846
+ "size-2 shrink-0 translate-y-[-0.05em] rounded-full",
3847
+ tone === "brand" ? "bg-oca-orange" : "bg-destructive"
3848
+ )
3849
+ }
3850
+ ) : null,
3851
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children })
3852
+ ] }),
3853
+ action ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("shrink-0 font-medium", tone !== "neutral" && "max-sm:pl-[1.125rem]"), children: action }) : null
3854
+ ] }) });
3855
+ }
3856
+ var FOOT_LINK = "inline-flex min-h-11 items-center transition-colors hover:text-foreground md:min-h-0";
3857
+ function LegalRow() {
3858
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-x-6 gap-y-2 sm:flex-row sm:items-center sm:justify-between", children: [
3859
+ /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Legal", children: /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-wrap gap-x-5", children: LEGAL_LINKS.map((l) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx("a", { href: l.href, className: FOOT_LINK, children: l.label }) }, l.href)) }) }),
3860
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
3861
+ "\xA9 ",
3862
+ (/* @__PURE__ */ new Date()).getFullYear(),
3863
+ " OrangeCheck"
3864
+ ] })
3865
+ ] });
3866
+ }
3867
+ function SiteFooter({
3868
+ columns = [],
3869
+ family = false,
3870
+ legal = false,
3871
+ compact = false,
3872
+ fineprint,
3873
+ meta,
3874
+ signature = true,
3875
+ className
3876
+ }) {
3877
+ if (compact) {
3878
+ return /* @__PURE__ */ jsxRuntime.jsx("footer", { className: cn("border-t border-border bg-background text-[0.875rem] text-muted-foreground", className), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "oca-container flex flex-col gap-x-8 gap-y-3 py-5 lg:flex-row lg:items-center lg:justify-between", children: [
3879
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-6 gap-y-1", children: [
3880
+ /* @__PURE__ */ jsxRuntime.jsx("a", { href: OCHK_IO, className: "rounded-lg text-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 22 }) }),
3881
+ family ? /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Protocols", children: /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-wrap gap-x-4", children: PROTOCOLS.map((p) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx("a", { href: p.pageHref, className: FOOT_LINK, children: p.label }) }, p.slug)) }) }) : null
3882
+ ] }),
3883
+ legal || meta ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-x-6 gap-y-2 sm:flex-row sm:flex-wrap sm:items-center", children: [
3884
+ legal ? /* @__PURE__ */ jsxRuntime.jsx(LegalRow, {}) : null,
3885
+ meta
3886
+ ] }) : null
3887
+ ] }) });
3888
+ }
3889
+ const cols = [
3890
+ ...columns,
3891
+ ...family ? familyByGroup().map((g) => ({
3892
+ // The lockup above already says orangecheck.
3893
+ heading: g.id === "orangecheck" ? "Start here" : g.label,
3894
+ links: g.sites.map((s) => ({ href: s.href, label: s.label, external: true }))
3895
+ })) : []
3896
+ ];
3897
+ const n = cols.length;
3898
+ const inline = n <= 5;
3899
+ const grid = {
3900
+ "--oca-footer-md": `repeat(${Math.max(1, Math.min(n, 4))}, minmax(0, 1fr))`,
3901
+ "--oca-footer-lg": inline ? `minmax(0, 1.3fr) repeat(${Math.max(1, n)}, minmax(0, 1fr))` : `repeat(${Math.min(n, 6)}, minmax(0, 1fr))`
3902
+ };
3903
+ return /* @__PURE__ */ jsxRuntime.jsxs("footer", { className: cn("border-t border-border bg-background", className), children: [
3904
+ /* @__PURE__ */ jsxRuntime.jsxs(
3905
+ "div",
3906
+ {
3907
+ style: grid,
3908
+ className: "oca-container grid grid-cols-2 gap-x-6 gap-y-10 py-14 md:grid-cols-[var(--oca-footer-md)] md:py-16 lg:grid-cols-[var(--oca-footer-lg)]",
3909
+ children: [
3910
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("col-span-full flex flex-col gap-4", inline && "lg:col-span-1"), children: [
3911
+ /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 26 }),
3912
+ fineprint ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "max-w-xs text-[0.9375rem] leading-relaxed text-muted-foreground", children: fineprint }) : null
3913
+ ] }),
3914
+ cols.map((col, i) => {
3915
+ const spans = n % 2 === 1 && i === n - 1;
3916
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3917
+ "div",
3918
+ {
3919
+ className: cn("flex min-w-0 flex-col gap-1", spans && "col-span-2 md:col-span-1"),
3920
+ children: [
3921
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-[0.875rem] font-medium", children: col.heading }),
3922
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex flex-col gap-1", spans && "grid grid-cols-2 gap-x-6 md:flex md:flex-col"), children: col.links.map((l) => /* @__PURE__ */ jsxRuntime.jsx(
3923
+ NavLink,
3924
+ {
3925
+ item: l,
3926
+ className: "-mx-3 py-2.5 text-[0.9375rem] md:py-1.5"
3927
+ },
3928
+ l.href
3929
+ )) })
3930
+ ]
3931
+ },
3932
+ col.heading
3933
+ );
3934
+ })
3935
+ ]
3936
+ }
3937
+ ),
3938
+ signature ? /* @__PURE__ */ jsxRuntime.jsx("div", { "aria-hidden": true, className: "oca-container select-none overflow-hidden pb-8 md:pb-12", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-end gap-[0.18em] text-[clamp(3rem,11.5vw,10rem)] leading-[0.78] tracking-[-0.065em] [font-family:var(--oc-font-display)]", children: [
3939
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mb-[0.06em] inline-block w-[1.1em] shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(Mark, { className: "block h-auto w-full" }) }),
3940
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "orangecheck" })
3941
+ ] }) }) : null,
3942
+ legal || meta ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "oca-container", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3 border-t border-border py-6 text-[0.875rem] text-muted-foreground", children: [
3943
+ legal ? /* @__PURE__ */ jsxRuntime.jsx(LegalRow, {}) : null,
3944
+ meta
3945
+ ] }) }) : null
3946
+ ] });
3947
+ }
3948
+ function SignInFrame({
3949
+ title = "Sign in",
3950
+ lead,
3951
+ children,
3952
+ error,
3953
+ fineprint,
3954
+ brand,
3955
+ home = "/",
3956
+ back,
3957
+ art,
3958
+ caption,
3959
+ className
3960
+ }) {
3961
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3962
+ "main",
3963
+ {
3964
+ id: "main-content",
3965
+ className: cn("grid min-h-dvh grid-cols-1 bg-background text-foreground lg:grid-cols-2", className),
3966
+ children: [
3967
+ /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "flex flex-col px-4 pb-8 pt-5 sm:px-8 lg:px-14 lg:pt-8", children: [
3968
+ /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "flex items-center justify-between gap-4", children: [
3969
+ /* @__PURE__ */ jsxRuntime.jsxs(Link5__default.default, { href: home, className: "w-fit rounded-lg", children: [
3970
+ brand ?? /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 28 }),
3971
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: " home" })
3972
+ ] }),
3973
+ back === void 0 ? /* @__PURE__ */ jsxRuntime.jsx(
3974
+ Link5__default.default,
3975
+ {
3976
+ href: home,
3977
+ className: "text-[0.9375rem] text-muted-foreground underline-offset-4 hover:text-foreground hover:underline",
3978
+ children: "Back to home"
3979
+ }
3980
+ ) : back
3981
+ ] }),
3982
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto flex w-full max-w-[25rem] flex-1 flex-col justify-center gap-9 py-12", children: [
3983
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3", children: [
3984
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "oca-display-2", children: title }),
3985
+ lead ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "oca-lead", children: lead }) : null
3986
+ ] }),
3987
+ /* @__PURE__ */ jsxRuntime.jsx("div", { children }),
3988
+ error ? /* @__PURE__ */ jsxRuntime.jsx("p", { role: "alert", className: "text-[0.9375rem] text-destructive", children: error }) : null,
3989
+ fineprint ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[0.8125rem] leading-relaxed text-muted-foreground", children: fineprint }) : null
3990
+ ] })
3991
+ ] }),
3992
+ /* @__PURE__ */ jsxRuntime.jsxs(
3993
+ "aside",
3994
+ {
3995
+ "aria-hidden": true,
3996
+ className: "relative hidden flex-col justify-between gap-10 overflow-hidden border-l border-[var(--oca-band-line)] bg-oca-ink p-14 text-oca-ink-foreground lg:flex",
3997
+ children: [
3998
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-1 items-center justify-center", children: art ?? /* @__PURE__ */ jsxRuntime.jsx(IsoCheck, { size: 340, settle: true, tilt: true, className: "max-w-full" }) }),
3999
+ caption ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex max-w-[24rem] flex-col gap-3", children: caption }) : null
4000
+ ]
4001
+ }
4002
+ )
4003
+ ]
4004
+ }
4005
+ );
4006
+ }
2565
4007
  function SideNav({ groups, onNavigate }) {
2566
4008
  return /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Pages", className: "flex flex-col gap-5", children: groups.map((g, gi) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-0.5", children: [
2567
4009
  g.label ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "px-3 pb-1 text-[0.8125rem] text-muted-foreground", children: g.label }) : null,
2568
4010
  g.items.map((it) => /* @__PURE__ */ jsxRuntime.jsxs(
2569
- Link2__default.default,
4011
+ Link5__default.default,
2570
4012
  {
2571
4013
  href: it.href,
2572
4014
  onClick: onNavigate,
@@ -2588,7 +4030,7 @@ function SideNav({ groups, onNavigate }) {
2588
4030
  }
2589
4031
  function SectionSwitch({
2590
4032
  sections,
2591
- current,
4033
+ current: current2,
2592
4034
  onNavigate
2593
4035
  }) {
2594
4036
  const cols = sections.length <= 3 ? sections.length : 2;
@@ -2599,9 +4041,9 @@ function SectionSwitch({
2599
4041
  className: cn("grid gap-1 bg-muted p-1", cols === sections.length ? "rounded-full" : "rounded-[1.25rem]"),
2600
4042
  style: { gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))` },
2601
4043
  children: sections.map((sec) => {
2602
- const on = sec.id === current.id;
4044
+ const on = sec.id === current2.id;
2603
4045
  return /* @__PURE__ */ jsxRuntime.jsx(
2604
- Link2__default.default,
4046
+ Link5__default.default,
2605
4047
  {
2606
4048
  href: sec.href,
2607
4049
  onClick: onNavigate,
@@ -2631,7 +4073,7 @@ function TabBar({ items }) {
2631
4073
  className: "mx-auto grid h-14 max-w-[32rem] px-1.5",
2632
4074
  style: { gridTemplateColumns: `repeat(${items.length}, minmax(0, 1fr))` },
2633
4075
  children: items.map((it) => /* @__PURE__ */ jsxRuntime.jsxs(
2634
- Link2__default.default,
4076
+ Link5__default.default,
2635
4077
  {
2636
4078
  href: it.href,
2637
4079
  "aria-current": it.active ? "page" : void 0,
@@ -2696,19 +4138,19 @@ function AppShell({
2696
4138
  className
2697
4139
  }) {
2698
4140
  const [open, setOpen] = react.useState(false);
2699
- const current = sections && sections.length > 0 ? sections.find((sec) => sec.id === activeSection) ?? sections.find((sec) => activeItem(sec.groups)) ?? sections[0] : void 0;
2700
- const groups = current ? [...current.groups, ...persistent] : [...nav ?? [], ...persistent];
4141
+ const current2 = sections && sections.length > 0 ? sections.find((sec) => sec.id === activeSection) ?? sections.find((sec) => activeItem(sec.groups)) ?? sections[0] : void 0;
4142
+ const groups = current2 ? [...current2.groups, ...persistent] : [...nav ?? [], ...persistent];
2701
4143
  warnDuplicateLabels(groups);
2702
- const tabs = current ? null : tabsFor(groups);
4144
+ const tabs = current2 ? null : tabsFor(groups);
2703
4145
  const page = activeItem(groups);
2704
4146
  const place = react.useMemo(
2705
4147
  () => ({
2706
- section: current ? current.title ?? current.label : void 0,
4148
+ section: current2 ? current2.title ?? current2.label : void 0,
2707
4149
  page: pageOverride ?? page?.label
2708
4150
  }),
2709
- [current, page?.label, pageOverride]
4151
+ [current2, page?.label, pageOverride]
2710
4152
  );
2711
- const switcher = sections && current && sections.length > 1 ? /* @__PURE__ */ jsxRuntime.jsx(SectionSwitch, { sections, current, onNavigate: () => setOpen(false) }) : null;
4153
+ const switcher = sections && current2 && sections.length > 1 ? /* @__PURE__ */ jsxRuntime.jsx(SectionSwitch, { sections, current: current2, onNavigate: () => setOpen(false) }) : null;
2712
4154
  return /* @__PURE__ */ jsxRuntime.jsx(ShellContext.Provider, { value: place, children: /* @__PURE__ */ jsxRuntime.jsxs(
2713
4155
  "div",
2714
4156
  {
@@ -2740,7 +4182,7 @@ function AppShell({
2740
4182
  footer ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-auto flex flex-col gap-3", children: footer }) : null
2741
4183
  ] })
2742
4184
  ] }),
2743
- /* @__PURE__ */ jsxRuntime.jsx(Link2__default.default, { href: home, "aria-label": "Home", className: "rounded-lg p-1", children: /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 22 }) }),
4185
+ /* @__PURE__ */ jsxRuntime.jsx(Link5__default.default, { href: home, "aria-label": "Home", className: "rounded-lg p-1", children: /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 22 }) }),
2744
4186
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-auto flex items-center", children: account })
2745
4187
  ] }),
2746
4188
  place.page ? /* @__PURE__ */ jsxRuntime.jsxs(
@@ -2763,7 +4205,7 @@ function AppShell({
2763
4205
  ] }),
2764
4206
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto flex w-full max-w-[90rem]", children: [
2765
4207
  /* @__PURE__ */ jsxRuntime.jsxs("aside", { className: "sticky top-0 hidden h-dvh w-[17rem] shrink-0 flex-col gap-6 overflow-y-auto px-4 py-6 lg:flex", children: [
2766
- /* @__PURE__ */ jsxRuntime.jsx(Link2__default.default, { href: home, className: "px-2", "aria-label": "Home", children: /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 26 }) }),
4208
+ /* @__PURE__ */ jsxRuntime.jsx(Link5__default.default, { href: home, className: "px-2", "aria-label": "Home", children: /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 26 }) }),
2767
4209
  switcher,
2768
4210
  /* @__PURE__ */ jsxRuntime.jsx(SideNav, { groups }),
2769
4211
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-auto flex flex-col gap-3", children: footer })
@@ -2808,7 +4250,7 @@ function AccountMenu({
2808
4250
  ] }),
2809
4251
  /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuSeparator, {}),
2810
4252
  items.map(
2811
- (it, i) => it === "separator" ? /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuSeparator, {}, `sep-${i}`) : it.href ? /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuItem, { asChild: true, destructive: it.destructive, children: /* @__PURE__ */ jsxRuntime.jsxs(Link2__default.default, { href: it.href, children: [
4253
+ (it, i) => it === "separator" ? /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuSeparator, {}, `sep-${i}`) : it.href ? /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuItem, { asChild: true, destructive: it.destructive, children: /* @__PURE__ */ jsxRuntime.jsxs(Link5__default.default, { href: it.href, children: [
2812
4254
  it.icon,
2813
4255
  it.label
2814
4256
  ] }) }, it.label) : /* @__PURE__ */ jsxRuntime.jsxs(DropdownMenuItem, { onSelect: it.onSelect, destructive: it.destructive, children: [
@@ -2823,16 +4265,16 @@ function ThemeToggle({ className }) {
2823
4265
  const { theme, setTheme } = nextThemes.useTheme();
2824
4266
  const [mounted, setMounted] = react.useState(false);
2825
4267
  react.useEffect(() => setMounted(true), []);
2826
- const current = mounted ? theme ?? "system" : "system";
2827
- const next = current === "light" ? "dark" : current === "dark" ? "system" : "light";
2828
- const Icon2 = current === "light" ? lucideReact.Sun : current === "dark" ? lucideReact.Moon : lucideReact.SunMoon;
4268
+ const current2 = mounted ? theme ?? "system" : "system";
4269
+ const next = current2 === "light" ? "dark" : current2 === "dark" ? "system" : "light";
4270
+ const Icon2 = current2 === "light" ? lucideReact.Sun : current2 === "dark" ? lucideReact.Moon : lucideReact.SunMoon;
2829
4271
  return /* @__PURE__ */ jsxRuntime.jsx(
2830
4272
  "button",
2831
4273
  {
2832
4274
  type: "button",
2833
4275
  onClick: () => setTheme(next),
2834
- "aria-label": `Theme: ${current}. Switch to ${next}`,
2835
- title: `Theme: ${current}`,
4276
+ "aria-label": `Theme: ${current2}. Switch to ${next}`,
4277
+ title: `Theme: ${current2}`,
2836
4278
  className: cn(
2837
4279
  "inline-flex size-10 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-accent hover:text-foreground",
2838
4280
  className
@@ -2849,8 +4291,12 @@ Object.defineProperty(exports, "toast", {
2849
4291
  exports.APP_ATTRIBUTE = APP_ATTRIBUTE;
2850
4292
  exports.APP_ID = APP_ID;
2851
4293
  exports.Accent = Accent;
4294
+ exports.Accordion = Accordion;
4295
+ exports.AccordionItem = AccordionItem;
2852
4296
  exports.AccountMenu = AccountMenu;
2853
4297
  exports.ActivityList = ActivityList;
4298
+ exports.AppCard = AppCard;
4299
+ exports.AppGrid = AppGrid;
2854
4300
  exports.AppIcon = AppIcon;
2855
4301
  exports.AppShell = AppShell;
2856
4302
  exports.Badge = Badge;
@@ -2864,10 +4310,13 @@ exports.CardHeader = CardHeader;
2864
4310
  exports.CardNumeral = CardNumeral;
2865
4311
  exports.CardTitle = CardTitle;
2866
4312
  exports.Checkbox = Checkbox;
4313
+ exports.Closing = Closing;
2867
4314
  exports.CodeBlock = CodeBlock;
4315
+ exports.ComparisonTable = ComparisonTable;
2868
4316
  exports.Container = Container;
2869
4317
  exports.CopyButton = CopyButton;
2870
4318
  exports.Crowd = Crowd;
4319
+ exports.DOCS_HREF = DOCS_HREF;
2871
4320
  exports.DataTable = DataTable;
2872
4321
  exports.Dialog = Dialog;
2873
4322
  exports.DialogClose = DialogClose;
@@ -2875,6 +4324,7 @@ exports.DialogContent = DialogContent;
2875
4324
  exports.DialogDescription = DialogDescription;
2876
4325
  exports.DialogFooter = DialogFooter;
2877
4326
  exports.DialogHeader = DialogHeader;
4327
+ exports.DialogHost = DialogHost;
2878
4328
  exports.DialogTitle = DialogTitle;
2879
4329
  exports.DialogTrigger = DialogTrigger;
2880
4330
  exports.Display = Display;
@@ -2889,8 +4339,16 @@ exports.DropdownMenuSeparator = DropdownMenuSeparator;
2889
4339
  exports.DropdownMenuTrigger = DropdownMenuTrigger;
2890
4340
  exports.EmptyLine = EmptyLine;
2891
4341
  exports.EmptyState = EmptyState;
4342
+ exports.EndpointList = EndpointList;
2892
4343
  exports.ErrorBoundary = ErrorBoundary;
4344
+ exports.ErrorPage = ErrorPage;
2893
4345
  exports.Eyebrow = Eyebrow;
4346
+ exports.FAMILY = FAMILY;
4347
+ exports.FAMILY_GROUPS = FAMILY_GROUPS;
4348
+ exports.FactBlock = FactBlock;
4349
+ exports.FactRows = FactRows;
4350
+ exports.FamilyMenu = FamilyMenu;
4351
+ exports.Faq = Faq;
2894
4352
  exports.Field = Field;
2895
4353
  exports.FloatChip = FloatChip;
2896
4354
  exports.Footnote = Footnote;
@@ -2901,24 +4359,37 @@ exports.Input = Input;
2901
4359
  exports.IsoCheck = IsoCheck;
2902
4360
  exports.Kbd = Kbd;
2903
4361
  exports.KeyValueList = KeyValueList;
4362
+ exports.LEGAL_LINKS = LEGAL_LINKS;
2904
4363
  exports.Label = Label;
2905
4364
  exports.Lead = Lead;
4365
+ exports.LegalDocument = LegalDocument;
2906
4366
  exports.LoadingBlock = LoadingBlock;
2907
4367
  exports.Lockup = Lockup;
2908
4368
  exports.MARK_FACES = MARK_FACES;
2909
4369
  exports.Mark = Mark;
2910
4370
  exports.Monogram = Monogram;
2911
4371
  exports.Notice = Notice;
4372
+ exports.OCHK_IO = OCHK_IO;
4373
+ exports.OCHK_IO_FOOTER = OCHK_IO_FOOTER;
4374
+ exports.OCHK_IO_NAV = OCHK_IO_NAV;
4375
+ exports.PROTOCOLS = PROTOCOLS;
4376
+ exports.PROTOCOL_ORDER = PROTOCOL_ORDER;
2912
4377
  exports.PackageCard = PackageCard;
2913
4378
  exports.PageHeader = PageHeader;
2914
4379
  exports.PageHero = PageHero;
4380
+ exports.Pagination = Pagination;
2915
4381
  exports.PhoneFrame = PhoneFrame;
2916
4382
  exports.Popover = Popover;
2917
4383
  exports.PopoverAnchor = PopoverAnchor;
2918
4384
  exports.PopoverContent = PopoverContent;
2919
4385
  exports.PopoverTrigger = PopoverTrigger;
2920
4386
  exports.ProgressSteps = ProgressSteps;
4387
+ exports.ProofStrip = ProofStrip;
2921
4388
  exports.Prose = Prose;
4389
+ exports.ProtocolGrid = ProtocolGrid;
4390
+ exports.ProtocolHero = ProtocolHero;
4391
+ exports.ProtocolNav = ProtocolNav;
4392
+ exports.QrCode = QrCode;
2922
4393
  exports.RadioGroup = RadioGroup;
2923
4394
  exports.RadioGroupItem = RadioGroupItem;
2924
4395
  exports.Reveal = Reveal;
@@ -2928,6 +4399,7 @@ exports.SatsFigure = SatsFigure;
2928
4399
  exports.ScrollFade = ScrollFade;
2929
4400
  exports.ScrollStory = ScrollStory;
2930
4401
  exports.Section = Section;
4402
+ exports.SectionHeading = SectionHeading;
2931
4403
  exports.SectionIntro = SectionIntro;
2932
4404
  exports.Select = Select;
2933
4405
  exports.SelectContent = SelectContent;
@@ -2943,13 +4415,19 @@ exports.SheetDescription = SheetDescription;
2943
4415
  exports.SheetTitle = SheetTitle;
2944
4416
  exports.SheetTrigger = SheetTrigger;
2945
4417
  exports.ShellContext = ShellContext;
4418
+ exports.SignInFrame = SignInFrame;
4419
+ exports.SignMessage = SignMessage;
4420
+ exports.SiteBanner = SiteBanner;
2946
4421
  exports.SiteFooter = SiteFooter;
2947
4422
  exports.SiteHeader = SiteHeader;
2948
4423
  exports.Skeleton = Skeleton;
4424
+ exports.SkipLink = SkipLink;
4425
+ exports.SpecCard = SpecCard;
2949
4426
  exports.Spinner = Spinner;
2950
4427
  exports.SplitBar = SplitBar;
2951
4428
  exports.StatCard = StatCard;
2952
4429
  exports.StatGrid = StatGrid;
4430
+ exports.StatusBadge = StatusBadge;
2953
4431
  exports.StatusDot = StatusDot;
2954
4432
  exports.StatusPill = StatusPill;
2955
4433
  exports.StepGrid = StepGrid;
@@ -2958,6 +4436,7 @@ exports.Tabs = Tabs;
2958
4436
  exports.TabsContent = TabsContent;
2959
4437
  exports.TabsList = TabsList;
2960
4438
  exports.TabsTrigger = TabsTrigger;
4439
+ exports.TextLink = TextLink;
2961
4440
  exports.Textarea = Textarea;
2962
4441
  exports.ThemeToggle = ThemeToggle;
2963
4442
  exports.Ticker = Ticker;
@@ -2968,17 +4447,25 @@ exports.TooltipProvider = TooltipProvider;
2968
4447
  exports.TooltipTrigger = TooltipTrigger;
2969
4448
  exports.TruthTable = TruthTable;
2970
4449
  exports.UsdApprox = UsdApprox;
4450
+ exports.VerifyBox = VerifyBox;
4451
+ exports.VerifyReport = VerifyReport;
2971
4452
  exports.appColors = appColors;
2972
4453
  exports.appFonts = appFonts;
2973
4454
  exports.badgeVariants = badgeVariants;
2974
4455
  exports.buttonVariants = buttonVariants;
2975
4456
  exports.cardVariants = cardVariants;
2976
4457
  exports.cn = cn;
4458
+ exports.confirm = confirm;
4459
+ exports.familyByGroup = familyByGroup;
4460
+ exports.familySite = familySite;
2977
4461
  exports.monogramGround = monogramGround;
2978
4462
  exports.monogramLetter = monogramLetter;
2979
4463
  exports.portraitTone = portraitTone;
4464
+ exports.prompt = prompt;
4465
+ exports.protocolSite = protocolSite;
2980
4466
  exports.satsText = satsText;
2981
4467
  exports.sectionVariants = sectionVariants;
4468
+ exports.statusWord = statusWord;
2982
4469
  exports.useCopy = useCopy;
2983
4470
  exports.useInView = useInView;
2984
4471
  exports.useShellPlace = useShellPlace;