@orangecheck/app-design 1.4.0 → 1.4.1

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.
@@ -18,10 +18,11 @@ interface CodeBlockProps {
18
18
  highlight?: string | readonly number[];
19
19
  diff?: boolean;
20
20
  lineNumbers?: boolean;
21
+ wrap?: boolean;
21
22
  actions?: ReactNode;
22
23
  className?: string;
23
24
  }
24
- declare function CodeBlock({ code, html, children, trailingNewline, lang, caption, copy, clearAfter, maxLines, highlight: marks, diff, lineNumbers, actions, className, }: CodeBlockProps): react.JSX.Element;
25
+ declare function CodeBlock({ code, html, children, trailingNewline, lang, caption, copy, clearAfter, maxLines, highlight: marks, diff, lineNumbers, wrap, actions, className, }: CodeBlockProps): react.JSX.Element;
25
26
  interface CodeTab {
26
27
  label: string;
27
28
  code: string;
@@ -18,10 +18,11 @@ interface CodeBlockProps {
18
18
  highlight?: string | readonly number[];
19
19
  diff?: boolean;
20
20
  lineNumbers?: boolean;
21
+ wrap?: boolean;
21
22
  actions?: ReactNode;
22
23
  className?: string;
23
24
  }
24
- declare function CodeBlock({ code, html, children, trailingNewline, lang, caption, copy, clearAfter, maxLines, highlight: marks, diff, lineNumbers, actions, className, }: CodeBlockProps): react.JSX.Element;
25
+ declare function CodeBlock({ code, html, children, trailingNewline, lang, caption, copy, clearAfter, maxLines, highlight: marks, diff, lineNumbers, wrap, actions, className, }: CodeBlockProps): react.JSX.Element;
25
26
  interface CodeTab {
26
27
  label: string;
27
28
  code: string;
package/dist/index.d.mts CHANGED
@@ -4,7 +4,7 @@ export { S as Statement, a as Status, b as StatusBadge, c as StatusBadgeProps, s
4
4
  export { AppIcon, AppIconProps, Crowd, CrowdProps, HalftoneCanvas, HalftoneCanvasProps, HalftoneSphere, HalftoneSphereProps, IsoCheck, IsoCheckProps, Lockup, LockupProps, MARK_FACES, Mark, MarkProps, SPHERE_GRADIENT, Tone, portraitTone } from './brand.mjs';
5
5
  export { Accent, ActivityItem, ActivityList, BrowserFrame, CheckState, Closing, Column, Container, CopyButton, CopyButtonProps, DataTable, Display, DisplayProps, EmptyLine, EmptyState, Endpoint, EndpointList, ErrorBoundary, ErrorPage, Eyebrow, FactBlock, FactRow, FactRows, Faq, FloatChip, Footnote, HashChip, KeyValueItem, KeyValueList, Lead, LegalBlock, LegalDocument, LegalSource, LoadingBlock, Monogram, Notice, PackageCard, PackageItem, PageHeader, PhoneFrame, ProgressStep, ProgressSteps, ProofStrip, Prose, Reveal, Sats, SatsFigure, SatsProps, SatsTextOptions, ScrollStory, SearchButton, SearchDialog, SearchGroup, SearchQuery, SearchResult, Section, SectionHeading, SectionIntro, SectionProps, SignMessage, SplitBar, SplitSegment, StatCard, StatCardProps, StatGrid, StatGridProps, StepGrid, StepGridProps, StepItem, StepState, TextLink, Ticker, TruthRow, TruthStatus, TruthTable, UsdApprox, VerifyCheck, VerifyReport, monogramGround, monogramLetter, satsText, sectionVariants, useCopy, useInView } from './components.mjs';
6
6
  export { D as DocHeader, a as DocLayout, P as PageHero, b as PageHeroProps, T as TocItem, u as useActiveHeading } from './hero-Dn37il-9.mjs';
7
- export { A as ApiRow, a as ApiTable, b as AppCard, c as AppCardProps, d as AppGrid, B as Breadcrumbs, C as Callout, e as CardGrid, f as CodeBlock, g as CodeBlockProps, h as CodeTab, i as CodeTabs, j as ComparisonColumn, k as ComparisonRow, l as ComparisonTable, m as Crumb, D as Diagram, n as DocsHeading, o as DocsPager, I as InstallTabs, L as LinkCard, M as MdxTable, p as MermaidLike, q as MermaidLoader, O as OnThisPage, P as PagerLink, r as ProtocolGrid, s as ProtocolHero, t as ProtocolNav, S as SpecCard, u as SpecCardProps, v as SpecFileKind, w as Step, x as Steps, V as VerifyBox, y as languageName, z as useHeadings } from './docs-D-T-nHiu.mjs';
7
+ export { A as ApiRow, a as ApiTable, b as AppCard, c as AppCardProps, d as AppGrid, B as Breadcrumbs, C as Callout, e as CardGrid, f as CodeBlock, g as CodeBlockProps, h as CodeTab, i as CodeTabs, j as ComparisonColumn, k as ComparisonRow, l as ComparisonTable, m as Crumb, D as Diagram, n as DocsHeading, o as DocsPager, I as InstallTabs, L as LinkCard, M as MdxTable, p as MermaidLike, q as MermaidLoader, O as OnThisPage, P as PagerLink, r as ProtocolGrid, s as ProtocolHero, t as ProtocolNav, S as SpecCard, u as SpecCardProps, v as SpecFileKind, w as Step, x as Steps, V as VerifyBox, y as languageName, z as useHeadings } from './docs-CFE5mU_6.mjs';
8
8
  export { A as AnchorState, a as AnchorStatus, b as ArtifactView, B as BlockCountdown, c as BlockHeight, C as ChosenFile, D as DropZone, F as FilterChips, d as FilterOption, e as FormSection, M as Meter, S as SectionStatus, f as StateBadge, g as StateDef, h as StateTone, T as ToolGrid, i as ToolItem, j as createStateBadge } from './tools-DFIxIj5p.mjs';
9
9
  export { DOCS_HEADER_NAV, DocsNav, DocsNavItem, DocsNavSection, DocsShell, DocsShellProps, FamilyMenu, OchkIoFooter, ShellContext, ShellPlace, SignInFrame, SiteBanner, SiteFooter, SiteFooterProps, SiteHeader, SiteHeaderProps, SkipLink, useShellPlace } from './chrome.mjs';
10
10
  export { A as AccountMenu, a as AccountMenuItem, b as AppShell, O as OCHK_APP_ACCOUNT, S as SessionAccountView, c as SessionState, d as ShellNavGroup, e as ShellNavItem, f as ShellSection, T as ThemeToggle, g as ToolShell, h as ToolShellProps, u as useSignInHref } from './tool-shell-D8Q8XX11.mjs';
package/dist/index.d.ts CHANGED
@@ -4,7 +4,7 @@ export { S as Statement, a as Status, b as StatusBadge, c as StatusBadgeProps, s
4
4
  export { AppIcon, AppIconProps, Crowd, CrowdProps, HalftoneCanvas, HalftoneCanvasProps, HalftoneSphere, HalftoneSphereProps, IsoCheck, IsoCheckProps, Lockup, LockupProps, MARK_FACES, Mark, MarkProps, SPHERE_GRADIENT, Tone, portraitTone } from './brand.js';
5
5
  export { Accent, ActivityItem, ActivityList, BrowserFrame, CheckState, Closing, Column, Container, CopyButton, CopyButtonProps, DataTable, Display, DisplayProps, EmptyLine, EmptyState, Endpoint, EndpointList, ErrorBoundary, ErrorPage, Eyebrow, FactBlock, FactRow, FactRows, Faq, FloatChip, Footnote, HashChip, KeyValueItem, KeyValueList, Lead, LegalBlock, LegalDocument, LegalSource, LoadingBlock, Monogram, Notice, PackageCard, PackageItem, PageHeader, PhoneFrame, ProgressStep, ProgressSteps, ProofStrip, Prose, Reveal, Sats, SatsFigure, SatsProps, SatsTextOptions, ScrollStory, SearchButton, SearchDialog, SearchGroup, SearchQuery, SearchResult, Section, SectionHeading, SectionIntro, SectionProps, SignMessage, SplitBar, SplitSegment, StatCard, StatCardProps, StatGrid, StatGridProps, StepGrid, StepGridProps, StepItem, StepState, TextLink, Ticker, TruthRow, TruthStatus, TruthTable, UsdApprox, VerifyCheck, VerifyReport, monogramGround, monogramLetter, satsText, sectionVariants, useCopy, useInView } from './components.js';
6
6
  export { D as DocHeader, a as DocLayout, P as PageHero, b as PageHeroProps, T as TocItem, u as useActiveHeading } from './hero-Dn37il-9.js';
7
- export { A as ApiRow, a as ApiTable, b as AppCard, c as AppCardProps, d as AppGrid, B as Breadcrumbs, C as Callout, e as CardGrid, f as CodeBlock, g as CodeBlockProps, h as CodeTab, i as CodeTabs, j as ComparisonColumn, k as ComparisonRow, l as ComparisonTable, m as Crumb, D as Diagram, n as DocsHeading, o as DocsPager, I as InstallTabs, L as LinkCard, M as MdxTable, p as MermaidLike, q as MermaidLoader, O as OnThisPage, P as PagerLink, r as ProtocolGrid, s as ProtocolHero, t as ProtocolNav, S as SpecCard, u as SpecCardProps, v as SpecFileKind, w as Step, x as Steps, V as VerifyBox, y as languageName, z as useHeadings } from './docs-BB9gK4KF.js';
7
+ export { A as ApiRow, a as ApiTable, b as AppCard, c as AppCardProps, d as AppGrid, B as Breadcrumbs, C as Callout, e as CardGrid, f as CodeBlock, g as CodeBlockProps, h as CodeTab, i as CodeTabs, j as ComparisonColumn, k as ComparisonRow, l as ComparisonTable, m as Crumb, D as Diagram, n as DocsHeading, o as DocsPager, I as InstallTabs, L as LinkCard, M as MdxTable, p as MermaidLike, q as MermaidLoader, O as OnThisPage, P as PagerLink, r as ProtocolGrid, s as ProtocolHero, t as ProtocolNav, S as SpecCard, u as SpecCardProps, v as SpecFileKind, w as Step, x as Steps, V as VerifyBox, y as languageName, z as useHeadings } from './docs-ByUx4t-D.js';
8
8
  export { A as AnchorState, a as AnchorStatus, b as ArtifactView, B as BlockCountdown, c as BlockHeight, C as ChosenFile, D as DropZone, F as FilterChips, d as FilterOption, e as FormSection, M as Meter, S as SectionStatus, f as StateBadge, g as StateDef, h as StateTone, T as ToolGrid, i as ToolItem, j as createStateBadge } from './tools-BggNN5DV.js';
9
9
  export { DOCS_HEADER_NAV, DocsNav, DocsNavItem, DocsNavSection, DocsShell, DocsShellProps, FamilyMenu, OchkIoFooter, ShellContext, ShellPlace, SignInFrame, SiteBanner, SiteFooter, SiteFooterProps, SiteHeader, SiteHeaderProps, SkipLink, useShellPlace } from './chrome.js';
10
10
  export { A as AccountMenu, a as AccountMenuItem, b as AppShell, O as OCHK_APP_ACCOUNT, S as SessionAccountView, c as SessionState, d as ShellNavGroup, e as ShellNavItem, f as ShellSection, T as ThemeToggle, g as ToolShell, h as ToolShellProps, u as useSignInHref } from './tool-shell-gmlj47Ie.js';
package/dist/index.js CHANGED
@@ -6,6 +6,7 @@ var react = require('react');
6
6
  var clsx = require('clsx');
7
7
  var tailwindMerge = require('tailwind-merge');
8
8
  var SeparatorPrimitive = require('@radix-ui/react-separator');
9
+ var nextThemes = require('next-themes');
9
10
  var sonner = require('sonner');
10
11
  var jsxRuntime = require('react/jsx-runtime');
11
12
  var CheckboxPrimitive = require('@radix-ui/react-checkbox');
@@ -22,7 +23,6 @@ var TabsPrimitive = require('@radix-ui/react-tabs');
22
23
  var QRCode = require('qrcode');
23
24
  var Link6 = require('next/link');
24
25
  var router = require('next/compat/router');
25
- var nextThemes = require('next-themes');
26
26
 
27
27
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
28
28
 
@@ -208,10 +208,18 @@ function StatusDot({
208
208
  }
209
209
  );
210
210
  }
211
- function Toaster(props) {
211
+ var TOAST_COLOURS = {
212
+ "--normal-bg": "var(--popover)",
213
+ "--normal-text": "var(--popover-foreground)",
214
+ "--normal-border": "var(--border)"
215
+ };
216
+ function Toaster({ style, ...props }) {
217
+ const { resolvedTheme } = nextThemes.useTheme();
212
218
  return /* @__PURE__ */ jsxRuntime.jsx(
213
219
  sonner.Toaster,
214
220
  {
221
+ theme: resolvedTheme === "dark" ? "dark" : resolvedTheme === "light" ? "light" : "system",
222
+ style: { ...TOAST_COLOURS, ...style },
215
223
  position: "bottom-right",
216
224
  toastOptions: {
217
225
  classNames: {
@@ -3035,7 +3043,8 @@ function Well({
3035
3043
  lines,
3036
3044
  maxLines,
3037
3045
  diff,
3038
- lineNumbers
3046
+ lineNumbers,
3047
+ wrap
3039
3048
  }) {
3040
3049
  const foldable = maxLines !== void 0 && lines > maxLines + 2;
3041
3050
  const [open, setOpen] = react.useState(false);
@@ -3054,7 +3063,8 @@ function Well({
3054
3063
  "data-diff": diff ? "" : void 0,
3055
3064
  "data-line-numbers": lineNumbers ? "" : void 0,
3056
3065
  className: cn(
3057
- "oca-code w-max min-w-full py-4 font-mono text-[0.875rem] leading-[1.625] text-oca-ink-muted [font-variant-ligatures:none]",
3066
+ "oca-code py-4 font-mono text-[0.875rem] leading-[1.625] text-oca-ink-muted [font-variant-ligatures:none]",
3067
+ wrap ? "whitespace-pre-wrap break-all" : "w-max min-w-full",
3058
3068
  !lined && "px-5"
3059
3069
  ),
3060
3070
  children: lined ? /* @__PURE__ */ jsxRuntime.jsx("code", { className: "block", "data-lang": lang, dangerouslySetInnerHTML: { __html: html } }) : /* @__PURE__ */ jsxRuntime.jsx("code", { className: "block", "data-lang": lang, children })
@@ -3096,6 +3106,7 @@ function CodeBlock({
3096
3106
  highlight: marks,
3097
3107
  diff,
3098
3108
  lineNumbers,
3109
+ wrap,
3099
3110
  actions,
3100
3111
  className
3101
3112
  }) {
@@ -3127,6 +3138,7 @@ function CodeBlock({
3127
3138
  maxLines,
3128
3139
  diff: prepared ? prepared.diff : isDiff,
3129
3140
  lineNumbers,
3141
+ wrap,
3130
3142
  children
3131
3143
  }
3132
3144
  )
@@ -3591,6 +3603,169 @@ var ErrorBoundary = class extends react.Component {
3591
3603
  ) });
3592
3604
  }
3593
3605
  };
3606
+
3607
+ // src/family/index.ts
3608
+ var OCHK_IO = "https://ochk.io";
3609
+ var DOCS_HREF = `${OCHK_IO}/docs`;
3610
+ function protocol(slug, verb, line, kinds) {
3611
+ return {
3612
+ slug,
3613
+ label: slug,
3614
+ href: `${OCHK_IO}/${slug}`,
3615
+ group: "protocol",
3616
+ line,
3617
+ status: "live",
3618
+ verb,
3619
+ pageHref: `${OCHK_IO}/${slug}`,
3620
+ toolHref: `https://${slug}.ochk.io`,
3621
+ specHref: `https://github.com/orangecheck/oc-${slug}-protocol`,
3622
+ kinds
3623
+ };
3624
+ }
3625
+ var PROTOCOLS = [
3626
+ protocol("attest", "identity", "Show that an address holds bitcoin, and for how long.", "30078"),
3627
+ protocol("lock", "confidentiality", "Encrypt to a Bitcoin address, so only its holder can open it.", "30078"),
3628
+ protocol("vote", "legitimacy", "Polls weighed in sats, that anyone can tally.", "30080\u201330082"),
3629
+ protocol("stamp", "provenance", "Prove who signed something, and when.", "30083"),
3630
+ protocol("agent", "authority", "Give software scoped, revocable permission to act for you.", "30083\u201330086"),
3631
+ protocol("pledge", "commitment", "Make a promise with bitcoin behind it, on a public record.", "30078")
3632
+ ];
3633
+ var PROTOCOL_ORDER = PROTOCOLS.map((p) => p.slug);
3634
+ var FAMILY = [
3635
+ {
3636
+ slug: "home",
3637
+ label: "ochk.io",
3638
+ href: OCHK_IO,
3639
+ group: "orangecheck",
3640
+ line: "The open protocols, and the company behind them.",
3641
+ status: "live"
3642
+ },
3643
+ {
3644
+ slug: "me",
3645
+ label: "ochk.app",
3646
+ href: "https://ochk.app",
3647
+ group: "orangecheck",
3648
+ line: "One account, with Bitcoin behind it.",
3649
+ status: "testing"
3650
+ },
3651
+ {
3652
+ slug: "docs",
3653
+ label: "docs",
3654
+ href: DOCS_HREF,
3655
+ group: "orangecheck",
3656
+ line: "Specs, SDKs and guides for every protocol.",
3657
+ status: "live"
3658
+ },
3659
+ ...PROTOCOLS,
3660
+ {
3661
+ slug: "vault",
3662
+ label: "vault",
3663
+ href: "https://vault.ochk.io",
3664
+ group: "app",
3665
+ line: "A password manager, encrypted in your browser.",
3666
+ status: "live",
3667
+ protocols: ["lock"]
3668
+ },
3669
+ {
3670
+ slug: "chat",
3671
+ label: "chat",
3672
+ href: "https://chat.ochk.io",
3673
+ group: "app",
3674
+ line: "Messages only the holder of a Bitcoin address can read.",
3675
+ status: "testing",
3676
+ protocols: ["lock"]
3677
+ },
3678
+ {
3679
+ slug: "cosign",
3680
+ label: "cosign",
3681
+ href: "https://cosign.ochk.io",
3682
+ group: "app",
3683
+ line: "Builders find co-founders and backers.",
3684
+ status: "testing",
3685
+ // Signs in with an orangecheck account and a wallet; uses none of the six directly.
3686
+ protocols: []
3687
+ },
3688
+ {
3689
+ slug: "me-demo",
3690
+ // "demo", not the made-up app's own name, so nobody takes it for ours.
3691
+ label: "demo",
3692
+ href: "https://me-demo.ochk.io",
3693
+ group: "app",
3694
+ line: "Lumen Notes, a made-up app that signs in with orangecheck.",
3695
+ status: "live"
3696
+ },
3697
+ {
3698
+ slug: "globe",
3699
+ label: "globe",
3700
+ href: "https://globe.ochk.io",
3701
+ group: "public-good",
3702
+ line: "The Bitcoin network, live, on a globe.",
3703
+ status: "live"
3704
+ },
3705
+ {
3706
+ slug: "btc",
3707
+ label: "btc",
3708
+ href: "https://btc.ochk.io",
3709
+ group: "public-good",
3710
+ line: "A free desk for reading the Bitcoin market.",
3711
+ status: "live"
3712
+ }
3713
+ ];
3714
+ var FAMILY_GROUPS = [
3715
+ { id: "orangecheck", label: "orangecheck" },
3716
+ { id: "protocol", label: "Protocols" },
3717
+ { id: "app", label: "Apps" },
3718
+ { id: "public-good", label: "Public goods" }
3719
+ ];
3720
+ var BY_SLUG = new Map(FAMILY.map((s) => [s.slug, s]));
3721
+ function familySite(slug) {
3722
+ return BY_SLUG.get(slug);
3723
+ }
3724
+ function protocolSite(slug) {
3725
+ return BY_SLUG.get(slug);
3726
+ }
3727
+ function familyByGroup() {
3728
+ return FAMILY_GROUPS.map((g) => ({ ...g, sites: FAMILY.filter((s) => s.group === g.id) }));
3729
+ }
3730
+ var LEGAL_LINKS = [
3731
+ { href: `${OCHK_IO}/privacy`, label: "Privacy" },
3732
+ { href: `${OCHK_IO}/terms`, label: "Terms" },
3733
+ { href: `${OCHK_IO}/security`, label: "Security" },
3734
+ { href: `${OCHK_IO}/trademark`, label: "Trademarks" },
3735
+ { href: `${OCHK_IO}/contact`, label: "Contact" }
3736
+ ];
3737
+ var SELF_HOSTED_LEGAL_LINKS = [
3738
+ { href: "/privacy", label: "Privacy" },
3739
+ { href: "/terms", label: "Terms" },
3740
+ { href: "/security", label: "Security" },
3741
+ { href: `${OCHK_IO}/trademark`, label: "Trademarks" },
3742
+ { href: "/contact", label: "Contact" }
3743
+ ];
3744
+ var OCHK_IO_NAV = [
3745
+ {
3746
+ href: `${OCHK_IO}/protocols`,
3747
+ label: "Protocols",
3748
+ children: PROTOCOLS.map((p) => ({ href: p.pageHref, label: p.label, description: p.line }))
3749
+ },
3750
+ { href: `${OCHK_IO}/apps`, label: "Apps" },
3751
+ { href: DOCS_HREF, label: "Docs" },
3752
+ { href: `${OCHK_IO}/trust`, label: "Trust" },
3753
+ { href: `${OCHK_IO}/about`, label: "About" }
3754
+ ];
3755
+ var OCHK_IO_FOOTER = [
3756
+ {
3757
+ heading: "Company",
3758
+ links: [
3759
+ { href: `${OCHK_IO}/about`, label: "About" },
3760
+ { href: `${OCHK_IO}/trust`, label: "Trust" },
3761
+ { href: "https://github.com/orangecheck", label: "GitHub", external: true }
3762
+ ]
3763
+ }
3764
+ ];
3765
+ var SiteHomeContext = sharedContext("site-home", void 0);
3766
+ function useSiteHome() {
3767
+ return react.useContext(SiteHomeContext);
3768
+ }
3594
3769
  var WORDS = {
3595
3770
  404: {
3596
3771
  name: "Not found",
@@ -3608,10 +3783,13 @@ function ErrorPage({
3608
3783
  title,
3609
3784
  detail,
3610
3785
  actions,
3611
- home = "/",
3786
+ home,
3787
+ protocol: protocol2,
3612
3788
  art,
3613
3789
  className
3614
3790
  }) {
3791
+ const shellHome = useSiteHome();
3792
+ const homeHref = home ?? (protocol2 ? protocolSite(protocol2).pageHref : shellHome ?? OCHK_IO);
3615
3793
  const words = WORDS[code] ?? (code >= 500 ? WORDS[500] : WORDS[404]);
3616
3794
  const server = code >= 500;
3617
3795
  return /* @__PURE__ */ jsxRuntime.jsx(Section, { space: "none", className: cn("flex min-h-[min(40rem,72dvh)] items-center py-16 md:py-24", className), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 items-center gap-12 md:grid-cols-12", children: [
@@ -3625,7 +3803,7 @@ function ErrorPage({
3625
3803
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "oca-lead oca-enter [--enter-delay:150ms]", children: detail ?? words.detail }),
3626
3804
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "oca-enter flex flex-wrap gap-3 [--enter-delay:230ms]", children: actions ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3627
3805
  server ? /* @__PURE__ */ jsxRuntime.jsx(Button, { onClick: () => window.location.reload(), children: "Try again" }) : null,
3628
- /* @__PURE__ */ jsxRuntime.jsx(Button, { asChild: true, variant: server ? "secondary" : "primary", children: /* @__PURE__ */ jsxRuntime.jsx(Link6__default.default, { href: home, children: "Go home" }) })
3806
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { asChild: true, variant: server ? "secondary" : "primary", children: /* @__PURE__ */ jsxRuntime.jsx(Link6__default.default, { href: homeHref, children: "Go home" }) })
3629
3807
  ] }) })
3630
3808
  ] }),
3631
3809
  art !== null ? /* @__PURE__ */ jsxRuntime.jsx("div", { "aria-hidden": true, className: "oca-enter hidden justify-center md:col-span-5 md:flex [--enter-delay:120ms]", children: art ?? /* @__PURE__ */ jsxRuntime.jsx(MarkOutline, { className: "w-full max-w-[20rem] text-oca-hairline-strong" }) }) : null
@@ -3871,165 +4049,6 @@ function LegalDocument({ doc, className }) {
3871
4049
  }
3872
4050
  );
3873
4051
  }
3874
-
3875
- // src/family/index.ts
3876
- var OCHK_IO = "https://ochk.io";
3877
- var DOCS_HREF = `${OCHK_IO}/docs`;
3878
- function protocol(slug, verb, line, kinds) {
3879
- return {
3880
- slug,
3881
- label: slug,
3882
- href: `${OCHK_IO}/${slug}`,
3883
- group: "protocol",
3884
- line,
3885
- status: "live",
3886
- verb,
3887
- pageHref: `${OCHK_IO}/${slug}`,
3888
- toolHref: `https://${slug}.ochk.io`,
3889
- specHref: `https://github.com/orangecheck/oc-${slug}-protocol`,
3890
- kinds
3891
- };
3892
- }
3893
- var PROTOCOLS = [
3894
- protocol("attest", "identity", "Show that an address holds bitcoin, and for how long.", "30078"),
3895
- protocol("lock", "confidentiality", "Encrypt to a Bitcoin address, so only its holder can open it.", "30078"),
3896
- protocol("vote", "legitimacy", "Polls weighed in sats, that anyone can tally.", "30080\u201330082"),
3897
- protocol("stamp", "provenance", "Prove who signed something, and when.", "30083"),
3898
- protocol("agent", "authority", "Give software scoped, revocable permission to act for you.", "30083\u201330086"),
3899
- protocol("pledge", "commitment", "Make a promise with bitcoin behind it, on a public record.", "30078")
3900
- ];
3901
- var PROTOCOL_ORDER = PROTOCOLS.map((p) => p.slug);
3902
- var FAMILY = [
3903
- {
3904
- slug: "home",
3905
- label: "ochk.io",
3906
- href: OCHK_IO,
3907
- group: "orangecheck",
3908
- line: "The open protocols, and the company behind them.",
3909
- status: "live"
3910
- },
3911
- {
3912
- slug: "me",
3913
- label: "ochk.app",
3914
- href: "https://ochk.app",
3915
- group: "orangecheck",
3916
- line: "One account, with Bitcoin behind it.",
3917
- status: "testing"
3918
- },
3919
- {
3920
- slug: "docs",
3921
- label: "docs",
3922
- href: DOCS_HREF,
3923
- group: "orangecheck",
3924
- line: "Specs, SDKs and guides for every protocol.",
3925
- status: "live"
3926
- },
3927
- ...PROTOCOLS,
3928
- {
3929
- slug: "vault",
3930
- label: "vault",
3931
- href: "https://vault.ochk.io",
3932
- group: "app",
3933
- line: "A password manager, encrypted in your browser.",
3934
- status: "live",
3935
- protocols: ["lock"]
3936
- },
3937
- {
3938
- slug: "chat",
3939
- label: "chat",
3940
- href: "https://chat.ochk.io",
3941
- group: "app",
3942
- line: "Messages only the holder of a Bitcoin address can read.",
3943
- status: "testing",
3944
- protocols: ["lock"]
3945
- },
3946
- {
3947
- slug: "cosign",
3948
- label: "cosign",
3949
- href: "https://cosign.ochk.io",
3950
- group: "app",
3951
- line: "Builders find co-founders and backers.",
3952
- status: "testing",
3953
- // Signs in with an orangecheck account and a wallet; uses none of the six directly.
3954
- protocols: []
3955
- },
3956
- {
3957
- slug: "me-demo",
3958
- // "demo", not the made-up app's own name, so nobody takes it for ours.
3959
- label: "demo",
3960
- href: "https://me-demo.ochk.io",
3961
- group: "app",
3962
- line: "Lumen Notes, a made-up app that signs in with orangecheck.",
3963
- status: "live"
3964
- },
3965
- {
3966
- slug: "globe",
3967
- label: "globe",
3968
- href: "https://globe.ochk.io",
3969
- group: "public-good",
3970
- line: "The Bitcoin network, live, on a globe.",
3971
- status: "live"
3972
- },
3973
- {
3974
- slug: "btc",
3975
- label: "btc",
3976
- href: "https://btc.ochk.io",
3977
- group: "public-good",
3978
- line: "A free desk for reading the Bitcoin market.",
3979
- status: "live"
3980
- }
3981
- ];
3982
- var FAMILY_GROUPS = [
3983
- { id: "orangecheck", label: "orangecheck" },
3984
- { id: "protocol", label: "Protocols" },
3985
- { id: "app", label: "Apps" },
3986
- { id: "public-good", label: "Public goods" }
3987
- ];
3988
- var BY_SLUG = new Map(FAMILY.map((s) => [s.slug, s]));
3989
- function familySite(slug) {
3990
- return BY_SLUG.get(slug);
3991
- }
3992
- function protocolSite(slug) {
3993
- return BY_SLUG.get(slug);
3994
- }
3995
- function familyByGroup() {
3996
- return FAMILY_GROUPS.map((g) => ({ ...g, sites: FAMILY.filter((s) => s.group === g.id) }));
3997
- }
3998
- var LEGAL_LINKS = [
3999
- { href: `${OCHK_IO}/privacy`, label: "Privacy" },
4000
- { href: `${OCHK_IO}/terms`, label: "Terms" },
4001
- { href: `${OCHK_IO}/security`, label: "Security" },
4002
- { href: `${OCHK_IO}/trademark`, label: "Trademarks" },
4003
- { href: `${OCHK_IO}/contact`, label: "Contact" }
4004
- ];
4005
- var SELF_HOSTED_LEGAL_LINKS = [
4006
- { href: "/privacy", label: "Privacy" },
4007
- { href: "/terms", label: "Terms" },
4008
- { href: "/security", label: "Security" },
4009
- { href: `${OCHK_IO}/trademark`, label: "Trademarks" },
4010
- { href: "/contact", label: "Contact" }
4011
- ];
4012
- var OCHK_IO_NAV = [
4013
- {
4014
- href: `${OCHK_IO}/protocols`,
4015
- label: "Protocols",
4016
- children: PROTOCOLS.map((p) => ({ href: p.pageHref, label: p.label, description: p.line }))
4017
- },
4018
- { href: `${OCHK_IO}/apps`, label: "Apps" },
4019
- { href: DOCS_HREF, label: "Docs" },
4020
- { href: `${OCHK_IO}/trust`, label: "Trust" },
4021
- { href: `${OCHK_IO}/about`, label: "About" }
4022
- ];
4023
- var OCHK_IO_FOOTER = [
4024
- {
4025
- heading: "Company",
4026
- links: [
4027
- { href: `${OCHK_IO}/about`, label: "About" },
4028
- { href: `${OCHK_IO}/trust`, label: "Trust" },
4029
- { href: "https://github.com/orangecheck", label: "GitHub", external: true }
4030
- ]
4031
- }
4032
- ];
4033
4052
  var InDocsContext = sharedContext("in-docs", false);
4034
4053
  function useInDocs() {
4035
4054
  return react.useContext(InDocsContext);
@@ -4846,6 +4865,7 @@ function SignMessage({
4846
4865
  error,
4847
4866
  submitLabel = "Confirm",
4848
4867
  secondary,
4868
+ scheme = "bip322",
4849
4869
  onSignature,
4850
4870
  className
4851
4871
  }) {
@@ -4860,7 +4880,7 @@ function SignMessage({
4860
4880
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-px flex-1 bg-border" })
4861
4881
  ] })
4862
4882
  ] }) : null,
4863
- /* @__PURE__ */ jsxRuntime.jsx(CodeBlock, { code: message, caption: "Message to sign" }),
4883
+ /* @__PURE__ */ jsxRuntime.jsx(CodeBlock, { code: message, caption: "Message to sign", wrap: true }),
4864
4884
  /* @__PURE__ */ jsxRuntime.jsxs(
4865
4885
  "form",
4866
4886
  {
@@ -4876,7 +4896,9 @@ function SignMessage({
4876
4896
  label: "Signature",
4877
4897
  error,
4878
4898
  hint: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
4879
- "From your wallet\u2019s \u201Csign message\u201D (BIP-322), signed by",
4899
+ "From your wallet\u2019s \u201Csign message\u201D (",
4900
+ scheme === "legacy" ? "legacy, BIP-137" : "BIP-322",
4901
+ "), signed by",
4880
4902
  " ",
4881
4903
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "break-all font-mono", children: address }),
4882
4904
  "."
@@ -5388,7 +5410,7 @@ function FormSection({
5388
5410
  "aria-current": status === "current" ? "step" : void 0,
5389
5411
  className: cn("scroll-mt-24 rounded-[1.25rem] border border-border bg-card", className),
5390
5412
  children: [
5391
- /* @__PURE__ */ jsxRuntime.jsxs("header", { className: cn("flex items-start gap-3.5", tight ? "px-5 pt-5" : "px-6 pt-6"), children: [
5413
+ /* @__PURE__ */ jsxRuntime.jsxs("header", { className: cn("flex flex-wrap items-start gap-x-3.5 gap-y-3", tight ? "px-5 pt-5" : "px-6 pt-6"), children: [
5392
5414
  n !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx(
5393
5415
  "span",
5394
5416
  {
@@ -5415,7 +5437,7 @@ function FormSection({
5415
5437
  ] }),
5416
5438
  hint ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[0.875rem] leading-snug text-muted-foreground", children: hint }) : null
5417
5439
  ] }),
5418
- action ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0", children: action }) : null
5440
+ action ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("shrink-0 max-sm:basis-full", n !== void 0 && "max-sm:pl-[2.625rem]"), children: action }) : null
5419
5441
  ] }),
5420
5442
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex flex-col", tight ? "gap-4 p-5" : "gap-5 p-6", n !== void 0 && (tight ? "sm:pl-[3.875rem]" : "sm:pl-[4.125rem]")), children })
5421
5443
  ]
@@ -5645,27 +5667,30 @@ function FilterChips({
5645
5667
  onChange(cur.includes(v) ? cur.filter((x) => x !== v) : [...cur, v]);
5646
5668
  } else onChange(v);
5647
5669
  };
5648
- return /* @__PURE__ */ jsxRuntime.jsx(ScrollFade, { fade: "var(--background)", className: cn("w-full", className), children: /* @__PURE__ */ jsxRuntime.jsx("div", { role: "group", "aria-label": label, className: "flex w-max items-center gap-2 py-0.5", children: options.map((o) => {
5649
- const on = isOn(o.value);
5650
- return /* @__PURE__ */ jsxRuntime.jsxs(
5651
- "button",
5652
- {
5653
- type: "button",
5654
- "aria-pressed": on,
5655
- onClick: () => press(o.value),
5656
- className: cn(
5657
- "inline-flex shrink-0 items-center gap-1.5 rounded-full border px-3.5 text-[0.875rem] transition-colors",
5658
- tight ? "h-8" : "h-9",
5659
- on ? "border-foreground bg-foreground text-background" : "border-border bg-card text-muted-foreground hover:border-oca-hairline-strong hover:text-foreground"
5660
- ),
5661
- children: [
5662
- o.label,
5663
- o.count !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "oca-tabular", children: o.count.toLocaleString("en-US") }) : null
5664
- ]
5665
- },
5666
- o.value
5667
- );
5668
- }) }) });
5670
+ return (
5671
+ // Wraps rather than scrolls: every filter stays in view on a phone.
5672
+ /* @__PURE__ */ jsxRuntime.jsx("div", { role: "group", "aria-label": label, className: cn("flex flex-wrap items-center gap-2 py-0.5", className), children: options.map((o) => {
5673
+ const on = isOn(o.value);
5674
+ return /* @__PURE__ */ jsxRuntime.jsxs(
5675
+ "button",
5676
+ {
5677
+ type: "button",
5678
+ "aria-pressed": on,
5679
+ onClick: () => press(o.value),
5680
+ className: cn(
5681
+ "inline-flex shrink-0 items-center gap-1.5 rounded-full border px-3.5 text-[0.875rem] transition-colors",
5682
+ tight ? "h-8" : "h-9",
5683
+ on ? "border-foreground bg-foreground text-background" : "border-border bg-card text-muted-foreground hover:border-oca-hairline-strong hover:text-foreground"
5684
+ ),
5685
+ children: [
5686
+ o.label,
5687
+ o.count !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "oca-tabular", children: o.count.toLocaleString("en-US") }) : null
5688
+ ]
5689
+ },
5690
+ o.value
5691
+ );
5692
+ }) })
5693
+ );
5669
5694
  }
5670
5695
  function ToolGrid({
5671
5696
  tools,
@@ -6420,12 +6445,14 @@ function SignInFrame({
6420
6445
  error,
6421
6446
  fineprint,
6422
6447
  brand,
6423
- home = "/",
6448
+ home,
6449
+ protocol: protocol2,
6424
6450
  back,
6425
6451
  art,
6426
6452
  caption,
6427
6453
  className
6428
6454
  }) {
6455
+ const homeHref = home ?? (protocol2 ? protocolSite(protocol2).pageHref : OCHK_IO);
6429
6456
  return /* @__PURE__ */ jsxRuntime.jsxs(
6430
6457
  "main",
6431
6458
  {
@@ -6434,14 +6461,14 @@ function SignInFrame({
6434
6461
  children: [
6435
6462
  /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "flex flex-col px-4 pb-8 pt-5 sm:px-8 lg:px-14 lg:pt-8", children: [
6436
6463
  /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "flex items-center justify-between gap-4", children: [
6437
- /* @__PURE__ */ jsxRuntime.jsxs(Link6__default.default, { href: home, className: "w-fit rounded-lg", children: [
6464
+ /* @__PURE__ */ jsxRuntime.jsxs(Link6__default.default, { href: homeHref, className: "w-fit rounded-lg", children: [
6438
6465
  brand ?? /* @__PURE__ */ jsxRuntime.jsx(Lockup, { size: 28 }),
6439
6466
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: " home" })
6440
6467
  ] }),
6441
6468
  back === void 0 ? /* @__PURE__ */ jsxRuntime.jsx(
6442
6469
  Link6__default.default,
6443
6470
  {
6444
- href: home,
6471
+ href: homeHref,
6445
6472
  className: "text-[0.9375rem] text-muted-foreground underline-offset-4 hover:text-foreground hover:underline",
6446
6473
  children: "Back to home"
6447
6474
  }
@@ -6690,6 +6717,7 @@ function ToolShell({
6690
6717
  children
6691
6718
  }) {
6692
6719
  const p = protocolSite(protocol2);
6720
+ const homeHref = home ?? p.pageHref;
6693
6721
  const app = variant === "app";
6694
6722
  const tabs = app ? null : tabsFor([{ items: [...tools] }]);
6695
6723
  const about = /* @__PURE__ */ jsxRuntime.jsxs(
@@ -6719,7 +6747,7 @@ function ToolShell({
6719
6747
  SiteHeader,
6720
6748
  {
6721
6749
  variant: "tool",
6722
- home: home ?? p.pageHref,
6750
+ home: homeHref,
6723
6751
  product: p.label,
6724
6752
  family: protocol2,
6725
6753
  nav: tools.map((t) => ({ href: t.href, label: t.label, active: t.active })),
@@ -6744,7 +6772,7 @@ function ToolShell({
6744
6772
  {
6745
6773
  id: "main-content",
6746
6774
  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"),
6747
- children: app ? children : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-[72rem]", children })
6775
+ children: /* @__PURE__ */ jsxRuntime.jsx(SiteHomeContext.Provider, { value: homeHref, children: app ? children : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full max-w-[72rem]", children }) })
6748
6776
  }
6749
6777
  )
6750
6778
  ] }),