@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/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`, `ListRow`, `ChoiceGroup`, `ChoiceCard`, `Avatar`) |
39
+ | `/chrome` | `SiteHeader`, `SiteFooter`, `FamilyMenu`, `SkipLink`, `SiteBanner`, `SignInFrame`, `AppShell`, `PaneHeader`, `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, P as PaneHeader, 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-Dxw5o2rH.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, P as PaneHeader, 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-Cg51cRHJ.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: [
@@ -417,7 +507,8 @@ var DropdownMenuItem = react.forwardRef(function DropdownMenuItem2({ className,
417
507
  {
418
508
  ref,
419
509
  className: cn(
420
- "flex h-10 cursor-default select-none items-center gap-2.5 rounded-xl px-3 text-[0.9375rem] outline-none",
510
+ // A thumb's 44px on a phone.
511
+ "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",
421
512
  "data-[highlighted]:bg-accent data-[disabled]:opacity-50 [&_svg]:size-4 [&_svg]:text-muted-foreground",
422
513
  destructive && "text-destructive [&_svg]:text-destructive",
423
514
  className
@@ -445,7 +536,8 @@ function sharedContext(name, initial) {
445
536
  return store[key] ?? (store[key] = react.createContext(initial));
446
537
  }
447
538
 
448
- // src/lib/shell-context.ts
539
+ // src/lib/column.ts
540
+ var InColumnContext = sharedContext("in-column", false);
449
541
  var ShellContext = sharedContext("shell-place", {});
450
542
  function useShellPlace() {
451
543
  return react.useContext(ShellContext);
@@ -857,7 +949,7 @@ function SidebarShell({
857
949
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
858
950
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "hidden h-[4.5rem] items-center justify-end gap-3 px-8 lg:flex", children: account }),
859
951
  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 }) })
952
+ /* @__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
953
  ] })
862
954
  ] }),
863
955
  tabs ? /* @__PURE__ */ jsxRuntime.jsx(TabBar, { items: tabs }) : null
@@ -923,6 +1015,9 @@ function RailShell({ nav = [], persistent = [], page: pageOverride, header, acco
923
1015
  tabs ? /* @__PURE__ */ jsxRuntime.jsx(TabBar, { items: tabs }) : null
924
1016
  ] }) }) });
925
1017
  }
1018
+ function PaneHeader({ children, className }) {
1019
+ 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 });
1020
+ }
926
1021
  function AccountMenu({
927
1022
  name,
928
1023
  detail,
@@ -1052,6 +1147,18 @@ function NavDropdown({ item }) {
1052
1147
  ] })
1053
1148
  ] });
1054
1149
  }
1150
+ function AccountCta({ href = GET_AN_ACCOUNT.href, className }) {
1151
+ return /* @__PURE__ */ jsxRuntime.jsx(Button, { asChild: true, size: "sm", className, children: /* @__PURE__ */ jsxRuntime.jsx("a", { href, children: GET_AN_ACCOUNT.label }) });
1152
+ }
1153
+ function ProductLockup({ size, product }) {
1154
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center", children: [
1155
+ /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size }),
1156
+ product ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1157
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "mx-3 h-5 w-px bg-oca-hairline-strong" }),
1158
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium tracking-[-0.01em]", style: { fontSize: size * 0.56 }, children: product })
1159
+ ] }) : null
1160
+ ] });
1161
+ }
1055
1162
  function SiteHeader({
1056
1163
  home = "/",
1057
1164
  brand,
@@ -1071,13 +1178,7 @@ function SiteHeader({
1071
1178
  const current = typeof family === "string" ? family : void 0;
1072
1179
  const phoneNav = navOnPhone ? nav : [];
1073
1180
  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
- ] });
1181
+ const brandNode = brand ?? /* @__PURE__ */ jsxRuntime.jsx(ProductLockup, { size, product });
1081
1182
  const navigation = nav.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Main", className: "hidden items-center gap-1 md:flex", children: nav.map(
1082
1183
  (n) => n.children?.length ? /* @__PURE__ */ jsxRuntime.jsx(NavDropdown, { item: n }, n.href) : (
1083
1184
  // Between md and lg the family menu and the actions share the row: tighter.
@@ -1207,7 +1308,7 @@ function SiteBanner({
1207
1308
  var FOOT_LINK = "inline-flex min-h-11 items-center transition-colors hover:text-foreground md:min-h-0";
1208
1309
  function LegalRow({ links }) {
1209
1310
  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)) }) }),
1311
+ /* @__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
1312
  /* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
1212
1313
  "\xA9 ",
1213
1314
  (/* @__PURE__ */ new Date()).getFullYear(),
@@ -1227,16 +1328,26 @@ function SiteFooter({
1227
1328
  }) {
1228
1329
  const legalLinks = legal === true ? LEGAL_LINKS : legal || null;
1229
1330
  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
- ] }) });
1331
+ return (
1332
+ // The tools' column (ToolColumn): the lockup lines up with the page's title.
1333
+ /* @__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: [
1334
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-6 gap-y-3", children: [
1335
+ /* @__PURE__ */ jsxRuntime.jsx(
1336
+ "a",
1337
+ {
1338
+ href: OCHK_IO,
1339
+ className: "relative rounded-lg text-foreground before:absolute before:inset-x-0 before:top-1/2 before:h-11 before:-translate-y-1/2",
1340
+ children: /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 22 })
1341
+ }
1342
+ ),
1343
+ 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
1344
+ ] }),
1345
+ 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: [
1346
+ legalLinks ? /* @__PURE__ */ jsxRuntime.jsx(LegalRow, { links: legalLinks }) : null,
1347
+ meta
1348
+ ] }) : null
1349
+ ] }) })
1350
+ );
1240
1351
  }
1241
1352
  const cols = [
1242
1353
  ...columns,
@@ -1271,17 +1382,17 @@ function SiteFooter({
1271
1382
  className: cn("flex min-w-0 flex-col gap-1", spans && "col-span-2 md:col-span-1"),
1272
1383
  children: [
1273
1384
  /* @__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(
1385
+ /* @__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
1386
  NavLink,
1276
1387
  {
1277
1388
  item: l,
1278
1389
  className: "-mx-3 py-2.5 text-[0.9375rem] md:py-1.5"
1279
1390
  },
1280
- l.href
1391
+ `${j}:${l.label}`
1281
1392
  )) })
1282
1393
  ]
1283
1394
  },
1284
- col.heading
1395
+ `${i}:${col.heading}`
1285
1396
  );
1286
1397
  })
1287
1398
  ]
@@ -1381,12 +1492,13 @@ function IsoCheck({ size = 360, settle = false, shadow = true, tilt = false, tit
1381
1492
  );
1382
1493
  }
1383
1494
  function SignInFrame({
1384
- title = "Sign in",
1495
+ title = SIGN_IN_LABEL,
1385
1496
  lead,
1386
1497
  children,
1387
1498
  error,
1388
1499
  fineprint,
1389
1500
  brand,
1501
+ product,
1390
1502
  home,
1391
1503
  protocol: protocol2,
1392
1504
  back,
@@ -1404,7 +1516,7 @@ function SignInFrame({
1404
1516
  /* @__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
1517
  /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "flex items-center justify-between gap-4", children: [
1406
1518
  /* @__PURE__ */ jsxRuntime.jsxs(Link__default.default, { href: homeHref, className: "w-fit rounded-lg", children: [
1407
- brand ?? /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 28 }),
1519
+ brand ?? /* @__PURE__ */ jsxRuntime.jsx(ProductLockup, { size: 28, product: product ?? (protocol2 ? protocolSite(protocol2).label : void 0) }),
1408
1520
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: " home" })
1409
1521
  ] }),
1410
1522
  back === void 0 ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -1441,97 +1553,10 @@ function SignInFrame({
1441
1553
  }
1442
1554
  );
1443
1555
  }
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
1556
  var DensityContext = sharedContext("density", "comfortable");
1478
1557
  function DensityProvider({ density, children }) {
1479
1558
  return react.createElement(DensityContext.Provider, { value: density }, children);
1480
1559
  }
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
1560
  function useActiveHeading(ids) {
1536
1561
  const [active, setActive] = react.useState(ids[0]);
1537
1562
  const key = ids.join("|");
@@ -1785,7 +1810,7 @@ function SessionAccountView({
1785
1810
  items = [],
1786
1811
  signInHref,
1787
1812
  signInPath,
1788
- signInLabel = "Sign in",
1813
+ signInLabel = SIGN_IN_LABEL,
1789
1814
  accountHref = OCHK_APP_ACCOUNT,
1790
1815
  onSignOut,
1791
1816
  nameFrom = "lg"
@@ -1816,6 +1841,13 @@ function SessionAccountView({
1816
1841
  /* @__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
1842
  );
1818
1843
  }
1844
+ function ToolColumn({
1845
+ measure = "wide",
1846
+ className,
1847
+ children
1848
+ }) {
1849
+ 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 }) }) });
1850
+ }
1819
1851
  function ToolShell({
1820
1852
  protocol: protocol2,
1821
1853
  tools,
@@ -1824,6 +1856,7 @@ function ToolShell({
1824
1856
  rail = false,
1825
1857
  railFooter,
1826
1858
  variant = "tool",
1859
+ measure = "wide",
1827
1860
  banner,
1828
1861
  footer,
1829
1862
  children
@@ -1881,14 +1914,7 @@ function ToolShell({
1881
1914
  /* @__PURE__ */ jsxRuntime.jsx(SideNav, { groups: [{ label: "Tools", items: tools.map(({ href, label, icon, active }) => ({ href, label, icon, active })) }] }),
1882
1915
  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
1916
  ] }) : 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
- )
1917
+ /* @__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
1918
  ] }),
1893
1919
  app || footer === false ? null : footer ?? /* @__PURE__ */ jsxRuntime.jsx(SiteFooter, { compact: true, family: true, legal: true }),
1894
1920
  tabs ? /* @__PURE__ */ jsxRuntime.jsx(TabBar, { items: tabs }) : null
@@ -1897,6 +1923,7 @@ function ToolShell({
1897
1923
  ) });
1898
1924
  }
1899
1925
 
1926
+ exports.AccountCta = AccountCta;
1900
1927
  exports.AccountMenu = AccountMenu;
1901
1928
  exports.AppShell = AppShell;
1902
1929
  exports.DOCS_HEADER_NAV = DOCS_HEADER_NAV;
@@ -1905,6 +1932,7 @@ exports.DocsShell = DocsShell;
1905
1932
  exports.FamilyMenu = FamilyMenu;
1906
1933
  exports.OCHK_APP_ACCOUNT = OCHK_APP_ACCOUNT;
1907
1934
  exports.OchkIoFooter = OchkIoFooter;
1935
+ exports.PaneHeader = PaneHeader;
1908
1936
  exports.SessionAccountView = SessionAccountView;
1909
1937
  exports.ShellContext = ShellContext;
1910
1938
  exports.SignInFrame = SignInFrame;
@@ -1913,6 +1941,7 @@ exports.SiteFooter = SiteFooter;
1913
1941
  exports.SiteHeader = SiteHeader;
1914
1942
  exports.SkipLink = SkipLink;
1915
1943
  exports.ThemeToggle = ThemeToggle;
1944
+ exports.ToolColumn = ToolColumn;
1916
1945
  exports.ToolShell = ToolShell;
1917
1946
  exports.useShellPlace = useShellPlace;
1918
1947
  exports.useSignInHref = useSignInHref;