@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.js CHANGED
@@ -956,7 +956,8 @@ function ScrollFade({ fade = "var(--card)", className, innerClassName, children,
956
956
  onScroll: measure,
957
957
  tabIndex: edges.left || edges.right ? 0 : void 0,
958
958
  className: cn(
959
- "overflow-x-auto overscroll-x-contain rounded-[inherit] outline-none focus-visible:ring-2 focus-visible:ring-ring",
959
+ // Positioned, so sr-only text deep in a wide row scrolls and clips with the row.
960
+ "relative overflow-x-auto overscroll-x-contain rounded-[inherit] outline-none focus-visible:ring-2 focus-visible:ring-ring",
960
961
  innerClassName
961
962
  ),
962
963
  children
@@ -2201,7 +2202,7 @@ var JS_TAG = /<\/?(?=[A-Za-z])/y;
2201
2202
  var JS_TAG_NAME = /[A-Za-z][\w$.:-]*/y;
2202
2203
  var JS_PUNCT = /=>|\.\.\.|[{}()[\];,.<>=+\-*/%!?:&|^~#]/y;
2203
2204
  var JSX_BEFORE = /* @__PURE__ */ new Set(["(", ",", "=", "?", ":", "{", "[", ";", ">", "&&", "||", "=>", "return"]);
2204
- function scanJs(src, emit2, jsx52) {
2205
+ function scanJs(src, emit2, jsx53) {
2205
2206
  let i = 0;
2206
2207
  let prev = "";
2207
2208
  let tagDepth = 0;
@@ -2227,7 +2228,7 @@ function scanJs(src, emit2, jsx52) {
2227
2228
  sig('"');
2228
2229
  continue;
2229
2230
  }
2230
- if (jsx52 && tagDepth === 0 && (m = at(JS_TAG, src, i)) && (prev === "" || JSX_BEFORE.has(prev))) {
2231
+ if (jsx53 && tagDepth === 0 && (m = at(JS_TAG, src, i)) && (prev === "" || JSX_BEFORE.has(prev))) {
2231
2232
  const name = at(JS_TAG_NAME, src, i + m.length);
2232
2233
  if (name) {
2233
2234
  emit2(m);
@@ -2239,7 +2240,7 @@ function scanJs(src, emit2, jsx52) {
2239
2240
  continue;
2240
2241
  }
2241
2242
  }
2242
- if (jsx52 && tagDepth > 0 && braceInTag === 0) {
2243
+ if (jsx53 && tagDepth > 0 && braceInTag === 0) {
2243
2244
  if (src.startsWith("/>", i) || src[i] === ">") {
2244
2245
  const close = src[i] === ">" ? ">" : "/>";
2245
2246
  emit2(close);
@@ -2259,7 +2260,7 @@ function scanJs(src, emit2, jsx52) {
2259
2260
  continue;
2260
2261
  }
2261
2262
  if (src[i] === "{") braceInTag = 1;
2262
- } else if (jsx52 && tagDepth > 0 && braceInTag > 0) {
2263
+ } else if (jsx53 && tagDepth > 0 && braceInTag > 0) {
2263
2264
  if (src[i] === "{") braceInTag++;
2264
2265
  else if (src[i] === "}") braceInTag--;
2265
2266
  }
@@ -3287,7 +3288,7 @@ function Well({
3287
3288
  ] });
3288
3289
  }
3289
3290
  var FRAME = "overflow-hidden rounded-[1.25rem] border border-[var(--oca-code-line)] bg-[var(--oca-code-surface)]";
3290
- var COPY_ON_INK = "text-oca-ink-subtle hover:bg-white/10 hover:text-white";
3291
+ var COPY_ON_INK = "text-oca-ink-subtle hover:bg-white/10 hover:text-white max-md:size-11";
3291
3292
  function CodeBlock({
3292
3293
  code,
3293
3294
  html,
@@ -3715,6 +3716,9 @@ var GROUNDS = [
3715
3716
  }
3716
3717
  ];
3717
3718
  var SIZES = {
3719
+ // A list row's avatar, a facepile.
3720
+ "2xs": "size-7 rounded-[0.55rem] text-[0.75rem]",
3721
+ xs: "size-8 rounded-[0.6rem] text-[0.875rem]",
3718
3722
  sm: "size-9 rounded-[0.7rem] text-[0.9375rem]",
3719
3723
  md: "size-11 rounded-[0.85rem] text-[1.125rem]",
3720
3724
  lg: "size-14 rounded-[1.05rem] text-[1.5rem]"
@@ -3802,6 +3806,9 @@ var ErrorBoundary = class extends react.Component {
3802
3806
  // src/family/index.ts
3803
3807
  var OCHK_IO = "https://ochk.io";
3804
3808
  var DOCS_HREF = `${OCHK_IO}/docs`;
3809
+ var OCHK_APP = "https://ochk.app";
3810
+ var GET_AN_ACCOUNT = { href: OCHK_APP, label: "Get an account" };
3811
+ var SIGN_IN_LABEL = "Sign in";
3805
3812
  function protocol(slug, verb, line, kinds) {
3806
3813
  return {
3807
3814
  slug,
@@ -3838,7 +3845,7 @@ var FAMILY = [
3838
3845
  {
3839
3846
  slug: "me",
3840
3847
  label: "ochk.app",
3841
- href: "https://ochk.app",
3848
+ href: OCHK_APP,
3842
3849
  group: "orangecheck",
3843
3850
  line: "One account, with Bitcoin behind it.",
3844
3851
  status: "testing"
@@ -3957,6 +3964,10 @@ var OCHK_IO_FOOTER = [
3957
3964
  ]
3958
3965
  }
3959
3966
  ];
3967
+ var InColumnContext = sharedContext("in-column", false);
3968
+ function useInColumn() {
3969
+ return react.useContext(InColumnContext);
3970
+ }
3960
3971
  var SiteHomeContext = sharedContext("site-home", void 0);
3961
3972
  function useSiteHome() {
3962
3973
  return react.useContext(SiteHomeContext);
@@ -3984,10 +3995,11 @@ function ErrorPage({
3984
3995
  className
3985
3996
  }) {
3986
3997
  const shellHome = useSiteHome();
3998
+ const inColumn = useInColumn();
3987
3999
  const homeHref = home ?? (protocol2 ? protocolSite(protocol2).pageHref : shellHome ?? OCHK_IO);
3988
4000
  const words = WORDS[code] ?? (code >= 500 ? WORDS[500] : WORDS[404]);
3989
4001
  const server = code >= 500;
3990
- 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: [
4002
+ return /* @__PURE__ */ jsxRuntime.jsx(Section, { space: "none", contained: !inColumn, 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: [
3991
4003
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex max-w-[40rem] flex-col items-start gap-6 md:col-span-7", children: [
3992
4004
  /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "oca-eyebrow oca-enter", children: [
3993
4005
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "oca-tabular", children: code }),
@@ -4244,7 +4256,7 @@ function Panel({
4244
4256
  const [open, setOpen] = react.useState(false);
4245
4257
  const body = (expanded) => typeof children === "function" ? children(expanded) : children;
4246
4258
  const head = (expanded) => /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "flex flex-wrap items-start justify-between gap-x-4 gap-y-2", children: [
4247
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-col gap-1", children: [
4259
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-[min(100%,12rem)] flex-1 basis-0 flex-col gap-1", children: [
4248
4260
  expanded ? /* @__PURE__ */ jsxRuntime.jsx(DialogTitle, { className: "text-[1.0625rem] font-medium leading-snug", children: title }) : /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-[1rem] font-medium leading-snug", children: title }),
4249
4261
  description ? expanded ? /* @__PURE__ */ jsxRuntime.jsx(DialogDescription, { className: "text-[0.875rem] leading-snug text-muted-foreground", children: description }) : /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[0.875rem] leading-snug text-muted-foreground", children: description }) : null
4250
4262
  ] }),
@@ -4273,7 +4285,7 @@ function Panel({
4273
4285
  className: "flex h-[min(92dvh,56rem)] w-[min(96vw,80rem)] max-w-none flex-col gap-4 overflow-y-auto",
4274
4286
  children: [
4275
4287
  head(true),
4276
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 min-w-0 flex-1", children: open ? body(true) : null }),
4288
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 min-w-0 flex-1 overflow-y-auto", children: open ? body(true) : null }),
4277
4289
  source ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-t border-border pt-3", children: source }) : null
4278
4290
  ]
4279
4291
  }
@@ -5423,6 +5435,112 @@ function SignMessage({
5423
5435
  )
5424
5436
  ] });
5425
5437
  }
5438
+ function SectionTitle({
5439
+ title,
5440
+ meta,
5441
+ description,
5442
+ action,
5443
+ as: Tag = "h2",
5444
+ size = "md",
5445
+ tone = "default",
5446
+ id,
5447
+ className
5448
+ }) {
5449
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-wrap items-end justify-between gap-x-4 gap-y-3", className), children: [
5450
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 max-w-[40rem] flex-[1_1_16rem] flex-col gap-1", children: [
5451
+ /* @__PURE__ */ jsxRuntime.jsxs(
5452
+ Tag,
5453
+ {
5454
+ id,
5455
+ className: cn(
5456
+ "flex scroll-mt-24 flex-wrap items-baseline gap-x-3",
5457
+ size === "sm" ? "oca-title-sm" : "oca-title",
5458
+ tone === "danger" && "text-destructive"
5459
+ ),
5460
+ children: [
5461
+ title,
5462
+ meta ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "oca-tabular text-[0.875rem] font-normal tracking-normal text-muted-foreground", children: meta }) : null
5463
+ ]
5464
+ }
5465
+ ),
5466
+ description ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[0.9375rem] leading-relaxed text-muted-foreground", children: description }) : null
5467
+ ] }),
5468
+ action ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex shrink-0 flex-wrap items-center gap-2", children: action }) : null
5469
+ ] });
5470
+ }
5471
+ function ListCard({
5472
+ as: Tag = "ul",
5473
+ className,
5474
+ ...props
5475
+ }) {
5476
+ return /* @__PURE__ */ jsxRuntime.jsx(Tag, { className: cn("divide-y divide-border overflow-clip rounded-[1.25rem] border border-border bg-card", className), ...props });
5477
+ }
5478
+ var ChoiceSize = react.createContext("md");
5479
+ var COLUMNS = { 1: "", 2: "sm:grid-cols-2", 3: "sm:grid-cols-2 lg:grid-cols-3" };
5480
+ function ChoiceGroup({
5481
+ value,
5482
+ onValueChange,
5483
+ label,
5484
+ columns = 1,
5485
+ size = "md",
5486
+ disabled,
5487
+ className,
5488
+ children
5489
+ }) {
5490
+ return /* @__PURE__ */ jsxRuntime.jsx(ChoiceSize.Provider, { value: size, children: /* @__PURE__ */ jsxRuntime.jsx(
5491
+ RadioGroupPrimitive__namespace.Root,
5492
+ {
5493
+ value: value ?? "",
5494
+ onValueChange: (v) => onValueChange(v),
5495
+ "aria-label": label,
5496
+ disabled,
5497
+ className: cn("grid", size === "sm" ? "gap-1.5" : "gap-3", COLUMNS[columns], className),
5498
+ children
5499
+ }
5500
+ ) });
5501
+ }
5502
+ function ChoiceCard({
5503
+ value,
5504
+ title,
5505
+ description,
5506
+ icon,
5507
+ disabled,
5508
+ className
5509
+ }) {
5510
+ const sm = react.useContext(ChoiceSize) === "sm";
5511
+ return /* @__PURE__ */ jsxRuntime.jsxs(
5512
+ RadioGroupPrimitive__namespace.Item,
5513
+ {
5514
+ value,
5515
+ disabled,
5516
+ className: cn(
5517
+ "group flex w-full min-w-0 items-start gap-3 border text-left outline-none transition-colors",
5518
+ "focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
5519
+ "border-border bg-card data-[state=checked]:border-foreground data-[state=checked]:bg-accent data-[state=unchecked]:hover:border-oca-hairline-strong",
5520
+ "disabled:cursor-not-allowed disabled:opacity-50",
5521
+ sm ? "min-h-11 rounded-xl px-3.5 py-2.5" : "rounded-[1.25rem] p-5",
5522
+ className
5523
+ ),
5524
+ children: [
5525
+ icon ? /* @__PURE__ */ jsxRuntime.jsx(
5526
+ "span",
5527
+ {
5528
+ "aria-hidden": true,
5529
+ className: cn(
5530
+ "shrink-0 text-muted-foreground group-data-[state=checked]:text-oca-accent-ink [&_svg]:size-full",
5531
+ sm ? "mt-0.5 size-4" : "size-6"
5532
+ ),
5533
+ children: icon
5534
+ }
5535
+ ) : null,
5536
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-col gap-1", children: [
5537
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: sm ? "text-[0.9375rem] font-medium" : "oca-title-sm", children: title }),
5538
+ description ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[0.875rem] leading-relaxed text-muted-foreground", children: description }) : null
5539
+ ] })
5540
+ ]
5541
+ }
5542
+ );
5543
+ }
5426
5544
  function useMacKeys() {
5427
5545
  const [mac, setMac] = react.useState(true);
5428
5546
  react.useEffect(() => {
@@ -5698,7 +5816,7 @@ function download(content, filename, mime) {
5698
5816
  a.remove();
5699
5817
  setTimeout(() => URL.revokeObjectURL(url), 0);
5700
5818
  }
5701
- 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";
5819
+ 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";
5702
5820
  function ArtifactView({
5703
5821
  content,
5704
5822
  title,
@@ -5728,7 +5846,8 @@ function ArtifactView({
5728
5846
  "aria-pressed": view === v,
5729
5847
  onClick: () => setView(v),
5730
5848
  className: cn(
5731
- "h-7 rounded-full px-2.5 text-[0.75rem] transition-colors",
5849
+ // The pill stays 28px; its target reaches the bar's 44.
5850
+ "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",
5732
5851
  view === v ? "bg-white/[0.12] text-white" : "text-oca-ink-subtle hover:text-white"
5733
5852
  ),
5734
5853
  children: v === "formatted" ? "Formatted" : "Raw"
@@ -6198,7 +6317,8 @@ function FilterChips({
6198
6317
  onClick: () => press(o.value),
6199
6318
  className: cn(
6200
6319
  "inline-flex shrink-0 items-center gap-1.5 rounded-full border px-3.5 text-[0.875rem] transition-colors",
6201
- tight ? "h-8" : "h-9",
6320
+ // A thumb's 44px on a phone.
6321
+ tight ? "h-11 md:h-8" : "h-11 md:h-9",
6202
6322
  on ? "border-foreground bg-foreground text-background" : "border-border bg-card text-muted-foreground hover:border-oca-hairline-strong hover:text-foreground"
6203
6323
  ),
6204
6324
  children: [
@@ -6622,7 +6742,7 @@ function SidebarShell({
6622
6742
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
6623
6743
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "hidden h-[4.5rem] items-center justify-end gap-3 px-8 lg:flex", children: account }),
6624
6744
  banner ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-4 pb-2 pt-4 md:px-8 lg:pt-0", children: banner }) : null,
6625
- /* @__PURE__ */ jsxRuntime.jsx("main", { id: "main-content", className: "flex-1 px-4 pb-16 pt-6 md:px-8 lg:pt-2", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-[72rem]", children }) })
6745
+ /* @__PURE__ */ jsxRuntime.jsx("main", { id: "main-content", className: "flex-1 px-4 pb-16 pt-6 md:px-8 lg:pt-2", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-[72rem]", children: /* @__PURE__ */ jsxRuntime.jsx(InColumnContext.Provider, { value: true, children }) }) })
6626
6746
  ] })
6627
6747
  ] }),
6628
6748
  tabs ? /* @__PURE__ */ jsxRuntime.jsx(TabBar, { items: tabs }) : null
@@ -6665,7 +6785,7 @@ function RailShell({ nav = [], persistent = [], page: pageOverride, header, acco
6665
6785
  const tabs = tabsFor([{ items: [...main, ...foot] }]);
6666
6786
  const active = activeItem([...nav, ...persistent]);
6667
6787
  const place = react.useMemo(() => ({ page: pageOverride ?? active?.label }), [pageOverride, active?.label]);
6668
- return /* @__PURE__ */ jsxRuntime.jsx(ShellContext.Provider, { value: place, children: /* @__PURE__ */ jsxRuntime.jsx(TooltipProvider, { delayDuration: 300, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex h-dvh flex-col overflow-hidden bg-background", className), children: [
6788
+ return /* @__PURE__ */ jsxRuntime.jsx(ShellContext.Provider, { value: place, children: /* @__PURE__ */ jsxRuntime.jsx(TooltipProvider, { delayDuration: 300, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative flex h-dvh flex-col overflow-clip bg-background", className), children: [
6669
6789
  header,
6670
6790
  banner,
6671
6791
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-0 flex-1", children: [
@@ -6817,6 +6937,18 @@ function NavDropdown({ item }) {
6817
6937
  ] })
6818
6938
  ] });
6819
6939
  }
6940
+ function AccountCta({ href = GET_AN_ACCOUNT.href, className }) {
6941
+ return /* @__PURE__ */ jsxRuntime.jsx(Button, { asChild: true, size: "sm", className, children: /* @__PURE__ */ jsxRuntime.jsx("a", { href, children: GET_AN_ACCOUNT.label }) });
6942
+ }
6943
+ function ProductLockup({ size, product }) {
6944
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center", children: [
6945
+ /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size }),
6946
+ product ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
6947
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "mx-3 h-5 w-px bg-oca-hairline-strong" }),
6948
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium tracking-[-0.01em]", style: { fontSize: size * 0.56 }, children: product })
6949
+ ] }) : null
6950
+ ] });
6951
+ }
6820
6952
  function SiteHeader({
6821
6953
  home = "/",
6822
6954
  brand,
@@ -6836,13 +6968,7 @@ function SiteHeader({
6836
6968
  const current2 = typeof family === "string" ? family : void 0;
6837
6969
  const phoneNav = navOnPhone ? nav : [];
6838
6970
  const menu = phoneNav.length > 0 || Boolean(family) || Boolean(menuExtra);
6839
- const brandNode = brand ?? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center", children: [
6840
- /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size }),
6841
- product ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
6842
- /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "mx-3 h-5 w-px bg-oca-hairline-strong" }),
6843
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium tracking-[-0.01em]", style: { fontSize: size * 0.56 }, children: product })
6844
- ] }) : null
6845
- ] });
6971
+ const brandNode = brand ?? /* @__PURE__ */ jsxRuntime.jsx(ProductLockup, { size, product });
6846
6972
  const navigation = nav.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Main", className: "hidden items-center gap-1 md:flex", children: nav.map(
6847
6973
  (n) => n.children?.length ? /* @__PURE__ */ jsxRuntime.jsx(NavDropdown, { item: n }, n.href) : (
6848
6974
  // Between md and lg the family menu and the actions share the row: tighter.
@@ -6972,7 +7098,7 @@ function SiteBanner({
6972
7098
  var FOOT_LINK = "inline-flex min-h-11 items-center transition-colors hover:text-foreground md:min-h-0";
6973
7099
  function LegalRow({ links }) {
6974
7100
  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: [
6975
- /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Legal", children: /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-wrap gap-x-5", children: links.map((l) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: l.href.startsWith("/") ? /* @__PURE__ */ jsxRuntime.jsx(Link6__default.default, { href: l.href, className: FOOT_LINK, children: l.label }) : /* @__PURE__ */ jsxRuntime.jsx("a", { href: l.href, className: FOOT_LINK, children: l.label }) }, l.href)) }) }),
7101
+ /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Legal", children: /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-wrap gap-x-5", children: links.map((l, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: l.href.startsWith("/") ? /* @__PURE__ */ jsxRuntime.jsx(Link6__default.default, { href: l.href, className: FOOT_LINK, children: l.label }) : /* @__PURE__ */ jsxRuntime.jsx("a", { href: l.href, className: FOOT_LINK, children: l.label }) }, `${i}:${l.label}`)) }) }),
6976
7102
  /* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
6977
7103
  "\xA9 ",
6978
7104
  (/* @__PURE__ */ new Date()).getFullYear(),
@@ -6992,16 +7118,26 @@ function SiteFooter({
6992
7118
  }) {
6993
7119
  const legalLinks = legal === true ? LEGAL_LINKS : legal || null;
6994
7120
  if (compact) {
6995
- 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: [
6996
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-6 gap-y-1", children: [
6997
- /* @__PURE__ */ jsxRuntime.jsx("a", { href: OCHK_IO, className: "rounded-lg text-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 22 }) }),
6998
- 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
6999
- ] }),
7000
- legalLinks || 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: [
7001
- legalLinks ? /* @__PURE__ */ jsxRuntime.jsx(LegalRow, { links: legalLinks }) : null,
7002
- meta
7003
- ] }) : null
7004
- ] }) });
7121
+ return (
7122
+ // The tools' column (ToolColumn): the lockup lines up with the page's title.
7123
+ /* @__PURE__ */ jsxRuntime.jsx("footer", { className: cn("border-t border-border bg-background px-4 text-[0.875rem] text-muted-foreground md:px-8", className), children: /* @__PURE__ */ jsxRuntime.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: [
7124
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-6 gap-y-3", children: [
7125
+ /* @__PURE__ */ jsxRuntime.jsx(
7126
+ "a",
7127
+ {
7128
+ href: OCHK_IO,
7129
+ className: "relative rounded-lg text-foreground before:absolute before:inset-x-0 before:top-1/2 before:h-11 before:-translate-y-1/2",
7130
+ children: /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 22 })
7131
+ }
7132
+ ),
7133
+ 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
7134
+ ] }),
7135
+ legalLinks || 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: [
7136
+ legalLinks ? /* @__PURE__ */ jsxRuntime.jsx(LegalRow, { links: legalLinks }) : null,
7137
+ meta
7138
+ ] }) : null
7139
+ ] }) })
7140
+ );
7005
7141
  }
7006
7142
  const cols = [
7007
7143
  ...columns,
@@ -7036,17 +7172,17 @@ function SiteFooter({
7036
7172
  className: cn("flex min-w-0 flex-col gap-1", spans && "col-span-2 md:col-span-1"),
7037
7173
  children: [
7038
7174
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-[0.875rem] font-medium", children: col.heading }),
7039
- /* @__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(
7175
+ /* @__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, j) => /* @__PURE__ */ jsxRuntime.jsx(
7040
7176
  NavLink,
7041
7177
  {
7042
7178
  item: l,
7043
7179
  className: "-mx-3 py-2.5 text-[0.9375rem] md:py-1.5"
7044
7180
  },
7045
- l.href
7181
+ `${j}:${l.label}`
7046
7182
  )) })
7047
7183
  ]
7048
7184
  },
7049
- col.heading
7185
+ `${i}:${col.heading}`
7050
7186
  );
7051
7187
  })
7052
7188
  ]
@@ -7082,12 +7218,13 @@ function OchkIoFooter({ columns = OCHK_IO_FOOTER, className }) {
7082
7218
  );
7083
7219
  }
7084
7220
  function SignInFrame({
7085
- title = "Sign in",
7221
+ title = SIGN_IN_LABEL,
7086
7222
  lead,
7087
7223
  children,
7088
7224
  error,
7089
7225
  fineprint,
7090
7226
  brand,
7227
+ product,
7091
7228
  home,
7092
7229
  protocol: protocol2,
7093
7230
  back,
@@ -7105,7 +7242,7 @@ function SignInFrame({
7105
7242
  /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "flex flex-col px-4 pb-8 pt-5 sm:px-8 lg:px-14 lg:pt-8", children: [
7106
7243
  /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "flex items-center justify-between gap-4", children: [
7107
7244
  /* @__PURE__ */ jsxRuntime.jsxs(Link6__default.default, { href: homeHref, className: "w-fit rounded-lg", children: [
7108
- brand ?? /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 28 }),
7245
+ brand ?? /* @__PURE__ */ jsxRuntime.jsx(ProductLockup, { size: 28, product: product ?? (protocol2 ? protocolSite(protocol2).label : void 0) }),
7109
7246
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: " home" })
7110
7247
  ] }),
7111
7248
  back === void 0 ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -7316,7 +7453,7 @@ function SessionAccountView({
7316
7453
  items = [],
7317
7454
  signInHref,
7318
7455
  signInPath,
7319
- signInLabel = "Sign in",
7456
+ signInLabel = SIGN_IN_LABEL,
7320
7457
  accountHref = OCHK_APP_ACCOUNT,
7321
7458
  onSignOut,
7322
7459
  nameFrom = "lg"
@@ -7347,6 +7484,13 @@ function SessionAccountView({
7347
7484
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: state === "checking" ? "contents invisible" : "contents", "aria-hidden": state === "checking" || void 0, children: /* @__PURE__ */ jsxRuntime.jsx(Button, { asChild: true, size: "sm", variant: "secondary", tabIndex: state === "checking" ? -1 : void 0, children: /* @__PURE__ */ jsxRuntime.jsx("a", { href: signInHref ?? inPlace ?? "https://ochk.io/signin", children: signInLabel }) }) })
7348
7485
  );
7349
7486
  }
7487
+ function ToolColumn({
7488
+ measure = "wide",
7489
+ className,
7490
+ children
7491
+ }) {
7492
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("px-4 pb-16 pt-8 md:px-8 md:pt-10", className), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-[72rem]", children: /* @__PURE__ */ jsxRuntime.jsx(InColumnContext.Provider, { value: true, children: measure === "narrow" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-w-[48rem]", children }) : children }) }) });
7493
+ }
7350
7494
  function ToolShell({
7351
7495
  protocol: protocol2,
7352
7496
  tools,
@@ -7355,6 +7499,7 @@ function ToolShell({
7355
7499
  rail = false,
7356
7500
  railFooter,
7357
7501
  variant = "tool",
7502
+ measure = "wide",
7358
7503
  banner,
7359
7504
  footer,
7360
7505
  children
@@ -7380,7 +7525,9 @@ function ToolShell({
7380
7525
  {
7381
7526
  className: cn(
7382
7527
  "flex flex-col bg-background",
7383
- app ? "h-dvh overflow-hidden" : "min-h-dvh",
7528
+ // An app frame contains what is positioned inside it (sr-only text deep in the page's own
7529
+ // scroller would otherwise size the document), and clips without becoming a scroller.
7530
+ app ? "relative h-dvh overflow-clip" : "min-h-dvh",
7384
7531
  tabs && "max-md:pb-[calc(3.5rem_+_env(safe-area-inset-bottom))]"
7385
7532
  ),
7386
7533
  children: [
@@ -7410,14 +7557,7 @@ function ToolShell({
7410
7557
  /* @__PURE__ */ jsxRuntime.jsx(SideNav, { groups: [{ label: "Tools", items: tools.map(({ href, label, icon, active }) => ({ href, label, icon, active })) }] }),
7411
7558
  railFooter ? /* @__PURE__ */ jsxRuntime.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
7412
7559
  ] }) : null,
7413
- /* @__PURE__ */ jsxRuntime.jsx(
7414
- "main",
7415
- {
7416
- id: "main-content",
7417
- 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"),
7418
- children: /* @__PURE__ */ jsxRuntime.jsx(SiteHomeContext.Provider, { value: homeHref, children: app ? children : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-[72rem]", children }) })
7419
- }
7420
- )
7560
+ /* @__PURE__ */ jsxRuntime.jsx("main", { id: "main-content", className: cn("min-w-0 flex-1", app && "flex min-h-0 flex-col"), children: /* @__PURE__ */ jsxRuntime.jsx(SiteHomeContext.Provider, { value: homeHref, children: app ? children : /* @__PURE__ */ jsxRuntime.jsx(ToolColumn, { measure, children }) }) })
7421
7561
  ] }),
7422
7562
  app || footer === false ? null : footer ?? /* @__PURE__ */ jsxRuntime.jsx(SiteFooter, { compact: true, family: true, legal: true }),
7423
7563
  tabs ? /* @__PURE__ */ jsxRuntime.jsx(TabBar, { items: tabs }) : null
@@ -7603,6 +7743,7 @@ exports.APP_ID = APP_ID;
7603
7743
  exports.Accent = Accent;
7604
7744
  exports.Accordion = Accordion;
7605
7745
  exports.AccordionItem = AccordionItem;
7746
+ exports.AccountCta = AccountCta;
7606
7747
  exports.AccountMenu = AccountMenu;
7607
7748
  exports.ActivityList = ActivityList;
7608
7749
  exports.AnchorStatus = AnchorStatus;
@@ -7630,6 +7771,8 @@ exports.CardNumeral = CardNumeral;
7630
7771
  exports.CardTitle = CardTitle;
7631
7772
  exports.ChartFrame = ChartFrame;
7632
7773
  exports.Checkbox = Checkbox;
7774
+ exports.ChoiceCard = ChoiceCard;
7775
+ exports.ChoiceGroup = ChoiceGroup;
7633
7776
  exports.Closing = Closing;
7634
7777
  exports.CodeBlock = CodeBlock;
7635
7778
  exports.CodeTabs = CodeTabs;
@@ -7685,6 +7828,7 @@ exports.FilterChips = FilterChips;
7685
7828
  exports.FloatChip = FloatChip;
7686
7829
  exports.Footnote = Footnote;
7687
7830
  exports.FormSection = FormSection;
7831
+ exports.GET_AN_ACCOUNT = GET_AN_ACCOUNT;
7688
7832
  exports.HalftoneCanvas = HalftoneCanvas;
7689
7833
  exports.HalftoneSphere = HalftoneSphere;
7690
7834
  exports.HashChip = HashChip;
@@ -7699,6 +7843,7 @@ exports.Label = Label;
7699
7843
  exports.Lead = Lead;
7700
7844
  exports.LegalDocument = LegalDocument;
7701
7845
  exports.LinkCard = LinkCard;
7846
+ exports.ListCard = ListCard;
7702
7847
  exports.LoadingBlock = LoadingBlock;
7703
7848
  exports.LockedPreview = LockedPreview;
7704
7849
  exports.Lockup = Lockup;
@@ -7708,6 +7853,7 @@ exports.MdxTable = MdxTable;
7708
7853
  exports.Meter = Meter;
7709
7854
  exports.Monogram = Monogram;
7710
7855
  exports.Notice = Notice;
7856
+ exports.OCHK_APP = OCHK_APP;
7711
7857
  exports.OCHK_APP_ACCOUNT = OCHK_APP_ACCOUNT;
7712
7858
  exports.OCHK_IO = OCHK_IO;
7713
7859
  exports.OCHK_IO_FOOTER = OCHK_IO_FOOTER;
@@ -7738,6 +7884,7 @@ exports.RadioGroup = RadioGroup;
7738
7884
  exports.RadioGroupItem = RadioGroupItem;
7739
7885
  exports.Reveal = Reveal;
7740
7886
  exports.SELF_HOSTED_LEGAL_LINKS = SELF_HOSTED_LEGAL_LINKS;
7887
+ exports.SIGN_IN_LABEL = SIGN_IN_LABEL;
7741
7888
  exports.SPHERE_GRADIENT = SPHERE_GRADIENT;
7742
7889
  exports.Sats = Sats;
7743
7890
  exports.SatsFigure = SatsFigure;
@@ -7748,6 +7895,7 @@ exports.SearchDialog = SearchDialog;
7748
7895
  exports.Section = Section;
7749
7896
  exports.SectionHeading = SectionHeading;
7750
7897
  exports.SectionIntro = SectionIntro;
7898
+ exports.SectionTitle = SectionTitle;
7751
7899
  exports.Select = Select;
7752
7900
  exports.SelectContent = SelectContent;
7753
7901
  exports.SelectGroup = SelectGroup;
@@ -7795,6 +7943,7 @@ exports.Textarea = Textarea;
7795
7943
  exports.ThemeToggle = ThemeToggle;
7796
7944
  exports.Ticker = Ticker;
7797
7945
  exports.Toaster = Toaster;
7946
+ exports.ToolColumn = ToolColumn;
7798
7947
  exports.ToolGrid = ToolGrid;
7799
7948
  exports.ToolShell = ToolShell;
7800
7949
  exports.Tooltip = Tooltip;