@orangecheck/app-design 1.6.2 → 1.8.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 +158 -129
  5. package/dist/chrome.js.map +1 -1
  6. package/dist/chrome.mjs +156 -130
  7. package/dist/chrome.mjs.map +1 -1
  8. package/dist/components.d.mts +75 -8
  9. package/dist/components.d.ts +75 -8
  10. package/dist/components.js +255 -12
  11. package/dist/components.js.map +1 -1
  12. package/dist/components.mjs +251 -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 +338 -66
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs +327 -67
  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 +15 -3
  33. package/dist/mdx.js.map +1 -1
  34. package/dist/mdx.mjs +15 -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 +124 -2
  45. package/dist/session.js.map +1 -1
  46. package/dist/session.mjs +124 -2
  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 +11 -0
  52. package/dist/{tool-shell-CQZNRUgH.d.mts → tool-shell-Cg51cRHJ.d.ts} +14 -4
  53. package/dist/{tool-shell-CRmceGrV.d.ts → tool-shell-Dxw5o2rH.d.mts} +14 -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 +2 -2
package/dist/index.js CHANGED
@@ -21,7 +21,7 @@ var PopoverPrimitive = require('@radix-ui/react-popover');
21
21
  var TooltipPrimitive = require('@radix-ui/react-tooltip');
22
22
  var TabsPrimitive = require('@radix-ui/react-tabs');
23
23
  var QRCode = require('qrcode');
24
- var Link6 = require('next/link');
24
+ var Link7 = require('next/link');
25
25
  var router = require('next/compat/router');
26
26
 
27
27
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -56,7 +56,7 @@ var PopoverPrimitive__namespace = /*#__PURE__*/_interopNamespace(PopoverPrimitiv
56
56
  var TooltipPrimitive__namespace = /*#__PURE__*/_interopNamespace(TooltipPrimitive);
57
57
  var TabsPrimitive__namespace = /*#__PURE__*/_interopNamespace(TabsPrimitive);
58
58
  var QRCode__default = /*#__PURE__*/_interopDefault(QRCode);
59
- var Link6__default = /*#__PURE__*/_interopDefault(Link6);
59
+ var Link7__default = /*#__PURE__*/_interopDefault(Link7);
60
60
 
61
61
  // src/tokens/palette.ts
62
62
  var lightPalette = {
@@ -906,7 +906,8 @@ var DropdownMenuItem = react.forwardRef(function DropdownMenuItem2({ className,
906
906
  {
907
907
  ref,
908
908
  className: cn(
909
- "flex h-10 cursor-default select-none items-center gap-2.5 rounded-xl px-3 text-[0.9375rem] outline-none",
909
+ // A thumb's 44px on a phone.
910
+ "flex h-10 cursor-default select-none items-center gap-2.5 rounded-xl px-3 text-[0.9375rem] outline-none max-md:h-11",
910
911
  "data-[highlighted]:bg-accent data-[disabled]:opacity-50 [&_svg]:size-4 [&_svg]:text-muted-foreground",
911
912
  destructive && "text-destructive [&_svg]:text-destructive",
912
913
  className
@@ -2202,7 +2203,7 @@ var JS_TAG = /<\/?(?=[A-Za-z])/y;
2202
2203
  var JS_TAG_NAME = /[A-Za-z][\w$.:-]*/y;
2203
2204
  var JS_PUNCT = /=>|\.\.\.|[{}()[\];,.<>=+\-*/%!?:&|^~#]/y;
2204
2205
  var JSX_BEFORE = /* @__PURE__ */ new Set(["(", ",", "=", "?", ":", "{", "[", ";", ">", "&&", "||", "=>", "return"]);
2205
- function scanJs(src, emit2, jsx52) {
2206
+ function scanJs(src, emit2, jsx54) {
2206
2207
  let i = 0;
2207
2208
  let prev = "";
2208
2209
  let tagDepth = 0;
@@ -2228,7 +2229,7 @@ function scanJs(src, emit2, jsx52) {
2228
2229
  sig('"');
2229
2230
  continue;
2230
2231
  }
2231
- if (jsx52 && tagDepth === 0 && (m = at(JS_TAG, src, i)) && (prev === "" || JSX_BEFORE.has(prev))) {
2232
+ if (jsx54 && tagDepth === 0 && (m = at(JS_TAG, src, i)) && (prev === "" || JSX_BEFORE.has(prev))) {
2232
2233
  const name = at(JS_TAG_NAME, src, i + m.length);
2233
2234
  if (name) {
2234
2235
  emit2(m);
@@ -2240,7 +2241,7 @@ function scanJs(src, emit2, jsx52) {
2240
2241
  continue;
2241
2242
  }
2242
2243
  }
2243
- if (jsx52 && tagDepth > 0 && braceInTag === 0) {
2244
+ if (jsx54 && tagDepth > 0 && braceInTag === 0) {
2244
2245
  if (src.startsWith("/>", i) || src[i] === ">") {
2245
2246
  const close = src[i] === ">" ? ">" : "/>";
2246
2247
  emit2(close);
@@ -2260,7 +2261,7 @@ function scanJs(src, emit2, jsx52) {
2260
2261
  continue;
2261
2262
  }
2262
2263
  if (src[i] === "{") braceInTag = 1;
2263
- } else if (jsx52 && tagDepth > 0 && braceInTag > 0) {
2264
+ } else if (jsx54 && tagDepth > 0 && braceInTag > 0) {
2264
2265
  if (src[i] === "{") braceInTag++;
2265
2266
  else if (src[i] === "}") braceInTag--;
2266
2267
  }
@@ -2977,6 +2978,7 @@ function Notice({
2977
2978
  title,
2978
2979
  children,
2979
2980
  action,
2981
+ icon,
2980
2982
  role,
2981
2983
  className
2982
2984
  }) {
@@ -2993,7 +2995,17 @@ function Notice({
2993
2995
  ),
2994
2996
  children: [
2995
2997
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 gap-3", children: [
2996
- kind !== "neutral" ? /* @__PURE__ */ jsxRuntime.jsx(
2998
+ icon ? /* @__PURE__ */ jsxRuntime.jsx(
2999
+ "span",
3000
+ {
3001
+ "aria-hidden": true,
3002
+ className: cn(
3003
+ "mt-0.5 shrink-0 [&_svg]:size-[1.125rem]",
3004
+ kind === "brand" ? "text-oca-accent-ink" : kind === "danger" ? "text-destructive" : "text-muted-foreground"
3005
+ ),
3006
+ children: icon
3007
+ }
3008
+ ) : kind !== "neutral" ? /* @__PURE__ */ jsxRuntime.jsx(
2997
3009
  "span",
2998
3010
  {
2999
3011
  "aria-hidden": true,
@@ -3288,7 +3300,7 @@ function Well({
3288
3300
  ] });
3289
3301
  }
3290
3302
  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";
3303
+ var COPY_ON_INK = "text-oca-ink-subtle hover:bg-white/10 hover:text-white max-md:size-11";
3292
3304
  function CodeBlock({
3293
3305
  code,
3294
3306
  html,
@@ -3716,6 +3728,9 @@ var GROUNDS = [
3716
3728
  }
3717
3729
  ];
3718
3730
  var SIZES = {
3731
+ // A list row's avatar, a facepile.
3732
+ "2xs": "size-7 rounded-[0.55rem] text-[0.75rem]",
3733
+ xs: "size-8 rounded-[0.6rem] text-[0.875rem]",
3719
3734
  sm: "size-9 rounded-[0.7rem] text-[0.9375rem]",
3720
3735
  md: "size-11 rounded-[0.85rem] text-[1.125rem]",
3721
3736
  lg: "size-14 rounded-[1.05rem] text-[1.5rem]"
@@ -3803,6 +3818,9 @@ var ErrorBoundary = class extends react.Component {
3803
3818
  // src/family/index.ts
3804
3819
  var OCHK_IO = "https://ochk.io";
3805
3820
  var DOCS_HREF = `${OCHK_IO}/docs`;
3821
+ var OCHK_APP = "https://ochk.app";
3822
+ var GET_AN_ACCOUNT = { href: OCHK_APP, label: "Get an account" };
3823
+ var SIGN_IN_LABEL = "Sign in";
3806
3824
  function protocol(slug, verb, line, kinds) {
3807
3825
  return {
3808
3826
  slug,
@@ -3839,7 +3857,7 @@ var FAMILY = [
3839
3857
  {
3840
3858
  slug: "me",
3841
3859
  label: "ochk.app",
3842
- href: "https://ochk.app",
3860
+ href: OCHK_APP,
3843
3861
  group: "orangecheck",
3844
3862
  line: "One account, with Bitcoin behind it.",
3845
3863
  status: "testing"
@@ -3958,6 +3976,10 @@ var OCHK_IO_FOOTER = [
3958
3976
  ]
3959
3977
  }
3960
3978
  ];
3979
+ var InColumnContext = sharedContext("in-column", false);
3980
+ function useInColumn() {
3981
+ return react.useContext(InColumnContext);
3982
+ }
3961
3983
  var SiteHomeContext = sharedContext("site-home", void 0);
3962
3984
  function useSiteHome() {
3963
3985
  return react.useContext(SiteHomeContext);
@@ -3985,10 +4007,11 @@ function ErrorPage({
3985
4007
  className
3986
4008
  }) {
3987
4009
  const shellHome = useSiteHome();
4010
+ const inColumn = useInColumn();
3988
4011
  const homeHref = home ?? (protocol2 ? protocolSite(protocol2).pageHref : shellHome ?? OCHK_IO);
3989
4012
  const words = WORDS[code] ?? (code >= 500 ? WORDS[500] : WORDS[404]);
3990
4013
  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: [
4014
+ 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
4015
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex max-w-[40rem] flex-col items-start gap-6 md:col-span-7", children: [
3993
4016
  /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "oca-eyebrow oca-enter", children: [
3994
4017
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "oca-tabular", children: code }),
@@ -3999,7 +4022,7 @@ function ErrorPage({
3999
4022
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "oca-lead oca-enter [--enter-delay:150ms]", children: detail ?? words.detail }),
4000
4023
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "oca-enter flex flex-wrap gap-3 [--enter-delay:230ms]", children: actions ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
4001
4024
  server ? /* @__PURE__ */ jsxRuntime.jsx(Button, { onClick: () => window.location.reload(), children: "Try again" }) : null,
4002
- /* @__PURE__ */ jsxRuntime.jsx(Button, { asChild: true, variant: server ? "secondary" : "primary", children: /* @__PURE__ */ jsxRuntime.jsx(Link6__default.default, { href: homeHref, children: "Go home" }) })
4025
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { asChild: true, variant: server ? "secondary" : "primary", children: /* @__PURE__ */ jsxRuntime.jsx(Link7__default.default, { href: homeHref, children: "Go home" }) })
4003
4026
  ] }) })
4004
4027
  ] }),
4005
4028
  art !== null ? /* @__PURE__ */ jsxRuntime.jsx("div", { "aria-hidden": true, className: "oca-enter hidden justify-center md:col-span-5 md:flex [--enter-delay:120ms]", children: art ?? /* @__PURE__ */ jsxRuntime.jsx(MarkOutline, { className: "w-full max-w-[20rem] text-oca-hairline-strong" }) }) : null
@@ -4440,7 +4463,7 @@ function TextLink({
4440
4463
  const internal = href.startsWith("/") && !href.startsWith("/api/") && !href.startsWith("/.well-known/");
4441
4464
  const offsite = external ?? /^https?:\/\//.test(href);
4442
4465
  if (internal && !offsite) {
4443
- return /* @__PURE__ */ jsxRuntime.jsx(Link6__default.default, { href, className: cn(LINK, className), children });
4466
+ return /* @__PURE__ */ jsxRuntime.jsx(Link7__default.default, { href, className: cn(LINK, className), children });
4444
4467
  }
4445
4468
  return /* @__PURE__ */ jsxRuntime.jsxs("a", { href, className: cn(LINK, className), ...offsite ? { target: "_blank", rel: "noreferrer" } : {}, children: [
4446
4469
  children,
@@ -4574,7 +4597,7 @@ function ProtocolGrid({
4574
4597
  ] }),
4575
4598
  p.status !== "live" ? /* @__PURE__ */ jsxRuntime.jsx(StatusBadge, { status: p.status }) : null
4576
4599
  ] }),
4577
- /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "oca-display-3", children: link === "docs" && inDocs ? /* @__PURE__ */ jsxRuntime.jsx(Link6__default.default, { href: `/${p.slug}`, className: STRETCH, children: p.label }) : /* @__PURE__ */ jsxRuntime.jsx(
4600
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "oca-display-3", children: link === "docs" && inDocs ? /* @__PURE__ */ jsxRuntime.jsx(Link7__default.default, { href: `/${p.slug}`, className: STRETCH, children: p.label }) : /* @__PURE__ */ jsxRuntime.jsx(
4578
4601
  "a",
4579
4602
  {
4580
4603
  href: link === "tool" ? p.toolHref : link === "docs" ? `${DOCS_HREF}/${p.slug}` : p.pageHref,
@@ -4634,7 +4657,7 @@ function AppGrid({
4634
4657
  }
4635
4658
  var isInternal = (href) => href.startsWith("/") || href.startsWith("#");
4636
4659
  function DocLink({ href, className, children, ...rest }) {
4637
- return isInternal(href) ? /* @__PURE__ */ jsxRuntime.jsx(Link6__default.default, { href, className, ...rest, children }) : /* @__PURE__ */ jsxRuntime.jsx("a", { href, className, ...rest, children });
4660
+ return isInternal(href) ? /* @__PURE__ */ jsxRuntime.jsx(Link7__default.default, { href, className, ...rest, children }) : /* @__PURE__ */ jsxRuntime.jsx("a", { href, className, ...rest, children });
4638
4661
  }
4639
4662
  function Breadcrumbs({ items, action, className }) {
4640
4663
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex min-h-11 items-center justify-between gap-4 sm:min-h-0", className), children: [
@@ -5424,6 +5447,220 @@ function SignMessage({
5424
5447
  )
5425
5448
  ] });
5426
5449
  }
5450
+ function SectionTitle({
5451
+ title,
5452
+ meta,
5453
+ description,
5454
+ action,
5455
+ as: Tag = "h2",
5456
+ size = "md",
5457
+ tone = "default",
5458
+ id,
5459
+ className
5460
+ }) {
5461
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-wrap items-end justify-between gap-x-4 gap-y-3", className), children: [
5462
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 max-w-[40rem] flex-[1_1_16rem] flex-col gap-1", children: [
5463
+ /* @__PURE__ */ jsxRuntime.jsxs(
5464
+ Tag,
5465
+ {
5466
+ id,
5467
+ className: cn(
5468
+ "flex scroll-mt-24 flex-wrap items-baseline gap-x-3",
5469
+ size === "sm" ? "oca-title-sm" : "oca-title",
5470
+ tone === "danger" && "text-destructive"
5471
+ ),
5472
+ children: [
5473
+ title,
5474
+ meta ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "oca-tabular text-[0.875rem] font-normal tracking-normal text-muted-foreground", children: meta }) : null
5475
+ ]
5476
+ }
5477
+ ),
5478
+ description ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[0.9375rem] leading-relaxed text-muted-foreground", children: description }) : null
5479
+ ] }),
5480
+ action ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex shrink-0 flex-wrap items-center gap-2", children: action }) : null
5481
+ ] });
5482
+ }
5483
+ function ListCard({
5484
+ as: Tag = "ul",
5485
+ className,
5486
+ ...props
5487
+ }) {
5488
+ return /* @__PURE__ */ jsxRuntime.jsx(Tag, { className: cn("divide-y divide-border overflow-clip rounded-[1.25rem] border border-border bg-card", className), ...props });
5489
+ }
5490
+ var ROW_LOOK = {
5491
+ // In a ListCard: full width, the card's hairlines between rows.
5492
+ card: { box: "px-5", hover: "hover:bg-accent/60", current: "bg-accent" },
5493
+ // In a pane's list (threads, contacts): rounded, lifted when current.
5494
+ pane: { box: "rounded-xl px-3", hover: "hover:bg-accent", current: "bg-card shadow-sm ring-1 ring-border" }
5495
+ };
5496
+ function ListRow({
5497
+ title,
5498
+ meta,
5499
+ description,
5500
+ leading,
5501
+ trailing,
5502
+ actions,
5503
+ revealActions = "always",
5504
+ href,
5505
+ onSelect,
5506
+ current: current2 = false,
5507
+ unread = false,
5508
+ variant = "card",
5509
+ as: Tag = "li",
5510
+ className
5511
+ }) {
5512
+ const tight = useDensity() === "compact";
5513
+ const look = ROW_LOOK[variant];
5514
+ const interactive = href !== void 0 || onSelect !== void 0;
5515
+ const cls = cn(
5516
+ "flex min-h-11 w-full min-w-0 items-center gap-3 text-left outline-none transition-colors",
5517
+ "focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring",
5518
+ look.box,
5519
+ variant === "pane" ? "py-2" : tight ? "py-3" : "py-4",
5520
+ interactive && !current2 && look.hover,
5521
+ current2 && look.current,
5522
+ actions && "pr-14"
5523
+ );
5524
+ const body = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
5525
+ leading ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex shrink-0", children: leading }) : null,
5526
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [
5527
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 items-baseline justify-between gap-3", children: [
5528
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("truncate text-[0.9375rem] text-foreground", unread ? "font-semibold" : "font-medium"), children: title }),
5529
+ meta ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "oca-tabular shrink-0 text-[0.8125rem] text-muted-foreground", children: meta }) : null
5530
+ ] }),
5531
+ description ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("truncate text-[0.875rem]", unread ? "text-foreground" : "text-muted-foreground"), children: description }) : null
5532
+ ] }),
5533
+ trailing ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex shrink-0 items-center gap-2", children: trailing }) : null
5534
+ ] });
5535
+ const aria = current2 ? { "aria-current": "true" } : {};
5536
+ return /* @__PURE__ */ jsxRuntime.jsxs(Tag, { className: cn("group/row relative", className), children: [
5537
+ href !== void 0 ? href.startsWith("/") ? /* @__PURE__ */ jsxRuntime.jsx(Link7__default.default, { href, className: cls, ...aria, children: body }) : /* @__PURE__ */ jsxRuntime.jsx("a", { href, className: cls, ...aria, children: body }) : onSelect ? /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: onSelect, className: cls, ...aria, children: body }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cls, children: body }),
5538
+ actions ? /* @__PURE__ */ jsxRuntime.jsx(
5539
+ "div",
5540
+ {
5541
+ className: cn(
5542
+ "absolute right-2 top-1/2 flex -translate-y-1/2 items-center",
5543
+ revealActions === "hover" && "transition-opacity md:opacity-0 md:focus-within:opacity-100 md:group-hover/row:opacity-100 md:has-[[data-state=open]]:opacity-100"
5544
+ ),
5545
+ children: actions
5546
+ }
5547
+ ) : null
5548
+ ] });
5549
+ }
5550
+ var ChoiceSize = react.createContext("md");
5551
+ var COLUMNS = { 1: "", 2: "sm:grid-cols-2", 3: "sm:grid-cols-2 lg:grid-cols-3" };
5552
+ function ChoiceGroup({
5553
+ value,
5554
+ onValueChange,
5555
+ label,
5556
+ columns = 1,
5557
+ size = "md",
5558
+ disabled,
5559
+ className,
5560
+ children
5561
+ }) {
5562
+ return /* @__PURE__ */ jsxRuntime.jsx(ChoiceSize.Provider, { value: size, children: /* @__PURE__ */ jsxRuntime.jsx(
5563
+ RadioGroupPrimitive__namespace.Root,
5564
+ {
5565
+ value: value ?? "",
5566
+ onValueChange: (v) => onValueChange(v),
5567
+ "aria-label": label,
5568
+ disabled,
5569
+ className: cn("grid", size === "sm" ? "gap-1.5" : "gap-3", COLUMNS[columns], className),
5570
+ children
5571
+ }
5572
+ ) });
5573
+ }
5574
+ function ChoiceCard({
5575
+ value,
5576
+ title,
5577
+ description,
5578
+ icon,
5579
+ disabled,
5580
+ className
5581
+ }) {
5582
+ const sm = react.useContext(ChoiceSize) === "sm";
5583
+ return /* @__PURE__ */ jsxRuntime.jsxs(
5584
+ RadioGroupPrimitive__namespace.Item,
5585
+ {
5586
+ value,
5587
+ disabled,
5588
+ className: cn(
5589
+ "group flex w-full min-w-0 items-start gap-3 border text-left outline-none transition-colors",
5590
+ "focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
5591
+ "border-border bg-card data-[state=checked]:border-foreground data-[state=checked]:bg-accent data-[state=unchecked]:hover:border-oca-hairline-strong",
5592
+ "disabled:cursor-not-allowed disabled:opacity-50",
5593
+ sm ? "min-h-11 rounded-xl px-3.5 py-2.5" : "rounded-[1.25rem] p-5",
5594
+ className
5595
+ ),
5596
+ children: [
5597
+ icon ? /* @__PURE__ */ jsxRuntime.jsx(
5598
+ "span",
5599
+ {
5600
+ "aria-hidden": true,
5601
+ className: cn(
5602
+ "shrink-0 text-muted-foreground group-data-[state=checked]:text-oca-accent-ink [&_svg]:size-full",
5603
+ sm ? "mt-0.5 size-4" : "size-6"
5604
+ ),
5605
+ children: icon
5606
+ }
5607
+ ) : null,
5608
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-col gap-1", children: [
5609
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: sm ? "text-[0.9375rem] font-medium" : "oca-title-sm", children: title }),
5610
+ description ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[0.875rem] leading-relaxed text-muted-foreground", children: description }) : null
5611
+ ] })
5612
+ ]
5613
+ }
5614
+ );
5615
+ }
5616
+ var SIZES2 = {
5617
+ "2xs": "size-7 text-[0.6875rem] [&_svg]:size-3.5",
5618
+ xs: "size-8 text-[0.75rem] [&_svg]:size-4",
5619
+ sm: "size-9 text-[0.8125rem] [&_svg]:size-4",
5620
+ md: "size-11 text-[0.9375rem] [&_svg]:size-5",
5621
+ lg: "size-14 text-[1.1875rem] [&_svg]:size-6"
5622
+ };
5623
+ function personInitials(name) {
5624
+ return name.trim().split(/\s+/).slice(0, 2).map((w) => w.match(/[\p{L}\p{N}]/u)?.[0] ?? "").join("").toLocaleUpperCase();
5625
+ }
5626
+ function avatarHue(seed) {
5627
+ let h = 2166136261;
5628
+ for (let i = 0; i < seed.length; i++) {
5629
+ h ^= seed.charCodeAt(i);
5630
+ h = Math.imul(h, 16777619);
5631
+ }
5632
+ return (h >>> 0) % 360;
5633
+ }
5634
+ function Avatar({
5635
+ seed,
5636
+ name,
5637
+ src,
5638
+ size = "sm",
5639
+ className
5640
+ }) {
5641
+ const [failed, setFailed] = react.useState(null);
5642
+ const box = cn("inline-flex shrink-0 select-none items-center justify-center overflow-hidden rounded-full", SIZES2[size], className);
5643
+ if (src && failed !== src) {
5644
+ return (
5645
+ // eslint-disable-next-line @next/next/no-img-element
5646
+ /* @__PURE__ */ jsxRuntime.jsx("img", { src, alt: "", "aria-hidden": true, className: cn(box, "object-cover"), onError: () => setFailed(src) })
5647
+ );
5648
+ }
5649
+ const initials = name ? personInitials(name) : "";
5650
+ return /* @__PURE__ */ jsxRuntime.jsx(
5651
+ "span",
5652
+ {
5653
+ "aria-hidden": true,
5654
+ className: cn(box, "font-medium leading-none"),
5655
+ style: {
5656
+ "--oca-avatar-h": avatarHue(seed),
5657
+ backgroundColor: "hsl(var(--oca-avatar-h) 60% var(--oca-avatar-bg-l))",
5658
+ color: "hsl(var(--oca-avatar-h) 45% var(--oca-avatar-fg-l))"
5659
+ },
5660
+ children: initials || /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UserRound, {})
5661
+ }
5662
+ );
5663
+ }
5427
5664
  function useMacKeys() {
5428
5665
  const [mac, setMac] = react.useState(true);
5429
5666
  react.useEffect(() => {
@@ -5699,7 +5936,7 @@ function download(content, filename, mime) {
5699
5936
  a.remove();
5700
5937
  setTimeout(() => URL.revokeObjectURL(url), 0);
5701
5938
  }
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";
5939
+ 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
5940
  function ArtifactView({
5704
5941
  content,
5705
5942
  title,
@@ -5729,7 +5966,8 @@ function ArtifactView({
5729
5966
  "aria-pressed": view === v,
5730
5967
  onClick: () => setView(v),
5731
5968
  className: cn(
5732
- "h-7 rounded-full px-2.5 text-[0.75rem] transition-colors",
5969
+ // The pill stays 28px; its target reaches the bar's 44.
5970
+ "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
5971
  view === v ? "bg-white/[0.12] text-white" : "text-oca-ink-subtle hover:text-white"
5734
5972
  ),
5735
5973
  children: v === "formatted" ? "Formatted" : "Raw"
@@ -6199,7 +6437,8 @@ function FilterChips({
6199
6437
  onClick: () => press(o.value),
6200
6438
  className: cn(
6201
6439
  "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",
6440
+ // A thumb's 44px on a phone.
6441
+ tight ? "h-11 md:h-8" : "h-11 md:h-9",
6203
6442
  on ? "border-foreground bg-foreground text-background" : "border-border bg-card text-muted-foreground hover:border-oca-hairline-strong hover:text-foreground"
6204
6443
  ),
6205
6444
  children: [
@@ -6249,7 +6488,7 @@ function ToolGrid({
6249
6488
  ] }),
6250
6489
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1.5", children: [
6251
6490
  /* @__PURE__ */ jsxRuntime.jsx(Heading, { className: "oca-title-sm", children: /* @__PURE__ */ jsxRuntime.jsx(
6252
- Link6__default.default,
6491
+ Link7__default.default,
6253
6492
  {
6254
6493
  href: t.href,
6255
6494
  className: "outline-none after:absolute after:inset-0 after:rounded-[1.25rem] after:content-['']",
@@ -6346,7 +6585,7 @@ function SideNav({ groups, onNavigate }) {
6346
6585
  return /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Pages", className: "flex flex-col gap-5", children: groups.map((g, gi) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-0.5", children: [
6347
6586
  g.label ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "px-3 pb-1 text-[0.8125rem] text-muted-foreground", children: g.label }) : null,
6348
6587
  g.items.map((it) => /* @__PURE__ */ jsxRuntime.jsxs(
6349
- Link6__default.default,
6588
+ Link7__default.default,
6350
6589
  {
6351
6590
  href: it.href,
6352
6591
  onClick: onNavigate,
@@ -6381,7 +6620,7 @@ function SectionSwitch({
6381
6620
  children: sections.map((sec) => {
6382
6621
  const on = sec.id === current2.id;
6383
6622
  return /* @__PURE__ */ jsxRuntime.jsx(
6384
- Link6__default.default,
6623
+ Link7__default.default,
6385
6624
  {
6386
6625
  href: sec.href,
6387
6626
  onClick: onNavigate,
@@ -6454,7 +6693,7 @@ function TabBar({ items }) {
6454
6693
  style: { gridTemplateColumns: `repeat(${shown.length + (overflow ? 1 : 0)}, minmax(0, 1fr))` },
6455
6694
  children: [
6456
6695
  shown.map((it) => /* @__PURE__ */ jsxRuntime.jsx(
6457
- Link6__default.default,
6696
+ Link7__default.default,
6458
6697
  {
6459
6698
  href: it.href,
6460
6699
  "aria-current": it.active ? "page" : void 0,
@@ -6474,7 +6713,7 @@ function TabBar({ items }) {
6474
6713
  /* @__PURE__ */ jsxRuntime.jsxs(SheetContent, { side: "bottom", className: "pb-[calc(1.5rem+env(safe-area-inset-bottom))]", children: [
6475
6714
  /* @__PURE__ */ jsxRuntime.jsx(SheetTitle, { className: "px-1 text-[1.0625rem] font-medium", children: "More" }),
6476
6715
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 grid grid-cols-3 gap-2", children: rest.map((it) => /* @__PURE__ */ jsxRuntime.jsxs(
6477
- Link6__default.default,
6716
+ Link7__default.default,
6478
6717
  {
6479
6718
  href: it.href,
6480
6719
  onClick: () => setMore(false),
@@ -6588,7 +6827,7 @@ function SidebarShell({
6588
6827
  footer ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-auto flex flex-col gap-3", children: footer }) : null
6589
6828
  ] })
6590
6829
  ] }),
6591
- /* @__PURE__ */ jsxRuntime.jsx(Link6__default.default, { href: home, "aria-label": "Home", className: "rounded-lg p-1", children: /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 22 }) }),
6830
+ /* @__PURE__ */ jsxRuntime.jsx(Link7__default.default, { href: home, "aria-label": "Home", className: "rounded-lg p-1", children: /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 22 }) }),
6592
6831
  familyMenu,
6593
6832
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-auto flex items-center", children: account })
6594
6833
  ] }),
@@ -6613,7 +6852,7 @@ function SidebarShell({
6613
6852
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto flex w-full max-w-[90rem]", children: [
6614
6853
  /* @__PURE__ */ jsxRuntime.jsxs("aside", { className: "sticky top-0 hidden h-dvh w-[17rem] shrink-0 flex-col gap-6 overflow-y-auto px-4 py-6 lg:flex", children: [
6615
6854
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [
6616
- /* @__PURE__ */ jsxRuntime.jsx(Link6__default.default, { href: home, className: "px-2", "aria-label": "Home", children: /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 26 }) }),
6855
+ /* @__PURE__ */ jsxRuntime.jsx(Link7__default.default, { href: home, className: "px-2", "aria-label": "Home", children: /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 26 }) }),
6617
6856
  familyMenu
6618
6857
  ] }),
6619
6858
  switcher,
@@ -6623,7 +6862,7 @@ function SidebarShell({
6623
6862
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
6624
6863
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "hidden h-[4.5rem] items-center justify-end gap-3 px-8 lg:flex", children: account }),
6625
6864
  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 }) })
6865
+ /* @__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
6866
  ] })
6628
6867
  ] }),
6629
6868
  tabs ? /* @__PURE__ */ jsxRuntime.jsx(TabBar, { items: tabs }) : null
@@ -6634,7 +6873,7 @@ function SidebarShell({
6634
6873
  function RailItem({ item }) {
6635
6874
  return /* @__PURE__ */ jsxRuntime.jsxs(Tooltip, { children: [
6636
6875
  /* @__PURE__ */ jsxRuntime.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
6637
- Link6__default.default,
6876
+ Link7__default.default,
6638
6877
  {
6639
6878
  href: item.href,
6640
6879
  "aria-current": item.active ? "page" : void 0,
@@ -6689,6 +6928,9 @@ function RailShell({ nav = [], persistent = [], page: pageOverride, header, acco
6689
6928
  tabs ? /* @__PURE__ */ jsxRuntime.jsx(TabBar, { items: tabs }) : null
6690
6929
  ] }) }) });
6691
6930
  }
6931
+ function PaneHeader({ children, className }) {
6932
+ return /* @__PURE__ */ jsxRuntime.jsx("header", { className: cn("flex h-14 shrink-0 items-center gap-3 border-b border-border px-4 md:px-5", className), children });
6933
+ }
6692
6934
  function AccountMenu({
6693
6935
  name,
6694
6936
  detail,
@@ -6725,7 +6967,7 @@ function AccountMenu({
6725
6967
  ] }),
6726
6968
  /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuSeparator, {}),
6727
6969
  items.map(
6728
- (it, i) => it === "separator" ? /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuSeparator, {}, `sep-${i}`) : it.href ? /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuItem, { asChild: true, destructive: it.destructive, children: /* @__PURE__ */ jsxRuntime.jsxs(Link6__default.default, { href: it.href, children: [
6970
+ (it, i) => it === "separator" ? /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuSeparator, {}, `sep-${i}`) : it.href ? /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuItem, { asChild: true, destructive: it.destructive, children: /* @__PURE__ */ jsxRuntime.jsxs(Link7__default.default, { href: it.href, children: [
6729
6971
  it.icon,
6730
6972
  it.label
6731
6973
  ] }) }, it.label) : /* @__PURE__ */ jsxRuntime.jsxs(DropdownMenuItem, { onSelect: it.onSelect, destructive: it.destructive, children: [
@@ -6774,7 +7016,7 @@ function NavLink({
6774
7016
  if (item.external) {
6775
7017
  return /* @__PURE__ */ jsxRuntime.jsx("a", { href: item.href, className: cls, rel: "noreferrer", onClick: onNavigate, children: item.label });
6776
7018
  }
6777
- return /* @__PURE__ */ jsxRuntime.jsx(Link6__default.default, { href: item.href, className: cls, "aria-current": item.active ? "page" : void 0, onClick: onNavigate, children: item.label });
7019
+ return /* @__PURE__ */ jsxRuntime.jsx(Link7__default.default, { href: item.href, className: cls, "aria-current": item.active ? "page" : void 0, onClick: onNavigate, children: item.label });
6778
7020
  }
6779
7021
  function NavRow({ item, onNavigate }) {
6780
7022
  const body = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -6785,7 +7027,7 @@ function NavRow({ item, onNavigate }) {
6785
7027
  "flex flex-col gap-0.5 rounded-xl px-3 py-2 transition-colors hover:bg-accent",
6786
7028
  item.active && "bg-muted hover:bg-muted dark:bg-white/[0.06]"
6787
7029
  );
6788
- return item.external ? /* @__PURE__ */ jsxRuntime.jsx("a", { href: item.href, className: cls, rel: "noreferrer", onClick: onNavigate, children: body }) : /* @__PURE__ */ jsxRuntime.jsx(Link6__default.default, { href: item.href, className: cls, "aria-current": item.active ? "page" : void 0, onClick: onNavigate, children: body });
7030
+ return item.external ? /* @__PURE__ */ jsxRuntime.jsx("a", { href: item.href, className: cls, rel: "noreferrer", onClick: onNavigate, children: body }) : /* @__PURE__ */ jsxRuntime.jsx(Link7__default.default, { href: item.href, className: cls, "aria-current": item.active ? "page" : void 0, onClick: onNavigate, children: body });
6789
7031
  }
6790
7032
  var seeAll = (item) => typeof item.label === "string" ? `All ${item.label.toLowerCase()}` : "See all";
6791
7033
  function NavDropdown({ item }) {
@@ -6818,6 +7060,18 @@ function NavDropdown({ item }) {
6818
7060
  ] })
6819
7061
  ] });
6820
7062
  }
7063
+ function AccountCta({ href = GET_AN_ACCOUNT.href, className }) {
7064
+ return /* @__PURE__ */ jsxRuntime.jsx(Button, { asChild: true, size: "sm", className, children: /* @__PURE__ */ jsxRuntime.jsx("a", { href, children: GET_AN_ACCOUNT.label }) });
7065
+ }
7066
+ function ProductLockup({ size, product }) {
7067
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center", children: [
7068
+ /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size }),
7069
+ product ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
7070
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "mx-3 h-5 w-px bg-oca-hairline-strong" }),
7071
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium tracking-[-0.01em]", style: { fontSize: size * 0.56 }, children: product })
7072
+ ] }) : null
7073
+ ] });
7074
+ }
6821
7075
  function SiteHeader({
6822
7076
  home = "/",
6823
7077
  brand,
@@ -6837,13 +7091,7 @@ function SiteHeader({
6837
7091
  const current2 = typeof family === "string" ? family : void 0;
6838
7092
  const phoneNav = navOnPhone ? nav : [];
6839
7093
  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
- ] });
7094
+ const brandNode = brand ?? /* @__PURE__ */ jsxRuntime.jsx(ProductLockup, { size, product });
6847
7095
  const navigation = nav.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Main", className: "hidden items-center gap-1 md:flex", children: nav.map(
6848
7096
  (n) => n.children?.length ? /* @__PURE__ */ jsxRuntime.jsx(NavDropdown, { item: n }, n.href) : (
6849
7097
  // Between md and lg the family menu and the actions share the row: tighter.
@@ -6871,7 +7119,7 @@ function SiteHeader({
6871
7119
  ),
6872
7120
  children: [
6873
7121
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex min-w-0 items-center gap-1", tool ? "md:gap-1" : "justify-self-start"), children: [
6874
- /* @__PURE__ */ jsxRuntime.jsxs(Link6__default.default, { href: home, className: "-ml-1 min-w-0 rounded-lg p-1", children: [
7122
+ /* @__PURE__ */ jsxRuntime.jsxs(Link7__default.default, { href: home, className: "-ml-1 min-w-0 rounded-lg p-1", children: [
6875
7123
  brandNode,
6876
7124
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: " home" })
6877
7125
  ] }),
@@ -6973,7 +7221,7 @@ function SiteBanner({
6973
7221
  var FOOT_LINK = "inline-flex min-h-11 items-center transition-colors hover:text-foreground md:min-h-0";
6974
7222
  function LegalRow({ links }) {
6975
7223
  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)) }) }),
7224
+ /* @__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(Link7__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
7225
  /* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
6978
7226
  "\xA9 ",
6979
7227
  (/* @__PURE__ */ new Date()).getFullYear(),
@@ -6993,16 +7241,26 @@ function SiteFooter({
6993
7241
  }) {
6994
7242
  const legalLinks = legal === true ? LEGAL_LINKS : legal || null;
6995
7243
  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
- ] }) });
7244
+ return (
7245
+ // The tools' column (ToolColumn): the lockup lines up with the page's title.
7246
+ /* @__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: [
7247
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-6 gap-y-3", children: [
7248
+ /* @__PURE__ */ jsxRuntime.jsx(
7249
+ "a",
7250
+ {
7251
+ href: OCHK_IO,
7252
+ className: "relative rounded-lg text-foreground before:absolute before:inset-x-0 before:top-1/2 before:h-11 before:-translate-y-1/2",
7253
+ children: /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 22 })
7254
+ }
7255
+ ),
7256
+ 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
7257
+ ] }),
7258
+ 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: [
7259
+ legalLinks ? /* @__PURE__ */ jsxRuntime.jsx(LegalRow, { links: legalLinks }) : null,
7260
+ meta
7261
+ ] }) : null
7262
+ ] }) })
7263
+ );
7006
7264
  }
7007
7265
  const cols = [
7008
7266
  ...columns,
@@ -7037,17 +7295,17 @@ function SiteFooter({
7037
7295
  className: cn("flex min-w-0 flex-col gap-1", spans && "col-span-2 md:col-span-1"),
7038
7296
  children: [
7039
7297
  /* @__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(
7298
+ /* @__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
7299
  NavLink,
7042
7300
  {
7043
7301
  item: l,
7044
7302
  className: "-mx-3 py-2.5 text-[0.9375rem] md:py-1.5"
7045
7303
  },
7046
- l.href
7304
+ `${j}:${l.label}`
7047
7305
  )) })
7048
7306
  ]
7049
7307
  },
7050
- col.heading
7308
+ `${i}:${col.heading}`
7051
7309
  );
7052
7310
  })
7053
7311
  ]
@@ -7083,12 +7341,13 @@ function OchkIoFooter({ columns = OCHK_IO_FOOTER, className }) {
7083
7341
  );
7084
7342
  }
7085
7343
  function SignInFrame({
7086
- title = "Sign in",
7344
+ title = SIGN_IN_LABEL,
7087
7345
  lead,
7088
7346
  children,
7089
7347
  error,
7090
7348
  fineprint,
7091
7349
  brand,
7350
+ product,
7092
7351
  home,
7093
7352
  protocol: protocol2,
7094
7353
  back,
@@ -7105,12 +7364,12 @@ function SignInFrame({
7105
7364
  children: [
7106
7365
  /* @__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
7366
  /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "flex items-center justify-between gap-4", children: [
7108
- /* @__PURE__ */ jsxRuntime.jsxs(Link6__default.default, { href: homeHref, className: "w-fit rounded-lg", children: [
7109
- brand ?? /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 28 }),
7367
+ /* @__PURE__ */ jsxRuntime.jsxs(Link7__default.default, { href: homeHref, className: "w-fit rounded-lg", children: [
7368
+ brand ?? /* @__PURE__ */ jsxRuntime.jsx(ProductLockup, { size: 28, product: product ?? (protocol2 ? protocolSite(protocol2).label : void 0) }),
7110
7369
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: " home" })
7111
7370
  ] }),
7112
7371
  back === void 0 ? /* @__PURE__ */ jsxRuntime.jsx(
7113
- Link6__default.default,
7372
+ Link7__default.default,
7114
7373
  {
7115
7374
  href: homeHref,
7116
7375
  className: "text-[0.9375rem] text-muted-foreground underline-offset-4 hover:text-foreground hover:underline",
@@ -7205,7 +7464,7 @@ function DocsNav({
7205
7464
  const on = pathOf(item.href) === here;
7206
7465
  const badge = typeof item.badge === "string" && STATUS_WORDS.has(item.badge) ? /* @__PURE__ */ jsxRuntime.jsx(StatusBadge, { status: item.badge }) : item.badge ? /* @__PURE__ */ jsxRuntime.jsx(Badge, { tone: "muted", children: item.badge }) : null;
7207
7466
  return /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsxs(
7208
- Link6__default.default,
7467
+ Link7__default.default,
7209
7468
  {
7210
7469
  href: item.href,
7211
7470
  ref: on ? activeRef : void 0,
@@ -7317,7 +7576,7 @@ function SessionAccountView({
7317
7576
  items = [],
7318
7577
  signInHref,
7319
7578
  signInPath,
7320
- signInLabel = "Sign in",
7579
+ signInLabel = SIGN_IN_LABEL,
7321
7580
  accountHref = OCHK_APP_ACCOUNT,
7322
7581
  onSignOut,
7323
7582
  nameFrom = "lg"
@@ -7348,6 +7607,13 @@ function SessionAccountView({
7348
7607
  /* @__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
7608
  );
7350
7609
  }
7610
+ function ToolColumn({
7611
+ measure = "wide",
7612
+ className,
7613
+ children
7614
+ }) {
7615
+ 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 }) }) });
7616
+ }
7351
7617
  function ToolShell({
7352
7618
  protocol: protocol2,
7353
7619
  tools,
@@ -7356,6 +7622,7 @@ function ToolShell({
7356
7622
  rail = false,
7357
7623
  railFooter,
7358
7624
  variant = "tool",
7625
+ measure = "wide",
7359
7626
  banner,
7360
7627
  footer,
7361
7628
  children
@@ -7413,14 +7680,7 @@ function ToolShell({
7413
7680
  /* @__PURE__ */ jsxRuntime.jsx(SideNav, { groups: [{ label: "Tools", items: tools.map(({ href, label, icon, active }) => ({ href, label, icon, active })) }] }),
7414
7681
  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
7682
  ] }) : 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
- )
7683
+ /* @__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
7684
  ] }),
7425
7685
  app || footer === false ? null : footer ?? /* @__PURE__ */ jsxRuntime.jsx(SiteFooter, { compact: true, family: true, legal: true }),
7426
7686
  tabs ? /* @__PURE__ */ jsxRuntime.jsx(TabBar, { items: tabs }) : null
@@ -7606,6 +7866,7 @@ exports.APP_ID = APP_ID;
7606
7866
  exports.Accent = Accent;
7607
7867
  exports.Accordion = Accordion;
7608
7868
  exports.AccordionItem = AccordionItem;
7869
+ exports.AccountCta = AccountCta;
7609
7870
  exports.AccountMenu = AccountMenu;
7610
7871
  exports.ActivityList = ActivityList;
7611
7872
  exports.AnchorStatus = AnchorStatus;
@@ -7615,6 +7876,7 @@ exports.AppGrid = AppGrid;
7615
7876
  exports.AppIcon = AppIcon;
7616
7877
  exports.AppShell = AppShell;
7617
7878
  exports.ArtifactView = ArtifactView;
7879
+ exports.Avatar = Avatar;
7618
7880
  exports.Badge = Badge;
7619
7881
  exports.BlockCountdown = BlockCountdown;
7620
7882
  exports.BlockHeight = BlockHeight;
@@ -7633,6 +7895,8 @@ exports.CardNumeral = CardNumeral;
7633
7895
  exports.CardTitle = CardTitle;
7634
7896
  exports.ChartFrame = ChartFrame;
7635
7897
  exports.Checkbox = Checkbox;
7898
+ exports.ChoiceCard = ChoiceCard;
7899
+ exports.ChoiceGroup = ChoiceGroup;
7636
7900
  exports.Closing = Closing;
7637
7901
  exports.CodeBlock = CodeBlock;
7638
7902
  exports.CodeTabs = CodeTabs;
@@ -7688,6 +7952,7 @@ exports.FilterChips = FilterChips;
7688
7952
  exports.FloatChip = FloatChip;
7689
7953
  exports.Footnote = Footnote;
7690
7954
  exports.FormSection = FormSection;
7955
+ exports.GET_AN_ACCOUNT = GET_AN_ACCOUNT;
7691
7956
  exports.HalftoneCanvas = HalftoneCanvas;
7692
7957
  exports.HalftoneSphere = HalftoneSphere;
7693
7958
  exports.HashChip = HashChip;
@@ -7702,6 +7967,8 @@ exports.Label = Label;
7702
7967
  exports.Lead = Lead;
7703
7968
  exports.LegalDocument = LegalDocument;
7704
7969
  exports.LinkCard = LinkCard;
7970
+ exports.ListCard = ListCard;
7971
+ exports.ListRow = ListRow;
7705
7972
  exports.LoadingBlock = LoadingBlock;
7706
7973
  exports.LockedPreview = LockedPreview;
7707
7974
  exports.Lockup = Lockup;
@@ -7711,6 +7978,7 @@ exports.MdxTable = MdxTable;
7711
7978
  exports.Meter = Meter;
7712
7979
  exports.Monogram = Monogram;
7713
7980
  exports.Notice = Notice;
7981
+ exports.OCHK_APP = OCHK_APP;
7714
7982
  exports.OCHK_APP_ACCOUNT = OCHK_APP_ACCOUNT;
7715
7983
  exports.OCHK_IO = OCHK_IO;
7716
7984
  exports.OCHK_IO_FOOTER = OCHK_IO_FOOTER;
@@ -7723,6 +7991,7 @@ exports.PackageCard = PackageCard;
7723
7991
  exports.PageHeader = PageHeader;
7724
7992
  exports.PageHero = PageHero;
7725
7993
  exports.Pagination = Pagination;
7994
+ exports.PaneHeader = PaneHeader;
7726
7995
  exports.Panel = Panel;
7727
7996
  exports.PhoneFrame = PhoneFrame;
7728
7997
  exports.PlanCard = PlanCard;
@@ -7741,6 +8010,7 @@ exports.RadioGroup = RadioGroup;
7741
8010
  exports.RadioGroupItem = RadioGroupItem;
7742
8011
  exports.Reveal = Reveal;
7743
8012
  exports.SELF_HOSTED_LEGAL_LINKS = SELF_HOSTED_LEGAL_LINKS;
8013
+ exports.SIGN_IN_LABEL = SIGN_IN_LABEL;
7744
8014
  exports.SPHERE_GRADIENT = SPHERE_GRADIENT;
7745
8015
  exports.Sats = Sats;
7746
8016
  exports.SatsFigure = SatsFigure;
@@ -7751,6 +8021,7 @@ exports.SearchDialog = SearchDialog;
7751
8021
  exports.Section = Section;
7752
8022
  exports.SectionHeading = SectionHeading;
7753
8023
  exports.SectionIntro = SectionIntro;
8024
+ exports.SectionTitle = SectionTitle;
7754
8025
  exports.Select = Select;
7755
8026
  exports.SelectContent = SelectContent;
7756
8027
  exports.SelectGroup = SelectGroup;
@@ -7798,6 +8069,7 @@ exports.Textarea = Textarea;
7798
8069
  exports.ThemeToggle = ThemeToggle;
7799
8070
  exports.Ticker = Ticker;
7800
8071
  exports.Toaster = Toaster;
8072
+ exports.ToolColumn = ToolColumn;
7801
8073
  exports.ToolGrid = ToolGrid;
7802
8074
  exports.ToolShell = ToolShell;
7803
8075
  exports.Tooltip = Tooltip;