@orangecheck/app-design 1.6.2 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +3 -3
  2. package/dist/chrome.d.mts +11 -6
  3. package/dist/chrome.d.ts +11 -6
  4. package/dist/chrome.js +152 -128
  5. package/dist/chrome.js.map +1 -1
  6. package/dist/chrome.mjs +151 -129
  7. package/dist/chrome.mjs.map +1 -1
  8. package/dist/components.d.mts +40 -5
  9. package/dist/components.d.ts +40 -5
  10. package/dist/components.js +131 -10
  11. package/dist/components.js.map +1 -1
  12. package/dist/components.mjs +128 -11
  13. package/dist/components.mjs.map +1 -1
  14. package/dist/{docs-CFE5mU_6.d.mts → docs-B9G1BNXI.d.mts} +2 -2
  15. package/dist/{docs-ByUx4t-D.d.ts → docs-BWWnm5Jv.d.ts} +2 -2
  16. package/dist/family.d.mts +1 -1
  17. package/dist/family.d.ts +1 -1
  18. package/dist/family.js +7 -1
  19. package/dist/family.js.map +1 -1
  20. package/dist/family.mjs +5 -2
  21. package/dist/family.mjs.map +1 -1
  22. package/dist/{index-DmfyPYe5.d.mts → index-Bkl49Vgy.d.mts} +4 -1
  23. package/dist/{index-DmfyPYe5.d.ts → index-Bkl49Vgy.d.ts} +4 -1
  24. package/dist/index.d.mts +7 -7
  25. package/dist/index.d.ts +7 -7
  26. package/dist/index.js +189 -43
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs +181 -44
  29. package/dist/index.mjs.map +1 -1
  30. package/dist/mdx.d.mts +3 -3
  31. package/dist/mdx.d.ts +3 -3
  32. package/dist/mdx.js +3 -2
  33. package/dist/mdx.js.map +1 -1
  34. package/dist/mdx.mjs +3 -2
  35. package/dist/mdx.mjs.map +1 -1
  36. package/dist/primitives.d.mts +2 -2
  37. package/dist/primitives.d.ts +2 -2
  38. package/dist/session.d.mts +4 -4
  39. package/dist/session.d.ts +4 -4
  40. package/dist/session.js +122 -1
  41. package/dist/session.js.map +1 -1
  42. package/dist/session.mjs +122 -1
  43. package/dist/session.mjs.map +1 -1
  44. package/dist/{status-badge-BJ9Sdsx8.d.mts → status-badge-BBbCO6ZA.d.mts} +1 -1
  45. package/dist/{status-badge-Bt8x3RhO.d.ts → status-badge-CHHxtFkP.d.ts} +1 -1
  46. package/dist/styles/swagger.css +24 -1
  47. package/dist/styles/tokens.css +5 -0
  48. package/dist/{tool-shell-CQZNRUgH.d.mts → tool-shell-CnZ3NUSi.d.ts} +10 -4
  49. package/dist/{tool-shell-CRmceGrV.d.ts → tool-shell-DQFEMLLe.d.mts} +10 -4
  50. package/dist/{tools-Bg1gi2HO.d.mts → tools-CKO8IseL.d.mts} +2 -2
  51. package/dist/{tools-Bw7RhO92.d.ts → tools-CzjFPng4.d.ts} +2 -2
  52. package/package.json +2 -2
package/README.md CHANGED
@@ -35,13 +35,13 @@ family `OcThemeProvider` on the same page: it writes `data-oc-theme` and the sha
35
35
  |---|---|
36
36
  | `/brand` | `Mark`, `AppIcon`, `Lockup`, `IsoCheck`, `HalftoneSphere` |
37
37
  | `/primitives` | `Button`, `Badge`, `Card`, form controls (`Input size="sm"` for tools), `Dialog`, `Sheet`, `Popover`, `Tooltip`, `DropdownMenu`, `Tabs`, `Toaster`, `DensityProvider` |
38
- | `/components` | `Display`, `Eyebrow`, `Section`, `StepGrid`, `PackageCard`, `TruthTable`, `Sats`, `DataTable`, `Notice`, `ProgressSteps`, `ErrorPage`, the public page blocks (`SectionHeading`, `FactBlock`, `ProofStrip`, `Closing`, `LegalDocument` …), the protocol page blocks (`ProtocolGrid`, `AppGrid`, `ProtocolHero`, `SpecCard`, `VerifyBox`, `ComparisonTable`, `VerifyReport`, `SignMessage`), code (`CodeBlock`, `CodeTabs`, `InstallTabs`), the docs blocks (`Breadcrumbs`, `DocsPager`, `OnThisPage`, `Callout`, `Steps`, `LinkCard`, `ApiTable`, `Diagram`, `SearchDialog`) and the tool parts (`ArtifactView`, `DropZone`, `FormSection`, `StateBadge`, `AnchorStatus`, `BlockHeight`, `BlockCountdown`, `Meter`, `FilterChips`, `ToolGrid`) |
39
- | `/chrome` | `SiteHeader`, `SiteFooter`, `FamilyMenu`, `SkipLink`, `SiteBanner`, `SignInFrame`, `AppShell`, `AccountMenu`, `ThemeToggle`, `DocsShell`, `DocsNav`, `ToolShell`, `SessionAccountView` |
38
+ | `/components` | `Display`, `Eyebrow`, `Section`, `StepGrid`, `PackageCard`, `TruthTable`, `Sats`, `DataTable`, `Notice`, `ProgressSteps`, `ErrorPage`, the public page blocks (`SectionHeading`, `FactBlock`, `ProofStrip`, `Closing`, `LegalDocument` …), the protocol page blocks (`ProtocolGrid`, `AppGrid`, `ProtocolHero`, `SpecCard`, `VerifyBox`, `ComparisonTable`, `VerifyReport`, `SignMessage`), code (`CodeBlock`, `CodeTabs`, `InstallTabs`), the docs blocks (`Breadcrumbs`, `DocsPager`, `OnThisPage`, `Callout`, `Steps`, `LinkCard`, `ApiTable`, `Diagram`, `SearchDialog`) and the tool parts (`ArtifactView`, `DropZone`, `FormSection`, `StateBadge`, `AnchorStatus`, `BlockHeight`, `BlockCountdown`, `Meter`, `FilterChips`, `ToolGrid`), and the parts signed-in pages repeat (`SectionTitle`, `ListCard`, `ChoiceGroup`, `ChoiceCard`) |
39
+ | `/chrome` | `SiteHeader`, `SiteFooter`, `FamilyMenu`, `SkipLink`, `SiteBanner`, `SignInFrame`, `AppShell`, `AccountMenu`, `ThemeToggle`, `DocsShell`, `DocsNav`, `ToolShell`, `ToolColumn`, `SessionAccountView`, `AccountCta` |
40
40
  | `/mdx` | `mdxComponents` and `createMdxComponents({ mermaid })`: markdown in the system's type |
41
41
  | `/code` | `rehypeCode` (highlights fences at build time), `highlight`, `highlightToHtml`; no React |
42
42
  | `/format` | `explorerUrl`, `shortenMiddle`, `formatBlockHeight`, `blocksToDuration`, `formatUtc`, `formatBytes`; no React |
43
43
  | `/session` | `SessionAccount`, read from `@orangecheck/auth-client` (an optional peer: install it to use this entry) |
44
- | `/family` | every public site as data (`FAMILY`, `PROTOCOLS`, `OCHK_IO_NAV`, `LEGAL_LINKS`); no React |
44
+ | `/family` | every public site as data (`FAMILY`, `PROTOCOLS`, `OCHK_IO_NAV`, `LEGAL_LINKS`) and the account phrase (`GET_AN_ACCOUNT`, `SIGN_IN_LABEL`); no React |
45
45
  | `/tokens` | the palette as data, for OG images and charts |
46
46
 
47
47
  Docs written in MDX get highlighted code from the build and the system's type:
package/dist/chrome.d.mts CHANGED
@@ -1,10 +1,10 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
- import { e as FooterColumn, N as NavItem, d as FamilySlug, j as ProtocolSlug } from './index-DmfyPYe5.mjs';
3
+ import { e as FooterColumn, N as NavItem, d as FamilySlug, k as ProtocolSlug } from './index-Bkl49Vgy.mjs';
4
4
  import { T as TocItem } from './hero-Dn37il-9.mjs';
5
- import { a as Status } from './status-badge-BJ9Sdsx8.mjs';
6
- export { A as AccountMenu, a as AccountMenuItem, b as AppShell, c as AppShellProps, O as OCHK_APP_ACCOUNT, S as SessionAccountView, d as SessionState, e as ShellNavGroup, f as ShellNavItem, g as ShellSection, T as ThemeToggle, h as ToolShell, i as ToolShellProps, u as useSignInHref } from './tool-shell-CQZNRUgH.mjs';
7
- import './tools-Bg1gi2HO.mjs';
5
+ import { a as Status } from './status-badge-BBbCO6ZA.mjs';
6
+ export { A as AccountMenu, a as AccountMenuItem, b as AppShell, c as AppShellProps, O as OCHK_APP_ACCOUNT, S as SessionAccountView, d as SessionState, e as ShellNavGroup, f as ShellNavItem, g as ShellSection, T as ThemeToggle, h as ToolColumn, i as ToolShell, j as ToolShellProps, u as useSignInHref } from './tool-shell-DQFEMLLe.mjs';
7
+ import './tools-CKO8IseL.mjs';
8
8
  import './format.mjs';
9
9
 
10
10
  interface SiteHeaderProps {
@@ -20,6 +20,10 @@ interface SiteHeaderProps {
20
20
  menu?: ReactNode;
21
21
  className?: string;
22
22
  }
23
+ declare function AccountCta({ href, className }: {
24
+ href?: string;
25
+ className?: string;
26
+ }): react.JSX.Element;
23
27
  declare function SiteHeader({ home, brand, product, family, nav, search, actions, variant, navOnPhone, menu: menuExtra, className, }: SiteHeaderProps): react.JSX.Element;
24
28
  declare function SkipLink({ href, children }: {
25
29
  href?: string;
@@ -57,13 +61,14 @@ declare function FamilyMenu({ current, className }: {
57
61
  className?: string;
58
62
  }): react.JSX.Element;
59
63
 
60
- declare function SignInFrame({ title, lead, children, error, fineprint, brand, home, protocol, back, art, caption, className, }: {
64
+ declare function SignInFrame({ title, lead, children, error, fineprint, brand, product, home, protocol, back, art, caption, className, }: {
61
65
  title?: ReactNode;
62
66
  lead?: ReactNode;
63
67
  children: ReactNode;
64
68
  error?: ReactNode;
65
69
  fineprint?: ReactNode;
66
70
  brand?: ReactNode;
71
+ product?: string;
67
72
  home?: string;
68
73
  protocol?: ProtocolSlug;
69
74
  back?: ReactNode;
@@ -110,4 +115,4 @@ interface ShellPlace {
110
115
  declare const ShellContext: react.Context<ShellPlace>;
111
116
  declare function useShellPlace(): ShellPlace;
112
117
 
113
- export { DOCS_HEADER_NAV, DocsNav, type DocsNavItem, type DocsNavSection, DocsShell, type DocsShellProps, FamilyMenu, FooterColumn, NavItem, OchkIoFooter, ShellContext, type ShellPlace, SignInFrame, SiteBanner, SiteFooter, type SiteFooterProps, SiteHeader, type SiteHeaderProps, SkipLink, useShellPlace };
118
+ export { AccountCta, DOCS_HEADER_NAV, DocsNav, type DocsNavItem, type DocsNavSection, DocsShell, type DocsShellProps, FamilyMenu, FooterColumn, NavItem, OchkIoFooter, ShellContext, type ShellPlace, SignInFrame, SiteBanner, SiteFooter, type SiteFooterProps, SiteHeader, type SiteHeaderProps, SkipLink, useShellPlace };
package/dist/chrome.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
- import { e as FooterColumn, N as NavItem, d as FamilySlug, j as ProtocolSlug } from './index-DmfyPYe5.js';
3
+ import { e as FooterColumn, N as NavItem, d as FamilySlug, k as ProtocolSlug } from './index-Bkl49Vgy.js';
4
4
  import { T as TocItem } from './hero-Dn37il-9.js';
5
- import { a as Status } from './status-badge-Bt8x3RhO.js';
6
- export { A as AccountMenu, a as AccountMenuItem, b as AppShell, c as AppShellProps, O as OCHK_APP_ACCOUNT, S as SessionAccountView, d as SessionState, e as ShellNavGroup, f as ShellNavItem, g as ShellSection, T as ThemeToggle, h as ToolShell, i as ToolShellProps, u as useSignInHref } from './tool-shell-CRmceGrV.js';
7
- import './tools-Bw7RhO92.js';
5
+ import { a as Status } from './status-badge-CHHxtFkP.js';
6
+ export { A as AccountMenu, a as AccountMenuItem, b as AppShell, c as AppShellProps, O as OCHK_APP_ACCOUNT, S as SessionAccountView, d as SessionState, e as ShellNavGroup, f as ShellNavItem, g as ShellSection, T as ThemeToggle, h as ToolColumn, i as ToolShell, j as ToolShellProps, u as useSignInHref } from './tool-shell-CnZ3NUSi.js';
7
+ import './tools-CzjFPng4.js';
8
8
  import './format.js';
9
9
 
10
10
  interface SiteHeaderProps {
@@ -20,6 +20,10 @@ interface SiteHeaderProps {
20
20
  menu?: ReactNode;
21
21
  className?: string;
22
22
  }
23
+ declare function AccountCta({ href, className }: {
24
+ href?: string;
25
+ className?: string;
26
+ }): react.JSX.Element;
23
27
  declare function SiteHeader({ home, brand, product, family, nav, search, actions, variant, navOnPhone, menu: menuExtra, className, }: SiteHeaderProps): react.JSX.Element;
24
28
  declare function SkipLink({ href, children }: {
25
29
  href?: string;
@@ -57,13 +61,14 @@ declare function FamilyMenu({ current, className }: {
57
61
  className?: string;
58
62
  }): react.JSX.Element;
59
63
 
60
- declare function SignInFrame({ title, lead, children, error, fineprint, brand, home, protocol, back, art, caption, className, }: {
64
+ declare function SignInFrame({ title, lead, children, error, fineprint, brand, product, home, protocol, back, art, caption, className, }: {
61
65
  title?: ReactNode;
62
66
  lead?: ReactNode;
63
67
  children: ReactNode;
64
68
  error?: ReactNode;
65
69
  fineprint?: ReactNode;
66
70
  brand?: ReactNode;
71
+ product?: string;
67
72
  home?: string;
68
73
  protocol?: ProtocolSlug;
69
74
  back?: ReactNode;
@@ -110,4 +115,4 @@ interface ShellPlace {
110
115
  declare const ShellContext: react.Context<ShellPlace>;
111
116
  declare function useShellPlace(): ShellPlace;
112
117
 
113
- export { DOCS_HEADER_NAV, DocsNav, type DocsNavItem, type DocsNavSection, DocsShell, type DocsShellProps, FamilyMenu, FooterColumn, NavItem, OchkIoFooter, ShellContext, type ShellPlace, SignInFrame, SiteBanner, SiteFooter, type SiteFooterProps, SiteHeader, type SiteHeaderProps, SkipLink, useShellPlace };
118
+ export { AccountCta, DOCS_HEADER_NAV, DocsNav, type DocsNavItem, type DocsNavSection, DocsShell, type DocsShellProps, FamilyMenu, FooterColumn, NavItem, OchkIoFooter, ShellContext, type ShellPlace, SignInFrame, SiteBanner, SiteFooter, type SiteFooterProps, SiteHeader, type SiteHeaderProps, SkipLink, useShellPlace };
package/dist/chrome.js CHANGED
@@ -6,15 +6,15 @@ var react = require('react');
6
6
  var clsx = require('clsx');
7
7
  var tailwindMerge = require('tailwind-merge');
8
8
  var jsxRuntime = require('react/jsx-runtime');
9
+ var reactSlot = require('@radix-ui/react-slot');
10
+ var classVarianceAuthority = require('class-variance-authority');
11
+ var SeparatorPrimitive = require('@radix-ui/react-separator');
12
+ var nextThemes = require('next-themes');
13
+ require('sonner');
9
14
  var DialogPrimitive = require('@radix-ui/react-dialog');
10
15
  var DropdownMenuPrimitive = require('@radix-ui/react-dropdown-menu');
11
16
  var PopoverPrimitive = require('@radix-ui/react-popover');
12
17
  var TooltipPrimitive = require('@radix-ui/react-tooltip');
13
- var nextThemes = require('next-themes');
14
- var classVarianceAuthority = require('class-variance-authority');
15
- var SeparatorPrimitive = require('@radix-ui/react-separator');
16
- require('sonner');
17
- var reactSlot = require('@radix-ui/react-slot');
18
18
  var router = require('next/compat/router');
19
19
 
20
20
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -38,11 +38,11 @@ function _interopNamespace(e) {
38
38
  }
39
39
 
40
40
  var Link__default = /*#__PURE__*/_interopDefault(Link);
41
+ var SeparatorPrimitive__namespace = /*#__PURE__*/_interopNamespace(SeparatorPrimitive);
41
42
  var DialogPrimitive__namespace = /*#__PURE__*/_interopNamespace(DialogPrimitive);
42
43
  var DropdownMenuPrimitive__namespace = /*#__PURE__*/_interopNamespace(DropdownMenuPrimitive);
43
44
  var PopoverPrimitive__namespace = /*#__PURE__*/_interopNamespace(PopoverPrimitive);
44
45
  var TooltipPrimitive__namespace = /*#__PURE__*/_interopNamespace(TooltipPrimitive);
45
- var SeparatorPrimitive__namespace = /*#__PURE__*/_interopNamespace(SeparatorPrimitive);
46
46
 
47
47
  var merge = tailwindMerge.extendTailwindMerge({
48
48
  extend: {
@@ -137,6 +137,9 @@ function Lockup({ name = "orangecheck", size = 28, className }) {
137
137
  // src/family/index.ts
138
138
  var OCHK_IO = "https://ochk.io";
139
139
  var DOCS_HREF = `${OCHK_IO}/docs`;
140
+ var OCHK_APP = "https://ochk.app";
141
+ var GET_AN_ACCOUNT = { href: OCHK_APP, label: "Get an account" };
142
+ var SIGN_IN_LABEL = "Sign in";
140
143
  function protocol(slug, verb, line, kinds) {
141
144
  return {
142
145
  slug,
@@ -173,7 +176,7 @@ var FAMILY = [
173
176
  {
174
177
  slug: "me",
175
178
  label: "ochk.app",
176
- href: "https://ochk.app",
179
+ href: OCHK_APP,
177
180
  group: "orangecheck",
178
181
  line: "One account, with Bitcoin behind it.",
179
182
  status: "testing"
@@ -282,6 +285,93 @@ var OCHK_IO_FOOTER = [
282
285
  ]
283
286
  }
284
287
  ];
288
+ function Spinner({ className, label }) {
289
+ return /* @__PURE__ */ jsxRuntime.jsxs(
290
+ "svg",
291
+ {
292
+ viewBox: "0 0 24 24",
293
+ fill: "none",
294
+ role: label ? "status" : void 0,
295
+ "aria-label": label,
296
+ "aria-hidden": label ? void 0 : true,
297
+ className: cn("size-4 animate-spin", className),
298
+ children: [
299
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "9", stroke: "currentColor", strokeOpacity: "0.2", strokeWidth: "2.5" }),
300
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M21 12a9 9 0 0 0-9-9", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round" })
301
+ ]
302
+ }
303
+ );
304
+ }
305
+ react.forwardRef(function Separator2({ className, orientation = "horizontal", decorative = true, ...props }, ref) {
306
+ return /* @__PURE__ */ jsxRuntime.jsx(
307
+ SeparatorPrimitive__namespace.Root,
308
+ {
309
+ ref,
310
+ decorative,
311
+ orientation,
312
+ className: cn(
313
+ "shrink-0 bg-border",
314
+ orientation === "horizontal" ? "h-px w-full" : "h-full w-px",
315
+ className
316
+ ),
317
+ ...props
318
+ }
319
+ );
320
+ });
321
+ var buttonVariants = classVarianceAuthority.cva(
322
+ [
323
+ "inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-full font-medium",
324
+ "transition-[background-color,border-color,color,box-shadow,transform] duration-150",
325
+ "outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
326
+ "active:translate-y-px disabled:pointer-events-none",
327
+ // Disabled is one look for every variant: a quiet grey pill, never a
328
+ // faded black or orange slab that reads as broken.
329
+ "disabled:border disabled:border-border disabled:bg-muted disabled:text-oca-subtle disabled:shadow-none",
330
+ "[&_svg]:pointer-events-none [&_svg]:size-[1.1em] [&_svg]:shrink-0"
331
+ ],
332
+ {
333
+ variants: {
334
+ variant: {
335
+ primary: "bg-primary text-primary-foreground hover:bg-primary/85",
336
+ secondary: "border border-border bg-secondary text-secondary-foreground hover:border-oca-hairline-strong hover:bg-accent",
337
+ brand: "bg-brand text-brand-foreground hover:bg-oca-orange-deep",
338
+ ghost: "text-foreground hover:bg-accent",
339
+ danger: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
340
+ link: "h-auto rounded-none px-0 text-foreground underline decoration-foreground/35 underline-offset-4 hover:decoration-foreground",
341
+ onInk: "bg-white text-oca-ink hover:bg-white/90",
342
+ onInkOutline: "border border-white/20 text-white hover:bg-white/10"
343
+ },
344
+ size: {
345
+ sm: "h-9 px-4 text-sm",
346
+ md: "h-11 px-5 text-[0.9375rem]",
347
+ lg: "h-14 px-7 text-[1.0625rem]",
348
+ icon: "size-10",
349
+ "icon-sm": "size-8"
350
+ }
351
+ },
352
+ compoundVariants: [{ variant: "link", className: "h-auto px-0" }],
353
+ defaultVariants: { variant: "primary", size: "md" }
354
+ }
355
+ );
356
+ var Button = react.forwardRef(function Button2({ className, variant, size, asChild = false, loading = false, disabled, children, type, ...props }, ref) {
357
+ const Comp = asChild ? reactSlot.Slot : "button";
358
+ return /* @__PURE__ */ jsxRuntime.jsx(
359
+ Comp,
360
+ {
361
+ ref,
362
+ "data-ui": "button",
363
+ className: cn(buttonVariants({ variant, size }), className),
364
+ disabled: asChild ? void 0 : disabled || loading,
365
+ "aria-busy": loading || void 0,
366
+ type: asChild ? void 0 : type ?? "button",
367
+ ...props,
368
+ children: asChild ? children : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
369
+ loading ? /* @__PURE__ */ jsxRuntime.jsx(Spinner, { className: "size-[1.1em]" }) : null,
370
+ children
371
+ ] })
372
+ }
373
+ );
374
+ });
285
375
  var overlayClass = "oca-animate-fade fixed inset-0 z-50 bg-[rgb(10_10_10/0.38)] backdrop-blur-[2px] data-[state=closed]:opacity-0";
286
376
  react.forwardRef(function DialogContent2({ className, children, hideClose, ...props }, ref) {
287
377
  return /* @__PURE__ */ jsxRuntime.jsxs(DialogPrimitive__namespace.Portal, { children: [
@@ -445,7 +535,8 @@ function sharedContext(name, initial) {
445
535
  return store[key] ?? (store[key] = react.createContext(initial));
446
536
  }
447
537
 
448
- // src/lib/shell-context.ts
538
+ // src/lib/column.ts
539
+ var InColumnContext = sharedContext("in-column", false);
449
540
  var ShellContext = sharedContext("shell-place", {});
450
541
  function useShellPlace() {
451
542
  return react.useContext(ShellContext);
@@ -857,7 +948,7 @@ function SidebarShell({
857
948
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
858
949
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "hidden h-[4.5rem] items-center justify-end gap-3 px-8 lg:flex", children: account }),
859
950
  banner ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-4 pb-2 pt-4 md:px-8 lg:pt-0", children: banner }) : null,
860
- /* @__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 }) })
951
+ /* @__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 }) }) })
861
952
  ] })
862
953
  ] }),
863
954
  tabs ? /* @__PURE__ */ jsxRuntime.jsx(TabBar, { items: tabs }) : null
@@ -1052,6 +1143,18 @@ function NavDropdown({ item }) {
1052
1143
  ] })
1053
1144
  ] });
1054
1145
  }
1146
+ function AccountCta({ href = GET_AN_ACCOUNT.href, className }) {
1147
+ return /* @__PURE__ */ jsxRuntime.jsx(Button, { asChild: true, size: "sm", className, children: /* @__PURE__ */ jsxRuntime.jsx("a", { href, children: GET_AN_ACCOUNT.label }) });
1148
+ }
1149
+ function ProductLockup({ size, product }) {
1150
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center", children: [
1151
+ /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size }),
1152
+ product ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1153
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "mx-3 h-5 w-px bg-oca-hairline-strong" }),
1154
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium tracking-[-0.01em]", style: { fontSize: size * 0.56 }, children: product })
1155
+ ] }) : null
1156
+ ] });
1157
+ }
1055
1158
  function SiteHeader({
1056
1159
  home = "/",
1057
1160
  brand,
@@ -1071,13 +1174,7 @@ function SiteHeader({
1071
1174
  const current = typeof family === "string" ? family : void 0;
1072
1175
  const phoneNav = navOnPhone ? nav : [];
1073
1176
  const menu = phoneNav.length > 0 || Boolean(family) || Boolean(menuExtra);
1074
- const brandNode = brand ?? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center", children: [
1075
- /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size }),
1076
- product ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1077
- /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "mx-3 h-5 w-px bg-oca-hairline-strong" }),
1078
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium tracking-[-0.01em]", style: { fontSize: size * 0.56 }, children: product })
1079
- ] }) : null
1080
- ] });
1177
+ const brandNode = brand ?? /* @__PURE__ */ jsxRuntime.jsx(ProductLockup, { size, product });
1081
1178
  const navigation = nav.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Main", className: "hidden items-center gap-1 md:flex", children: nav.map(
1082
1179
  (n) => n.children?.length ? /* @__PURE__ */ jsxRuntime.jsx(NavDropdown, { item: n }, n.href) : (
1083
1180
  // Between md and lg the family menu and the actions share the row: tighter.
@@ -1207,7 +1304,7 @@ function SiteBanner({
1207
1304
  var FOOT_LINK = "inline-flex min-h-11 items-center transition-colors hover:text-foreground md:min-h-0";
1208
1305
  function LegalRow({ links }) {
1209
1306
  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: [
1210
- /* @__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(Link__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)) }) }),
1307
+ /* @__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(Link__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}`)) }) }),
1211
1308
  /* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
1212
1309
  "\xA9 ",
1213
1310
  (/* @__PURE__ */ new Date()).getFullYear(),
@@ -1227,16 +1324,26 @@ function SiteFooter({
1227
1324
  }) {
1228
1325
  const legalLinks = legal === true ? LEGAL_LINKS : legal || null;
1229
1326
  if (compact) {
1230
- 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: [
1231
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-6 gap-y-1", children: [
1232
- /* @__PURE__ */ jsxRuntime.jsx("a", { href: OCHK_IO, className: "rounded-lg text-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 22 }) }),
1233
- 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
1234
- ] }),
1235
- 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: [
1236
- legalLinks ? /* @__PURE__ */ jsxRuntime.jsx(LegalRow, { links: legalLinks }) : null,
1237
- meta
1238
- ] }) : null
1239
- ] }) });
1327
+ return (
1328
+ // The tools' column (ToolColumn): the lockup lines up with the page's title.
1329
+ /* @__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: [
1330
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-6 gap-y-3", children: [
1331
+ /* @__PURE__ */ jsxRuntime.jsx(
1332
+ "a",
1333
+ {
1334
+ href: OCHK_IO,
1335
+ className: "relative rounded-lg text-foreground before:absolute before:inset-x-0 before:top-1/2 before:h-11 before:-translate-y-1/2",
1336
+ children: /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 22 })
1337
+ }
1338
+ ),
1339
+ 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
1340
+ ] }),
1341
+ 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: [
1342
+ legalLinks ? /* @__PURE__ */ jsxRuntime.jsx(LegalRow, { links: legalLinks }) : null,
1343
+ meta
1344
+ ] }) : null
1345
+ ] }) })
1346
+ );
1240
1347
  }
1241
1348
  const cols = [
1242
1349
  ...columns,
@@ -1271,17 +1378,17 @@ function SiteFooter({
1271
1378
  className: cn("flex min-w-0 flex-col gap-1", spans && "col-span-2 md:col-span-1"),
1272
1379
  children: [
1273
1380
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-[0.875rem] font-medium", children: col.heading }),
1274
- /* @__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(
1381
+ /* @__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(
1275
1382
  NavLink,
1276
1383
  {
1277
1384
  item: l,
1278
1385
  className: "-mx-3 py-2.5 text-[0.9375rem] md:py-1.5"
1279
1386
  },
1280
- l.href
1387
+ `${j}:${l.label}`
1281
1388
  )) })
1282
1389
  ]
1283
1390
  },
1284
- col.heading
1391
+ `${i}:${col.heading}`
1285
1392
  );
1286
1393
  })
1287
1394
  ]
@@ -1381,12 +1488,13 @@ function IsoCheck({ size = 360, settle = false, shadow = true, tilt = false, tit
1381
1488
  );
1382
1489
  }
1383
1490
  function SignInFrame({
1384
- title = "Sign in",
1491
+ title = SIGN_IN_LABEL,
1385
1492
  lead,
1386
1493
  children,
1387
1494
  error,
1388
1495
  fineprint,
1389
1496
  brand,
1497
+ product,
1390
1498
  home,
1391
1499
  protocol: protocol2,
1392
1500
  back,
@@ -1404,7 +1512,7 @@ function SignInFrame({
1404
1512
  /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "flex flex-col px-4 pb-8 pt-5 sm:px-8 lg:px-14 lg:pt-8", children: [
1405
1513
  /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "flex items-center justify-between gap-4", children: [
1406
1514
  /* @__PURE__ */ jsxRuntime.jsxs(Link__default.default, { href: homeHref, className: "w-fit rounded-lg", children: [
1407
- brand ?? /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 28 }),
1515
+ brand ?? /* @__PURE__ */ jsxRuntime.jsx(ProductLockup, { size: 28, product: product ?? (protocol2 ? protocolSite(protocol2).label : void 0) }),
1408
1516
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: " home" })
1409
1517
  ] }),
1410
1518
  back === void 0 ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -1441,97 +1549,10 @@ function SignInFrame({
1441
1549
  }
1442
1550
  );
1443
1551
  }
1444
- function Spinner({ className, label }) {
1445
- return /* @__PURE__ */ jsxRuntime.jsxs(
1446
- "svg",
1447
- {
1448
- viewBox: "0 0 24 24",
1449
- fill: "none",
1450
- role: label ? "status" : void 0,
1451
- "aria-label": label,
1452
- "aria-hidden": label ? void 0 : true,
1453
- className: cn("size-4 animate-spin", className),
1454
- children: [
1455
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "9", stroke: "currentColor", strokeOpacity: "0.2", strokeWidth: "2.5" }),
1456
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M21 12a9 9 0 0 0-9-9", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round" })
1457
- ]
1458
- }
1459
- );
1460
- }
1461
- react.forwardRef(function Separator3({ className, orientation = "horizontal", decorative = true, ...props }, ref) {
1462
- return /* @__PURE__ */ jsxRuntime.jsx(
1463
- SeparatorPrimitive__namespace.Root,
1464
- {
1465
- ref,
1466
- decorative,
1467
- orientation,
1468
- className: cn(
1469
- "shrink-0 bg-border",
1470
- orientation === "horizontal" ? "h-px w-full" : "h-full w-px",
1471
- className
1472
- ),
1473
- ...props
1474
- }
1475
- );
1476
- });
1477
1552
  var DensityContext = sharedContext("density", "comfortable");
1478
1553
  function DensityProvider({ density, children }) {
1479
1554
  return react.createElement(DensityContext.Provider, { value: density }, children);
1480
1555
  }
1481
- var buttonVariants = classVarianceAuthority.cva(
1482
- [
1483
- "inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-full font-medium",
1484
- "transition-[background-color,border-color,color,box-shadow,transform] duration-150",
1485
- "outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
1486
- "active:translate-y-px disabled:pointer-events-none",
1487
- // Disabled is one look for every variant: a quiet grey pill, never a
1488
- // faded black or orange slab that reads as broken.
1489
- "disabled:border disabled:border-border disabled:bg-muted disabled:text-oca-subtle disabled:shadow-none",
1490
- "[&_svg]:pointer-events-none [&_svg]:size-[1.1em] [&_svg]:shrink-0"
1491
- ],
1492
- {
1493
- variants: {
1494
- variant: {
1495
- primary: "bg-primary text-primary-foreground hover:bg-primary/85",
1496
- secondary: "border border-border bg-secondary text-secondary-foreground hover:border-oca-hairline-strong hover:bg-accent",
1497
- brand: "bg-brand text-brand-foreground hover:bg-oca-orange-deep",
1498
- ghost: "text-foreground hover:bg-accent",
1499
- danger: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
1500
- link: "h-auto rounded-none px-0 text-foreground underline decoration-foreground/35 underline-offset-4 hover:decoration-foreground",
1501
- onInk: "bg-white text-oca-ink hover:bg-white/90",
1502
- onInkOutline: "border border-white/20 text-white hover:bg-white/10"
1503
- },
1504
- size: {
1505
- sm: "h-9 px-4 text-sm",
1506
- md: "h-11 px-5 text-[0.9375rem]",
1507
- lg: "h-14 px-7 text-[1.0625rem]",
1508
- icon: "size-10",
1509
- "icon-sm": "size-8"
1510
- }
1511
- },
1512
- compoundVariants: [{ variant: "link", className: "h-auto px-0" }],
1513
- defaultVariants: { variant: "primary", size: "md" }
1514
- }
1515
- );
1516
- var Button = react.forwardRef(function Button2({ className, variant, size, asChild = false, loading = false, disabled, children, type, ...props }, ref) {
1517
- const Comp = asChild ? reactSlot.Slot : "button";
1518
- return /* @__PURE__ */ jsxRuntime.jsx(
1519
- Comp,
1520
- {
1521
- ref,
1522
- "data-ui": "button",
1523
- className: cn(buttonVariants({ variant, size }), className),
1524
- disabled: asChild ? void 0 : disabled || loading,
1525
- "aria-busy": loading || void 0,
1526
- type: asChild ? void 0 : type ?? "button",
1527
- ...props,
1528
- children: asChild ? children : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1529
- loading ? /* @__PURE__ */ jsxRuntime.jsx(Spinner, { className: "size-[1.1em]" }) : null,
1530
- children
1531
- ] })
1532
- }
1533
- );
1534
- });
1535
1556
  function useActiveHeading(ids) {
1536
1557
  const [active, setActive] = react.useState(ids[0]);
1537
1558
  const key = ids.join("|");
@@ -1785,7 +1806,7 @@ function SessionAccountView({
1785
1806
  items = [],
1786
1807
  signInHref,
1787
1808
  signInPath,
1788
- signInLabel = "Sign in",
1809
+ signInLabel = SIGN_IN_LABEL,
1789
1810
  accountHref = OCHK_APP_ACCOUNT,
1790
1811
  onSignOut,
1791
1812
  nameFrom = "lg"
@@ -1816,6 +1837,13 @@ function SessionAccountView({
1816
1837
  /* @__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 }) }) })
1817
1838
  );
1818
1839
  }
1840
+ function ToolColumn({
1841
+ measure = "wide",
1842
+ className,
1843
+ children
1844
+ }) {
1845
+ 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 }) }) });
1846
+ }
1819
1847
  function ToolShell({
1820
1848
  protocol: protocol2,
1821
1849
  tools,
@@ -1824,6 +1852,7 @@ function ToolShell({
1824
1852
  rail = false,
1825
1853
  railFooter,
1826
1854
  variant = "tool",
1855
+ measure = "wide",
1827
1856
  banner,
1828
1857
  footer,
1829
1858
  children
@@ -1881,14 +1910,7 @@ function ToolShell({
1881
1910
  /* @__PURE__ */ jsxRuntime.jsx(SideNav, { groups: [{ label: "Tools", items: tools.map(({ href, label, icon, active }) => ({ href, label, icon, active })) }] }),
1882
1911
  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
1883
1912
  ] }) : null,
1884
- /* @__PURE__ */ jsxRuntime.jsx(
1885
- "main",
1886
- {
1887
- id: "main-content",
1888
- 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"),
1889
- children: /* @__PURE__ */ jsxRuntime.jsx(SiteHomeContext.Provider, { value: homeHref, children: app ? children : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-[72rem]", children }) })
1890
- }
1891
- )
1913
+ /* @__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 }) }) })
1892
1914
  ] }),
1893
1915
  app || footer === false ? null : footer ?? /* @__PURE__ */ jsxRuntime.jsx(SiteFooter, { compact: true, family: true, legal: true }),
1894
1916
  tabs ? /* @__PURE__ */ jsxRuntime.jsx(TabBar, { items: tabs }) : null
@@ -1897,6 +1919,7 @@ function ToolShell({
1897
1919
  ) });
1898
1920
  }
1899
1921
 
1922
+ exports.AccountCta = AccountCta;
1900
1923
  exports.AccountMenu = AccountMenu;
1901
1924
  exports.AppShell = AppShell;
1902
1925
  exports.DOCS_HEADER_NAV = DOCS_HEADER_NAV;
@@ -1913,6 +1936,7 @@ exports.SiteFooter = SiteFooter;
1913
1936
  exports.SiteHeader = SiteHeader;
1914
1937
  exports.SkipLink = SkipLink;
1915
1938
  exports.ThemeToggle = ThemeToggle;
1939
+ exports.ToolColumn = ToolColumn;
1916
1940
  exports.ToolShell = ToolShell;
1917
1941
  exports.useShellPlace = useShellPlace;
1918
1942
  exports.useSignInHref = useSignInHref;