@orangecheck/app-design 1.6.2 → 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 (52) 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 +152 -128
  5. package/dist/chrome.js.map +1 -1
  6. package/dist/chrome.mjs +151 -129
  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 +131 -10
  11. package/dist/components.js.map +1 -1
  12. package/dist/components.mjs +128 -11
  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 +189 -43
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs +181 -44
  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 +3 -2
  33. package/dist/mdx.js.map +1 -1
  34. package/dist/mdx.mjs +3 -2
  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/session.d.mts +4 -4
  39. package/dist/session.d.ts +4 -4
  40. package/dist/session.js +122 -1
  41. package/dist/session.js.map +1 -1
  42. package/dist/session.mjs +122 -1
  43. package/dist/session.mjs.map +1 -1
  44. package/dist/{status-badge-BJ9Sdsx8.d.mts → status-badge-BBbCO6ZA.d.mts} +1 -1
  45. package/dist/{status-badge-Bt8x3RhO.d.ts → status-badge-CHHxtFkP.d.ts} +1 -1
  46. package/dist/styles/swagger.css +24 -1
  47. package/dist/styles/tokens.css +5 -0
  48. package/dist/{tool-shell-CQZNRUgH.d.mts → tool-shell-CnZ3NUSi.d.ts} +10 -4
  49. package/dist/{tool-shell-CRmceGrV.d.ts → tool-shell-DQFEMLLe.d.mts} +10 -4
  50. package/dist/{tools-Bg1gi2HO.d.mts → tools-CKO8IseL.d.mts} +2 -2
  51. package/dist/{tools-Bw7RhO92.d.ts → tools-CzjFPng4.d.ts} +2 -2
  52. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -2202,7 +2202,7 @@ var JS_TAG = /<\/?(?=[A-Za-z])/y;
2202
2202
  var JS_TAG_NAME = /[A-Za-z][\w$.:-]*/y;
2203
2203
  var JS_PUNCT = /=>|\.\.\.|[{}()[\];,.<>=+\-*/%!?:&|^~#]/y;
2204
2204
  var JSX_BEFORE = /* @__PURE__ */ new Set(["(", ",", "=", "?", ":", "{", "[", ";", ">", "&&", "||", "=>", "return"]);
2205
- function scanJs(src, emit2, jsx52) {
2205
+ function scanJs(src, emit2, jsx53) {
2206
2206
  let i = 0;
2207
2207
  let prev = "";
2208
2208
  let tagDepth = 0;
@@ -2228,7 +2228,7 @@ function scanJs(src, emit2, jsx52) {
2228
2228
  sig('"');
2229
2229
  continue;
2230
2230
  }
2231
- 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))) {
2232
2232
  const name = at(JS_TAG_NAME, src, i + m.length);
2233
2233
  if (name) {
2234
2234
  emit2(m);
@@ -2240,7 +2240,7 @@ function scanJs(src, emit2, jsx52) {
2240
2240
  continue;
2241
2241
  }
2242
2242
  }
2243
- if (jsx52 && tagDepth > 0 && braceInTag === 0) {
2243
+ if (jsx53 && tagDepth > 0 && braceInTag === 0) {
2244
2244
  if (src.startsWith("/>", i) || src[i] === ">") {
2245
2245
  const close = src[i] === ">" ? ">" : "/>";
2246
2246
  emit2(close);
@@ -2260,7 +2260,7 @@ function scanJs(src, emit2, jsx52) {
2260
2260
  continue;
2261
2261
  }
2262
2262
  if (src[i] === "{") braceInTag = 1;
2263
- } else if (jsx52 && tagDepth > 0 && braceInTag > 0) {
2263
+ } else if (jsx53 && tagDepth > 0 && braceInTag > 0) {
2264
2264
  if (src[i] === "{") braceInTag++;
2265
2265
  else if (src[i] === "}") braceInTag--;
2266
2266
  }
@@ -3288,7 +3288,7 @@ function Well({
3288
3288
  ] });
3289
3289
  }
3290
3290
  var FRAME = "overflow-hidden rounded-[1.25rem] border border-[var(--oca-code-line)] bg-[var(--oca-code-surface)]";
3291
- 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";
3292
3292
  function CodeBlock({
3293
3293
  code,
3294
3294
  html,
@@ -3716,6 +3716,9 @@ var GROUNDS = [
3716
3716
  }
3717
3717
  ];
3718
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]",
3719
3722
  sm: "size-9 rounded-[0.7rem] text-[0.9375rem]",
3720
3723
  md: "size-11 rounded-[0.85rem] text-[1.125rem]",
3721
3724
  lg: "size-14 rounded-[1.05rem] text-[1.5rem]"
@@ -3803,6 +3806,9 @@ var ErrorBoundary = class extends react.Component {
3803
3806
  // src/family/index.ts
3804
3807
  var OCHK_IO = "https://ochk.io";
3805
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";
3806
3812
  function protocol(slug, verb, line, kinds) {
3807
3813
  return {
3808
3814
  slug,
@@ -3839,7 +3845,7 @@ var FAMILY = [
3839
3845
  {
3840
3846
  slug: "me",
3841
3847
  label: "ochk.app",
3842
- href: "https://ochk.app",
3848
+ href: OCHK_APP,
3843
3849
  group: "orangecheck",
3844
3850
  line: "One account, with Bitcoin behind it.",
3845
3851
  status: "testing"
@@ -3958,6 +3964,10 @@ var OCHK_IO_FOOTER = [
3958
3964
  ]
3959
3965
  }
3960
3966
  ];
3967
+ var InColumnContext = sharedContext("in-column", false);
3968
+ function useInColumn() {
3969
+ return react.useContext(InColumnContext);
3970
+ }
3961
3971
  var SiteHomeContext = sharedContext("site-home", void 0);
3962
3972
  function useSiteHome() {
3963
3973
  return react.useContext(SiteHomeContext);
@@ -3985,10 +3995,11 @@ function ErrorPage({
3985
3995
  className
3986
3996
  }) {
3987
3997
  const shellHome = useSiteHome();
3998
+ const inColumn = useInColumn();
3988
3999
  const homeHref = home ?? (protocol2 ? protocolSite(protocol2).pageHref : shellHome ?? OCHK_IO);
3989
4000
  const words = WORDS[code] ?? (code >= 500 ? WORDS[500] : WORDS[404]);
3990
4001
  const server = code >= 500;
3991
- 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: [
3992
4003
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex max-w-[40rem] flex-col items-start gap-6 md:col-span-7", children: [
3993
4004
  /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "oca-eyebrow oca-enter", children: [
3994
4005
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "oca-tabular", children: code }),
@@ -5424,6 +5435,112 @@ function SignMessage({
5424
5435
  )
5425
5436
  ] });
5426
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
+ }
5427
5544
  function useMacKeys() {
5428
5545
  const [mac, setMac] = react.useState(true);
5429
5546
  react.useEffect(() => {
@@ -5699,7 +5816,7 @@ function download(content, filename, mime) {
5699
5816
  a.remove();
5700
5817
  setTimeout(() => URL.revokeObjectURL(url), 0);
5701
5818
  }
5702
- 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";
5703
5820
  function ArtifactView({
5704
5821
  content,
5705
5822
  title,
@@ -5729,7 +5846,8 @@ function ArtifactView({
5729
5846
  "aria-pressed": view === v,
5730
5847
  onClick: () => setView(v),
5731
5848
  className: cn(
5732
- "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",
5733
5851
  view === v ? "bg-white/[0.12] text-white" : "text-oca-ink-subtle hover:text-white"
5734
5852
  ),
5735
5853
  children: v === "formatted" ? "Formatted" : "Raw"
@@ -6199,7 +6317,8 @@ function FilterChips({
6199
6317
  onClick: () => press(o.value),
6200
6318
  className: cn(
6201
6319
  "inline-flex shrink-0 items-center gap-1.5 rounded-full border px-3.5 text-[0.875rem] transition-colors",
6202
- 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",
6203
6322
  on ? "border-foreground bg-foreground text-background" : "border-border bg-card text-muted-foreground hover:border-oca-hairline-strong hover:text-foreground"
6204
6323
  ),
6205
6324
  children: [
@@ -6623,7 +6742,7 @@ function SidebarShell({
6623
6742
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
6624
6743
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "hidden h-[4.5rem] items-center justify-end gap-3 px-8 lg:flex", children: account }),
6625
6744
  banner ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-4 pb-2 pt-4 md:px-8 lg:pt-0", children: banner }) : null,
6626
- /* @__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 }) }) })
6627
6746
  ] })
6628
6747
  ] }),
6629
6748
  tabs ? /* @__PURE__ */ jsxRuntime.jsx(TabBar, { items: tabs }) : null
@@ -6818,6 +6937,18 @@ function NavDropdown({ item }) {
6818
6937
  ] })
6819
6938
  ] });
6820
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
+ }
6821
6952
  function SiteHeader({
6822
6953
  home = "/",
6823
6954
  brand,
@@ -6837,13 +6968,7 @@ function SiteHeader({
6837
6968
  const current2 = typeof family === "string" ? family : void 0;
6838
6969
  const phoneNav = navOnPhone ? nav : [];
6839
6970
  const menu = phoneNav.length > 0 || Boolean(family) || Boolean(menuExtra);
6840
- const brandNode = brand ?? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center", children: [
6841
- /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size }),
6842
- product ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
6843
- /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "mx-3 h-5 w-px bg-oca-hairline-strong" }),
6844
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium tracking-[-0.01em]", style: { fontSize: size * 0.56 }, children: product })
6845
- ] }) : null
6846
- ] });
6971
+ const brandNode = brand ?? /* @__PURE__ */ jsxRuntime.jsx(ProductLockup, { size, product });
6847
6972
  const navigation = nav.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Main", className: "hidden items-center gap-1 md:flex", children: nav.map(
6848
6973
  (n) => n.children?.length ? /* @__PURE__ */ jsxRuntime.jsx(NavDropdown, { item: n }, n.href) : (
6849
6974
  // Between md and lg the family menu and the actions share the row: tighter.
@@ -6973,7 +7098,7 @@ function SiteBanner({
6973
7098
  var FOOT_LINK = "inline-flex min-h-11 items-center transition-colors hover:text-foreground md:min-h-0";
6974
7099
  function LegalRow({ links }) {
6975
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: [
6976
- /* @__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}`)) }) }),
6977
7102
  /* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
6978
7103
  "\xA9 ",
6979
7104
  (/* @__PURE__ */ new Date()).getFullYear(),
@@ -6993,16 +7118,26 @@ function SiteFooter({
6993
7118
  }) {
6994
7119
  const legalLinks = legal === true ? LEGAL_LINKS : legal || null;
6995
7120
  if (compact) {
6996
- 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: [
6997
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-6 gap-y-1", children: [
6998
- /* @__PURE__ */ jsxRuntime.jsx("a", { href: OCHK_IO, className: "rounded-lg text-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 22 }) }),
6999
- 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
7000
- ] }),
7001
- 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: [
7002
- legalLinks ? /* @__PURE__ */ jsxRuntime.jsx(LegalRow, { links: legalLinks }) : null,
7003
- meta
7004
- ] }) : null
7005
- ] }) });
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
+ );
7006
7141
  }
7007
7142
  const cols = [
7008
7143
  ...columns,
@@ -7037,17 +7172,17 @@ function SiteFooter({
7037
7172
  className: cn("flex min-w-0 flex-col gap-1", spans && "col-span-2 md:col-span-1"),
7038
7173
  children: [
7039
7174
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-[0.875rem] font-medium", children: col.heading }),
7040
- /* @__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(
7041
7176
  NavLink,
7042
7177
  {
7043
7178
  item: l,
7044
7179
  className: "-mx-3 py-2.5 text-[0.9375rem] md:py-1.5"
7045
7180
  },
7046
- l.href
7181
+ `${j}:${l.label}`
7047
7182
  )) })
7048
7183
  ]
7049
7184
  },
7050
- col.heading
7185
+ `${i}:${col.heading}`
7051
7186
  );
7052
7187
  })
7053
7188
  ]
@@ -7083,12 +7218,13 @@ function OchkIoFooter({ columns = OCHK_IO_FOOTER, className }) {
7083
7218
  );
7084
7219
  }
7085
7220
  function SignInFrame({
7086
- title = "Sign in",
7221
+ title = SIGN_IN_LABEL,
7087
7222
  lead,
7088
7223
  children,
7089
7224
  error,
7090
7225
  fineprint,
7091
7226
  brand,
7227
+ product,
7092
7228
  home,
7093
7229
  protocol: protocol2,
7094
7230
  back,
@@ -7106,7 +7242,7 @@ function SignInFrame({
7106
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: [
7107
7243
  /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "flex items-center justify-between gap-4", children: [
7108
7244
  /* @__PURE__ */ jsxRuntime.jsxs(Link6__default.default, { href: homeHref, className: "w-fit rounded-lg", children: [
7109
- brand ?? /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 28 }),
7245
+ brand ?? /* @__PURE__ */ jsxRuntime.jsx(ProductLockup, { size: 28, product: product ?? (protocol2 ? protocolSite(protocol2).label : void 0) }),
7110
7246
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: " home" })
7111
7247
  ] }),
7112
7248
  back === void 0 ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -7317,7 +7453,7 @@ function SessionAccountView({
7317
7453
  items = [],
7318
7454
  signInHref,
7319
7455
  signInPath,
7320
- signInLabel = "Sign in",
7456
+ signInLabel = SIGN_IN_LABEL,
7321
7457
  accountHref = OCHK_APP_ACCOUNT,
7322
7458
  onSignOut,
7323
7459
  nameFrom = "lg"
@@ -7348,6 +7484,13 @@ function SessionAccountView({
7348
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 }) }) })
7349
7485
  );
7350
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
+ }
7351
7494
  function ToolShell({
7352
7495
  protocol: protocol2,
7353
7496
  tools,
@@ -7356,6 +7499,7 @@ function ToolShell({
7356
7499
  rail = false,
7357
7500
  railFooter,
7358
7501
  variant = "tool",
7502
+ measure = "wide",
7359
7503
  banner,
7360
7504
  footer,
7361
7505
  children
@@ -7413,14 +7557,7 @@ function ToolShell({
7413
7557
  /* @__PURE__ */ jsxRuntime.jsx(SideNav, { groups: [{ label: "Tools", items: tools.map(({ href, label, icon, active }) => ({ href, label, icon, active })) }] }),
7414
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
7415
7559
  ] }) : null,
7416
- /* @__PURE__ */ jsxRuntime.jsx(
7417
- "main",
7418
- {
7419
- id: "main-content",
7420
- 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"),
7421
- children: /* @__PURE__ */ jsxRuntime.jsx(SiteHomeContext.Provider, { value: homeHref, children: app ? children : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-[72rem]", children }) })
7422
- }
7423
- )
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 }) }) })
7424
7561
  ] }),
7425
7562
  app || footer === false ? null : footer ?? /* @__PURE__ */ jsxRuntime.jsx(SiteFooter, { compact: true, family: true, legal: true }),
7426
7563
  tabs ? /* @__PURE__ */ jsxRuntime.jsx(TabBar, { items: tabs }) : null
@@ -7606,6 +7743,7 @@ exports.APP_ID = APP_ID;
7606
7743
  exports.Accent = Accent;
7607
7744
  exports.Accordion = Accordion;
7608
7745
  exports.AccordionItem = AccordionItem;
7746
+ exports.AccountCta = AccountCta;
7609
7747
  exports.AccountMenu = AccountMenu;
7610
7748
  exports.ActivityList = ActivityList;
7611
7749
  exports.AnchorStatus = AnchorStatus;
@@ -7633,6 +7771,8 @@ exports.CardNumeral = CardNumeral;
7633
7771
  exports.CardTitle = CardTitle;
7634
7772
  exports.ChartFrame = ChartFrame;
7635
7773
  exports.Checkbox = Checkbox;
7774
+ exports.ChoiceCard = ChoiceCard;
7775
+ exports.ChoiceGroup = ChoiceGroup;
7636
7776
  exports.Closing = Closing;
7637
7777
  exports.CodeBlock = CodeBlock;
7638
7778
  exports.CodeTabs = CodeTabs;
@@ -7688,6 +7828,7 @@ exports.FilterChips = FilterChips;
7688
7828
  exports.FloatChip = FloatChip;
7689
7829
  exports.Footnote = Footnote;
7690
7830
  exports.FormSection = FormSection;
7831
+ exports.GET_AN_ACCOUNT = GET_AN_ACCOUNT;
7691
7832
  exports.HalftoneCanvas = HalftoneCanvas;
7692
7833
  exports.HalftoneSphere = HalftoneSphere;
7693
7834
  exports.HashChip = HashChip;
@@ -7702,6 +7843,7 @@ exports.Label = Label;
7702
7843
  exports.Lead = Lead;
7703
7844
  exports.LegalDocument = LegalDocument;
7704
7845
  exports.LinkCard = LinkCard;
7846
+ exports.ListCard = ListCard;
7705
7847
  exports.LoadingBlock = LoadingBlock;
7706
7848
  exports.LockedPreview = LockedPreview;
7707
7849
  exports.Lockup = Lockup;
@@ -7711,6 +7853,7 @@ exports.MdxTable = MdxTable;
7711
7853
  exports.Meter = Meter;
7712
7854
  exports.Monogram = Monogram;
7713
7855
  exports.Notice = Notice;
7856
+ exports.OCHK_APP = OCHK_APP;
7714
7857
  exports.OCHK_APP_ACCOUNT = OCHK_APP_ACCOUNT;
7715
7858
  exports.OCHK_IO = OCHK_IO;
7716
7859
  exports.OCHK_IO_FOOTER = OCHK_IO_FOOTER;
@@ -7741,6 +7884,7 @@ exports.RadioGroup = RadioGroup;
7741
7884
  exports.RadioGroupItem = RadioGroupItem;
7742
7885
  exports.Reveal = Reveal;
7743
7886
  exports.SELF_HOSTED_LEGAL_LINKS = SELF_HOSTED_LEGAL_LINKS;
7887
+ exports.SIGN_IN_LABEL = SIGN_IN_LABEL;
7744
7888
  exports.SPHERE_GRADIENT = SPHERE_GRADIENT;
7745
7889
  exports.Sats = Sats;
7746
7890
  exports.SatsFigure = SatsFigure;
@@ -7751,6 +7895,7 @@ exports.SearchDialog = SearchDialog;
7751
7895
  exports.Section = Section;
7752
7896
  exports.SectionHeading = SectionHeading;
7753
7897
  exports.SectionIntro = SectionIntro;
7898
+ exports.SectionTitle = SectionTitle;
7754
7899
  exports.Select = Select;
7755
7900
  exports.SelectContent = SelectContent;
7756
7901
  exports.SelectGroup = SelectGroup;
@@ -7798,6 +7943,7 @@ exports.Textarea = Textarea;
7798
7943
  exports.ThemeToggle = ThemeToggle;
7799
7944
  exports.Ticker = Ticker;
7800
7945
  exports.Toaster = Toaster;
7946
+ exports.ToolColumn = ToolColumn;
7801
7947
  exports.ToolGrid = ToolGrid;
7802
7948
  exports.ToolShell = ToolShell;
7803
7949
  exports.Tooltip = Tooltip;