@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.mjs CHANGED
@@ -13,14 +13,14 @@ import * as LabelPrimitive from '@radix-ui/react-label';
13
13
  import * as RadioGroupPrimitive from '@radix-ui/react-radio-group';
14
14
  import * as SelectPrimitive from '@radix-ui/react-select';
15
15
  import * as SwitchPrimitive from '@radix-ui/react-switch';
16
- import { ChevronDown, Check, X, Search, ArrowUpRight, ArrowRight, Copy, ChevronLeft, ChevronRight, Lock, Info, CornerDownLeft, Download, FileText, Upload, Menu, Sun, Moon, SunMoon, PanelLeft, CircleUser, LogOut, ArrowLeft, Maximize2, CircleDashed, CircleMinus, CircleSlash, Clock, CircleX, CircleCheck, Ellipsis } from 'lucide-react';
16
+ import { ChevronDown, Check, X, Search, ArrowUpRight, ArrowRight, Copy, ChevronLeft, ChevronRight, Lock, Info, UserRound, CornerDownLeft, Download, FileText, Upload, Menu, Sun, Moon, SunMoon, PanelLeft, CircleUser, LogOut, ArrowLeft, Maximize2, CircleDashed, CircleMinus, CircleSlash, Clock, CircleX, CircleCheck, Ellipsis } from 'lucide-react';
17
17
  import * as DialogPrimitive from '@radix-ui/react-dialog';
18
18
  import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
19
19
  import * as PopoverPrimitive from '@radix-ui/react-popover';
20
20
  import * as TooltipPrimitive from '@radix-ui/react-tooltip';
21
21
  import * as TabsPrimitive from '@radix-ui/react-tabs';
22
22
  import QRCode from 'qrcode';
23
- import Link6 from 'next/link';
23
+ import Link7 from 'next/link';
24
24
  import { useRouter } from 'next/compat/router';
25
25
 
26
26
  // src/tokens/palette.ts
@@ -871,7 +871,8 @@ var DropdownMenuItem = forwardRef(function DropdownMenuItem2({ className, destru
871
871
  {
872
872
  ref,
873
873
  className: cn(
874
- "flex h-10 cursor-default select-none items-center gap-2.5 rounded-xl px-3 text-[0.9375rem] outline-none",
874
+ // A thumb's 44px on a phone.
875
+ "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",
875
876
  "data-[highlighted]:bg-accent data-[disabled]:opacity-50 [&_svg]:size-4 [&_svg]:text-muted-foreground",
876
877
  destructive && "text-destructive [&_svg]:text-destructive",
877
878
  className
@@ -2167,7 +2168,7 @@ var JS_TAG = /<\/?(?=[A-Za-z])/y;
2167
2168
  var JS_TAG_NAME = /[A-Za-z][\w$.:-]*/y;
2168
2169
  var JS_PUNCT = /=>|\.\.\.|[{}()[\];,.<>=+\-*/%!?:&|^~#]/y;
2169
2170
  var JSX_BEFORE = /* @__PURE__ */ new Set(["(", ",", "=", "?", ":", "{", "[", ";", ">", "&&", "||", "=>", "return"]);
2170
- function scanJs(src, emit2, jsx52) {
2171
+ function scanJs(src, emit2, jsx54) {
2171
2172
  let i = 0;
2172
2173
  let prev = "";
2173
2174
  let tagDepth = 0;
@@ -2193,7 +2194,7 @@ function scanJs(src, emit2, jsx52) {
2193
2194
  sig('"');
2194
2195
  continue;
2195
2196
  }
2196
- if (jsx52 && tagDepth === 0 && (m = at(JS_TAG, src, i)) && (prev === "" || JSX_BEFORE.has(prev))) {
2197
+ if (jsx54 && tagDepth === 0 && (m = at(JS_TAG, src, i)) && (prev === "" || JSX_BEFORE.has(prev))) {
2197
2198
  const name = at(JS_TAG_NAME, src, i + m.length);
2198
2199
  if (name) {
2199
2200
  emit2(m);
@@ -2205,7 +2206,7 @@ function scanJs(src, emit2, jsx52) {
2205
2206
  continue;
2206
2207
  }
2207
2208
  }
2208
- if (jsx52 && tagDepth > 0 && braceInTag === 0) {
2209
+ if (jsx54 && tagDepth > 0 && braceInTag === 0) {
2209
2210
  if (src.startsWith("/>", i) || src[i] === ">") {
2210
2211
  const close = src[i] === ">" ? ">" : "/>";
2211
2212
  emit2(close);
@@ -2225,7 +2226,7 @@ function scanJs(src, emit2, jsx52) {
2225
2226
  continue;
2226
2227
  }
2227
2228
  if (src[i] === "{") braceInTag = 1;
2228
- } else if (jsx52 && tagDepth > 0 && braceInTag > 0) {
2229
+ } else if (jsx54 && tagDepth > 0 && braceInTag > 0) {
2229
2230
  if (src[i] === "{") braceInTag++;
2230
2231
  else if (src[i] === "}") braceInTag--;
2231
2232
  }
@@ -2942,6 +2943,7 @@ function Notice({
2942
2943
  title,
2943
2944
  children,
2944
2945
  action,
2946
+ icon,
2945
2947
  role,
2946
2948
  className
2947
2949
  }) {
@@ -2958,7 +2960,17 @@ function Notice({
2958
2960
  ),
2959
2961
  children: [
2960
2962
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 gap-3", children: [
2961
- kind !== "neutral" ? /* @__PURE__ */ jsx(
2963
+ icon ? /* @__PURE__ */ jsx(
2964
+ "span",
2965
+ {
2966
+ "aria-hidden": true,
2967
+ className: cn(
2968
+ "mt-0.5 shrink-0 [&_svg]:size-[1.125rem]",
2969
+ kind === "brand" ? "text-oca-accent-ink" : kind === "danger" ? "text-destructive" : "text-muted-foreground"
2970
+ ),
2971
+ children: icon
2972
+ }
2973
+ ) : kind !== "neutral" ? /* @__PURE__ */ jsx(
2962
2974
  "span",
2963
2975
  {
2964
2976
  "aria-hidden": true,
@@ -3253,7 +3265,7 @@ function Well({
3253
3265
  ] });
3254
3266
  }
3255
3267
  var FRAME = "overflow-hidden rounded-[1.25rem] border border-[var(--oca-code-line)] bg-[var(--oca-code-surface)]";
3256
- var COPY_ON_INK = "text-oca-ink-subtle hover:bg-white/10 hover:text-white";
3268
+ var COPY_ON_INK = "text-oca-ink-subtle hover:bg-white/10 hover:text-white max-md:size-11";
3257
3269
  function CodeBlock({
3258
3270
  code,
3259
3271
  html,
@@ -3681,6 +3693,9 @@ var GROUNDS = [
3681
3693
  }
3682
3694
  ];
3683
3695
  var SIZES = {
3696
+ // A list row's avatar, a facepile.
3697
+ "2xs": "size-7 rounded-[0.55rem] text-[0.75rem]",
3698
+ xs: "size-8 rounded-[0.6rem] text-[0.875rem]",
3684
3699
  sm: "size-9 rounded-[0.7rem] text-[0.9375rem]",
3685
3700
  md: "size-11 rounded-[0.85rem] text-[1.125rem]",
3686
3701
  lg: "size-14 rounded-[1.05rem] text-[1.5rem]"
@@ -3768,6 +3783,9 @@ var ErrorBoundary = class extends Component {
3768
3783
  // src/family/index.ts
3769
3784
  var OCHK_IO = "https://ochk.io";
3770
3785
  var DOCS_HREF = `${OCHK_IO}/docs`;
3786
+ var OCHK_APP = "https://ochk.app";
3787
+ var GET_AN_ACCOUNT = { href: OCHK_APP, label: "Get an account" };
3788
+ var SIGN_IN_LABEL = "Sign in";
3771
3789
  function protocol(slug, verb, line, kinds) {
3772
3790
  return {
3773
3791
  slug,
@@ -3804,7 +3822,7 @@ var FAMILY = [
3804
3822
  {
3805
3823
  slug: "me",
3806
3824
  label: "ochk.app",
3807
- href: "https://ochk.app",
3825
+ href: OCHK_APP,
3808
3826
  group: "orangecheck",
3809
3827
  line: "One account, with Bitcoin behind it.",
3810
3828
  status: "testing"
@@ -3923,6 +3941,10 @@ var OCHK_IO_FOOTER = [
3923
3941
  ]
3924
3942
  }
3925
3943
  ];
3944
+ var InColumnContext = sharedContext("in-column", false);
3945
+ function useInColumn() {
3946
+ return useContext(InColumnContext);
3947
+ }
3926
3948
  var SiteHomeContext = sharedContext("site-home", void 0);
3927
3949
  function useSiteHome() {
3928
3950
  return useContext(SiteHomeContext);
@@ -3950,10 +3972,11 @@ function ErrorPage({
3950
3972
  className
3951
3973
  }) {
3952
3974
  const shellHome = useSiteHome();
3975
+ const inColumn = useInColumn();
3953
3976
  const homeHref = home ?? (protocol2 ? protocolSite(protocol2).pageHref : shellHome ?? OCHK_IO);
3954
3977
  const words = WORDS[code] ?? (code >= 500 ? WORDS[500] : WORDS[404]);
3955
3978
  const server = code >= 500;
3956
- return /* @__PURE__ */ jsx(Section, { space: "none", className: cn("flex min-h-[min(40rem,72dvh)] items-center py-16 md:py-24", className), children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 items-center gap-12 md:grid-cols-12", children: [
3979
+ return /* @__PURE__ */ jsx(Section, { space: "none", contained: !inColumn, className: cn("flex min-h-[min(40rem,72dvh)] items-center py-16 md:py-24", className), children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 items-center gap-12 md:grid-cols-12", children: [
3957
3980
  /* @__PURE__ */ jsxs("div", { className: "flex max-w-[40rem] flex-col items-start gap-6 md:col-span-7", children: [
3958
3981
  /* @__PURE__ */ jsxs("p", { className: "oca-eyebrow oca-enter", children: [
3959
3982
  /* @__PURE__ */ jsx("span", { className: "oca-tabular", children: code }),
@@ -3964,7 +3987,7 @@ function ErrorPage({
3964
3987
  /* @__PURE__ */ jsx("p", { className: "oca-lead oca-enter [--enter-delay:150ms]", children: detail ?? words.detail }),
3965
3988
  /* @__PURE__ */ jsx("div", { className: "oca-enter flex flex-wrap gap-3 [--enter-delay:230ms]", children: actions ?? /* @__PURE__ */ jsxs(Fragment, { children: [
3966
3989
  server ? /* @__PURE__ */ jsx(Button, { onClick: () => window.location.reload(), children: "Try again" }) : null,
3967
- /* @__PURE__ */ jsx(Button, { asChild: true, variant: server ? "secondary" : "primary", children: /* @__PURE__ */ jsx(Link6, { href: homeHref, children: "Go home" }) })
3990
+ /* @__PURE__ */ jsx(Button, { asChild: true, variant: server ? "secondary" : "primary", children: /* @__PURE__ */ jsx(Link7, { href: homeHref, children: "Go home" }) })
3968
3991
  ] }) })
3969
3992
  ] }),
3970
3993
  art !== null ? /* @__PURE__ */ jsx("div", { "aria-hidden": true, className: "oca-enter hidden justify-center md:col-span-5 md:flex [--enter-delay:120ms]", children: art ?? /* @__PURE__ */ jsx(MarkOutline, { className: "w-full max-w-[20rem] text-oca-hairline-strong" }) }) : null
@@ -4405,7 +4428,7 @@ function TextLink({
4405
4428
  const internal = href.startsWith("/") && !href.startsWith("/api/") && !href.startsWith("/.well-known/");
4406
4429
  const offsite = external ?? /^https?:\/\//.test(href);
4407
4430
  if (internal && !offsite) {
4408
- return /* @__PURE__ */ jsx(Link6, { href, className: cn(LINK, className), children });
4431
+ return /* @__PURE__ */ jsx(Link7, { href, className: cn(LINK, className), children });
4409
4432
  }
4410
4433
  return /* @__PURE__ */ jsxs("a", { href, className: cn(LINK, className), ...offsite ? { target: "_blank", rel: "noreferrer" } : {}, children: [
4411
4434
  children,
@@ -4539,7 +4562,7 @@ function ProtocolGrid({
4539
4562
  ] }),
4540
4563
  p.status !== "live" ? /* @__PURE__ */ jsx(StatusBadge, { status: p.status }) : null
4541
4564
  ] }),
4542
- /* @__PURE__ */ jsx("h3", { className: "oca-display-3", children: link === "docs" && inDocs ? /* @__PURE__ */ jsx(Link6, { href: `/${p.slug}`, className: STRETCH, children: p.label }) : /* @__PURE__ */ jsx(
4565
+ /* @__PURE__ */ jsx("h3", { className: "oca-display-3", children: link === "docs" && inDocs ? /* @__PURE__ */ jsx(Link7, { href: `/${p.slug}`, className: STRETCH, children: p.label }) : /* @__PURE__ */ jsx(
4543
4566
  "a",
4544
4567
  {
4545
4568
  href: link === "tool" ? p.toolHref : link === "docs" ? `${DOCS_HREF}/${p.slug}` : p.pageHref,
@@ -4599,7 +4622,7 @@ function AppGrid({
4599
4622
  }
4600
4623
  var isInternal = (href) => href.startsWith("/") || href.startsWith("#");
4601
4624
  function DocLink({ href, className, children, ...rest }) {
4602
- return isInternal(href) ? /* @__PURE__ */ jsx(Link6, { href, className, ...rest, children }) : /* @__PURE__ */ jsx("a", { href, className, ...rest, children });
4625
+ return isInternal(href) ? /* @__PURE__ */ jsx(Link7, { href, className, ...rest, children }) : /* @__PURE__ */ jsx("a", { href, className, ...rest, children });
4603
4626
  }
4604
4627
  function Breadcrumbs({ items, action, className }) {
4605
4628
  return /* @__PURE__ */ jsxs("div", { className: cn("flex min-h-11 items-center justify-between gap-4 sm:min-h-0", className), children: [
@@ -5389,6 +5412,220 @@ function SignMessage({
5389
5412
  )
5390
5413
  ] });
5391
5414
  }
5415
+ function SectionTitle({
5416
+ title,
5417
+ meta,
5418
+ description,
5419
+ action,
5420
+ as: Tag = "h2",
5421
+ size = "md",
5422
+ tone = "default",
5423
+ id,
5424
+ className
5425
+ }) {
5426
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-wrap items-end justify-between gap-x-4 gap-y-3", className), children: [
5427
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 max-w-[40rem] flex-[1_1_16rem] flex-col gap-1", children: [
5428
+ /* @__PURE__ */ jsxs(
5429
+ Tag,
5430
+ {
5431
+ id,
5432
+ className: cn(
5433
+ "flex scroll-mt-24 flex-wrap items-baseline gap-x-3",
5434
+ size === "sm" ? "oca-title-sm" : "oca-title",
5435
+ tone === "danger" && "text-destructive"
5436
+ ),
5437
+ children: [
5438
+ title,
5439
+ meta ? /* @__PURE__ */ jsx("span", { className: "oca-tabular text-[0.875rem] font-normal tracking-normal text-muted-foreground", children: meta }) : null
5440
+ ]
5441
+ }
5442
+ ),
5443
+ description ? /* @__PURE__ */ jsx("p", { className: "text-[0.9375rem] leading-relaxed text-muted-foreground", children: description }) : null
5444
+ ] }),
5445
+ action ? /* @__PURE__ */ jsx("div", { className: "flex shrink-0 flex-wrap items-center gap-2", children: action }) : null
5446
+ ] });
5447
+ }
5448
+ function ListCard({
5449
+ as: Tag = "ul",
5450
+ className,
5451
+ ...props
5452
+ }) {
5453
+ return /* @__PURE__ */ jsx(Tag, { className: cn("divide-y divide-border overflow-clip rounded-[1.25rem] border border-border bg-card", className), ...props });
5454
+ }
5455
+ var ROW_LOOK = {
5456
+ // In a ListCard: full width, the card's hairlines between rows.
5457
+ card: { box: "px-5", hover: "hover:bg-accent/60", current: "bg-accent" },
5458
+ // In a pane's list (threads, contacts): rounded, lifted when current.
5459
+ pane: { box: "rounded-xl px-3", hover: "hover:bg-accent", current: "bg-card shadow-sm ring-1 ring-border" }
5460
+ };
5461
+ function ListRow({
5462
+ title,
5463
+ meta,
5464
+ description,
5465
+ leading,
5466
+ trailing,
5467
+ actions,
5468
+ revealActions = "always",
5469
+ href,
5470
+ onSelect,
5471
+ current: current2 = false,
5472
+ unread = false,
5473
+ variant = "card",
5474
+ as: Tag = "li",
5475
+ className
5476
+ }) {
5477
+ const tight = useDensity() === "compact";
5478
+ const look = ROW_LOOK[variant];
5479
+ const interactive = href !== void 0 || onSelect !== void 0;
5480
+ const cls = cn(
5481
+ "flex min-h-11 w-full min-w-0 items-center gap-3 text-left outline-none transition-colors",
5482
+ "focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring",
5483
+ look.box,
5484
+ variant === "pane" ? "py-2" : tight ? "py-3" : "py-4",
5485
+ interactive && !current2 && look.hover,
5486
+ current2 && look.current,
5487
+ actions && "pr-14"
5488
+ );
5489
+ const body = /* @__PURE__ */ jsxs(Fragment, { children: [
5490
+ leading ? /* @__PURE__ */ jsx("span", { className: "flex shrink-0", children: leading }) : null,
5491
+ /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [
5492
+ /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 items-baseline justify-between gap-3", children: [
5493
+ /* @__PURE__ */ jsx("span", { className: cn("truncate text-[0.9375rem] text-foreground", unread ? "font-semibold" : "font-medium"), children: title }),
5494
+ meta ? /* @__PURE__ */ jsx("span", { className: "oca-tabular shrink-0 text-[0.8125rem] text-muted-foreground", children: meta }) : null
5495
+ ] }),
5496
+ description ? /* @__PURE__ */ jsx("span", { className: cn("truncate text-[0.875rem]", unread ? "text-foreground" : "text-muted-foreground"), children: description }) : null
5497
+ ] }),
5498
+ trailing ? /* @__PURE__ */ jsx("span", { className: "flex shrink-0 items-center gap-2", children: trailing }) : null
5499
+ ] });
5500
+ const aria = current2 ? { "aria-current": "true" } : {};
5501
+ return /* @__PURE__ */ jsxs(Tag, { className: cn("group/row relative", className), children: [
5502
+ href !== void 0 ? href.startsWith("/") ? /* @__PURE__ */ jsx(Link7, { href, className: cls, ...aria, children: body }) : /* @__PURE__ */ jsx("a", { href, className: cls, ...aria, children: body }) : onSelect ? /* @__PURE__ */ jsx("button", { type: "button", onClick: onSelect, className: cls, ...aria, children: body }) : /* @__PURE__ */ jsx("div", { className: cls, children: body }),
5503
+ actions ? /* @__PURE__ */ jsx(
5504
+ "div",
5505
+ {
5506
+ className: cn(
5507
+ "absolute right-2 top-1/2 flex -translate-y-1/2 items-center",
5508
+ 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"
5509
+ ),
5510
+ children: actions
5511
+ }
5512
+ ) : null
5513
+ ] });
5514
+ }
5515
+ var ChoiceSize = createContext("md");
5516
+ var COLUMNS = { 1: "", 2: "sm:grid-cols-2", 3: "sm:grid-cols-2 lg:grid-cols-3" };
5517
+ function ChoiceGroup({
5518
+ value,
5519
+ onValueChange,
5520
+ label,
5521
+ columns = 1,
5522
+ size = "md",
5523
+ disabled,
5524
+ className,
5525
+ children
5526
+ }) {
5527
+ return /* @__PURE__ */ jsx(ChoiceSize.Provider, { value: size, children: /* @__PURE__ */ jsx(
5528
+ RadioGroupPrimitive.Root,
5529
+ {
5530
+ value: value ?? "",
5531
+ onValueChange: (v) => onValueChange(v),
5532
+ "aria-label": label,
5533
+ disabled,
5534
+ className: cn("grid", size === "sm" ? "gap-1.5" : "gap-3", COLUMNS[columns], className),
5535
+ children
5536
+ }
5537
+ ) });
5538
+ }
5539
+ function ChoiceCard({
5540
+ value,
5541
+ title,
5542
+ description,
5543
+ icon,
5544
+ disabled,
5545
+ className
5546
+ }) {
5547
+ const sm = useContext(ChoiceSize) === "sm";
5548
+ return /* @__PURE__ */ jsxs(
5549
+ RadioGroupPrimitive.Item,
5550
+ {
5551
+ value,
5552
+ disabled,
5553
+ className: cn(
5554
+ "group flex w-full min-w-0 items-start gap-3 border text-left outline-none transition-colors",
5555
+ "focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
5556
+ "border-border bg-card data-[state=checked]:border-foreground data-[state=checked]:bg-accent data-[state=unchecked]:hover:border-oca-hairline-strong",
5557
+ "disabled:cursor-not-allowed disabled:opacity-50",
5558
+ sm ? "min-h-11 rounded-xl px-3.5 py-2.5" : "rounded-[1.25rem] p-5",
5559
+ className
5560
+ ),
5561
+ children: [
5562
+ icon ? /* @__PURE__ */ jsx(
5563
+ "span",
5564
+ {
5565
+ "aria-hidden": true,
5566
+ className: cn(
5567
+ "shrink-0 text-muted-foreground group-data-[state=checked]:text-oca-accent-ink [&_svg]:size-full",
5568
+ sm ? "mt-0.5 size-4" : "size-6"
5569
+ ),
5570
+ children: icon
5571
+ }
5572
+ ) : null,
5573
+ /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-col gap-1", children: [
5574
+ /* @__PURE__ */ jsx("span", { className: sm ? "text-[0.9375rem] font-medium" : "oca-title-sm", children: title }),
5575
+ description ? /* @__PURE__ */ jsx("span", { className: "text-[0.875rem] leading-relaxed text-muted-foreground", children: description }) : null
5576
+ ] })
5577
+ ]
5578
+ }
5579
+ );
5580
+ }
5581
+ var SIZES2 = {
5582
+ "2xs": "size-7 text-[0.6875rem] [&_svg]:size-3.5",
5583
+ xs: "size-8 text-[0.75rem] [&_svg]:size-4",
5584
+ sm: "size-9 text-[0.8125rem] [&_svg]:size-4",
5585
+ md: "size-11 text-[0.9375rem] [&_svg]:size-5",
5586
+ lg: "size-14 text-[1.1875rem] [&_svg]:size-6"
5587
+ };
5588
+ function personInitials(name) {
5589
+ return name.trim().split(/\s+/).slice(0, 2).map((w) => w.match(/[\p{L}\p{N}]/u)?.[0] ?? "").join("").toLocaleUpperCase();
5590
+ }
5591
+ function avatarHue(seed) {
5592
+ let h = 2166136261;
5593
+ for (let i = 0; i < seed.length; i++) {
5594
+ h ^= seed.charCodeAt(i);
5595
+ h = Math.imul(h, 16777619);
5596
+ }
5597
+ return (h >>> 0) % 360;
5598
+ }
5599
+ function Avatar({
5600
+ seed,
5601
+ name,
5602
+ src,
5603
+ size = "sm",
5604
+ className
5605
+ }) {
5606
+ const [failed, setFailed] = useState(null);
5607
+ const box = cn("inline-flex shrink-0 select-none items-center justify-center overflow-hidden rounded-full", SIZES2[size], className);
5608
+ if (src && failed !== src) {
5609
+ return (
5610
+ // eslint-disable-next-line @next/next/no-img-element
5611
+ /* @__PURE__ */ jsx("img", { src, alt: "", "aria-hidden": true, className: cn(box, "object-cover"), onError: () => setFailed(src) })
5612
+ );
5613
+ }
5614
+ const initials = name ? personInitials(name) : "";
5615
+ return /* @__PURE__ */ jsx(
5616
+ "span",
5617
+ {
5618
+ "aria-hidden": true,
5619
+ className: cn(box, "font-medium leading-none"),
5620
+ style: {
5621
+ "--oca-avatar-h": avatarHue(seed),
5622
+ backgroundColor: "hsl(var(--oca-avatar-h) 60% var(--oca-avatar-bg-l))",
5623
+ color: "hsl(var(--oca-avatar-h) 45% var(--oca-avatar-fg-l))"
5624
+ },
5625
+ children: initials || /* @__PURE__ */ jsx(UserRound, {})
5626
+ }
5627
+ );
5628
+ }
5392
5629
  function useMacKeys() {
5393
5630
  const [mac, setMac] = useState(true);
5394
5631
  useEffect(() => {
@@ -5664,7 +5901,7 @@ function download(content, filename, mime) {
5664
5901
  a.remove();
5665
5902
  setTimeout(() => URL.revokeObjectURL(url), 0);
5666
5903
  }
5667
- 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";
5904
+ 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";
5668
5905
  function ArtifactView({
5669
5906
  content,
5670
5907
  title,
@@ -5694,7 +5931,8 @@ function ArtifactView({
5694
5931
  "aria-pressed": view === v,
5695
5932
  onClick: () => setView(v),
5696
5933
  className: cn(
5697
- "h-7 rounded-full px-2.5 text-[0.75rem] transition-colors",
5934
+ // The pill stays 28px; its target reaches the bar's 44.
5935
+ "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",
5698
5936
  view === v ? "bg-white/[0.12] text-white" : "text-oca-ink-subtle hover:text-white"
5699
5937
  ),
5700
5938
  children: v === "formatted" ? "Formatted" : "Raw"
@@ -6164,7 +6402,8 @@ function FilterChips({
6164
6402
  onClick: () => press(o.value),
6165
6403
  className: cn(
6166
6404
  "inline-flex shrink-0 items-center gap-1.5 rounded-full border px-3.5 text-[0.875rem] transition-colors",
6167
- tight ? "h-8" : "h-9",
6405
+ // A thumb's 44px on a phone.
6406
+ tight ? "h-11 md:h-8" : "h-11 md:h-9",
6168
6407
  on ? "border-foreground bg-foreground text-background" : "border-border bg-card text-muted-foreground hover:border-oca-hairline-strong hover:text-foreground"
6169
6408
  ),
6170
6409
  children: [
@@ -6214,7 +6453,7 @@ function ToolGrid({
6214
6453
  ] }),
6215
6454
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
6216
6455
  /* @__PURE__ */ jsx(Heading, { className: "oca-title-sm", children: /* @__PURE__ */ jsx(
6217
- Link6,
6456
+ Link7,
6218
6457
  {
6219
6458
  href: t.href,
6220
6459
  className: "outline-none after:absolute after:inset-0 after:rounded-[1.25rem] after:content-['']",
@@ -6311,7 +6550,7 @@ function SideNav({ groups, onNavigate }) {
6311
6550
  return /* @__PURE__ */ jsx("nav", { "aria-label": "Pages", className: "flex flex-col gap-5", children: groups.map((g, gi) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-0.5", children: [
6312
6551
  g.label ? /* @__PURE__ */ jsx("p", { className: "px-3 pb-1 text-[0.8125rem] text-muted-foreground", children: g.label }) : null,
6313
6552
  g.items.map((it) => /* @__PURE__ */ jsxs(
6314
- Link6,
6553
+ Link7,
6315
6554
  {
6316
6555
  href: it.href,
6317
6556
  onClick: onNavigate,
@@ -6346,7 +6585,7 @@ function SectionSwitch({
6346
6585
  children: sections.map((sec) => {
6347
6586
  const on = sec.id === current2.id;
6348
6587
  return /* @__PURE__ */ jsx(
6349
- Link6,
6588
+ Link7,
6350
6589
  {
6351
6590
  href: sec.href,
6352
6591
  onClick: onNavigate,
@@ -6419,7 +6658,7 @@ function TabBar({ items }) {
6419
6658
  style: { gridTemplateColumns: `repeat(${shown.length + (overflow ? 1 : 0)}, minmax(0, 1fr))` },
6420
6659
  children: [
6421
6660
  shown.map((it) => /* @__PURE__ */ jsx(
6422
- Link6,
6661
+ Link7,
6423
6662
  {
6424
6663
  href: it.href,
6425
6664
  "aria-current": it.active ? "page" : void 0,
@@ -6439,7 +6678,7 @@ function TabBar({ items }) {
6439
6678
  /* @__PURE__ */ jsxs(SheetContent, { side: "bottom", className: "pb-[calc(1.5rem+env(safe-area-inset-bottom))]", children: [
6440
6679
  /* @__PURE__ */ jsx(SheetTitle, { className: "px-1 text-[1.0625rem] font-medium", children: "More" }),
6441
6680
  /* @__PURE__ */ jsx("div", { className: "mt-4 grid grid-cols-3 gap-2", children: rest.map((it) => /* @__PURE__ */ jsxs(
6442
- Link6,
6681
+ Link7,
6443
6682
  {
6444
6683
  href: it.href,
6445
6684
  onClick: () => setMore(false),
@@ -6553,7 +6792,7 @@ function SidebarShell({
6553
6792
  footer ? /* @__PURE__ */ jsx("div", { className: "mt-auto flex flex-col gap-3", children: footer }) : null
6554
6793
  ] })
6555
6794
  ] }),
6556
- /* @__PURE__ */ jsx(Link6, { href: home, "aria-label": "Home", className: "rounded-lg p-1", children: /* @__PURE__ */ jsx(Lockup, { size: 22 }) }),
6795
+ /* @__PURE__ */ jsx(Link7, { href: home, "aria-label": "Home", className: "rounded-lg p-1", children: /* @__PURE__ */ jsx(Lockup, { size: 22 }) }),
6557
6796
  familyMenu,
6558
6797
  /* @__PURE__ */ jsx("div", { className: "ml-auto flex items-center", children: account })
6559
6798
  ] }),
@@ -6578,7 +6817,7 @@ function SidebarShell({
6578
6817
  /* @__PURE__ */ jsxs("div", { className: "mx-auto flex w-full max-w-[90rem]", children: [
6579
6818
  /* @__PURE__ */ 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: [
6580
6819
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
6581
- /* @__PURE__ */ jsx(Link6, { href: home, className: "px-2", "aria-label": "Home", children: /* @__PURE__ */ jsx(Lockup, { size: 26 }) }),
6820
+ /* @__PURE__ */ jsx(Link7, { href: home, className: "px-2", "aria-label": "Home", children: /* @__PURE__ */ jsx(Lockup, { size: 26 }) }),
6582
6821
  familyMenu
6583
6822
  ] }),
6584
6823
  switcher,
@@ -6588,7 +6827,7 @@ function SidebarShell({
6588
6827
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
6589
6828
  /* @__PURE__ */ jsx("div", { className: "hidden h-[4.5rem] items-center justify-end gap-3 px-8 lg:flex", children: account }),
6590
6829
  banner ? /* @__PURE__ */ jsx("div", { className: "px-4 pb-2 pt-4 md:px-8 lg:pt-0", children: banner }) : null,
6591
- /* @__PURE__ */ jsx("main", { id: "main-content", className: "flex-1 px-4 pb-16 pt-6 md:px-8 lg:pt-2", children: /* @__PURE__ */ jsx("div", { className: "mx-auto w-full max-w-[72rem]", children }) })
6830
+ /* @__PURE__ */ jsx("main", { id: "main-content", className: "flex-1 px-4 pb-16 pt-6 md:px-8 lg:pt-2", children: /* @__PURE__ */ jsx("div", { className: "mx-auto w-full max-w-[72rem]", children: /* @__PURE__ */ jsx(InColumnContext.Provider, { value: true, children }) }) })
6592
6831
  ] })
6593
6832
  ] }),
6594
6833
  tabs ? /* @__PURE__ */ jsx(TabBar, { items: tabs }) : null
@@ -6599,7 +6838,7 @@ function SidebarShell({
6599
6838
  function RailItem({ item }) {
6600
6839
  return /* @__PURE__ */ jsxs(Tooltip, { children: [
6601
6840
  /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
6602
- Link6,
6841
+ Link7,
6603
6842
  {
6604
6843
  href: item.href,
6605
6844
  "aria-current": item.active ? "page" : void 0,
@@ -6654,6 +6893,9 @@ function RailShell({ nav = [], persistent = [], page: pageOverride, header, acco
6654
6893
  tabs ? /* @__PURE__ */ jsx(TabBar, { items: tabs }) : null
6655
6894
  ] }) }) });
6656
6895
  }
6896
+ function PaneHeader({ children, className }) {
6897
+ return /* @__PURE__ */ jsx("header", { className: cn("flex h-14 shrink-0 items-center gap-3 border-b border-border px-4 md:px-5", className), children });
6898
+ }
6657
6899
  function AccountMenu({
6658
6900
  name,
6659
6901
  detail,
@@ -6690,7 +6932,7 @@ function AccountMenu({
6690
6932
  ] }),
6691
6933
  /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
6692
6934
  items.map(
6693
- (it, i) => it === "separator" ? /* @__PURE__ */ jsx(DropdownMenuSeparator, {}, `sep-${i}`) : it.href ? /* @__PURE__ */ jsx(DropdownMenuItem, { asChild: true, destructive: it.destructive, children: /* @__PURE__ */ jsxs(Link6, { href: it.href, children: [
6935
+ (it, i) => it === "separator" ? /* @__PURE__ */ jsx(DropdownMenuSeparator, {}, `sep-${i}`) : it.href ? /* @__PURE__ */ jsx(DropdownMenuItem, { asChild: true, destructive: it.destructive, children: /* @__PURE__ */ jsxs(Link7, { href: it.href, children: [
6694
6936
  it.icon,
6695
6937
  it.label
6696
6938
  ] }) }, it.label) : /* @__PURE__ */ jsxs(DropdownMenuItem, { onSelect: it.onSelect, destructive: it.destructive, children: [
@@ -6739,7 +6981,7 @@ function NavLink({
6739
6981
  if (item.external) {
6740
6982
  return /* @__PURE__ */ jsx("a", { href: item.href, className: cls, rel: "noreferrer", onClick: onNavigate, children: item.label });
6741
6983
  }
6742
- return /* @__PURE__ */ jsx(Link6, { href: item.href, className: cls, "aria-current": item.active ? "page" : void 0, onClick: onNavigate, children: item.label });
6984
+ return /* @__PURE__ */ jsx(Link7, { href: item.href, className: cls, "aria-current": item.active ? "page" : void 0, onClick: onNavigate, children: item.label });
6743
6985
  }
6744
6986
  function NavRow({ item, onNavigate }) {
6745
6987
  const body = /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -6750,7 +6992,7 @@ function NavRow({ item, onNavigate }) {
6750
6992
  "flex flex-col gap-0.5 rounded-xl px-3 py-2 transition-colors hover:bg-accent",
6751
6993
  item.active && "bg-muted hover:bg-muted dark:bg-white/[0.06]"
6752
6994
  );
6753
- return item.external ? /* @__PURE__ */ jsx("a", { href: item.href, className: cls, rel: "noreferrer", onClick: onNavigate, children: body }) : /* @__PURE__ */ jsx(Link6, { href: item.href, className: cls, "aria-current": item.active ? "page" : void 0, onClick: onNavigate, children: body });
6995
+ return item.external ? /* @__PURE__ */ jsx("a", { href: item.href, className: cls, rel: "noreferrer", onClick: onNavigate, children: body }) : /* @__PURE__ */ jsx(Link7, { href: item.href, className: cls, "aria-current": item.active ? "page" : void 0, onClick: onNavigate, children: body });
6754
6996
  }
6755
6997
  var seeAll = (item) => typeof item.label === "string" ? `All ${item.label.toLowerCase()}` : "See all";
6756
6998
  function NavDropdown({ item }) {
@@ -6783,6 +7025,18 @@ function NavDropdown({ item }) {
6783
7025
  ] })
6784
7026
  ] });
6785
7027
  }
7028
+ function AccountCta({ href = GET_AN_ACCOUNT.href, className }) {
7029
+ return /* @__PURE__ */ jsx(Button, { asChild: true, size: "sm", className, children: /* @__PURE__ */ jsx("a", { href, children: GET_AN_ACCOUNT.label }) });
7030
+ }
7031
+ function ProductLockup({ size, product }) {
7032
+ return /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center", children: [
7033
+ /* @__PURE__ */ jsx(Lockup, { size }),
7034
+ product ? /* @__PURE__ */ jsxs(Fragment, { children: [
7035
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "mx-3 h-5 w-px bg-oca-hairline-strong" }),
7036
+ /* @__PURE__ */ jsx("span", { className: "font-medium tracking-[-0.01em]", style: { fontSize: size * 0.56 }, children: product })
7037
+ ] }) : null
7038
+ ] });
7039
+ }
6786
7040
  function SiteHeader({
6787
7041
  home = "/",
6788
7042
  brand,
@@ -6802,13 +7056,7 @@ function SiteHeader({
6802
7056
  const current2 = typeof family === "string" ? family : void 0;
6803
7057
  const phoneNav = navOnPhone ? nav : [];
6804
7058
  const menu = phoneNav.length > 0 || Boolean(family) || Boolean(menuExtra);
6805
- const brandNode = brand ?? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center", children: [
6806
- /* @__PURE__ */ jsx(Lockup, { size }),
6807
- product ? /* @__PURE__ */ jsxs(Fragment, { children: [
6808
- /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "mx-3 h-5 w-px bg-oca-hairline-strong" }),
6809
- /* @__PURE__ */ jsx("span", { className: "font-medium tracking-[-0.01em]", style: { fontSize: size * 0.56 }, children: product })
6810
- ] }) : null
6811
- ] });
7059
+ const brandNode = brand ?? /* @__PURE__ */ jsx(ProductLockup, { size, product });
6812
7060
  const navigation = nav.length > 0 ? /* @__PURE__ */ jsx("nav", { "aria-label": "Main", className: "hidden items-center gap-1 md:flex", children: nav.map(
6813
7061
  (n) => n.children?.length ? /* @__PURE__ */ jsx(NavDropdown, { item: n }, n.href) : (
6814
7062
  // Between md and lg the family menu and the actions share the row: tighter.
@@ -6836,7 +7084,7 @@ function SiteHeader({
6836
7084
  ),
6837
7085
  children: [
6838
7086
  /* @__PURE__ */ jsxs("div", { className: cn("flex min-w-0 items-center gap-1", tool ? "md:gap-1" : "justify-self-start"), children: [
6839
- /* @__PURE__ */ jsxs(Link6, { href: home, className: "-ml-1 min-w-0 rounded-lg p-1", children: [
7087
+ /* @__PURE__ */ jsxs(Link7, { href: home, className: "-ml-1 min-w-0 rounded-lg p-1", children: [
6840
7088
  brandNode,
6841
7089
  /* @__PURE__ */ jsx("span", { className: "sr-only", children: " home" })
6842
7090
  ] }),
@@ -6938,7 +7186,7 @@ function SiteBanner({
6938
7186
  var FOOT_LINK = "inline-flex min-h-11 items-center transition-colors hover:text-foreground md:min-h-0";
6939
7187
  function LegalRow({ links }) {
6940
7188
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-x-6 gap-y-2 sm:flex-row sm:items-center sm:justify-between", children: [
6941
- /* @__PURE__ */ jsx("nav", { "aria-label": "Legal", children: /* @__PURE__ */ jsx("ul", { className: "flex flex-wrap gap-x-5", children: links.map((l) => /* @__PURE__ */ jsx("li", { children: l.href.startsWith("/") ? /* @__PURE__ */ jsx(Link6, { href: l.href, className: FOOT_LINK, children: l.label }) : /* @__PURE__ */ jsx("a", { href: l.href, className: FOOT_LINK, children: l.label }) }, l.href)) }) }),
7189
+ /* @__PURE__ */ jsx("nav", { "aria-label": "Legal", children: /* @__PURE__ */ jsx("ul", { className: "flex flex-wrap gap-x-5", children: links.map((l, i) => /* @__PURE__ */ jsx("li", { children: l.href.startsWith("/") ? /* @__PURE__ */ jsx(Link7, { href: l.href, className: FOOT_LINK, children: l.label }) : /* @__PURE__ */ jsx("a", { href: l.href, className: FOOT_LINK, children: l.label }) }, `${i}:${l.label}`)) }) }),
6942
7190
  /* @__PURE__ */ jsxs("p", { children: [
6943
7191
  "\xA9 ",
6944
7192
  (/* @__PURE__ */ new Date()).getFullYear(),
@@ -6958,16 +7206,26 @@ function SiteFooter({
6958
7206
  }) {
6959
7207
  const legalLinks = legal === true ? LEGAL_LINKS : legal || null;
6960
7208
  if (compact) {
6961
- return /* @__PURE__ */ jsx("footer", { className: cn("border-t border-border bg-background text-[0.875rem] text-muted-foreground", className), children: /* @__PURE__ */ jsxs("div", { className: "oca-container flex flex-col gap-x-8 gap-y-3 py-5 lg:flex-row lg:items-center lg:justify-between", children: [
6962
- /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-x-6 gap-y-1", children: [
6963
- /* @__PURE__ */ jsx("a", { href: OCHK_IO, className: "rounded-lg text-foreground", children: /* @__PURE__ */ jsx(Lockup, { size: 22 }) }),
6964
- family ? /* @__PURE__ */ jsx("nav", { "aria-label": "Protocols", children: /* @__PURE__ */ jsx("ul", { className: "flex flex-wrap gap-x-4", children: PROTOCOLS.map((p) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("a", { href: p.pageHref, className: FOOT_LINK, children: p.label }) }, p.slug)) }) }) : null
6965
- ] }),
6966
- legalLinks || meta ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-x-6 gap-y-2 sm:flex-row sm:flex-wrap sm:items-center", children: [
6967
- legalLinks ? /* @__PURE__ */ jsx(LegalRow, { links: legalLinks }) : null,
6968
- meta
6969
- ] }) : null
6970
- ] }) });
7209
+ return (
7210
+ // The tools' column (ToolColumn): the lockup lines up with the page's title.
7211
+ /* @__PURE__ */ jsx("footer", { className: cn("border-t border-border bg-background px-4 text-[0.875rem] text-muted-foreground md:px-8", className), children: /* @__PURE__ */ jsxs("div", { className: "mx-auto flex w-full max-w-[72rem] flex-col gap-x-8 gap-y-3 py-5 lg:flex-row lg:items-center lg:justify-between", children: [
7212
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-x-6 gap-y-3", children: [
7213
+ /* @__PURE__ */ jsx(
7214
+ "a",
7215
+ {
7216
+ href: OCHK_IO,
7217
+ className: "relative rounded-lg text-foreground before:absolute before:inset-x-0 before:top-1/2 before:h-11 before:-translate-y-1/2",
7218
+ children: /* @__PURE__ */ jsx(Lockup, { size: 22 })
7219
+ }
7220
+ ),
7221
+ family ? /* @__PURE__ */ jsx("nav", { "aria-label": "Protocols", children: /* @__PURE__ */ jsx("ul", { className: "flex flex-wrap gap-x-4", children: PROTOCOLS.map((p) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("a", { href: p.pageHref, className: FOOT_LINK, children: p.label }) }, p.slug)) }) }) : null
7222
+ ] }),
7223
+ legalLinks || meta ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-x-6 gap-y-2 sm:flex-row sm:flex-wrap sm:items-center", children: [
7224
+ legalLinks ? /* @__PURE__ */ jsx(LegalRow, { links: legalLinks }) : null,
7225
+ meta
7226
+ ] }) : null
7227
+ ] }) })
7228
+ );
6971
7229
  }
6972
7230
  const cols = [
6973
7231
  ...columns,
@@ -7002,17 +7260,17 @@ function SiteFooter({
7002
7260
  className: cn("flex min-w-0 flex-col gap-1", spans && "col-span-2 md:col-span-1"),
7003
7261
  children: [
7004
7262
  /* @__PURE__ */ jsx("p", { className: "mb-2 text-[0.875rem] font-medium", children: col.heading }),
7005
- /* @__PURE__ */ jsx("div", { className: cn("flex flex-col gap-1", spans && "grid grid-cols-2 gap-x-6 md:flex md:flex-col"), children: col.links.map((l) => /* @__PURE__ */ jsx(
7263
+ /* @__PURE__ */ jsx("div", { className: cn("flex flex-col gap-1", spans && "grid grid-cols-2 gap-x-6 md:flex md:flex-col"), children: col.links.map((l, j) => /* @__PURE__ */ jsx(
7006
7264
  NavLink,
7007
7265
  {
7008
7266
  item: l,
7009
7267
  className: "-mx-3 py-2.5 text-[0.9375rem] md:py-1.5"
7010
7268
  },
7011
- l.href
7269
+ `${j}:${l.label}`
7012
7270
  )) })
7013
7271
  ]
7014
7272
  },
7015
- col.heading
7273
+ `${i}:${col.heading}`
7016
7274
  );
7017
7275
  })
7018
7276
  ]
@@ -7048,12 +7306,13 @@ function OchkIoFooter({ columns = OCHK_IO_FOOTER, className }) {
7048
7306
  );
7049
7307
  }
7050
7308
  function SignInFrame({
7051
- title = "Sign in",
7309
+ title = SIGN_IN_LABEL,
7052
7310
  lead,
7053
7311
  children,
7054
7312
  error,
7055
7313
  fineprint,
7056
7314
  brand,
7315
+ product,
7057
7316
  home,
7058
7317
  protocol: protocol2,
7059
7318
  back,
@@ -7070,12 +7329,12 @@ function SignInFrame({
7070
7329
  children: [
7071
7330
  /* @__PURE__ */ jsxs("section", { className: "flex flex-col px-4 pb-8 pt-5 sm:px-8 lg:px-14 lg:pt-8", children: [
7072
7331
  /* @__PURE__ */ jsxs("header", { className: "flex items-center justify-between gap-4", children: [
7073
- /* @__PURE__ */ jsxs(Link6, { href: homeHref, className: "w-fit rounded-lg", children: [
7074
- brand ?? /* @__PURE__ */ jsx(Lockup, { size: 28 }),
7332
+ /* @__PURE__ */ jsxs(Link7, { href: homeHref, className: "w-fit rounded-lg", children: [
7333
+ brand ?? /* @__PURE__ */ jsx(ProductLockup, { size: 28, product: product ?? (protocol2 ? protocolSite(protocol2).label : void 0) }),
7075
7334
  /* @__PURE__ */ jsx("span", { className: "sr-only", children: " home" })
7076
7335
  ] }),
7077
7336
  back === void 0 ? /* @__PURE__ */ jsx(
7078
- Link6,
7337
+ Link7,
7079
7338
  {
7080
7339
  href: homeHref,
7081
7340
  className: "text-[0.9375rem] text-muted-foreground underline-offset-4 hover:text-foreground hover:underline",
@@ -7170,7 +7429,7 @@ function DocsNav({
7170
7429
  const on = pathOf(item.href) === here;
7171
7430
  const badge = typeof item.badge === "string" && STATUS_WORDS.has(item.badge) ? /* @__PURE__ */ jsx(StatusBadge, { status: item.badge }) : item.badge ? /* @__PURE__ */ jsx(Badge, { tone: "muted", children: item.badge }) : null;
7172
7431
  return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
7173
- Link6,
7432
+ Link7,
7174
7433
  {
7175
7434
  href: item.href,
7176
7435
  ref: on ? activeRef : void 0,
@@ -7282,7 +7541,7 @@ function SessionAccountView({
7282
7541
  items = [],
7283
7542
  signInHref,
7284
7543
  signInPath,
7285
- signInLabel = "Sign in",
7544
+ signInLabel = SIGN_IN_LABEL,
7286
7545
  accountHref = OCHK_APP_ACCOUNT,
7287
7546
  onSignOut,
7288
7547
  nameFrom = "lg"
@@ -7313,6 +7572,13 @@ function SessionAccountView({
7313
7572
  /* @__PURE__ */ jsx("span", { className: state === "checking" ? "contents invisible" : "contents", "aria-hidden": state === "checking" || void 0, children: /* @__PURE__ */ jsx(Button, { asChild: true, size: "sm", variant: "secondary", tabIndex: state === "checking" ? -1 : void 0, children: /* @__PURE__ */ jsx("a", { href: signInHref ?? inPlace ?? "https://ochk.io/signin", children: signInLabel }) }) })
7314
7573
  );
7315
7574
  }
7575
+ function ToolColumn({
7576
+ measure = "wide",
7577
+ className,
7578
+ children
7579
+ }) {
7580
+ return /* @__PURE__ */ jsx("div", { className: cn("px-4 pb-16 pt-8 md:px-8 md:pt-10", className), children: /* @__PURE__ */ jsx("div", { className: "mx-auto w-full max-w-[72rem]", children: /* @__PURE__ */ jsx(InColumnContext.Provider, { value: true, children: measure === "narrow" ? /* @__PURE__ */ jsx("div", { className: "max-w-[48rem]", children }) : children }) }) });
7581
+ }
7316
7582
  function ToolShell({
7317
7583
  protocol: protocol2,
7318
7584
  tools,
@@ -7321,6 +7587,7 @@ function ToolShell({
7321
7587
  rail = false,
7322
7588
  railFooter,
7323
7589
  variant = "tool",
7590
+ measure = "wide",
7324
7591
  banner,
7325
7592
  footer,
7326
7593
  children
@@ -7378,14 +7645,7 @@ function ToolShell({
7378
7645
  /* @__PURE__ */ jsx(SideNav, { groups: [{ label: "Tools", items: tools.map(({ href, label, icon, active }) => ({ href, label, icon, active })) }] }),
7379
7646
  railFooter ? /* @__PURE__ */ jsx("div", { className: "mt-auto flex flex-col gap-0.5 px-3 text-[0.875rem] text-muted-foreground [&_a:hover]:text-foreground [&_a]:py-1.5 [&_a]:transition-colors", children: railFooter }) : null
7380
7647
  ] }) : null,
7381
- /* @__PURE__ */ jsx(
7382
- "main",
7383
- {
7384
- id: "main-content",
7385
- 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"),
7386
- children: /* @__PURE__ */ jsx(SiteHomeContext.Provider, { value: homeHref, children: app ? children : /* @__PURE__ */ jsx("div", { className: "mx-auto w-full max-w-[72rem]", children }) })
7387
- }
7388
- )
7648
+ /* @__PURE__ */ jsx("main", { id: "main-content", className: cn("min-w-0 flex-1", app && "flex min-h-0 flex-col"), children: /* @__PURE__ */ jsx(SiteHomeContext.Provider, { value: homeHref, children: app ? children : /* @__PURE__ */ jsx(ToolColumn, { measure, children }) }) })
7389
7649
  ] }),
7390
7650
  app || footer === false ? null : footer ?? /* @__PURE__ */ jsx(SiteFooter, { compact: true, family: true, legal: true }),
7391
7651
  tabs ? /* @__PURE__ */ jsx(TabBar, { items: tabs }) : null
@@ -7562,6 +7822,6 @@ function createMdxComponents({ mermaid } = {}) {
7562
7822
  }
7563
7823
  var mdxComponents = createMdxComponents();
7564
7824
 
7565
- export { APP_ATTRIBUTE, APP_ID, Accent, Accordion, AccordionItem, AccountMenu, ActivityList, AnchorStatus, ApiTable, AppCard, AppGrid, AppIcon, AppShell, ArtifactView, Badge, BlockCountdown, BlockHeight, Breadcrumbs, BrowserFrame, Button, CODE_LANGS, Callout, Card, CardContent, CardDescription, CardFooter, CardGrid, CardHeader, CardNumeral, CardTitle, ChartFrame, Checkbox, Closing, CodeBlock, CodeTabs, CommandDialog, ComparisonTable, Container, CopyButton, CountdownRing, Crowd, DOCS_HEADER_NAV, DOCS_HREF, DataTable, DensityProvider, Diagram, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogHost, DialogTitle, DialogTrigger, Display, DocHeader, DocLayout, DocsHeading, DocsNav, DocsPager, DocsShell, DropZone, DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, EmptyLine, EmptyState, EndpointList, ErrorBoundary, ErrorPage, Eyebrow, FAMILY, FAMILY_GROUPS, FactBlock, FactRows, FamilyMenu, Faq, Field, FilterChips, FloatChip, Footnote, FormSection, HalftoneCanvas, HalftoneSphere, HashChip, HudCard, Input, InstallTabs, IsoCheck, Kbd, KeyValueList, LEGAL_LINKS, Label, Lead, LegalDocument, LinkCard, LoadingBlock, LockedPreview, Lockup, MARK_FACES, Mark, MdxTable, Meter, Monogram, Notice, OCHK_APP_ACCOUNT, OCHK_IO, OCHK_IO_FOOTER, OCHK_IO_NAV, OchkIoFooter, OnThisPage, PROTOCOLS, PROTOCOL_ORDER, PackageCard, PageHeader, PageHero, Pagination, Panel, PhoneFrame, PlanCard, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, ProgressSteps, ProofStrip, Prose, ProtocolGrid, ProtocolHero, ProtocolNav, QrCode, RadioGroup, RadioGroupItem, Reveal, SELF_HOSTED_LEGAL_LINKS, SPHERE_GRADIENT, Sats, SatsFigure, ScrollFade, ScrollStory, SearchButton, SearchDialog, Section, SectionHeading, SectionIntro, Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue, Separator, SessionAccountView, Sheet, SheetClose, SheetContent, SheetDescription, SheetTitle, SheetTrigger, ShellContext, SignInFrame, SignMessage, SiteBanner, SiteFooter, SiteHeader, Skeleton, SkipLink, SourceNote, Sparkline, SpecCard, Spinner, SplitBar, StatCard, StatGrid, StateBadge, StatusBadge, StatusDot, StatusPill, Step, StepGrid, Steps, Switch, TOKEN_CLASS, Tabs, TabsContent, TabsList, TabsTrigger, TextLink, Textarea, ThemeToggle, Ticker, Toaster, ToolGrid, ToolShell, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TruthTable, UsdApprox, VerifyBox, VerifyReport, appColors, appFonts, badgeVariants, blocksToDuration, buttonVariants, cardVariants, chartColor, cn, confirm, createMdxComponents, createStateBadge, darkPalette, escapeHtml, explorerUrl, familyByGroup, familySite, formatBlockHeight, formatBytes, formatUtc, grammarOf, highlight, highlightToHtml, languageName, lightPalette, linesToHtml, mdxComponents, monogramGround, monogramLetter, parseCodeMeta, parseLineRanges, portraitTone, prompt, protocolSite, readDiff, rehypeCode, satsText, sectionVariants, shortenMiddle, statusWord, useActiveHeading, useCopy, useDensity, useHeadings, useInView, useShellPlace, useSignInHref, useTimedOut };
7825
+ export { APP_ATTRIBUTE, APP_ID, Accent, Accordion, AccordionItem, AccountCta, AccountMenu, ActivityList, AnchorStatus, ApiTable, AppCard, AppGrid, AppIcon, AppShell, ArtifactView, Avatar, Badge, BlockCountdown, BlockHeight, Breadcrumbs, BrowserFrame, Button, CODE_LANGS, Callout, Card, CardContent, CardDescription, CardFooter, CardGrid, CardHeader, CardNumeral, CardTitle, ChartFrame, Checkbox, ChoiceCard, ChoiceGroup, Closing, CodeBlock, CodeTabs, CommandDialog, ComparisonTable, Container, CopyButton, CountdownRing, Crowd, DOCS_HEADER_NAV, DOCS_HREF, DataTable, DensityProvider, Diagram, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogHost, DialogTitle, DialogTrigger, Display, DocHeader, DocLayout, DocsHeading, DocsNav, DocsPager, DocsShell, DropZone, DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, EmptyLine, EmptyState, EndpointList, ErrorBoundary, ErrorPage, Eyebrow, FAMILY, FAMILY_GROUPS, FactBlock, FactRows, FamilyMenu, Faq, Field, FilterChips, FloatChip, Footnote, FormSection, GET_AN_ACCOUNT, HalftoneCanvas, HalftoneSphere, HashChip, HudCard, Input, InstallTabs, IsoCheck, Kbd, KeyValueList, LEGAL_LINKS, Label, Lead, LegalDocument, LinkCard, ListCard, ListRow, LoadingBlock, LockedPreview, Lockup, MARK_FACES, Mark, MdxTable, Meter, Monogram, Notice, OCHK_APP, OCHK_APP_ACCOUNT, OCHK_IO, OCHK_IO_FOOTER, OCHK_IO_NAV, OchkIoFooter, OnThisPage, PROTOCOLS, PROTOCOL_ORDER, PackageCard, PageHeader, PageHero, Pagination, PaneHeader, Panel, PhoneFrame, PlanCard, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, ProgressSteps, ProofStrip, Prose, ProtocolGrid, ProtocolHero, ProtocolNav, QrCode, RadioGroup, RadioGroupItem, Reveal, SELF_HOSTED_LEGAL_LINKS, SIGN_IN_LABEL, SPHERE_GRADIENT, Sats, SatsFigure, ScrollFade, ScrollStory, SearchButton, SearchDialog, Section, SectionHeading, SectionIntro, SectionTitle, Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue, Separator, SessionAccountView, Sheet, SheetClose, SheetContent, SheetDescription, SheetTitle, SheetTrigger, ShellContext, SignInFrame, SignMessage, SiteBanner, SiteFooter, SiteHeader, Skeleton, SkipLink, SourceNote, Sparkline, SpecCard, Spinner, SplitBar, StatCard, StatGrid, StateBadge, StatusBadge, StatusDot, StatusPill, Step, StepGrid, Steps, Switch, TOKEN_CLASS, Tabs, TabsContent, TabsList, TabsTrigger, TextLink, Textarea, ThemeToggle, Ticker, Toaster, ToolColumn, ToolGrid, ToolShell, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TruthTable, UsdApprox, VerifyBox, VerifyReport, appColors, appFonts, badgeVariants, blocksToDuration, buttonVariants, cardVariants, chartColor, cn, confirm, createMdxComponents, createStateBadge, darkPalette, escapeHtml, explorerUrl, familyByGroup, familySite, formatBlockHeight, formatBytes, formatUtc, grammarOf, highlight, highlightToHtml, languageName, lightPalette, linesToHtml, mdxComponents, monogramGround, monogramLetter, parseCodeMeta, parseLineRanges, portraitTone, prompt, protocolSite, readDiff, rehypeCode, satsText, sectionVariants, shortenMiddle, statusWord, useActiveHeading, useCopy, useDensity, useHeadings, useInView, useShellPlace, useSignInHref, useTimedOut };
7566
7826
  //# sourceMappingURL=index.mjs.map
7567
7827
  //# sourceMappingURL=index.mjs.map