@orangecheck/app-design 1.6.1 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +3 -3
  2. package/dist/chrome.d.mts +11 -6
  3. package/dist/chrome.d.ts +11 -6
  4. package/dist/chrome.js +156 -130
  5. package/dist/chrome.js.map +1 -1
  6. package/dist/chrome.mjs +155 -131
  7. package/dist/chrome.mjs.map +1 -1
  8. package/dist/components.d.mts +40 -5
  9. package/dist/components.d.ts +40 -5
  10. package/dist/components.js +135 -13
  11. package/dist/components.js.map +1 -1
  12. package/dist/components.mjs +132 -14
  13. package/dist/components.mjs.map +1 -1
  14. package/dist/{docs-CFE5mU_6.d.mts → docs-B9G1BNXI.d.mts} +2 -2
  15. package/dist/{docs-ByUx4t-D.d.ts → docs-BWWnm5Jv.d.ts} +2 -2
  16. package/dist/family.d.mts +1 -1
  17. package/dist/family.d.ts +1 -1
  18. package/dist/family.js +7 -1
  19. package/dist/family.js.map +1 -1
  20. package/dist/family.mjs +5 -2
  21. package/dist/family.mjs.map +1 -1
  22. package/dist/{index-DmfyPYe5.d.mts → index-Bkl49Vgy.d.mts} +4 -1
  23. package/dist/{index-DmfyPYe5.d.ts → index-Bkl49Vgy.d.ts} +4 -1
  24. package/dist/index.d.mts +7 -7
  25. package/dist/index.d.ts +7 -7
  26. package/dist/index.js +197 -48
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs +189 -49
  29. package/dist/index.mjs.map +1 -1
  30. package/dist/mdx.d.mts +3 -3
  31. package/dist/mdx.d.ts +3 -3
  32. package/dist/mdx.js +5 -3
  33. package/dist/mdx.js.map +1 -1
  34. package/dist/mdx.mjs +5 -3
  35. package/dist/mdx.mjs.map +1 -1
  36. package/dist/primitives.d.mts +2 -2
  37. package/dist/primitives.d.ts +2 -2
  38. package/dist/primitives.js +2 -1
  39. package/dist/primitives.js.map +1 -1
  40. package/dist/primitives.mjs +2 -1
  41. package/dist/primitives.mjs.map +1 -1
  42. package/dist/session.d.mts +4 -4
  43. package/dist/session.d.ts +4 -4
  44. package/dist/session.js +122 -1
  45. package/dist/session.js.map +1 -1
  46. package/dist/session.mjs +122 -1
  47. package/dist/session.mjs.map +1 -1
  48. package/dist/{status-badge-BJ9Sdsx8.d.mts → status-badge-BBbCO6ZA.d.mts} +1 -1
  49. package/dist/{status-badge-Bt8x3RhO.d.ts → status-badge-CHHxtFkP.d.ts} +1 -1
  50. package/dist/styles/swagger.css +24 -1
  51. package/dist/styles/tokens.css +5 -0
  52. package/dist/{tool-shell-CQZNRUgH.d.mts → tool-shell-CnZ3NUSi.d.ts} +10 -4
  53. package/dist/{tool-shell-CRmceGrV.d.ts → tool-shell-DQFEMLLe.d.mts} +10 -4
  54. package/dist/{tools-Bg1gi2HO.d.mts → tools-CKO8IseL.d.mts} +2 -2
  55. package/dist/{tools-Bw7RhO92.d.ts → tools-CzjFPng4.d.ts} +2 -2
  56. package/package.json +5 -2
package/dist/index.mjs CHANGED
@@ -921,7 +921,8 @@ function ScrollFade({ fade = "var(--card)", className, innerClassName, children,
921
921
  onScroll: measure,
922
922
  tabIndex: edges.left || edges.right ? 0 : void 0,
923
923
  className: cn(
924
- "overflow-x-auto overscroll-x-contain rounded-[inherit] outline-none focus-visible:ring-2 focus-visible:ring-ring",
924
+ // Positioned, so sr-only text deep in a wide row scrolls and clips with the row.
925
+ "relative overflow-x-auto overscroll-x-contain rounded-[inherit] outline-none focus-visible:ring-2 focus-visible:ring-ring",
925
926
  innerClassName
926
927
  ),
927
928
  children
@@ -2166,7 +2167,7 @@ var JS_TAG = /<\/?(?=[A-Za-z])/y;
2166
2167
  var JS_TAG_NAME = /[A-Za-z][\w$.:-]*/y;
2167
2168
  var JS_PUNCT = /=>|\.\.\.|[{}()[\];,.<>=+\-*/%!?:&|^~#]/y;
2168
2169
  var JSX_BEFORE = /* @__PURE__ */ new Set(["(", ",", "=", "?", ":", "{", "[", ";", ">", "&&", "||", "=>", "return"]);
2169
- function scanJs(src, emit2, jsx52) {
2170
+ function scanJs(src, emit2, jsx53) {
2170
2171
  let i = 0;
2171
2172
  let prev = "";
2172
2173
  let tagDepth = 0;
@@ -2192,7 +2193,7 @@ function scanJs(src, emit2, jsx52) {
2192
2193
  sig('"');
2193
2194
  continue;
2194
2195
  }
2195
- if (jsx52 && tagDepth === 0 && (m = at(JS_TAG, src, i)) && (prev === "" || JSX_BEFORE.has(prev))) {
2196
+ if (jsx53 && tagDepth === 0 && (m = at(JS_TAG, src, i)) && (prev === "" || JSX_BEFORE.has(prev))) {
2196
2197
  const name = at(JS_TAG_NAME, src, i + m.length);
2197
2198
  if (name) {
2198
2199
  emit2(m);
@@ -2204,7 +2205,7 @@ function scanJs(src, emit2, jsx52) {
2204
2205
  continue;
2205
2206
  }
2206
2207
  }
2207
- if (jsx52 && tagDepth > 0 && braceInTag === 0) {
2208
+ if (jsx53 && tagDepth > 0 && braceInTag === 0) {
2208
2209
  if (src.startsWith("/>", i) || src[i] === ">") {
2209
2210
  const close = src[i] === ">" ? ">" : "/>";
2210
2211
  emit2(close);
@@ -2224,7 +2225,7 @@ function scanJs(src, emit2, jsx52) {
2224
2225
  continue;
2225
2226
  }
2226
2227
  if (src[i] === "{") braceInTag = 1;
2227
- } else if (jsx52 && tagDepth > 0 && braceInTag > 0) {
2228
+ } else if (jsx53 && tagDepth > 0 && braceInTag > 0) {
2228
2229
  if (src[i] === "{") braceInTag++;
2229
2230
  else if (src[i] === "}") braceInTag--;
2230
2231
  }
@@ -3252,7 +3253,7 @@ function Well({
3252
3253
  ] });
3253
3254
  }
3254
3255
  var FRAME = "overflow-hidden rounded-[1.25rem] border border-[var(--oca-code-line)] bg-[var(--oca-code-surface)]";
3255
- var COPY_ON_INK = "text-oca-ink-subtle hover:bg-white/10 hover:text-white";
3256
+ var COPY_ON_INK = "text-oca-ink-subtle hover:bg-white/10 hover:text-white max-md:size-11";
3256
3257
  function CodeBlock({
3257
3258
  code,
3258
3259
  html,
@@ -3680,6 +3681,9 @@ var GROUNDS = [
3680
3681
  }
3681
3682
  ];
3682
3683
  var SIZES = {
3684
+ // A list row's avatar, a facepile.
3685
+ "2xs": "size-7 rounded-[0.55rem] text-[0.75rem]",
3686
+ xs: "size-8 rounded-[0.6rem] text-[0.875rem]",
3683
3687
  sm: "size-9 rounded-[0.7rem] text-[0.9375rem]",
3684
3688
  md: "size-11 rounded-[0.85rem] text-[1.125rem]",
3685
3689
  lg: "size-14 rounded-[1.05rem] text-[1.5rem]"
@@ -3767,6 +3771,9 @@ var ErrorBoundary = class extends Component {
3767
3771
  // src/family/index.ts
3768
3772
  var OCHK_IO = "https://ochk.io";
3769
3773
  var DOCS_HREF = `${OCHK_IO}/docs`;
3774
+ var OCHK_APP = "https://ochk.app";
3775
+ var GET_AN_ACCOUNT = { href: OCHK_APP, label: "Get an account" };
3776
+ var SIGN_IN_LABEL = "Sign in";
3770
3777
  function protocol(slug, verb, line, kinds) {
3771
3778
  return {
3772
3779
  slug,
@@ -3803,7 +3810,7 @@ var FAMILY = [
3803
3810
  {
3804
3811
  slug: "me",
3805
3812
  label: "ochk.app",
3806
- href: "https://ochk.app",
3813
+ href: OCHK_APP,
3807
3814
  group: "orangecheck",
3808
3815
  line: "One account, with Bitcoin behind it.",
3809
3816
  status: "testing"
@@ -3922,6 +3929,10 @@ var OCHK_IO_FOOTER = [
3922
3929
  ]
3923
3930
  }
3924
3931
  ];
3932
+ var InColumnContext = sharedContext("in-column", false);
3933
+ function useInColumn() {
3934
+ return useContext(InColumnContext);
3935
+ }
3925
3936
  var SiteHomeContext = sharedContext("site-home", void 0);
3926
3937
  function useSiteHome() {
3927
3938
  return useContext(SiteHomeContext);
@@ -3949,10 +3960,11 @@ function ErrorPage({
3949
3960
  className
3950
3961
  }) {
3951
3962
  const shellHome = useSiteHome();
3963
+ const inColumn = useInColumn();
3952
3964
  const homeHref = home ?? (protocol2 ? protocolSite(protocol2).pageHref : shellHome ?? OCHK_IO);
3953
3965
  const words = WORDS[code] ?? (code >= 500 ? WORDS[500] : WORDS[404]);
3954
3966
  const server = code >= 500;
3955
- return /* @__PURE__ */ jsx(Section, { space: "none", className: cn("flex min-h-[min(40rem,72dvh)] items-center py-16 md:py-24", className), children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 items-center gap-12 md:grid-cols-12", children: [
3967
+ return /* @__PURE__ */ jsx(Section, { space: "none", contained: !inColumn, className: cn("flex min-h-[min(40rem,72dvh)] items-center py-16 md:py-24", className), children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 items-center gap-12 md:grid-cols-12", children: [
3956
3968
  /* @__PURE__ */ jsxs("div", { className: "flex max-w-[40rem] flex-col items-start gap-6 md:col-span-7", children: [
3957
3969
  /* @__PURE__ */ jsxs("p", { className: "oca-eyebrow oca-enter", children: [
3958
3970
  /* @__PURE__ */ jsx("span", { className: "oca-tabular", children: code }),
@@ -4209,7 +4221,7 @@ function Panel({
4209
4221
  const [open, setOpen] = useState(false);
4210
4222
  const body = (expanded) => typeof children === "function" ? children(expanded) : children;
4211
4223
  const head = (expanded) => /* @__PURE__ */ jsxs("header", { className: "flex flex-wrap items-start justify-between gap-x-4 gap-y-2", children: [
4212
- /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col gap-1", children: [
4224
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-[min(100%,12rem)] flex-1 basis-0 flex-col gap-1", children: [
4213
4225
  expanded ? /* @__PURE__ */ jsx(DialogTitle, { className: "text-[1.0625rem] font-medium leading-snug", children: title }) : /* @__PURE__ */ jsx("h3", { className: "text-[1rem] font-medium leading-snug", children: title }),
4214
4226
  description ? expanded ? /* @__PURE__ */ jsx(DialogDescription, { className: "text-[0.875rem] leading-snug text-muted-foreground", children: description }) : /* @__PURE__ */ jsx("p", { className: "text-[0.875rem] leading-snug text-muted-foreground", children: description }) : null
4215
4227
  ] }),
@@ -4238,7 +4250,7 @@ function Panel({
4238
4250
  className: "flex h-[min(92dvh,56rem)] w-[min(96vw,80rem)] max-w-none flex-col gap-4 overflow-y-auto",
4239
4251
  children: [
4240
4252
  head(true),
4241
- /* @__PURE__ */ jsx("div", { className: "min-h-0 min-w-0 flex-1", children: open ? body(true) : null }),
4253
+ /* @__PURE__ */ jsx("div", { className: "min-h-0 min-w-0 flex-1 overflow-y-auto", children: open ? body(true) : null }),
4242
4254
  source ? /* @__PURE__ */ jsx("div", { className: "border-t border-border pt-3", children: source }) : null
4243
4255
  ]
4244
4256
  }
@@ -5388,6 +5400,112 @@ function SignMessage({
5388
5400
  )
5389
5401
  ] });
5390
5402
  }
5403
+ function SectionTitle({
5404
+ title,
5405
+ meta,
5406
+ description,
5407
+ action,
5408
+ as: Tag = "h2",
5409
+ size = "md",
5410
+ tone = "default",
5411
+ id,
5412
+ className
5413
+ }) {
5414
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-wrap items-end justify-between gap-x-4 gap-y-3", className), children: [
5415
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 max-w-[40rem] flex-[1_1_16rem] flex-col gap-1", children: [
5416
+ /* @__PURE__ */ jsxs(
5417
+ Tag,
5418
+ {
5419
+ id,
5420
+ className: cn(
5421
+ "flex scroll-mt-24 flex-wrap items-baseline gap-x-3",
5422
+ size === "sm" ? "oca-title-sm" : "oca-title",
5423
+ tone === "danger" && "text-destructive"
5424
+ ),
5425
+ children: [
5426
+ title,
5427
+ meta ? /* @__PURE__ */ jsx("span", { className: "oca-tabular text-[0.875rem] font-normal tracking-normal text-muted-foreground", children: meta }) : null
5428
+ ]
5429
+ }
5430
+ ),
5431
+ description ? /* @__PURE__ */ jsx("p", { className: "text-[0.9375rem] leading-relaxed text-muted-foreground", children: description }) : null
5432
+ ] }),
5433
+ action ? /* @__PURE__ */ jsx("div", { className: "flex shrink-0 flex-wrap items-center gap-2", children: action }) : null
5434
+ ] });
5435
+ }
5436
+ function ListCard({
5437
+ as: Tag = "ul",
5438
+ className,
5439
+ ...props
5440
+ }) {
5441
+ return /* @__PURE__ */ jsx(Tag, { className: cn("divide-y divide-border overflow-clip rounded-[1.25rem] border border-border bg-card", className), ...props });
5442
+ }
5443
+ var ChoiceSize = createContext("md");
5444
+ var COLUMNS = { 1: "", 2: "sm:grid-cols-2", 3: "sm:grid-cols-2 lg:grid-cols-3" };
5445
+ function ChoiceGroup({
5446
+ value,
5447
+ onValueChange,
5448
+ label,
5449
+ columns = 1,
5450
+ size = "md",
5451
+ disabled,
5452
+ className,
5453
+ children
5454
+ }) {
5455
+ return /* @__PURE__ */ jsx(ChoiceSize.Provider, { value: size, children: /* @__PURE__ */ jsx(
5456
+ RadioGroupPrimitive.Root,
5457
+ {
5458
+ value: value ?? "",
5459
+ onValueChange: (v) => onValueChange(v),
5460
+ "aria-label": label,
5461
+ disabled,
5462
+ className: cn("grid", size === "sm" ? "gap-1.5" : "gap-3", COLUMNS[columns], className),
5463
+ children
5464
+ }
5465
+ ) });
5466
+ }
5467
+ function ChoiceCard({
5468
+ value,
5469
+ title,
5470
+ description,
5471
+ icon,
5472
+ disabled,
5473
+ className
5474
+ }) {
5475
+ const sm = useContext(ChoiceSize) === "sm";
5476
+ return /* @__PURE__ */ jsxs(
5477
+ RadioGroupPrimitive.Item,
5478
+ {
5479
+ value,
5480
+ disabled,
5481
+ className: cn(
5482
+ "group flex w-full min-w-0 items-start gap-3 border text-left outline-none transition-colors",
5483
+ "focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
5484
+ "border-border bg-card data-[state=checked]:border-foreground data-[state=checked]:bg-accent data-[state=unchecked]:hover:border-oca-hairline-strong",
5485
+ "disabled:cursor-not-allowed disabled:opacity-50",
5486
+ sm ? "min-h-11 rounded-xl px-3.5 py-2.5" : "rounded-[1.25rem] p-5",
5487
+ className
5488
+ ),
5489
+ children: [
5490
+ icon ? /* @__PURE__ */ jsx(
5491
+ "span",
5492
+ {
5493
+ "aria-hidden": true,
5494
+ className: cn(
5495
+ "shrink-0 text-muted-foreground group-data-[state=checked]:text-oca-accent-ink [&_svg]:size-full",
5496
+ sm ? "mt-0.5 size-4" : "size-6"
5497
+ ),
5498
+ children: icon
5499
+ }
5500
+ ) : null,
5501
+ /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-col gap-1", children: [
5502
+ /* @__PURE__ */ jsx("span", { className: sm ? "text-[0.9375rem] font-medium" : "oca-title-sm", children: title }),
5503
+ description ? /* @__PURE__ */ jsx("span", { className: "text-[0.875rem] leading-relaxed text-muted-foreground", children: description }) : null
5504
+ ] })
5505
+ ]
5506
+ }
5507
+ );
5508
+ }
5391
5509
  function useMacKeys() {
5392
5510
  const [mac, setMac] = useState(true);
5393
5511
  useEffect(() => {
@@ -5663,7 +5781,7 @@ function download(content, filename, mime) {
5663
5781
  a.remove();
5664
5782
  setTimeout(() => URL.revokeObjectURL(url), 0);
5665
5783
  }
5666
- var BAR_BUTTON = "inline-flex h-7 items-center gap-1.5 rounded-full px-2.5 text-[0.75rem] text-oca-ink-subtle transition-colors hover:bg-white/10 hover:text-white";
5784
+ var BAR_BUTTON = "inline-flex h-7 items-center gap-1.5 rounded-full px-2.5 text-[0.75rem] text-oca-ink-subtle transition-colors hover:bg-white/10 hover:text-white max-md:h-11 max-md:min-w-11 max-md:justify-center max-md:px-3";
5667
5785
  function ArtifactView({
5668
5786
  content,
5669
5787
  title,
@@ -5693,7 +5811,8 @@ function ArtifactView({
5693
5811
  "aria-pressed": view === v,
5694
5812
  onClick: () => setView(v),
5695
5813
  className: cn(
5696
- "h-7 rounded-full px-2.5 text-[0.75rem] transition-colors",
5814
+ // The pill stays 28px; its target reaches the bar's 44.
5815
+ "relative h-7 rounded-full px-2.5 text-[0.75rem] transition-colors before:absolute before:inset-x-0 before:top-1/2 before:h-11 before:-translate-y-1/2",
5697
5816
  view === v ? "bg-white/[0.12] text-white" : "text-oca-ink-subtle hover:text-white"
5698
5817
  ),
5699
5818
  children: v === "formatted" ? "Formatted" : "Raw"
@@ -6163,7 +6282,8 @@ function FilterChips({
6163
6282
  onClick: () => press(o.value),
6164
6283
  className: cn(
6165
6284
  "inline-flex shrink-0 items-center gap-1.5 rounded-full border px-3.5 text-[0.875rem] transition-colors",
6166
- tight ? "h-8" : "h-9",
6285
+ // A thumb's 44px on a phone.
6286
+ tight ? "h-11 md:h-8" : "h-11 md:h-9",
6167
6287
  on ? "border-foreground bg-foreground text-background" : "border-border bg-card text-muted-foreground hover:border-oca-hairline-strong hover:text-foreground"
6168
6288
  ),
6169
6289
  children: [
@@ -6587,7 +6707,7 @@ function SidebarShell({
6587
6707
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
6588
6708
  /* @__PURE__ */ jsx("div", { className: "hidden h-[4.5rem] items-center justify-end gap-3 px-8 lg:flex", children: account }),
6589
6709
  banner ? /* @__PURE__ */ jsx("div", { className: "px-4 pb-2 pt-4 md:px-8 lg:pt-0", children: banner }) : null,
6590
- /* @__PURE__ */ jsx("main", { id: "main-content", className: "flex-1 px-4 pb-16 pt-6 md:px-8 lg:pt-2", children: /* @__PURE__ */ jsx("div", { className: "mx-auto w-full max-w-[72rem]", children }) })
6710
+ /* @__PURE__ */ jsx("main", { id: "main-content", className: "flex-1 px-4 pb-16 pt-6 md:px-8 lg:pt-2", children: /* @__PURE__ */ jsx("div", { className: "mx-auto w-full max-w-[72rem]", children: /* @__PURE__ */ jsx(InColumnContext.Provider, { value: true, children }) }) })
6591
6711
  ] })
6592
6712
  ] }),
6593
6713
  tabs ? /* @__PURE__ */ jsx(TabBar, { items: tabs }) : null
@@ -6630,7 +6750,7 @@ function RailShell({ nav = [], persistent = [], page: pageOverride, header, acco
6630
6750
  const tabs = tabsFor([{ items: [...main, ...foot] }]);
6631
6751
  const active = activeItem([...nav, ...persistent]);
6632
6752
  const place = useMemo(() => ({ page: pageOverride ?? active?.label }), [pageOverride, active?.label]);
6633
- return /* @__PURE__ */ jsx(ShellContext.Provider, { value: place, children: /* @__PURE__ */ jsx(TooltipProvider, { delayDuration: 300, children: /* @__PURE__ */ jsxs("div", { className: cn("flex h-dvh flex-col overflow-hidden bg-background", className), children: [
6753
+ return /* @__PURE__ */ jsx(ShellContext.Provider, { value: place, children: /* @__PURE__ */ jsx(TooltipProvider, { delayDuration: 300, children: /* @__PURE__ */ jsxs("div", { className: cn("relative flex h-dvh flex-col overflow-clip bg-background", className), children: [
6634
6754
  header,
6635
6755
  banner,
6636
6756
  /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-1", children: [
@@ -6782,6 +6902,18 @@ function NavDropdown({ item }) {
6782
6902
  ] })
6783
6903
  ] });
6784
6904
  }
6905
+ function AccountCta({ href = GET_AN_ACCOUNT.href, className }) {
6906
+ return /* @__PURE__ */ jsx(Button, { asChild: true, size: "sm", className, children: /* @__PURE__ */ jsx("a", { href, children: GET_AN_ACCOUNT.label }) });
6907
+ }
6908
+ function ProductLockup({ size, product }) {
6909
+ return /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center", children: [
6910
+ /* @__PURE__ */ jsx(Lockup, { size }),
6911
+ product ? /* @__PURE__ */ jsxs(Fragment, { children: [
6912
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "mx-3 h-5 w-px bg-oca-hairline-strong" }),
6913
+ /* @__PURE__ */ jsx("span", { className: "font-medium tracking-[-0.01em]", style: { fontSize: size * 0.56 }, children: product })
6914
+ ] }) : null
6915
+ ] });
6916
+ }
6785
6917
  function SiteHeader({
6786
6918
  home = "/",
6787
6919
  brand,
@@ -6801,13 +6933,7 @@ function SiteHeader({
6801
6933
  const current2 = typeof family === "string" ? family : void 0;
6802
6934
  const phoneNav = navOnPhone ? nav : [];
6803
6935
  const menu = phoneNav.length > 0 || Boolean(family) || Boolean(menuExtra);
6804
- const brandNode = brand ?? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center", children: [
6805
- /* @__PURE__ */ jsx(Lockup, { size }),
6806
- product ? /* @__PURE__ */ jsxs(Fragment, { children: [
6807
- /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "mx-3 h-5 w-px bg-oca-hairline-strong" }),
6808
- /* @__PURE__ */ jsx("span", { className: "font-medium tracking-[-0.01em]", style: { fontSize: size * 0.56 }, children: product })
6809
- ] }) : null
6810
- ] });
6936
+ const brandNode = brand ?? /* @__PURE__ */ jsx(ProductLockup, { size, product });
6811
6937
  const navigation = nav.length > 0 ? /* @__PURE__ */ jsx("nav", { "aria-label": "Main", className: "hidden items-center gap-1 md:flex", children: nav.map(
6812
6938
  (n) => n.children?.length ? /* @__PURE__ */ jsx(NavDropdown, { item: n }, n.href) : (
6813
6939
  // Between md and lg the family menu and the actions share the row: tighter.
@@ -6937,7 +7063,7 @@ function SiteBanner({
6937
7063
  var FOOT_LINK = "inline-flex min-h-11 items-center transition-colors hover:text-foreground md:min-h-0";
6938
7064
  function LegalRow({ links }) {
6939
7065
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-x-6 gap-y-2 sm:flex-row sm:items-center sm:justify-between", children: [
6940
- /* @__PURE__ */ jsx("nav", { "aria-label": "Legal", children: /* @__PURE__ */ jsx("ul", { className: "flex flex-wrap gap-x-5", children: links.map((l) => /* @__PURE__ */ jsx("li", { children: l.href.startsWith("/") ? /* @__PURE__ */ jsx(Link6, { href: l.href, className: FOOT_LINK, children: l.label }) : /* @__PURE__ */ jsx("a", { href: l.href, className: FOOT_LINK, children: l.label }) }, l.href)) }) }),
7066
+ /* @__PURE__ */ jsx("nav", { "aria-label": "Legal", children: /* @__PURE__ */ jsx("ul", { className: "flex flex-wrap gap-x-5", children: links.map((l, i) => /* @__PURE__ */ jsx("li", { children: l.href.startsWith("/") ? /* @__PURE__ */ jsx(Link6, { href: l.href, className: FOOT_LINK, children: l.label }) : /* @__PURE__ */ jsx("a", { href: l.href, className: FOOT_LINK, children: l.label }) }, `${i}:${l.label}`)) }) }),
6941
7067
  /* @__PURE__ */ jsxs("p", { children: [
6942
7068
  "\xA9 ",
6943
7069
  (/* @__PURE__ */ new Date()).getFullYear(),
@@ -6957,16 +7083,26 @@ function SiteFooter({
6957
7083
  }) {
6958
7084
  const legalLinks = legal === true ? LEGAL_LINKS : legal || null;
6959
7085
  if (compact) {
6960
- return /* @__PURE__ */ jsx("footer", { className: cn("border-t border-border bg-background text-[0.875rem] text-muted-foreground", className), children: /* @__PURE__ */ 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: [
6961
- /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-x-6 gap-y-1", children: [
6962
- /* @__PURE__ */ jsx("a", { href: OCHK_IO, className: "rounded-lg text-foreground", children: /* @__PURE__ */ jsx(Lockup, { size: 22 }) }),
6963
- family ? /* @__PURE__ */ jsx("nav", { "aria-label": "Protocols", children: /* @__PURE__ */ jsx("ul", { className: "flex flex-wrap gap-x-4", children: PROTOCOLS.map((p) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("a", { href: p.pageHref, className: FOOT_LINK, children: p.label }) }, p.slug)) }) }) : null
6964
- ] }),
6965
- legalLinks || meta ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-x-6 gap-y-2 sm:flex-row sm:flex-wrap sm:items-center", children: [
6966
- legalLinks ? /* @__PURE__ */ jsx(LegalRow, { links: legalLinks }) : null,
6967
- meta
6968
- ] }) : null
6969
- ] }) });
7086
+ return (
7087
+ // The tools' column (ToolColumn): the lockup lines up with the page's title.
7088
+ /* @__PURE__ */ jsx("footer", { className: cn("border-t border-border bg-background px-4 text-[0.875rem] text-muted-foreground md:px-8", className), children: /* @__PURE__ */ jsxs("div", { className: "mx-auto flex w-full max-w-[72rem] flex-col gap-x-8 gap-y-3 py-5 lg:flex-row lg:items-center lg:justify-between", children: [
7089
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-x-6 gap-y-3", children: [
7090
+ /* @__PURE__ */ jsx(
7091
+ "a",
7092
+ {
7093
+ href: OCHK_IO,
7094
+ className: "relative rounded-lg text-foreground before:absolute before:inset-x-0 before:top-1/2 before:h-11 before:-translate-y-1/2",
7095
+ children: /* @__PURE__ */ jsx(Lockup, { size: 22 })
7096
+ }
7097
+ ),
7098
+ family ? /* @__PURE__ */ jsx("nav", { "aria-label": "Protocols", children: /* @__PURE__ */ jsx("ul", { className: "flex flex-wrap gap-x-4", children: PROTOCOLS.map((p) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("a", { href: p.pageHref, className: FOOT_LINK, children: p.label }) }, p.slug)) }) }) : null
7099
+ ] }),
7100
+ legalLinks || meta ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-x-6 gap-y-2 sm:flex-row sm:flex-wrap sm:items-center", children: [
7101
+ legalLinks ? /* @__PURE__ */ jsx(LegalRow, { links: legalLinks }) : null,
7102
+ meta
7103
+ ] }) : null
7104
+ ] }) })
7105
+ );
6970
7106
  }
6971
7107
  const cols = [
6972
7108
  ...columns,
@@ -7001,17 +7137,17 @@ function SiteFooter({
7001
7137
  className: cn("flex min-w-0 flex-col gap-1", spans && "col-span-2 md:col-span-1"),
7002
7138
  children: [
7003
7139
  /* @__PURE__ */ jsx("p", { className: "mb-2 text-[0.875rem] font-medium", children: col.heading }),
7004
- /* @__PURE__ */ 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__ */ jsx(
7140
+ /* @__PURE__ */ 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, j) => /* @__PURE__ */ jsx(
7005
7141
  NavLink,
7006
7142
  {
7007
7143
  item: l,
7008
7144
  className: "-mx-3 py-2.5 text-[0.9375rem] md:py-1.5"
7009
7145
  },
7010
- l.href
7146
+ `${j}:${l.label}`
7011
7147
  )) })
7012
7148
  ]
7013
7149
  },
7014
- col.heading
7150
+ `${i}:${col.heading}`
7015
7151
  );
7016
7152
  })
7017
7153
  ]
@@ -7047,12 +7183,13 @@ function OchkIoFooter({ columns = OCHK_IO_FOOTER, className }) {
7047
7183
  );
7048
7184
  }
7049
7185
  function SignInFrame({
7050
- title = "Sign in",
7186
+ title = SIGN_IN_LABEL,
7051
7187
  lead,
7052
7188
  children,
7053
7189
  error,
7054
7190
  fineprint,
7055
7191
  brand,
7192
+ product,
7056
7193
  home,
7057
7194
  protocol: protocol2,
7058
7195
  back,
@@ -7070,7 +7207,7 @@ function SignInFrame({
7070
7207
  /* @__PURE__ */ jsxs("section", { className: "flex flex-col px-4 pb-8 pt-5 sm:px-8 lg:px-14 lg:pt-8", children: [
7071
7208
  /* @__PURE__ */ jsxs("header", { className: "flex items-center justify-between gap-4", children: [
7072
7209
  /* @__PURE__ */ jsxs(Link6, { href: homeHref, className: "w-fit rounded-lg", children: [
7073
- brand ?? /* @__PURE__ */ jsx(Lockup, { size: 28 }),
7210
+ brand ?? /* @__PURE__ */ jsx(ProductLockup, { size: 28, product: product ?? (protocol2 ? protocolSite(protocol2).label : void 0) }),
7074
7211
  /* @__PURE__ */ jsx("span", { className: "sr-only", children: " home" })
7075
7212
  ] }),
7076
7213
  back === void 0 ? /* @__PURE__ */ jsx(
@@ -7281,7 +7418,7 @@ function SessionAccountView({
7281
7418
  items = [],
7282
7419
  signInHref,
7283
7420
  signInPath,
7284
- signInLabel = "Sign in",
7421
+ signInLabel = SIGN_IN_LABEL,
7285
7422
  accountHref = OCHK_APP_ACCOUNT,
7286
7423
  onSignOut,
7287
7424
  nameFrom = "lg"
@@ -7312,6 +7449,13 @@ function SessionAccountView({
7312
7449
  /* @__PURE__ */ jsx("span", { className: state === "checking" ? "contents invisible" : "contents", "aria-hidden": state === "checking" || void 0, children: /* @__PURE__ */ jsx(Button, { asChild: true, size: "sm", variant: "secondary", tabIndex: state === "checking" ? -1 : void 0, children: /* @__PURE__ */ jsx("a", { href: signInHref ?? inPlace ?? "https://ochk.io/signin", children: signInLabel }) }) })
7313
7450
  );
7314
7451
  }
7452
+ function ToolColumn({
7453
+ measure = "wide",
7454
+ className,
7455
+ children
7456
+ }) {
7457
+ return /* @__PURE__ */ jsx("div", { className: cn("px-4 pb-16 pt-8 md:px-8 md:pt-10", className), children: /* @__PURE__ */ jsx("div", { className: "mx-auto w-full max-w-[72rem]", children: /* @__PURE__ */ jsx(InColumnContext.Provider, { value: true, children: measure === "narrow" ? /* @__PURE__ */ jsx("div", { className: "max-w-[48rem]", children }) : children }) }) });
7458
+ }
7315
7459
  function ToolShell({
7316
7460
  protocol: protocol2,
7317
7461
  tools,
@@ -7320,6 +7464,7 @@ function ToolShell({
7320
7464
  rail = false,
7321
7465
  railFooter,
7322
7466
  variant = "tool",
7467
+ measure = "wide",
7323
7468
  banner,
7324
7469
  footer,
7325
7470
  children
@@ -7345,7 +7490,9 @@ function ToolShell({
7345
7490
  {
7346
7491
  className: cn(
7347
7492
  "flex flex-col bg-background",
7348
- app ? "h-dvh overflow-hidden" : "min-h-dvh",
7493
+ // An app frame contains what is positioned inside it (sr-only text deep in the page's own
7494
+ // scroller would otherwise size the document), and clips without becoming a scroller.
7495
+ app ? "relative h-dvh overflow-clip" : "min-h-dvh",
7349
7496
  tabs && "max-md:pb-[calc(3.5rem_+_env(safe-area-inset-bottom))]"
7350
7497
  ),
7351
7498
  children: [
@@ -7375,14 +7522,7 @@ function ToolShell({
7375
7522
  /* @__PURE__ */ jsx(SideNav, { groups: [{ label: "Tools", items: tools.map(({ href, label, icon, active }) => ({ href, label, icon, active })) }] }),
7376
7523
  railFooter ? /* @__PURE__ */ jsx("div", { className: "mt-auto flex flex-col gap-0.5 px-3 text-[0.875rem] text-muted-foreground [&_a:hover]:text-foreground [&_a]:py-1.5 [&_a]:transition-colors", children: railFooter }) : null
7377
7524
  ] }) : null,
7378
- /* @__PURE__ */ jsx(
7379
- "main",
7380
- {
7381
- id: "main-content",
7382
- className: cn("min-w-0 flex-1", app ? "flex min-h-0 flex-col" : "px-4 pb-16 pt-8 md:px-8 md:pt-10"),
7383
- children: /* @__PURE__ */ jsx(SiteHomeContext.Provider, { value: homeHref, children: app ? children : /* @__PURE__ */ jsx("div", { className: "mx-auto w-full max-w-[72rem]", children }) })
7384
- }
7385
- )
7525
+ /* @__PURE__ */ jsx("main", { id: "main-content", className: cn("min-w-0 flex-1", app && "flex min-h-0 flex-col"), children: /* @__PURE__ */ jsx(SiteHomeContext.Provider, { value: homeHref, children: app ? children : /* @__PURE__ */ jsx(ToolColumn, { measure, children }) }) })
7386
7526
  ] }),
7387
7527
  app || footer === false ? null : footer ?? /* @__PURE__ */ jsx(SiteFooter, { compact: true, family: true, legal: true }),
7388
7528
  tabs ? /* @__PURE__ */ jsx(TabBar, { items: tabs }) : null
@@ -7559,6 +7699,6 @@ function createMdxComponents({ mermaid } = {}) {
7559
7699
  }
7560
7700
  var mdxComponents = createMdxComponents();
7561
7701
 
7562
- export { APP_ATTRIBUTE, APP_ID, Accent, Accordion, AccordionItem, AccountMenu, ActivityList, AnchorStatus, ApiTable, AppCard, AppGrid, AppIcon, AppShell, ArtifactView, Badge, BlockCountdown, BlockHeight, Breadcrumbs, BrowserFrame, Button, CODE_LANGS, Callout, Card, CardContent, CardDescription, CardFooter, CardGrid, CardHeader, CardNumeral, CardTitle, ChartFrame, Checkbox, Closing, CodeBlock, CodeTabs, CommandDialog, ComparisonTable, Container, CopyButton, CountdownRing, Crowd, DOCS_HEADER_NAV, DOCS_HREF, DataTable, DensityProvider, Diagram, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogHost, DialogTitle, DialogTrigger, Display, DocHeader, DocLayout, DocsHeading, DocsNav, DocsPager, DocsShell, DropZone, DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, EmptyLine, EmptyState, EndpointList, ErrorBoundary, ErrorPage, Eyebrow, FAMILY, FAMILY_GROUPS, FactBlock, FactRows, FamilyMenu, Faq, Field, FilterChips, FloatChip, Footnote, FormSection, HalftoneCanvas, HalftoneSphere, HashChip, HudCard, Input, InstallTabs, IsoCheck, Kbd, KeyValueList, LEGAL_LINKS, Label, Lead, LegalDocument, LinkCard, LoadingBlock, LockedPreview, Lockup, MARK_FACES, Mark, MdxTable, Meter, Monogram, Notice, OCHK_APP_ACCOUNT, OCHK_IO, OCHK_IO_FOOTER, OCHK_IO_NAV, OchkIoFooter, OnThisPage, PROTOCOLS, PROTOCOL_ORDER, PackageCard, PageHeader, PageHero, Pagination, Panel, PhoneFrame, PlanCard, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, ProgressSteps, ProofStrip, Prose, ProtocolGrid, ProtocolHero, ProtocolNav, QrCode, RadioGroup, RadioGroupItem, Reveal, SELF_HOSTED_LEGAL_LINKS, SPHERE_GRADIENT, Sats, SatsFigure, ScrollFade, ScrollStory, SearchButton, SearchDialog, Section, SectionHeading, SectionIntro, Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue, Separator, SessionAccountView, Sheet, SheetClose, SheetContent, SheetDescription, SheetTitle, SheetTrigger, ShellContext, SignInFrame, SignMessage, SiteBanner, SiteFooter, SiteHeader, Skeleton, SkipLink, SourceNote, Sparkline, SpecCard, Spinner, SplitBar, StatCard, StatGrid, StateBadge, StatusBadge, StatusDot, StatusPill, Step, StepGrid, Steps, Switch, TOKEN_CLASS, Tabs, TabsContent, TabsList, TabsTrigger, TextLink, Textarea, ThemeToggle, Ticker, Toaster, ToolGrid, ToolShell, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TruthTable, UsdApprox, VerifyBox, VerifyReport, appColors, appFonts, badgeVariants, blocksToDuration, buttonVariants, cardVariants, chartColor, cn, confirm, createMdxComponents, createStateBadge, darkPalette, escapeHtml, explorerUrl, familyByGroup, familySite, formatBlockHeight, formatBytes, formatUtc, grammarOf, highlight, highlightToHtml, languageName, lightPalette, linesToHtml, mdxComponents, monogramGround, monogramLetter, parseCodeMeta, parseLineRanges, portraitTone, prompt, protocolSite, readDiff, rehypeCode, satsText, sectionVariants, shortenMiddle, statusWord, useActiveHeading, useCopy, useDensity, useHeadings, useInView, useShellPlace, useSignInHref, useTimedOut };
7702
+ export { APP_ATTRIBUTE, APP_ID, Accent, Accordion, AccordionItem, AccountCta, AccountMenu, ActivityList, AnchorStatus, ApiTable, AppCard, AppGrid, AppIcon, AppShell, ArtifactView, Badge, BlockCountdown, BlockHeight, Breadcrumbs, BrowserFrame, Button, CODE_LANGS, Callout, Card, CardContent, CardDescription, CardFooter, CardGrid, CardHeader, CardNumeral, CardTitle, ChartFrame, Checkbox, ChoiceCard, ChoiceGroup, Closing, CodeBlock, CodeTabs, CommandDialog, ComparisonTable, Container, CopyButton, CountdownRing, Crowd, DOCS_HEADER_NAV, DOCS_HREF, DataTable, DensityProvider, Diagram, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogHost, DialogTitle, DialogTrigger, Display, DocHeader, DocLayout, DocsHeading, DocsNav, DocsPager, DocsShell, DropZone, DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, EmptyLine, EmptyState, EndpointList, ErrorBoundary, ErrorPage, Eyebrow, FAMILY, FAMILY_GROUPS, FactBlock, FactRows, FamilyMenu, Faq, Field, FilterChips, FloatChip, Footnote, FormSection, GET_AN_ACCOUNT, HalftoneCanvas, HalftoneSphere, HashChip, HudCard, Input, InstallTabs, IsoCheck, Kbd, KeyValueList, LEGAL_LINKS, Label, Lead, LegalDocument, LinkCard, ListCard, LoadingBlock, LockedPreview, Lockup, MARK_FACES, Mark, MdxTable, Meter, Monogram, Notice, OCHK_APP, OCHK_APP_ACCOUNT, OCHK_IO, OCHK_IO_FOOTER, OCHK_IO_NAV, OchkIoFooter, OnThisPage, PROTOCOLS, PROTOCOL_ORDER, PackageCard, PageHeader, PageHero, Pagination, Panel, PhoneFrame, PlanCard, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, ProgressSteps, ProofStrip, Prose, ProtocolGrid, ProtocolHero, ProtocolNav, QrCode, RadioGroup, RadioGroupItem, Reveal, SELF_HOSTED_LEGAL_LINKS, SIGN_IN_LABEL, SPHERE_GRADIENT, Sats, SatsFigure, ScrollFade, ScrollStory, SearchButton, SearchDialog, Section, SectionHeading, SectionIntro, SectionTitle, Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue, Separator, SessionAccountView, Sheet, SheetClose, SheetContent, SheetDescription, SheetTitle, SheetTrigger, ShellContext, SignInFrame, SignMessage, SiteBanner, SiteFooter, SiteHeader, Skeleton, SkipLink, SourceNote, Sparkline, SpecCard, Spinner, SplitBar, StatCard, StatGrid, StateBadge, StatusBadge, StatusDot, StatusPill, Step, StepGrid, Steps, Switch, TOKEN_CLASS, Tabs, TabsContent, TabsList, TabsTrigger, TextLink, Textarea, ThemeToggle, Ticker, Toaster, ToolColumn, ToolGrid, ToolShell, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TruthTable, UsdApprox, VerifyBox, VerifyReport, appColors, appFonts, badgeVariants, blocksToDuration, buttonVariants, cardVariants, chartColor, cn, confirm, createMdxComponents, createStateBadge, darkPalette, escapeHtml, explorerUrl, familyByGroup, familySite, formatBlockHeight, formatBytes, formatUtc, grammarOf, highlight, highlightToHtml, languageName, lightPalette, linesToHtml, mdxComponents, monogramGround, monogramLetter, parseCodeMeta, parseLineRanges, portraitTone, prompt, protocolSite, readDiff, rehypeCode, satsText, sectionVariants, shortenMiddle, statusWord, useActiveHeading, useCopy, useDensity, useHeadings, useInView, useShellPlace, useSignInHref, useTimedOut };
7563
7703
  //# sourceMappingURL=index.mjs.map
7564
7704
  //# sourceMappingURL=index.mjs.map