@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.
- package/README.md +4 -3
- package/dist/brand.js.map +1 -1
- package/dist/brand.mjs.map +1 -1
- package/dist/chrome.d.mts +49 -15
- package/dist/chrome.d.ts +49 -15
- package/dist/chrome.js +619 -55
- package/dist/chrome.js.map +1 -1
- package/dist/chrome.mjs +617 -57
- package/dist/chrome.mjs.map +1 -1
- package/dist/components.d.mts +231 -1
- package/dist/components.d.ts +231 -1
- package/dist/components.js +1187 -2
- package/dist/components.js.map +1 -1
- package/dist/components.mjs +1162 -5
- package/dist/components.mjs.map +1 -1
- package/dist/family.d.mts +2 -0
- package/dist/family.d.ts +2 -0
- package/dist/family.js +167 -0
- package/dist/family.js.map +1 -0
- package/dist/family.mjs +154 -0
- package/dist/family.mjs.map +1 -0
- package/dist/index-C6hDqOOS.d.mts +58 -0
- package/dist/index-C6hDqOOS.d.ts +58 -0
- package/dist/index.d.mts +5 -3
- package/dist/index.d.ts +5 -3
- package/dist/index.js +1619 -132
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1575 -134
- package/dist/index.mjs.map +1 -1
- package/dist/primitives.d.mts +52 -1
- package/dist/primitives.d.ts +52 -1
- package/dist/primitives.js +280 -3
- package/dist/primitives.js.map +1 -1
- package/dist/primitives.mjs +271 -6
- package/dist/primitives.mjs.map +1 -1
- package/dist/status-badge-BEOxeY9j.d.ts +13 -0
- package/dist/status-badge-DRwGhB0h.d.mts +13 -0
- package/dist/styles/fonts.css +1 -1
- package/dist/styles/tokens.css +4 -2
- package/dist/tokens.d.mts +3 -1
- package/dist/tokens.d.ts +3 -1
- package/dist/tokens.js +5 -3
- package/dist/tokens.js.map +1 -1
- package/dist/tokens.mjs +5 -3
- package/dist/tokens.mjs.map +1 -1
- 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
|
|
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
|
|
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: "#
|
|
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)
|
|
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)
|
|
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
|
-
|
|
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
|
|
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",
|
|
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
|
-
|
|
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
|
-
|
|
2451
|
-
|
|
2452
|
-
"
|
|
2453
|
-
|
|
2454
|
-
|
|
2455
|
-
|
|
2456
|
-
|
|
2457
|
-
|
|
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
|
-
|
|
2460
|
-
|
|
2461
|
-
|
|
2462
|
-
|
|
2463
|
-
|
|
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 [
|
|
2469
|
-
|
|
2470
|
-
|
|
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
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2475
|
-
|
|
2476
|
-
children:
|
|
2477
|
-
"
|
|
2478
|
-
{
|
|
2479
|
-
|
|
2480
|
-
|
|
2481
|
-
|
|
2482
|
-
|
|
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
|
|
2524
|
-
|
|
2525
|
-
|
|
2526
|
-
|
|
2527
|
-
|
|
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("
|
|
2531
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
2532
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "
|
|
2533
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2534
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2559
|
-
|
|
2560
|
-
/* @__PURE__ */ jsxRuntime.jsx("
|
|
2561
|
-
|
|
2562
|
-
|
|
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
|
-
|
|
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 ===
|
|
4044
|
+
const on = sec.id === current2.id;
|
|
2603
4045
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
2604
|
-
|
|
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
|
-
|
|
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
|
|
2700
|
-
const groups =
|
|
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 =
|
|
4144
|
+
const tabs = current2 ? null : tabsFor(groups);
|
|
2703
4145
|
const page = activeItem(groups);
|
|
2704
4146
|
const place = react.useMemo(
|
|
2705
4147
|
() => ({
|
|
2706
|
-
section:
|
|
4148
|
+
section: current2 ? current2.title ?? current2.label : void 0,
|
|
2707
4149
|
page: pageOverride ?? page?.label
|
|
2708
4150
|
}),
|
|
2709
|
-
[
|
|
4151
|
+
[current2, page?.label, pageOverride]
|
|
2710
4152
|
);
|
|
2711
|
-
const switcher = sections &&
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
2827
|
-
const next =
|
|
2828
|
-
const Icon2 =
|
|
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: ${
|
|
2835
|
-
title: `Theme: ${
|
|
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;
|