@orangecheck/app-design 1.6.1 → 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 (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 +156 -130
  5. package/dist/chrome.js.map +1 -1
  6. package/dist/chrome.mjs +155 -131
  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 +135 -13
  11. package/dist/components.js.map +1 -1
  12. package/dist/components.mjs +132 -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 +197 -48
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs +189 -49
  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 +5 -3
  33. package/dist/mdx.js.map +1 -1
  34. package/dist/mdx.mjs +5 -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 +122 -1
  45. package/dist/session.js.map +1 -1
  46. package/dist/session.mjs +122 -1
  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 +5 -0
  52. package/dist/{tool-shell-CQZNRUgH.d.mts → tool-shell-CnZ3NUSi.d.ts} +10 -4
  53. package/dist/{tool-shell-CRmceGrV.d.ts → tool-shell-DQFEMLLe.d.mts} +10 -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 +5 -2
package/dist/mdx.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/code/highlight.ts","../src/lib/cn.ts","../src/primitives/scroll-fade.tsx","../src/lib/shared-context.ts","../src/primitives/feedback.tsx","../src/primitives/button.tsx","../src/components/data.tsx","../src/components/code-block.tsx","../src/primitives/badge.tsx","../src/primitives/status-badge.tsx","../src/components/docs.tsx","../src/family/index.ts","../src/lib/docs-context.ts","../src/components/family-grids.tsx","../src/components/text-link.tsx","../src/components/protocol.tsx","../src/mdx/index.tsx"],"names":["jsx","extendTailwindMerge","clsx","useRef","useState","useCallback","useEffect","jsxs","createContext","forwardRef","Separator","SeparatorPrimitive","cva","Button","Slot","Fragment","Check","Copy","useMemo","useSyncExternalStore","TabsPrimitive","Link","ArrowRight","ArrowUpRight","useId","isValidElement","Children","useContext","router","useRouter","protocol"],"mappings":"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","file":"mdx.js","sourcesContent":["/*\n * Syntax highlighting with no dependency and no async step, so code is\n * coloured in the server's HTML: at build time in the docs (rehypeCode), and\n * in a page's own render for code made at run time (an envelope, an install\n * line). It reads the languages the family writes: TypeScript and JavaScript\n * (with JSX), JSON, shell, Python, YAML and diffs. Anything else is shown as\n * plain text, never guessed at.\n *\n * Each token names a kind; the kind is a class, and the class is a colour in\n * tokens.css (--oca-code-*). One palette for every highlighter: the shiki\n * theme in ./theme maps TextMate scopes onto the same variables.\n */\n\nexport type TokenKind =\n | 'keyword'\n | 'string'\n | 'number'\n | 'function'\n | 'type'\n | 'property'\n | 'comment'\n | 'tag'\n | 'url';\n\nexport interface Token {\n text: string;\n kind?: TokenKind;\n}\n\n/** One line of code, as tokens. */\nexport type CodeLine = Token[];\n\n/** The class each kind is drawn with (styles/code.css). */\nexport const TOKEN_CLASS: Record<TokenKind, string> = {\n keyword: 'oca-k',\n string: 'oca-s',\n number: 'oca-n',\n function: 'oca-f',\n type: 'oca-y',\n property: 'oca-p',\n comment: 'oca-c',\n tag: 'oca-g',\n url: 'oca-u',\n};\n\ntype Grammar = 'js' | 'json' | 'shell' | 'python' | 'yaml' | 'diff' | 'plain';\n\nconst ALIASES: Record<string, Grammar> = {\n ts: 'js',\n typescript: 'js',\n tsx: 'js',\n js: 'js',\n javascript: 'js',\n jsx: 'js',\n mjs: 'js',\n cjs: 'js',\n json: 'json',\n jsonc: 'json',\n json5: 'json',\n bash: 'shell',\n sh: 'shell',\n shell: 'shell',\n zsh: 'shell',\n console: 'shell',\n terminal: 'shell',\n py: 'python',\n python: 'python',\n yaml: 'yaml',\n yml: 'yaml',\n diff: 'diff',\n};\n\n/** The languages read, by the names a code fence uses. */\nexport const CODE_LANGS: readonly string[] = Object.keys(ALIASES);\n\nexport function grammarOf(lang?: string | null): Grammar {\n return (lang && ALIASES[lang.toLowerCase()]) || 'plain';\n}\n\n/* ── Scanner ─────────────────────────────────────────────────────────── */\n\ntype Emit = (text: string, kind?: TokenKind) => void;\n\n/** Collects tokens, merging neighbours of one kind so the markup stays small. */\nfunction collector(): { emit: Emit; tokens: Token[] } {\n const tokens: Token[] = [];\n const emit: Emit = (text, kind) => {\n if (!text) return;\n const last = tokens[tokens.length - 1];\n if (last && last.kind === kind) last.text += text;\n else tokens.push(kind ? { text, kind } : { text });\n };\n return { emit, tokens };\n}\n\nfunction at(re: RegExp, src: string, i: number): string | null {\n re.lastIndex = i;\n const m = re.exec(src);\n return m ? m[0] : null;\n}\n\nconst WS = /[ \\t]+/y;\nconst NEWLINE = /\\r?\\n/y;\n\n/* ── JavaScript, TypeScript, JSX ─────────────────────────────────────── */\n\nconst JS_KEYWORDS = new Set(\n (\n 'abstract as async await break case catch class const continue debugger declare default delete do else enum export ' +\n 'extends finally for from function get if implements import in infer instanceof interface is keyof let module ' +\n 'namespace new of override private protected public readonly return satisfies set static super switch this throw ' +\n 'try type typeof unique var void while with yield'\n ).split(' ')\n);\nconst JS_CONSTANTS = new Set(['true', 'false', 'null', 'undefined', 'NaN', 'Infinity']);\nconst TS_PRIMITIVES = new Set(['string', 'number', 'boolean', 'bigint', 'symbol', 'object', 'unknown', 'any', 'never']);\n\n/* MAX_SATS, DOCS_HREF: a constant. JSON, URL: a namespace, read as a type. */\nconst isConstant = (m: string) => /^[A-Z][A-Z\\d_]+$/.test(m) && (m.includes('_') || m.length > 4);\n\nconst JS_LINE_COMMENT = /\\/\\/[^\\n]*/y;\nconst JS_BLOCK_COMMENT = /\\/\\*[\\s\\S]*?(?:\\*\\/|$)/y;\nconst JS_TEMPLATE = /`(?:\\\\[\\s\\S]|[^\\\\`])*`?/y;\nconst JS_STRING = /'(?:\\\\.|[^\\\\'\\n])*'?|\"(?:\\\\.|[^\\\\\"\\n])*\"?/y;\nconst JS_NUMBER = /(?:0[xX][\\da-fA-F_]+|0[bB][01_]+|0[oO][0-7_]+|\\d[\\d_]*(?:\\.[\\d_]+)?(?:[eE][+-]?\\d+)?|\\.\\d[\\d_]*(?:[eE][+-]?\\d+)?)n?/y;\nconst JS_IDENT = /[A-Za-z_$][\\w$]*/y;\nconst JS_DECORATOR = /@[A-Za-z_$][\\w$.]*/y;\nconst JS_CALL_AFTER = /\\s*(?:<[\\w$\\s,.[\\]|&'\"]*>)?\\s*\\(/y;\nconst JS_TAG = /<\\/?(?=[A-Za-z])/y;\nconst JS_TAG_NAME = /[A-Za-z][\\w$.:-]*/y;\nconst JS_PUNCT = /=>|\\.\\.\\.|[{}()[\\];,.<>=+\\-*/%!?:&|^~#]/y;\n/* Where a JSX tag can start: after one of these, or at the start of a line. */\nconst JSX_BEFORE = new Set(['(', ',', '=', '?', ':', '{', '[', ';', '>', '&&', '||', '=>', 'return']);\n\nfunction scanJs(src: string, emit: Emit, jsx: boolean) {\n let i = 0;\n let prev = ''; // the last significant token, for property access and JSX starts\n let tagDepth = 0; // inside <Tag …> before its >\n let braceInTag = 0; // a {…} expression inside a tag's attributes\n const sig = (t: string) => {\n prev = t;\n };\n while (i < src.length) {\n let m: string | null;\n if ((m = at(WS, src, i)) || (m = at(NEWLINE, src, i))) {\n emit(m);\n i += m.length;\n continue;\n }\n if ((m = at(JS_LINE_COMMENT, src, i)) || (m = at(JS_BLOCK_COMMENT, src, i))) {\n emit(m, 'comment');\n i += m.length;\n continue;\n }\n if ((m = at(JS_TEMPLATE, src, i)) || (m = at(JS_STRING, src, i))) {\n emit(m, 'string');\n i += m.length;\n sig('\"');\n continue;\n }\n if (jsx && tagDepth === 0 && (m = at(JS_TAG, src, i)) && (prev === '' || JSX_BEFORE.has(prev))) {\n const name = at(JS_TAG_NAME, src, i + m.length);\n if (name) {\n emit(m);\n emit(name, 'tag');\n i += m.length + name.length;\n tagDepth = 1;\n braceInTag = 0;\n sig('tag');\n continue;\n }\n }\n if (jsx && tagDepth > 0 && braceInTag === 0) {\n if (src.startsWith('/>', i) || src[i] === '>') {\n const close = src[i] === '>' ? '>' : '/>';\n emit(close);\n i += close.length;\n tagDepth = 0;\n sig('>');\n continue;\n }\n if ((m = at(JS_IDENT, src, i)) && /^\\s*=/.test(src.slice(i + m.length, i + m.length + 4))) {\n emit(m, 'property');\n i += m.length;\n continue;\n }\n if ((m = at(JS_IDENT, src, i))) {\n emit(m, 'property');\n i += m.length;\n continue;\n }\n if (src[i] === '{') braceInTag = 1;\n } else if (jsx && tagDepth > 0 && braceInTag > 0) {\n if (src[i] === '{') braceInTag++;\n else if (src[i] === '}') braceInTag--;\n }\n if ((m = at(JS_DECORATOR, src, i))) {\n emit(m, 'function');\n i += m.length;\n sig('@');\n continue;\n }\n if ((m = at(JS_IDENT, src, i))) {\n const end = i + m.length;\n let kind: TokenKind | undefined;\n if (prev !== '.' && JS_CONSTANTS.has(m)) kind = 'number';\n else if (prev !== '.' && JS_KEYWORDS.has(m)) kind = 'keyword';\n else if (at(JS_CALL_AFTER, src, end) !== null) kind = 'function';\n else if (prev !== '.' && TS_PRIMITIVES.has(m)) kind = 'type';\n else if (isConstant(m)) kind = 'number';\n else if (/^[A-Z]/.test(m)) kind = 'type';\n emit(m, kind);\n i = end;\n sig(kind === 'keyword' ? m : 'id');\n continue;\n }\n if ((m = at(JS_NUMBER, src, i))) {\n emit(m, 'number');\n i += m.length;\n sig('0');\n continue;\n }\n if ((m = at(JS_PUNCT, src, i))) {\n emit(m);\n i += m.length;\n sig(m === '.' ? '.' : m);\n continue;\n }\n emit(src[i]!);\n i++;\n }\n}\n\n/* ── JSON ────────────────────────────────────────────────────────────── */\n\nconst JSON_STRING = /\"(?:\\\\.|[^\\\\\"\\n])*\"?/y;\nconst JSON_KEY_AFTER = /\\s*:/y;\nconst JSON_NUMBER = /-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/y;\nconst JSON_WORD = /true|false|null/y;\n\nfunction scanJson(src: string, emit: Emit) {\n let i = 0;\n while (i < src.length) {\n let m: string | null;\n if ((m = at(JS_LINE_COMMENT, src, i)) || (m = at(JS_BLOCK_COMMENT, src, i))) {\n emit(m, 'comment');\n } else if ((m = at(JSON_STRING, src, i))) {\n emit(m, at(JSON_KEY_AFTER, src, i + m.length) !== null ? 'property' : 'string');\n } else if ((m = at(JSON_NUMBER, src, i)) || (m = at(JSON_WORD, src, i))) {\n emit(m, 'number');\n } else {\n m = src[i]!;\n emit(m);\n }\n i += m.length;\n }\n}\n\n/* ── Shell ───────────────────────────────────────────────────────────── */\n\nconst SH_KEYWORDS = new Set(\n 'if then else elif fi for in do done case esac while until function return export local select time'.split(' ')\n);\nconst SH_PROMPT = /\\$ (?=\\S)/y;\nconst SH_COMMENT = /#[^\\n]*/y;\nconst SH_SINGLE = /'[^']*'?/y;\nconst SH_DOUBLE = /\"(?:\\\\.|[^\\\\\"])*\"?/y;\nconst SH_VAR = /\\$(?:\\{[^}\\n]*\\}?|[A-Za-z_][\\w]*|[@*#?$!\\d])/y;\nconst SH_URL = /https?:\\/\\/[^\\s'\"`)]+/y;\nconst SH_FLAG = /--?[A-Za-z][\\w-]*/y;\nconst SH_ASSIGN = /[A-Za-z_][\\w]*(?==)/y;\nconst SH_VALUE = /=[^\\s|&;()<>'\"`$]*/y;\nconst SH_WORD = /[^\\s|&;()<>'\"`$#]+/y;\nconst SH_OPERATOR = /\\|\\||&&|[|;&]|\\$\\(|[()<>]/y;\n\nfunction scanShell(src: string, emit: Emit) {\n let i = 0;\n let command = true; // the next word is a command\n let lineStart = true;\n while (i < src.length) {\n let m: string | null;\n if ((m = at(NEWLINE, src, i))) {\n emit(m);\n i += m.length;\n // A trailing backslash continues the command on the next line.\n command = !/\\\\\\s*$/.test(src.slice(0, i - m.length));\n lineStart = true;\n continue;\n }\n if ((m = at(WS, src, i))) {\n emit(m);\n i += m.length;\n continue;\n }\n if (lineStart && (m = at(SH_PROMPT, src, i))) {\n emit(m, 'comment');\n i += m.length;\n lineStart = false;\n continue;\n }\n lineStart = false;\n // A # starts a comment at the start of a word, not inside one (url#frag).\n if ((m = at(SH_COMMENT, src, i)) && (i === 0 || /\\s/.test(src[i - 1]!))) {\n emit(m, 'comment');\n i += m.length;\n continue;\n }\n if ((m = at(SH_SINGLE, src, i)) || (m = at(SH_DOUBLE, src, i))) {\n emit(m, 'string');\n i += m.length;\n command = false;\n continue;\n }\n if ((m = at(SH_OPERATOR, src, i))) {\n emit(m);\n i += m.length;\n command = m !== ')' && m !== '>' && m !== '<';\n continue;\n }\n if ((m = at(SH_VAR, src, i))) {\n emit(m, 'type');\n i += m.length;\n command = false;\n continue;\n }\n if ((m = at(SH_URL, src, i))) {\n emit(m, 'url');\n i += m.length;\n command = false;\n continue;\n }\n if (command && (m = at(SH_ASSIGN, src, i))) {\n // FOO=bar cmd: the name, then its value; the command comes after.\n emit(m, 'property');\n i += m.length;\n const v = at(SH_VALUE, src, i)!;\n emit(v);\n i += v.length;\n continue;\n }\n if ((m = at(SH_FLAG, src, i)) && !command) {\n emit(m, 'keyword');\n i += m.length;\n continue;\n }\n if ((m = at(SH_WORD, src, i))) {\n if (command && SH_KEYWORDS.has(m)) emit(m, 'keyword');\n else if (command) {\n emit(m, 'function');\n // `sudo npm …`, `npx tsx …`: the next word is the real command.\n command = m === 'sudo' || m === 'npx' || m === 'env' || m === 'time';\n i += m.length;\n continue;\n } else emit(m);\n i += m.length;\n continue;\n }\n emit(src[i]!);\n i++;\n }\n}\n\n/* ── Python ──────────────────────────────────────────────────────────── */\n\nconst PY_KEYWORDS = new Set(\n (\n 'and as assert async await break class continue def del elif else except finally for from global if import in is ' +\n 'lambda match case nonlocal not or pass raise return try while with yield self cls'\n ).split(' ')\n);\nconst PY_CONSTANTS = new Set(['True', 'False', 'None']);\nconst PY_TYPES = new Set(['int', 'str', 'bool', 'float', 'bytes', 'list', 'dict', 'tuple', 'set', 'object']);\nconst PY_COMMENT = /#[^\\n]*/y;\nconst PY_TRIPLE = /[rRbBuUfF]{0,2}(?:\"\"\"[\\s\\S]*?(?:\"\"\"|$)|'''[\\s\\S]*?(?:'''|$))/y;\nconst PY_STRING = /[rRbBuUfF]{0,2}(?:'(?:\\\\.|[^\\\\'\\n])*'?|\"(?:\\\\.|[^\\\\\"\\n])*\"?)/y;\nconst PY_NUMBER = /(?:0[xX][\\da-fA-F_]+|\\d[\\d_]*(?:\\.[\\d_]*)?(?:[eE][+-]?\\d+)?j?)/y;\nconst PY_IDENT = /[A-Za-z_]\\w*/y;\nconst PY_DECORATOR = /@[A-Za-z_][\\w.]*/y;\nconst PY_CALL_AFTER = /\\s*\\(/y;\n\nfunction scanPython(src: string, emit: Emit) {\n let i = 0;\n let prev = '';\n while (i < src.length) {\n let m: string | null;\n if ((m = at(WS, src, i)) || (m = at(NEWLINE, src, i))) {\n emit(m);\n i += m.length;\n continue;\n }\n if ((m = at(PY_COMMENT, src, i))) {\n emit(m, 'comment');\n } else if ((m = at(PY_TRIPLE, src, i)) || (m = at(PY_STRING, src, i))) {\n // An identifier like `f` or `rb` is only a prefix when a quote follows.\n if (/^[A-Za-z]+$/.test(m)) {\n emit(m);\n } else emit(m, 'string');\n prev = '\"';\n } else if ((m = at(PY_DECORATOR, src, i))) {\n emit(m, 'function');\n prev = '@';\n } else if ((m = at(PY_IDENT, src, i))) {\n let kind: TokenKind | undefined;\n if (PY_CONSTANTS.has(m)) kind = 'number';\n else if (prev !== '.' && PY_KEYWORDS.has(m)) kind = 'keyword';\n else if (prev === 'def' || at(PY_CALL_AFTER, src, i + m.length) !== null) kind = 'function';\n else if (prev === 'class' || /^[A-Z][a-z]/.test(m) || PY_TYPES.has(m)) kind = 'type';\n else if (isConstant(m)) kind = 'number';\n emit(m, kind);\n prev = kind === 'keyword' ? m : 'id';\n } else if ((m = at(PY_NUMBER, src, i))) {\n emit(m, 'number');\n prev = '0';\n } else {\n m = src[i]!;\n emit(m);\n prev = m;\n }\n i += m.length;\n }\n}\n\n/* ── YAML ────────────────────────────────────────────────────────────── */\n\nconst YAML_KEY = /[ \\t]*(?:- )?[\\w.$/-]+(?=[ \\t]*:(?:\\s|$))/y;\nconst YAML_VALUE_WORD = /(?:true|false|null|yes|no|~|-?\\d+(?:\\.\\d+)?)(?=\\s*(?:#|$))/y;\n\nfunction scanYaml(src: string, emit: Emit) {\n let i = 0;\n let lineStart = true;\n while (i < src.length) {\n let m: string | null;\n if ((m = at(NEWLINE, src, i))) {\n emit(m);\n i += m.length;\n lineStart = true;\n continue;\n }\n if (lineStart && (m = at(YAML_KEY, src, i))) {\n const dash = m.match(/^([ \\t]*(?:- )?)/)![1]!;\n emit(dash);\n emit(m.slice(dash.length), 'property');\n i += m.length;\n lineStart = false;\n continue;\n }\n lineStart = false;\n if ((m = at(SH_COMMENT, src, i)) && (i === 0 || /\\s/.test(src[i - 1]!))) emit(m, 'comment');\n else if ((m = at(SH_SINGLE, src, i)) || (m = at(JSON_STRING, src, i))) emit(m, 'string');\n else if ((m = at(YAML_VALUE_WORD, src, i))) emit(m, 'number');\n else if ((m = at(SH_URL, src, i))) emit(m, 'url');\n else {\n m = src[i]!;\n emit(m);\n }\n i += m.length;\n }\n}\n\n/* ── Lines ───────────────────────────────────────────────────────────── */\n\n/** Split tokens into lines; a token that spans lines (a block comment) is cut at each break. */\nfunction toLines(tokens: Token[]): CodeLine[] {\n const lines: CodeLine[] = [[]];\n for (const t of tokens) {\n const parts = t.text.split(/\\r?\\n/);\n parts.forEach((part, j) => {\n if (j > 0) lines.push([]);\n if (part) lines[lines.length - 1]!.push(t.kind ? { text: part, kind: t.kind } : { text: part });\n });\n }\n return lines;\n}\n\n/**\n * Highlight `code` written in `lang` (a fence name: ts, json, bash…). Returns\n * one array of tokens per line. An unknown language comes back as plain text.\n */\nexport function highlight(code: string, lang?: string | null): CodeLine[] {\n // A trailing newline (every fence has one) is not an extra empty line.\n const src = code.replace(/\\r?\\n$/, '');\n const grammar = grammarOf(lang);\n const { emit, tokens } = collector();\n const name = (lang ?? '').toLowerCase();\n switch (grammar) {\n case 'js':\n scanJs(src, emit, name === 'tsx' || name === 'jsx');\n break;\n case 'json':\n scanJson(src, emit);\n break;\n case 'shell':\n scanShell(src, emit);\n break;\n case 'python':\n scanPython(src, emit);\n break;\n case 'yaml':\n scanYaml(src, emit);\n break;\n default:\n emit(src);\n }\n return toLines(tokens);\n}\n\n/* ── Line marks: highlight, diff ─────────────────────────────────────── */\n\nexport type DiffMark = 'add' | 'remove';\n\nexport interface LineMarks {\n /** 1-based line numbers to mark as highlighted. */\n highlight?: ReadonlySet<number>;\n /** 1-based line numbers added or removed. */\n diff?: ReadonlyMap<number, DiffMark>;\n}\n\n/**\n * Read `+` and `-` at the start of each line as a diff, and return the code\n * without them and the marks. A line that starts with neither is context; a\n * single leading space (as `git diff` writes context) is dropped too.\n */\nexport function readDiff(code: string): { code: string; diff: Map<number, DiffMark> } {\n const diff = new Map<number, DiffMark>();\n const lines = code.replace(/\\r?\\n$/, '').split(/\\r?\\n/);\n const out = lines.map((line, i) => {\n const c = line[0];\n if (c === '+' || c === '-') {\n diff.set(i + 1, c === '+' ? 'add' : 'remove');\n return line.slice(1);\n }\n return c === ' ' ? line.slice(1) : line;\n });\n return { code: out.join('\\n'), diff };\n}\n\n/** \"1,3-5\" → {1, 3, 4, 5}. Out-of-order and repeated parts are fine. */\nexport function parseLineRanges(spec: string | readonly number[] | undefined | null): Set<number> {\n if (!spec) return new Set();\n if (typeof spec !== 'string') return new Set(spec);\n const out = new Set<number>();\n for (const part of spec.split(',')) {\n const m = part.trim().match(/^(\\d+)(?:\\s*-\\s*(\\d+))?$/);\n if (!m) continue;\n const a = Number(m[1]);\n const b = m[2] ? Number(m[2]) : a;\n for (let n = Math.min(a, b); n <= Math.max(a, b) && n - a < 10_000; n++) out.add(n);\n }\n return out;\n}\n\n/** What a fence's meta string says: ```ts title=\"gate.ts\" {2,4} diff showLineNumbers */\nexport interface CodeMeta {\n title?: string;\n highlight?: string;\n diff?: boolean;\n lineNumbers?: boolean;\n}\n\nexport function parseCodeMeta(meta?: string | null): CodeMeta {\n if (!meta) return {};\n const out: CodeMeta = {};\n const title = meta.match(/(?:title|filename)=(?:\"([^\"]*)\"|'([^']*)'|(\\S+))/);\n if (title) out.title = title[1] ?? title[2] ?? title[3];\n const lines = meta.match(/\\{([\\d,\\s-]+)\\}/);\n if (lines) out.highlight = lines[1]!.replace(/\\s+/g, '');\n const rest = meta.replace(/(?:title|filename)=(?:\"[^\"]*\"|'[^']*'|\\S+)/, '');\n if (/\\bdiff\\b/.test(rest)) out.diff = true;\n if (/\\b(?:showLineNumbers|lineNumbers|numbers)\\b/.test(rest)) out.lineNumbers = true;\n return out;\n}\n\n/* ── HTML ────────────────────────────────────────────────────────────── */\n\nconst ESCAPE: Record<string, string> = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;' };\nexport function escapeHtml(s: string): string {\n return s.replace(/[&<>\"]/g, (c) => ESCAPE[c]!);\n}\n\n/**\n * Lines as markup for CodeBlock's `html`: one `<span data-line>` per line\n * (with `data-mark` or `data-diff` where marked), tokens as classed spans,\n * lines joined by newlines so selecting and copying keeps them.\n */\nexport function linesToHtml(lines: CodeLine[], marks: LineMarks = {}): string {\n return lines\n .map((line, i) => {\n const n = i + 1;\n const attrs = [\n 'data-line=\"\"',\n marks.highlight?.has(n) ? 'data-mark=\"\"' : '',\n marks.diff?.has(n) ? `data-diff=\"${marks.diff.get(n)}\"` : '',\n ]\n .filter(Boolean)\n .join(' ');\n const body = line\n .map((t) => (t.kind ? `<span class=\"${TOKEN_CLASS[t.kind]}\">${escapeHtml(t.text)}</span>` : escapeHtml(t.text)))\n .join('');\n return `<span ${attrs}>${body}</span>`;\n })\n .join('\\n');\n}\n\n/** Highlight and render in one step, reading `diff` and line ranges as CodeBlock does. */\nexport function highlightToHtml(\n code: string,\n lang?: string | null,\n opts: { highlight?: string | readonly number[]; diff?: boolean } = {}\n): string {\n const d = opts.diff ? readDiff(code) : null;\n return linesToHtml(highlight(d ? d.code : code, lang), {\n highlight: parseLineRanges(opts.highlight),\n diff: d?.diff,\n });\n}\n","import { clsx, type ClassValue } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\n// tailwind-merge would treat `oca-display-1` and `text-foreground` as the same\n// group and drop one; teach it the package's own type utilities.\nconst merge = extendTailwindMerge<'oca-type'>({\n extend: {\n classGroups: {\n 'oca-type': [\n 'oca-display-1',\n 'oca-display-2',\n 'oca-display-3',\n 'oca-title',\n 'oca-title-sm',\n 'oca-eyebrow',\n 'oca-lead',\n 'oca-body',\n 'oca-numeral',\n ],\n },\n },\n});\n\nexport function cn(...inputs: ClassValue[]): string {\n return merge(clsx(inputs));\n}\n","import { useCallback, useEffect, useRef, useState, type HTMLAttributes } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/*\n * A horizontal scroller that says when there is more. Content that is wider\n * than its box scrolls instead of being clipped, and a soft edge appears on\n * whichever side hides something. Tables, code and tab bars all use it.\n */\nexport interface ScrollFadeProps extends HTMLAttributes<HTMLDivElement> {\n /** The colour under the scroller, as a CSS value; the edge fades to it. */\n fade?: string;\n /** Classes for the scrolling element itself. */\n innerClassName?: string;\n}\n\nexport function ScrollFade({ fade = 'var(--card)', className, innerClassName, children, ...props }: ScrollFadeProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [edges, setEdges] = useState({ left: false, right: false });\n const measure = useCallback(() => {\n const el = ref.current;\n if (!el) return;\n const left = el.scrollLeft > 1;\n const right = el.scrollLeft + el.clientWidth < el.scrollWidth - 1;\n setEdges((e) => (e.left === left && e.right === right ? e : { left, right }));\n }, []);\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n measure();\n // Without ResizeObserver (old engines, jsdom) the edges still follow scrolling.\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n if (el.firstElementChild) ro.observe(el.firstElementChild);\n return () => ro.disconnect();\n }, [measure]);\n return (\n <div className={cn('relative min-w-0', className)} {...props}>\n <div\n ref={ref}\n onScroll={measure}\n // While it hides something, a keyboard can reach it to scroll.\n tabIndex={edges.left || edges.right ? 0 : undefined}\n className={cn(\n 'overflow-x-auto overscroll-x-contain rounded-[inherit] outline-none focus-visible:ring-2 focus-visible:ring-ring',\n innerClassName\n )}\n >\n {children}\n </div>\n <span\n aria-hidden\n className={cn(\n 'pointer-events-none absolute inset-y-0 left-0 w-8 transition-opacity duration-150',\n edges.left ? 'opacity-100' : 'opacity-0'\n )}\n style={{ background: `linear-gradient(to right, ${fade}, transparent)` }}\n />\n <span\n aria-hidden\n className={cn(\n 'pointer-events-none absolute inset-y-0 right-0 w-10 transition-opacity duration-150',\n edges.right ? 'opacity-100' : 'opacity-0'\n )}\n style={{ background: `linear-gradient(to left, ${fade}, transparent)` }}\n />\n </div>\n );\n}\n","import { createContext, type Context } from 'react';\n\n/**\n * A context that is the same object in every entry. Each entry (./chrome,\n * ./components, ./primitives) is bundled on its own, so a plain\n * createContext in a shared module makes one context per entry, and a\n * provider from one entry is invisible to a reader from another. Keyed on\n * globalThis by name, there is one.\n */\nexport function sharedContext<T>(name: string, initial: T): Context<T> {\n const key = Symbol.for(`@orangecheck/app-design/${name}`);\n const store = globalThis as unknown as Record<symbol, Context<T> | undefined>;\n return (store[key] ??= createContext<T>(initial));\n}\n","import * as SeparatorPrimitive from '@radix-ui/react-separator';\nimport {\n forwardRef,\n useEffect,\n useState,\n type ComponentPropsWithoutRef,\n type CSSProperties,\n type ElementRef,\n type HTMLAttributes,\n} from 'react';\nimport { useTheme } from 'next-themes';\nimport { Toaster as SonnerToaster, type ToasterProps } from 'sonner';\n\nimport { cn } from '../lib/cn';\n\nexport function Spinner({ className, label }: { className?: string; label?: string }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n role={label ? 'status' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n className={cn('size-4 animate-spin', className)}\n >\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" strokeOpacity=\"0.2\" strokeWidth=\"2.5\" />\n <path d=\"M21 12a9 9 0 0 0-9-9\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\n/** A placeholder bar, visible on the canvas and on a card in both modes. */\nexport function Skeleton({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n data-ui=\"skeleton\"\n className={cn('animate-pulse rounded-lg bg-[var(--oca-skeleton)]', className)}\n {...props}\n />\n );\n}\n\n/**\n * True once `active` has stayed true for `ms`. A loading state that never\n * ends reads as a broken page; pass this to show a way out instead.\n */\nexport function useTimedOut(active: boolean, ms = 12_000): boolean {\n const [timedOut, setTimedOut] = useState(false);\n useEffect(() => {\n if (!active) {\n setTimedOut(false);\n return;\n }\n const t = setTimeout(() => setTimedOut(true), ms);\n return () => clearTimeout(t);\n }, [active, ms]);\n return timedOut;\n}\n\nexport const Separator = forwardRef<\n ElementRef<typeof SeparatorPrimitive.Root>,\n ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(function Separator({ className, orientation = 'horizontal', decorative = true, ...props }, ref) {\n return (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n 'shrink-0 bg-border',\n orientation === 'horizontal' ? 'h-px w-full' : 'h-full w-px',\n className\n )}\n {...props}\n />\n );\n});\n\nexport function Kbd({ className, ...props }: HTMLAttributes<HTMLElement>) {\n return (\n <kbd\n className={cn(\n 'inline-flex h-5 min-w-5 items-center justify-center rounded-md border border-border bg-card px-1.5 font-mono text-[11px] text-muted-foreground',\n className\n )}\n {...props}\n />\n );\n}\n\n/** Live-region status dot: a calm pulse for \"running\", solid otherwise. */\nexport function StatusDot({\n tone = 'neutral',\n pulse = false,\n className,\n}: {\n tone?: 'neutral' | 'success' | 'warning' | 'danger' | 'brand';\n pulse?: boolean;\n className?: string;\n}) {\n const color = {\n neutral: 'bg-oca-subtle',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-destructive',\n brand: 'bg-brand',\n }[tone];\n return (\n <span\n aria-hidden\n className={cn('inline-block size-2 shrink-0 rounded-full', color, pulse && 'oca-animate-pulse-dot', className)}\n />\n );\n}\n\n/** Toasts in the system's type and surfaces. Mount once. */\n/*\n * sonner paints a toast from its own variables (white, or black in dark), and\n * they outrank a class. Set to the tokens, a toast is the popover in both modes.\n */\nconst TOAST_COLOURS = {\n '--normal-bg': 'var(--popover)',\n '--normal-text': 'var(--popover-foreground)',\n '--normal-border': 'var(--border)',\n} as CSSProperties;\n\n/** Toasts in the page's mode: it reads next-themes, so a site passes nothing for dark. */\nexport function Toaster({ style, ...props }: ToasterProps) {\n const { resolvedTheme } = useTheme();\n return (\n <SonnerToaster\n theme={resolvedTheme === 'dark' ? 'dark' : resolvedTheme === 'light' ? 'light' : 'system'}\n style={{ ...TOAST_COLOURS, ...style }}\n position=\"bottom-right\"\n toastOptions={{\n classNames: {\n toast: 'oca-toast rounded-2xl border border-border bg-popover text-popover-foreground shadow-lg font-sans',\n title: 'text-[0.9375rem] font-medium',\n description: 'text-sm text-muted-foreground',\n actionButton: 'rounded-full bg-primary text-primary-foreground',\n cancelButton: 'rounded-full bg-muted text-foreground',\n },\n }}\n {...props}\n />\n );\n}\n\nexport { toast } from 'sonner';\n","import { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type ButtonHTMLAttributes } from 'react';\n\nimport { cn } from '../lib/cn';\nimport { Spinner } from './feedback';\n\n/*\n * Pills, as the deck draws them: the black filled pill leads, the white\n * outlined pill follows. `brand` is for the orange band only; `onInk` and\n * `onInkOutline` are the same pair inverted for dark bands.\n */\nexport const buttonVariants = cva(\n [\n 'inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-full font-medium',\n 'transition-[background-color,border-color,color,box-shadow,transform] duration-150',\n 'outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'active:translate-y-px disabled:pointer-events-none',\n // Disabled is one look for every variant: a quiet grey pill, never a\n // faded black or orange slab that reads as broken.\n 'disabled:border disabled:border-border disabled:bg-muted disabled:text-oca-subtle disabled:shadow-none',\n '[&_svg]:pointer-events-none [&_svg]:size-[1.1em] [&_svg]:shrink-0',\n ],\n {\n variants: {\n variant: {\n primary: 'bg-primary text-primary-foreground hover:bg-primary/85',\n secondary:\n 'border border-border bg-secondary text-secondary-foreground hover:border-oca-hairline-strong hover:bg-accent',\n brand: 'bg-brand text-brand-foreground hover:bg-oca-orange-deep',\n ghost: 'text-foreground hover:bg-accent',\n danger: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n link: 'h-auto rounded-none px-0 text-foreground underline decoration-foreground/35 underline-offset-4 hover:decoration-foreground',\n onInk: 'bg-white text-oca-ink hover:bg-white/90',\n onInkOutline: 'border border-white/20 text-white hover:bg-white/10',\n },\n size: {\n sm: 'h-9 px-4 text-sm',\n md: 'h-11 px-5 text-[0.9375rem]',\n lg: 'h-14 px-7 text-[1.0625rem]',\n icon: 'size-10',\n 'icon-sm': 'size-8',\n },\n },\n compoundVariants: [{ variant: 'link', className: 'h-auto px-0' }],\n defaultVariants: { variant: 'primary', size: 'md' },\n }\n);\n\nexport interface ButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n /** Render the child element (a Link, an <a>) with the button's styles. */\n asChild?: boolean;\n /** Shows a spinner and disables the button. */\n loading?: boolean;\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n { className, variant, size, asChild = false, loading = false, disabled, children, type, ...props },\n ref\n) {\n const Comp = asChild ? Slot : 'button';\n return (\n <Comp\n ref={ref}\n data-ui=\"button\"\n className={cn(buttonVariants({ variant, size }), className)}\n disabled={asChild ? undefined : disabled || loading}\n aria-busy={loading || undefined}\n type={asChild ? undefined : (type ?? 'button')}\n {...props}\n >\n {asChild ? (\n children\n ) : (\n <>\n {loading ? <Spinner className=\"size-[1.1em]\" /> : null}\n {children}\n </>\n )}\n </Comp>\n );\n});\n","import { Check, Copy } from 'lucide-react';\nimport {\n Children,\n cloneElement,\n createContext,\n isValidElement,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from 'react';\n\nimport { explorerUrl, shortenMiddle, type ExplorerKind, type Network } from '../format';\nimport { cn } from '../lib/cn';\nimport { useDensity } from '../lib/density';\nimport { useShellPlace } from '../lib/shell-context';\nimport { Button } from '../primitives/button';\nimport { Skeleton, useTimedOut } from '../primitives/feedback';\nimport { ScrollFade } from '../primitives/scroll-fade';\n\n/* ── Page header ─────────────────────────────────────────────────────── */\n\n/**\n * The top of a signed-in page: section, page title, one sentence, actions.\n * Inside AppShell the eyebrow defaults to the current section, so every page\n * in a section opens at the same height. Pass `eyebrow={null}` to omit it.\n * Public pages use PageHero.\n */\nexport function PageHeader({\n eyebrow,\n title,\n description,\n actions,\n className,\n}: {\n eyebrow?: ReactNode;\n title: ReactNode;\n /** One sentence. Longer explanation belongs in the docs, not the header. */\n description?: ReactNode;\n actions?: ReactNode;\n className?: string;\n}) {\n const place = useShellPlace();\n const eb = eyebrow === undefined ? place.section : eyebrow;\n return (\n <header className={cn('flex flex-col gap-5 md:flex-row md:items-end md:justify-between', className)}>\n <div className=\"flex min-w-0 max-w-[44rem] flex-col gap-2.5\">\n {eb ? <p className=\"oca-eyebrow\">{eb}</p> : null}\n <h1 className=\"oca-display-3\">{title}</h1>\n {description ? <p className=\"oca-body max-w-[40rem] text-[1.0625rem]\">{description}</p> : null}\n </div>\n {actions ? <div className=\"flex flex-wrap items-center gap-2.5 md:shrink-0 md:justify-end\">{actions}</div> : null}\n </header>\n );\n}\n\n/* ── Stats ───────────────────────────────────────────────────────────── */\n\nconst InStatGrid = createContext(false);\n\nexport interface StatCardProps {\n label: ReactNode;\n value: ReactNode;\n hint?: ReactNode;\n /**\n * The number behind `value`, when there is one. StatGrid reads it: a grid\n * whose every `raw` is 0 or null shows one empty line instead of zeros.\n */\n raw?: number | null;\n /** `sm` for a tool page: tighter, a smaller figure. Defaults to the density around it. */\n size?: 'md' | 'sm';\n /**\n * The change beside the figure: `{ value: -2.4, suffix: '%' }`. Green when\n * it moves the good way (`good`, default up), red the other, quiet at 0.\n */\n delta?: { value: number; suffix?: string; good?: 'up' | 'down'; label?: string };\n className?: string;\n}\n\nfunction Delta({ value, suffix = '', good = 'up', label }: NonNullable<StatCardProps['delta']>) {\n const dir = value > 0 ? 'up' : value < 0 ? 'down' : 'flat';\n const tone = dir === 'flat' ? 'text-muted-foreground' : dir === good ? 'text-success' : 'text-destructive';\n const sign = value > 0 ? '+' : value < 0 ? '−' : '';\n return (\n <span className={cn('inline-flex items-baseline gap-1 text-[0.8125rem] font-normal tracking-normal oca-tabular', tone)}>\n <span aria-hidden>{dir === 'up' ? '↑' : dir === 'down' ? '↓' : '·'}</span>\n {sign}\n {Math.abs(value).toLocaleString('en-US', { maximumFractionDigits: 2 })}\n {suffix}\n {label ? <span className=\"text-muted-foreground\"> {label}</span> : null}\n </span>\n );\n}\n\nexport function StatCard({ label, value, hint, size, delta, className }: StatCardProps) {\n const inGrid = useContext(InStatGrid);\n const density = useDensity();\n const sm = (size ?? (density === 'compact' ? 'sm' : 'md')) === 'sm';\n return (\n <div\n data-ui=\"stat\"\n className={cn(\n 'border border-border bg-card',\n sm ? 'rounded-2xl p-4' : 'rounded-[1.25rem] p-5 md:p-6',\n // In a grid, label, value and hint each share a row with their\n // neighbours, so values line up whatever wraps above them.\n inGrid ? 'row-span-3 grid grid-rows-subgrid gap-1.5' : 'flex flex-col gap-2',\n className\n )}\n >\n <span className={cn('leading-snug text-muted-foreground', sm ? 'text-[0.8125rem]' : 'text-[0.875rem]')}>{label}</span>\n {/* Bottom-aligned within a grid row; a lone card keeps it under its label. */}\n <span\n className={cn(\n 'break-words oca-tabular leading-tight tracking-[-0.02em]',\n sm ? 'text-[1.25rem]' : 'text-[1.5rem] md:text-[1.75rem]',\n inGrid && 'self-end',\n delta && 'flex flex-wrap items-baseline gap-x-2'\n )}\n >\n {value}\n {delta ? <Delta {...delta} /> : null}\n </span>\n {hint ? (\n <span className=\"text-[0.8125rem] leading-snug text-muted-foreground\">{hint}</span>\n ) : inGrid ? (\n <span aria-hidden />\n ) : null}\n </div>\n );\n}\n\nconst MD_COLS: Record<number, string> = {\n 1: 'md:grid-cols-1',\n 2: 'md:grid-cols-2',\n 3: 'md:grid-cols-3',\n 4: 'md:grid-cols-4',\n};\nconst LG_COLS: Record<number, string> = {\n 1: 'lg:grid-cols-1',\n 2: 'lg:grid-cols-2',\n 3: 'lg:grid-cols-3',\n 4: 'lg:grid-cols-4',\n 5: 'lg:grid-cols-5',\n};\nconst MD_SPAN: Record<number, string> = {\n 1: 'md:col-span-1',\n 2: 'md:col-span-2',\n 3: 'md:col-span-3',\n 4: 'md:col-span-4',\n};\nconst LG_SPAN: Record<number, string> = {\n 1: 'lg:col-span-1',\n 2: 'lg:col-span-2',\n 3: 'lg:col-span-3',\n 4: 'lg:col-span-4',\n};\n\n/** Columns for n tiles: as few ragged rows as possible, never more than five. */\nfunction statColumns(n: number): number {\n if (n <= 5) return Math.max(1, n);\n if (n % 4 === 0) return 4;\n if (n % 3 === 0) return 3;\n return 4;\n}\n\n/** How wide the last tile must be to fill its row of `cols`. */\nfunction lastSpan(n: number, cols: number): number {\n const rest = n % cols;\n return rest === 0 ? 1 : cols - rest + 1;\n}\n\n/** One quiet line where a group of numbers would all be zero. */\nexport function EmptyLine({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <p\n className={cn(\n 'rounded-[1.25rem] border border-dashed border-oca-hairline-strong px-5 py-4 text-[0.9375rem] text-muted-foreground',\n className\n )}\n >\n {children}\n </p>\n );\n}\n\nexport interface StatGridProps extends HTMLAttributes<HTMLDivElement> {\n /** Columns from md up. Default: the count up to 4, then 3 or 4. */\n columns?: 1 | 2 | 3 | 4 | 5;\n /** Shown instead of the tiles when the group is empty. */\n empty?: ReactNode;\n /** Force the empty line. Default: every child's `raw` is 0 or null. */\n isEmpty?: boolean;\n}\n\n/**\n * Stat tiles, two to a row on a phone. The last tile stretches to fill its row,\n * so a grid never ends in a hole, and a group of zeros becomes one line.\n */\nexport function StatGrid({ columns, empty, isEmpty, className, children, ...props }: StatGridProps) {\n const items = Children.toArray(children).filter(isValidElement) as ReactElement<StatCardProps>[];\n const n = items.length;\n const allZero =\n n > 0 && items.every((el) => 'raw' in el.props && (el.props.raw === 0 || el.props.raw === null));\n const compact = useDensity() === 'compact';\n if (isEmpty ?? allZero) return <EmptyLine className={className}>{empty ?? 'Nothing here yet.'}</EmptyLine>;\n const lg = columns ?? statColumns(n);\n // Five across is a desk-width row; a tablet gets three.\n const md = lg > 4 ? 3 : lg;\n const mdSpan = lastSpan(n, md);\n const lgSpan = lastSpan(n, lg);\n return (\n <InStatGrid.Provider value>\n <div\n className={cn(\n 'grid',\n compact ? 'gap-2.5 md:gap-3' : 'gap-3 md:gap-4',\n n === 1 ? 'grid-cols-1' : 'grid-cols-2',\n MD_COLS[md],\n LG_COLS[lg],\n className\n )}\n {...props}\n >\n {items.map((el, i) => {\n if (i !== n - 1) return el;\n const span = cn(\n n % 2 === 1 && n > 1 && 'max-md:col-span-2',\n (mdSpan > 1 || lgSpan > 1) && MD_SPAN[mdSpan],\n (mdSpan > 1 || lgSpan > 1) && LG_SPAN[lgSpan]\n );\n return span ? cloneElement(el, { className: cn(el.props.className, span) }) : el;\n })}\n </div>\n </InStatGrid.Provider>\n );\n}\n\n/* ── Key / value ─────────────────────────────────────────────────────── */\n\nexport interface KeyValueItem {\n label: ReactNode;\n value: ReactNode;\n mono?: boolean;\n /** After the value: what it means (\"Undervalued\", \"Above the 200-week mean\"). */\n note?: ReactNode;\n /** Colours the note, or the value when there is none. */\n tone?: ValueTone;\n}\n\n/** A reading's verdict, in words and colour: good, caution, bad, the accent, or quiet. */\nexport type ValueTone = 'good' | 'caution' | 'bad' | 'brand' | 'muted';\n\nconst TONE_TEXT: Record<ValueTone, string> = {\n good: 'text-success',\n caution: 'text-warning',\n bad: 'text-destructive',\n brand: 'text-oca-accent-ink',\n muted: 'text-muted-foreground',\n};\n\nexport function KeyValueList({\n items,\n dense,\n className,\n}: {\n items: KeyValueItem[];\n /** Tighter rows and smaller text, for a tool page. Defaults to the density around it. */\n dense?: boolean;\n className?: string;\n}) {\n const density = useDensity();\n const tight = dense ?? density === 'compact';\n return (\n // The rows go side by side when the list itself is wide enough, wherever it sits: a narrow card stacks them.\n <dl className={cn('@container divide-y divide-border border border-border bg-card', tight ? 'rounded-2xl' : 'rounded-[1.25rem]', className)}>\n {items.map((it, i) => (\n <div\n key={i}\n className={cn(\n 'flex flex-col gap-1 @md:flex-row @md:items-baseline',\n tight ? 'px-4 py-2.5 @md:gap-5' : 'px-5 py-3.5 @md:gap-6'\n )}\n >\n <dt className={cn('shrink-0 text-muted-foreground', tight ? 'text-[0.8125rem] @md:w-36' : 'text-[0.875rem] @md:w-48')}>\n {it.label}\n </dt>\n <dd\n className={cn(\n 'min-w-0 break-words',\n tight ? 'text-[0.875rem]' : 'text-[0.9375rem]',\n it.mono && (tight ? 'font-mono text-[0.8125rem]' : 'font-mono text-[0.875rem]'),\n it.tone && !it.note && TONE_TEXT[it.tone]\n )}\n >\n {it.value}\n {it.note ? (\n <span className={cn('ml-2 font-sans text-[0.8125rem]', TONE_TEXT[it.tone ?? 'muted'])}>{it.note}</span>\n ) : null}\n </dd>\n </div>\n ))}\n </dl>\n );\n}\n\n/* ── Table ───────────────────────────────────────────────────────────── */\n\nexport interface Column<T> {\n key: string;\n header: ReactNode;\n cell: (row: T) => ReactNode;\n align?: 'start' | 'end';\n /** A number: right-aligned, tabular, never wrapped. */\n numeric?: boolean;\n /** Hide below md in the table (the phone card list still shows it). */\n wide?: boolean;\n /** A CSS width for the column, e.g. '12rem' or '30%'. */\n width?: string;\n /** The narrowest it may get before the table scrolls instead. */\n minWidth?: string;\n /** Cut long content to one line (put the full value in a title or HashChip). */\n truncate?: boolean;\n /** The phone card's title. Defaults to the first column. */\n primary?: boolean;\n /** Leave out of the phone card list. */\n hideOnPhone?: boolean;\n}\n\n/**\n * Rows of data. Wider than its box, the table scrolls with an edge that says\n * so; under 640px it becomes a list of cards that keep every column's label.\n */\nexport function DataTable<T>({\n columns,\n rows,\n rowKey,\n empty,\n caption,\n phone = 'cards',\n dense,\n className,\n}: {\n columns: Column<T>[];\n rows: T[];\n rowKey: (row: T, i: number) => string;\n empty?: ReactNode;\n caption?: string;\n /** Under 640px: a card per row (default), or the same table scrolling. */\n phone?: 'cards' | 'scroll';\n /** Tighter rows and 14px text, for a tool page. Defaults to the density around it. */\n dense?: boolean;\n className?: string;\n}) {\n const density = useDensity();\n const tight = dense ?? density === 'compact';\n if (rows.length === 0 && empty) return <>{empty}</>;\n const primary = columns.find((c) => c.primary) ?? columns[0];\n const right = (c: Column<T>) => c.numeric || c.align === 'end';\n const table = (\n <div\n className={cn(\n 'overflow-hidden border border-border bg-card',\n tight ? 'rounded-2xl' : 'rounded-[1.25rem]',\n phone === 'cards' && 'max-sm:hidden',\n className\n )}\n >\n <ScrollFade fade=\"var(--card)\">\n <table className={cn('w-full border-collapse text-left', tight ? 'text-[0.875rem]' : 'text-[0.9375rem]')}>\n {caption ? <caption className=\"sr-only\">{caption}</caption> : null}\n <thead>\n <tr className=\"border-b border-border\">\n {columns.map((c) => (\n <th\n key={c.key}\n scope=\"col\"\n style={{ width: c.width, minWidth: c.minWidth }}\n className={cn(\n 'whitespace-nowrap text-[0.8125rem] font-medium text-muted-foreground',\n tight ? 'px-4 py-2.5' : 'px-5 py-3',\n right(c) && 'text-right',\n c.wide && 'hidden md:table-cell'\n )}\n >\n {c.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {rows.map((r, i) => (\n <tr key={rowKey(r, i)} className=\"transition-colors hover:bg-accent/60\">\n {columns.map((c) => (\n <td\n key={c.key}\n style={{ minWidth: c.minWidth }}\n className={cn(\n 'align-middle',\n tight ? 'px-4 py-2' : 'px-5 py-3.5',\n right(c) && 'text-right',\n c.numeric && 'whitespace-nowrap oca-tabular',\n c.wide && 'hidden md:table-cell'\n )}\n >\n {c.truncate ? (\n <div className=\"truncate\" style={{ maxWidth: c.width ?? '16rem' }}>\n {c.cell(r)}\n </div>\n ) : (\n c.cell(r)\n )}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </ScrollFade>\n </div>\n );\n if (phone !== 'cards') return table;\n const rest = columns.filter((c) => c !== primary && !c.hideOnPhone);\n return (\n <>\n {table}\n <ul\n aria-label={caption}\n className={cn(\n 'divide-y divide-border border border-border bg-card sm:hidden',\n tight ? 'rounded-2xl' : 'rounded-[1.25rem]',\n className\n )}\n >\n {rows.map((r, i) => (\n <li key={rowKey(r, i)} className={cn('flex flex-col gap-2.5 px-4', tight ? 'py-3' : 'py-4')}>\n <div className=\"min-w-0 break-words text-[0.9375rem] font-medium\">{primary?.cell(r)}</div>\n {rest.length > 0 ? (\n <dl className=\"grid grid-cols-[minmax(5.5rem,auto)_minmax(0,1fr)] gap-x-4 gap-y-1.5 text-[0.875rem]\">\n {rest.map((c) => (\n <div key={c.key} className=\"contents\">\n <dt className=\"text-muted-foreground\">{c.header}</dt>\n <dd className={cn('min-w-0 break-words', c.numeric && 'oca-tabular')}>{c.cell(r)}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n </li>\n ))}\n </ul>\n </>\n );\n}\n\n/* ── Empty, notice ───────────────────────────────────────────────────── */\n\nexport function EmptyState({\n title,\n children,\n action,\n icon,\n className,\n}: {\n title: ReactNode;\n children?: ReactNode;\n action?: ReactNode;\n /** An icon that says what is missing. None by default: the words carry it. */\n icon?: ReactNode;\n className?: string;\n}) {\n return (\n <div\n className={cn(\n 'flex flex-col items-center gap-3 rounded-[1.25rem] border border-dashed border-oca-hairline-strong px-6 py-10 text-center',\n className\n )}\n >\n {icon ? (\n <span className=\"mb-1 flex size-11 items-center justify-center rounded-full bg-muted text-muted-foreground [&_svg]:size-5\">\n {icon}\n </span>\n ) : null}\n <h3 className=\"oca-title-sm\">{title}</h3>\n {children ? <div className=\"oca-body max-w-md text-[0.9375rem]\">{children}</div> : null}\n {action ? <div className=\"mt-2 flex flex-wrap justify-center gap-3\">{action}</div> : null}\n </div>\n );\n}\n\n/*\n * Three kinds of notice: neutral, the orange accent for something that needs\n * attention, and red for a real error. The old tone names still compile and\n * land on one of the three, so no page can add a fourth colour.\n */\ntype NoticeTone = 'neutral' | 'brand' | 'danger' | 'info' | 'success' | 'warning';\n\nconst NOTICE_KIND: Record<NoticeTone, 'neutral' | 'brand' | 'danger'> = {\n neutral: 'neutral',\n info: 'neutral',\n success: 'neutral',\n brand: 'brand',\n warning: 'brand',\n danger: 'danger',\n};\n\nexport function Notice({\n tone = 'neutral',\n title,\n children,\n action,\n role,\n className,\n}: {\n tone?: NoticeTone;\n title?: ReactNode;\n children?: ReactNode;\n action?: ReactNode;\n /** Default: `alert` for danger and warning, which a screen reader announces. Text that is\n * simply part of the page (a docs callout) is a `note`. */\n role?: 'alert' | 'status' | 'note';\n className?: string;\n}) {\n const kind = NOTICE_KIND[tone];\n return (\n <div\n role={role ?? (tone === 'danger' || tone === 'warning' ? 'alert' : 'note')}\n data-tone={kind}\n className={cn(\n 'flex flex-col gap-3 rounded-2xl border border-border bg-card px-5 py-4 sm:flex-row sm:items-start sm:justify-between',\n kind === 'danger' && 'border-[color-mix(in_oklab,var(--destructive)_40%,var(--border))]',\n className\n )}\n >\n <div className=\"flex min-w-0 gap-3\">\n {kind !== 'neutral' ? (\n <span\n aria-hidden\n className={cn(\n 'mt-[0.45rem] size-2 shrink-0 rounded-full',\n kind === 'brand' ? 'bg-oca-orange' : 'bg-destructive'\n )}\n />\n ) : null}\n <div className=\"flex min-w-0 flex-col gap-1\">\n {title ? (\n <p className={cn('text-[0.9375rem] font-medium', kind === 'danger' && 'text-destructive')}>\n {title}\n </p>\n ) : null}\n {children ? <div className=\"text-[0.9375rem] leading-relaxed text-muted-foreground\">{children}</div> : null}\n </div>\n </div>\n {action ? <div className=\"shrink-0\">{action}</div> : null}\n </div>\n );\n}\n\n/**\n * Placeholder rows while something loads, and a way out if it never does:\n * after `timeoutMs` the skeleton turns into a message with a retry.\n */\nexport function LoadingBlock({\n rows = 3,\n timeoutMs = 12_000,\n onRetry,\n label = 'Loading',\n className,\n}: {\n rows?: number;\n timeoutMs?: number;\n onRetry?: () => void;\n label?: string;\n className?: string;\n}) {\n const timedOut = useTimedOut(true, timeoutMs);\n if (timedOut) {\n return (\n <Notice\n className={className}\n title=\"This is taking longer than it should.\"\n action={\n <Button size=\"sm\" variant=\"secondary\" onClick={onRetry ?? (() => window.location.reload())}>\n Try again\n </Button>\n }\n >\n Check your connection, then try again.\n </Notice>\n );\n }\n return (\n <div role=\"status\" aria-label={label} className={cn('flex flex-col gap-3', className)}>\n {Array.from({ length: rows }, (_, i) => (\n <Skeleton key={i} className=\"h-16 rounded-2xl\" />\n ))}\n </div>\n );\n}\n\n/* ── Hashes, addresses, ids ──────────────────────────────────────────── */\n\n/** Wipe the clipboard if it still holds `expected`, and only then. */\nasync function wipeIfUnchanged(expected: string): Promise<void> {\n try {\n if ((await navigator.clipboard.readText()) !== expected) return;\n } catch {\n // Reading needs a permission most browsers withhold; wiping does not.\n }\n try {\n await navigator.clipboard.writeText('');\n } catch {\n /* the clipboard is unavailable here */\n }\n}\n\nexport function useCopy(timeoutMs = 1600) {\n const [copied, setCopied] = useState(false);\n const t = useRef<ReturnType<typeof setTimeout> | null>(null);\n const wipe = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(\n () => () => {\n if (t.current) clearTimeout(t.current);\n },\n []\n );\n const copy = useCallback(\n async (text: string, opts: { clearAfter?: number } = {}): Promise<boolean> => {\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n if (t.current) clearTimeout(t.current);\n t.current = setTimeout(() => setCopied(false), timeoutMs);\n if (opts.clearAfter && opts.clearAfter > 0) {\n // Outlives the component on purpose: the secret should go even if the page moves on.\n if (wipe.current) clearTimeout(wipe.current);\n wipe.current = setTimeout(() => void wipeIfUnchanged(text), opts.clearAfter);\n }\n return true;\n } catch {\n setCopied(false);\n return false;\n }\n },\n [timeoutMs]\n );\n return { copied, copy };\n}\n\nexport interface CopyButtonProps {\n /** The text, or a function that reads it at the moment of copying. */\n value: string | (() => string);\n label?: string;\n /**\n * Milliseconds after which the clipboard is wiped, if it still holds what\n * was copied (a secret, a recovery code). Unset: never.\n */\n clearAfter?: number;\n /** Called once the text is on the clipboard. */\n onCopied?: () => void;\n className?: string;\n}\n\nexport function CopyButton({ value, label = 'Copy', clearAfter, onCopied, className }: CopyButtonProps) {\n const { copied, copy } = useCopy();\n const done = copied ? (clearAfter ? `Copied. Cleared in ${Math.round(clearAfter / 1000)} seconds` : 'Copied') : '';\n return (\n <button\n type=\"button\"\n onClick={async () => {\n if (await copy(typeof value === 'function' ? value() : value, { clearAfter })) onCopied?.();\n }}\n aria-label={copied ? 'Copied' : label}\n title={label}\n className={cn(\n 'inline-flex size-8 shrink-0 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-accent hover:text-foreground',\n className\n )}\n >\n {copied ? <Check className=\"size-4 text-success\" /> : <Copy className=\"size-4\" />}\n <span aria-live=\"polite\" className=\"sr-only\">\n {done}\n </span>\n </button>\n );\n}\n\n/**\n * A long identifier shown as head…tail in mono, with copy. The full value is\n * the title and the copied text, never lost to the truncation. `explorer`\n * links an address, transaction or block to mempool.space.\n */\nexport function HashChip({\n value,\n head = 8,\n tail = 6,\n copy = true,\n href,\n explorer,\n network = 'mainnet',\n className,\n}: {\n value: string;\n head?: number;\n tail?: number;\n copy?: boolean;\n href?: string;\n /** What the value is, to link it on mempool.space. `href` wins when both are set. */\n explorer?: ExplorerKind;\n network?: Network;\n className?: string;\n}) {\n const shown = shortenMiddle(value, head, tail);\n const link = href ?? (explorer ? explorerUrl(explorer, value, network) : undefined);\n const offsite = !!link && /^https?:\\/\\//.test(link);\n const text = (\n <span title={value} className=\"font-mono text-[0.875rem]\">\n {shown}\n </span>\n );\n return (\n <span className={cn('inline-flex max-w-full items-center gap-1', className)}>\n {link ? (\n <a\n href={link}\n {...(offsite ? { target: '_blank', rel: 'noreferrer' } : {})}\n className=\"underline decoration-foreground/35 underline-offset-4 hover:decoration-foreground\"\n >\n {text}\n {offsite ? <span className=\"sr-only\"> (opens in a new tab)</span> : null}\n </a>\n ) : (\n text\n )}\n {copy ? <CopyButton value={value} label=\"Copy full value\" /> : null}\n </span>\n );\n}\n\n/* ── Progress ────────────────────────────────────────────────────────── */\n\nexport type StepState = 'done' | 'current' | 'upcoming' | 'blocked';\n\nexport interface ProgressStep {\n label: ReactNode;\n hint?: ReactNode;\n state: StepState;\n}\n\nexport function ProgressSteps({ steps, className }: { steps: ProgressStep[]; className?: string }) {\n return (\n <ol className={cn('flex flex-col gap-0', className)}>\n {steps.map((s, i) => {\n const last = i === steps.length - 1;\n return (\n <li key={i} className=\"relative flex gap-4 pb-6 last:pb-0\" aria-current={s.state === 'current' ? 'step' : undefined}>\n {!last ? (\n <span\n aria-hidden\n className={cn(\n 'absolute left-[11px] top-7 h-[calc(100%-1.5rem)] w-px',\n s.state === 'done' ? 'bg-foreground/30' : 'bg-border'\n )}\n />\n ) : null}\n <span\n className={cn(\n 'relative z-10 mt-0.5 flex size-6 shrink-0 items-center justify-center rounded-full border text-[0.75rem] oca-tabular',\n s.state === 'done' && 'border-primary bg-primary text-primary-foreground',\n s.state === 'current' && 'border-brand bg-card text-oca-accent-ink',\n s.state === 'upcoming' && 'border-border bg-card text-muted-foreground',\n s.state === 'blocked' && 'border-destructive bg-card text-destructive'\n )}\n >\n {s.state === 'done' ? <Check className=\"size-3.5\" strokeWidth={3} /> : String(i + 1).padStart(2, '0')}\n </span>\n <div className=\"flex min-w-0 flex-col gap-1\">\n <span className={cn('text-[0.9375rem]', s.state === 'upcoming' ? 'text-muted-foreground' : 'font-medium')}>\n {s.label}\n </span>\n {s.hint ? <span className=\"text-[0.875rem] leading-snug text-muted-foreground\">{s.hint}</span> : null}\n </div>\n </li>\n );\n })}\n </ol>\n );\n}\n\n/* ── Activity ────────────────────────────────────────────────────────── */\n\nexport interface ActivityItem {\n id: string;\n title: ReactNode;\n meta?: ReactNode;\n /** A small mark before the text, such as a Monogram. */\n leading?: ReactNode;\n trailing?: ReactNode;\n href?: string;\n}\n\nexport function ActivityList({ items, empty, className }: { items: ActivityItem[]; empty?: ReactNode; className?: string }) {\n if (items.length === 0 && empty) return <>{empty}</>;\n return (\n <ul className={cn('divide-y divide-border rounded-[1.25rem] border border-border bg-card', className)}>\n {items.map((it) => {\n const body = (\n <div className=\"flex items-center justify-between gap-4 px-5 py-4\">\n <div className=\"flex min-w-0 items-center gap-3\">\n {it.leading ? <div className=\"shrink-0\">{it.leading}</div> : null}\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"truncate text-[0.9375rem]\">{it.title}</span>\n {it.meta ? <span className=\"truncate text-[0.8125rem] text-muted-foreground\">{it.meta}</span> : null}\n </div>\n </div>\n {it.trailing ? <div className=\"shrink-0 text-right\">{it.trailing}</div> : null}\n </div>\n );\n return (\n <li key={it.id}>\n {it.href ? (\n <a href={it.href} className=\"block transition-colors hover:bg-accent/60\">\n {body}\n </a>\n ) : (\n body\n )}\n </li>\n );\n })}\n </ul>\n );\n}\n","import * as TabsPrimitive from '@radix-ui/react-tabs';\nimport { useCallback, useMemo, useRef, useState, useSyncExternalStore, type ReactNode, type RefObject } from 'react';\n\nimport { grammarOf, highlight, linesToHtml, parseLineRanges, readDiff } from '../code/highlight';\nimport { cn } from '../lib/cn';\nimport { ScrollFade } from '../primitives/scroll-fade';\nimport { CopyButton } from './data';\n\nconst LANG_NAME: Record<string, string> = {\n ts: 'TypeScript',\n typescript: 'TypeScript',\n tsx: 'TSX',\n js: 'JavaScript',\n javascript: 'JavaScript',\n jsx: 'JSX',\n mjs: 'JavaScript',\n json: 'JSON',\n jsonc: 'JSON',\n bash: 'Shell',\n sh: 'Shell',\n shell: 'Shell',\n zsh: 'Shell',\n console: 'Terminal',\n terminal: 'Terminal',\n python: 'Python',\n py: 'Python',\n yaml: 'YAML',\n yml: 'YAML',\n diff: 'Diff',\n text: 'Text',\n};\n\n/** \"TypeScript\" for ts, \"Shell\" for bash; the fence name itself for anything else. */\nexport function languageName(lang?: string): string | undefined {\n return lang ? (LANG_NAME[lang.toLowerCase()] ?? lang) : undefined;\n}\n\n/*\n * What a copy button puts on the clipboard: the code exactly as written,\n * final newline included, without removed lines and, for a shell transcript\n * with `$ ` prompts, only the commands, without their prompts.\n */\nfunction forClipboard(text: string, lang?: string): string {\n if (grammarOf(lang) !== 'shell') return text;\n const lines = text.split('\\n');\n if (!lines.some((l) => l.startsWith('$ '))) return text;\n return lines\n .filter((l) => l.startsWith('$ '))\n .map((l) => l.slice(2))\n .join('\\n');\n}\n\nfunction linesFromDom(pre: HTMLElement | null, newline: boolean): string | null {\n if (!pre) return null;\n const lines = pre.querySelectorAll('[data-line]');\n if (lines.length === 0) return pre.textContent ?? '';\n const text = Array.from(lines)\n .filter((l) => l.getAttribute('data-diff') !== 'remove')\n .map((l) => l.textContent ?? '')\n .join('\\n');\n return newline ? `${text}\\n` : text;\n}\n\ninterface Prepared {\n html: string;\n /** The code as a reader would copy it. */\n copy: string;\n lines: number;\n diff: boolean;\n}\n\nfunction prepare(code: string, lang: string | undefined, marks: string | readonly number[] | undefined, diff: boolean): Prepared {\n const d = diff ? readDiff(code) : null;\n const src = d ? d.code : code.replace(/\\r?\\n$/, '');\n const lines = highlight(src, lang === 'diff' ? undefined : lang);\n const kept = d ? src.split('\\n').filter((_, i) => d.diff.get(i + 1) !== 'remove') : null;\n return {\n html: linesToHtml(lines, { highlight: parseLineRanges(marks), diff: d?.diff }),\n // Byte for byte, the final newline too: a hash printed beside the code must match a copy of it.\n copy: kept ? kept.join('\\n') + (/\\n$/.test(code) ? '\\n' : '') : code,\n lines: lines.length,\n diff: !!d,\n };\n}\n\n/** The dark well: lines that scroll sideways, folding past `maxLines`. */\nfunction Well({\n preRef,\n html,\n children,\n lang,\n lines,\n maxLines,\n diff,\n lineNumbers,\n wrap,\n}: {\n preRef?: RefObject<HTMLPreElement | null>;\n html?: string;\n children?: ReactNode;\n lang?: string;\n lines: number;\n maxLines?: number;\n diff?: boolean;\n lineNumbers?: boolean;\n wrap?: boolean;\n}) {\n const foldable = maxLines !== undefined && lines > maxLines + 2;\n const [open, setOpen] = useState(false);\n const folded = foldable && !open;\n // Markup made of lines carries its own side padding, so a marked line runs edge to edge.\n const lined = html !== undefined;\n return (\n <div className=\"relative\">\n <div\n className={cn(folded && 'overflow-hidden')}\n style={folded ? { maxHeight: `calc(${maxLines} * 1.625em + 2rem)` } : undefined}\n >\n <ScrollFade fade=\"var(--oca-code-surface)\">\n <pre\n ref={preRef}\n data-diff={diff ? '' : undefined}\n data-line-numbers={lineNumbers ? '' : undefined}\n className={cn(\n 'oca-code py-4 font-mono text-[0.875rem] leading-[1.625] text-oca-ink-muted [font-variant-ligatures:none]',\n wrap ? 'whitespace-pre-wrap break-all' : 'w-max min-w-full',\n !lined && 'px-5'\n )}\n >\n {lined ? (\n <code className=\"block\" data-lang={lang} dangerouslySetInnerHTML={{ __html: html }} />\n ) : (\n <code className=\"block\" data-lang={lang}>\n {children}\n </code>\n )}\n </pre>\n </ScrollFade>\n </div>\n {foldable ? (\n <div\n className={cn('flex justify-center px-5 pb-4', folded && 'absolute inset-x-0 bottom-0 pt-16')}\n style={folded ? { background: 'linear-gradient(to top, var(--oca-code-surface) 40%, transparent)' } : undefined}\n >\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n aria-expanded={open}\n className=\"rounded-full border border-white/20 px-4 py-1.5 text-[0.8125rem] text-white transition-colors hover:bg-white/10\"\n >\n {open ? 'Show less' : `Show all ${lines} lines`}\n </button>\n </div>\n ) : null}\n </div>\n );\n}\n\nconst FRAME = 'overflow-hidden rounded-[1.25rem] border border-[var(--oca-code-line)] bg-[var(--oca-code-surface)]';\nconst COPY_ON_INK = 'text-oca-ink-subtle hover:bg-white/10 hover:text-white';\n\nexport interface CodeBlockProps {\n /** The source. Highlighted here, on the server too, when `lang` is one the package reads. */\n code?: string;\n /**\n * Highlighted markup made at build time (rehypeCode, highlightToHtml).\n * Trusted markup only: it is set as HTML.\n */\n html?: string;\n /** Highlighted nodes from another highlighter. */\n children?: ReactNode;\n /** With `html`: the source ended in a newline, and a copy keeps it (rehypeCode sets this). */\n trailingNewline?: boolean;\n /** The fence name: ts, tsx, json, bash, python, yaml, diff. */\n lang?: string;\n /** The file name or purpose. Defaults to the language's name, or \"Code\". */\n caption?: ReactNode;\n copy?: boolean;\n /** Wipe the clipboard this many milliseconds after a copy (a secret in code). */\n clearAfter?: number;\n /** Fold past this many lines, with a button for the rest. */\n maxLines?: number;\n /** Lines to mark, 1-based: \"2,4-6\" or [2, 4, 5, 6]. With `code`. */\n highlight?: string | readonly number[];\n /** Read `+` and `-` at the start of each line as added and removed. With `code`; `lang=\"diff\"` implies it. */\n diff?: boolean;\n /** Number the lines. */\n lineNumbers?: boolean;\n /**\n * Break long lines at any character instead of scrolling: a message to\n * sign, a 64-character id. Copying still takes the exact bytes.\n */\n wrap?: boolean;\n /** Beside the copy button: a download, a raw/pretty switch. */\n actions?: ReactNode;\n className?: string;\n}\n\n/**\n * A block of code: a header with its name and a copy button, then the code\n * on a dark well, highlighted, that scrolls sideways (with an edge that says\n * so) rather than cutting a line off. Lines can be marked, shown as a diff,\n * or numbered; the marks are drawn, so copying takes the code as written.\n * Past `maxLines` it folds.\n */\nexport function CodeBlock({\n code,\n html,\n children,\n trailingNewline = false,\n lang,\n caption,\n copy = true,\n clearAfter,\n maxLines,\n highlight: marks,\n diff,\n lineNumbers,\n wrap,\n actions,\n className,\n}: CodeBlockProps) {\n const preRef = useRef<HTMLPreElement>(null);\n const isDiff = diff || lang === 'diff';\n const markKey = typeof marks === 'string' ? marks : marks?.join(',');\n const prepared = useMemo(\n () => (html === undefined && children === undefined && code !== undefined ? prepare(code, lang, markKey, !!isDiff) : null),\n [code, html, children, lang, markKey, isDiff]\n );\n const markup = prepared?.html ?? html;\n const lines = prepared?.lines ?? (html !== undefined ? html.split('\\n').length : (code?.split('\\n').length ?? 0));\n const read = () => forClipboard(prepared?.copy ?? linesFromDom(preRef.current, trailingNewline) ?? code ?? '', lang);\n return (\n <figure className={cn(FRAME, className)}>\n <figcaption className=\"flex h-11 items-center justify-between gap-3 border-b border-[var(--oca-code-line)] pl-5 pr-2\">\n <span className=\"truncate text-[0.8125rem] text-oca-ink-subtle\">{caption ?? languageName(lang) ?? 'Code'}</span>\n <span className=\"flex shrink-0 items-center gap-1\">\n {actions}\n {copy ? <CopyButton value={read} label=\"Copy code\" clearAfter={clearAfter} className={COPY_ON_INK} /> : null}\n </span>\n </figcaption>\n <Well\n preRef={preRef}\n html={markup}\n lang={lang}\n lines={lines}\n maxLines={maxLines}\n diff={prepared ? prepared.diff : isDiff}\n lineNumbers={lineNumbers}\n wrap={wrap}\n >\n {children}\n </Well>\n </figure>\n );\n}\n\n/* ── Tabs of code ────────────────────────────────────────────────────── */\n\nconst tabListeners = new Map<string, Set<() => void>>();\nconst tabMemory = new Map<string, string>();\nconst storeKey = (k: string) => `oca-code-tab:${k}`;\n\nfunction readTab(key: string): string | null {\n if (tabMemory.has(key)) return tabMemory.get(key)!;\n try {\n return window.localStorage.getItem(storeKey(key));\n } catch {\n return null;\n }\n}\n\nfunction writeTab(key: string, value: string) {\n tabMemory.set(key, value);\n try {\n window.localStorage.setItem(storeKey(key), value);\n } catch {\n /* private mode: the choice lasts for this page */\n }\n tabListeners.get(key)?.forEach((l) => l());\n}\n\n/** One choice shared by every CodeTabs with the same key, remembered in this browser. */\nfunction useSyncedTab(key: string | undefined): [string | null, (v: string) => void] {\n const subscribe = useCallback(\n (cb: () => void) => {\n if (!key) return () => {};\n const set = tabListeners.get(key) ?? new Set();\n set.add(cb);\n tabListeners.set(key, set);\n return () => {\n set.delete(cb);\n };\n },\n [key]\n );\n const value = useSyncExternalStore(\n subscribe,\n () => (key ? readTab(key) : null),\n () => null\n );\n return [value, (v: string) => key && writeTab(key, v)];\n}\n\nexport interface CodeTab {\n /** The tab's name, and what `syncKey` remembers: \"npm\", \"curl\", \"Python\". */\n label: string;\n code: string;\n lang?: string;\n}\n\n/**\n * The same thing in several forms (npm, yarn, pnpm; curl, Node, Python) in\n * one well, with tabs in its header and a copy button for the one shown.\n * Give every set the same `syncKey` and choosing \"pnpm\" once switches them\n * all, on this page and the next.\n */\nexport function CodeTabs({\n items,\n syncKey,\n defaultValue,\n maxLines,\n className,\n}: {\n items: CodeTab[];\n syncKey?: string;\n /** The label shown first. Default: the first item. */\n defaultValue?: string;\n maxLines?: number;\n className?: string;\n}) {\n const [synced, setSynced] = useSyncedTab(syncKey);\n const [local, setLocal] = useState<string | null>(null);\n const labels = items.map((it) => it.label);\n const pick = [local, synced, defaultValue].find((v): v is string => !!v && labels.includes(v)) ?? labels[0] ?? '';\n const active = items.find((it) => it.label === pick);\n const prepared = useMemo(() => items.map((it) => prepare(it.code, it.lang, undefined, it.lang === 'diff')), [items]);\n return (\n <TabsPrimitive.Root\n value={pick}\n onValueChange={(v) => {\n setLocal(v);\n setSynced(v);\n }}\n className={cn(FRAME, className)}\n >\n <div className=\"flex h-11 items-center justify-between gap-3 border-b border-[var(--oca-code-line)] pl-2 pr-2\">\n <ScrollFade fade=\"var(--oca-code-surface)\" className=\"min-w-0 flex-1\">\n <TabsPrimitive.List aria-label=\"Versions\" className=\"flex w-max items-center gap-0.5\">\n {items.map((it) => (\n <TabsPrimitive.Trigger\n key={it.label}\n value={it.label}\n className={cn(\n 'relative inline-flex h-11 items-center whitespace-nowrap px-3 text-[0.8125rem] text-oca-ink-subtle outline-none transition-colors',\n 'hover:text-white focus-visible:text-white focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring',\n 'data-[state=active]:text-white',\n 'after:absolute after:inset-x-3 after:bottom-0 after:h-0.5 after:rounded-full after:bg-transparent data-[state=active]:after:bg-oca-orange'\n )}\n >\n {it.label}\n </TabsPrimitive.Trigger>\n ))}\n </TabsPrimitive.List>\n </ScrollFade>\n {active ? (\n <CopyButton\n value={() => forClipboard(prepared[items.indexOf(active)]?.copy ?? active.code, active.lang)}\n label={`Copy ${active.label}`}\n className={COPY_ON_INK}\n />\n ) : null}\n </div>\n {items.map((it, i) => (\n <TabsPrimitive.Content key={it.label} value={it.label} className=\"outline-none\" tabIndex={-1}>\n <Well\n html={prepared[i]!.html}\n lang={it.lang}\n lines={prepared[i]!.lines}\n maxLines={maxLines}\n diff={prepared[i]!.diff}\n />\n </TabsPrimitive.Content>\n ))}\n </TabsPrimitive.Root>\n );\n}\n\n/** `npm install`, `yarn add` and `pnpm add` for a package, in one remembered set of tabs. */\nexport function InstallTabs({ pkg, dev = false, className }: { pkg: string; dev?: boolean; className?: string }) {\n const items: CodeTab[] = [\n { label: 'npm', code: `npm install ${dev ? '--save-dev ' : ''}${pkg}`, lang: 'bash' },\n { label: 'yarn', code: `yarn add ${dev ? '--dev ' : ''}${pkg}`, lang: 'bash' },\n { label: 'pnpm', code: `pnpm add ${dev ? '--save-dev ' : ''}${pkg}`, lang: 'bash' },\n ];\n return <CodeTabs items={items} syncKey=\"package-manager\" className={className} />;\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport type { HTMLAttributes } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/*\n * The small white pill from the deck (\"in testing\", \"on the path\"). Three tones\n * carry meaning: neutral, the orange accent for attention, and red for a real\n * error. Text stays on the token that clears 4.5:1 against its tint.\n */\nconst GOOD_DOT =\n \"border-border bg-card text-foreground before:size-1.5 before:shrink-0 before:rounded-full before:bg-success before:content-['']\";\n\nexport const badgeVariants = cva(\n 'inline-flex h-6 shrink-0 items-center gap-1.5 whitespace-nowrap rounded-full border px-2.5 text-[0.8125rem] font-medium leading-none',\n {\n variants: {\n tone: {\n neutral: 'border-border bg-card text-foreground',\n muted: 'border-transparent bg-muted text-muted-foreground',\n brand: 'border-transparent bg-[color-mix(in_oklab,var(--oca-orange)_9%,var(--card))] text-oca-accent-ink',\n danger: 'border-transparent bg-[color-mix(in_oklab,var(--destructive)_12%,var(--card))] text-destructive',\n // A good state is a neutral pill with a green dot, not a green pill.\n success: GOOD_DOT,\n // Aliases kept so older call sites keep compiling: attention is\n // the brand accent, information is neutral.\n warning: 'border-transparent bg-[color-mix(in_oklab,var(--oca-orange)_9%,var(--card))] text-oca-accent-ink',\n info: 'border-border bg-card text-foreground',\n // Inverted in dark mode, where ink would sit on a card of nearly its own colour.\n ink: 'border-transparent bg-oca-ink text-oca-ink-foreground dark:bg-foreground dark:text-background',\n onInk: 'border-white/15 bg-white/5 text-white/90',\n },\n },\n defaultVariants: { tone: 'neutral' },\n }\n);\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement>, VariantProps<typeof badgeVariants> {}\n\nexport function Badge({ className, tone, ...props }: BadgeProps) {\n return <span data-ui=\"badge\" className={cn(badgeVariants({ tone }), className)} {...props} />;\n}\n\n/** A pill with a live dot: where something stands right now (\"In testing · payouts start after\"). */\nexport function StatusPill({\n className,\n children,\n pulse = true,\n ...props\n}: HTMLAttributes<HTMLSpanElement> & { pulse?: boolean }) {\n return (\n <span\n data-ui=\"status-pill\"\n className={cn(\n 'inline-flex min-h-8 w-fit items-center gap-2.5 rounded-full border border-border bg-card py-1 pl-3 pr-3.5 text-[0.875rem] leading-snug text-foreground',\n className\n )}\n {...props}\n >\n <span aria-hidden className=\"relative flex size-2 shrink-0\">\n {pulse ? (\n <span className=\"absolute inset-0 rounded-full bg-oca-orange opacity-50 motion-safe:animate-ping\" />\n ) : null}\n <span className=\"relative size-2 rounded-full bg-oca-orange\" />\n </span>\n {children}\n </span>\n );\n}\n","import type { HTMLAttributes } from 'react';\n\nimport type { SiteStatus } from '../family';\nimport { cn } from '../lib/cn';\nimport { Badge } from './badge';\n\n/*\n * Where something stands, in the family's fixed words. A site or feature is\n * live, in testing, not yet, or paused; a check on an artifact is good,\n * caution or refused. There is no free text: the words are the component, so\n * no page can invent \"LIVE · MAINNET\", \"BETA\" or \"PRO\" again.\n */\nexport type Statement = 'good' | 'caution' | 'refused';\nexport type Status = SiteStatus | Statement;\n\nconst WORD: Record<Status, string> = {\n live: 'Live',\n testing: 'In testing',\n 'not-yet': 'Not yet',\n paused: 'Paused',\n good: 'Good',\n caution: 'Caution',\n refused: 'Refused',\n};\n\nconst TONE = {\n live: 'success',\n testing: 'brand',\n 'not-yet': 'muted',\n paused: 'muted',\n good: 'success',\n caution: 'brand',\n refused: 'danger',\n} as const;\n\n/** The word for a status, for places that need it as text. */\nexport function statusWord(status: Status): string {\n return WORD[status];\n}\n\nexport interface StatusBadgeProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {\n status: Status;\n}\n\nexport function StatusBadge({ status, className, ...props }: StatusBadgeProps) {\n return (\n <Badge tone={TONE[status]} data-status={status} className={cn(className)} {...props}>\n {WORD[status]}\n </Badge>\n );\n}\n","import { ArrowLeft, ArrowRight, ArrowUpRight, ChevronRight } from 'lucide-react';\nimport Link from 'next/link';\nimport {\n Children,\n isValidElement,\n useEffect,\n useId,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n type RefObject,\n type TableHTMLAttributes,\n} from 'react';\n\nimport { cn } from '../lib/cn';\nimport { Badge } from '../primitives/badge';\nimport { ScrollFade } from '../primitives/scroll-fade';\nimport { Skeleton } from '../primitives/feedback';\nimport { StatusBadge, type Status } from '../primitives/status-badge';\nimport { CodeBlock } from './code-block';\nimport { Notice } from './data';\nimport { useActiveHeading, type TocItem } from './hero';\n\n/*\n * The parts of a docs page: where you are (Breadcrumbs), where to go next\n * (DocsPager), what is on this page (OnThisPage), and the blocks MDX writes\n * with (Callout, Steps, LinkCard, ApiTable, MdxTable, Diagram). DocsShell\n * (chrome) puts them in place; mdxComponents (./mdx) maps markdown onto them.\n */\n\nconst isInternal = (href: string) => href.startsWith('/') || href.startsWith('#');\n\n/** A router link for this site's pages, a plain anchor for another site. */\nfunction DocLink({ href, className, children, ...rest }: { href: string; className?: string; children: ReactNode; 'aria-label'?: string }) {\n return isInternal(href) ? (\n <Link href={href} className={className} {...rest}>\n {children}\n </Link>\n ) : (\n <a href={href} className={className} {...rest}>\n {children}\n </a>\n );\n}\n\n/* ── Breadcrumbs ─────────────────────────────────────────────────────── */\n\nexport interface Crumb {\n label: ReactNode;\n /** Omit for the page you are on. */\n href?: string;\n}\n\n/** Where this page sits: docs › section › page, with room on the right for \"View source\". */\nexport function Breadcrumbs({ items, action, className }: { items: Crumb[]; action?: ReactNode; className?: string }) {\n return (\n <div className={cn('flex min-h-11 items-center justify-between gap-4 sm:min-h-0', className)}>\n <nav aria-label=\"Breadcrumb\" className=\"min-w-0\">\n <ol className=\"flex min-w-0 items-center gap-1.5 text-[0.875rem] text-muted-foreground\">\n {items.map((c, i) => {\n const last = i === items.length - 1;\n return (\n <li key={i} className={cn('flex items-center gap-1.5', last ? 'min-w-0' : 'shrink-0')}>\n {c.href && !last ? (\n <DocLink href={c.href} className=\"inline-flex min-h-11 items-center transition-colors hover:text-foreground sm:min-h-0\">\n {c.label}\n </DocLink>\n ) : (\n <span aria-current={last ? 'page' : undefined} className={cn('truncate', last && 'text-foreground')}>\n {c.label}\n </span>\n )}\n {!last ? <ChevronRight aria-hidden className=\"size-3.5 shrink-0 text-oca-subtle\" /> : null}\n </li>\n );\n })}\n </ol>\n </nav>\n {action ? <div className=\"shrink-0 text-[0.875rem]\">{action}</div> : null}\n </div>\n );\n}\n\n/* ── Previous / next ─────────────────────────────────────────────────── */\n\nexport interface PagerLink {\n href: string;\n label: ReactNode;\n /** The section it is in, when that differs from this page's. */\n section?: ReactNode;\n}\n\n/** The page before and after this one, as two cards at the foot of the page. */\nexport function DocsPager({ prev, next, className }: { prev?: PagerLink; next?: PagerLink; className?: string }) {\n if (!prev && !next) return null;\n const card = (l: PagerLink, dir: 'prev' | 'next') => (\n <DocLink\n href={l.href}\n className={cn(\n 'group flex min-h-20 flex-col justify-center gap-1 rounded-2xl border border-border bg-card px-5 py-4 transition-colors hover:border-oca-hairline-strong',\n dir === 'next' && 'items-end text-right sm:col-start-2'\n )}\n >\n <span className=\"flex items-center gap-1.5 text-[0.8125rem] text-muted-foreground\">\n {dir === 'prev' ? <ArrowLeft aria-hidden className=\"size-3.5\" /> : null}\n {dir === 'prev' ? 'Previous' : 'Next'}\n {l.section ? <span aria-hidden>·</span> : null}\n {l.section ? <span className=\"truncate\">{l.section}</span> : null}\n {dir === 'next' ? <ArrowRight aria-hidden className=\"size-3.5\" /> : null}\n </span>\n <span className=\"text-[1rem] font-medium leading-snug text-foreground\">{l.label}</span>\n </DocLink>\n );\n return (\n <nav aria-label=\"Previous and next page\" className={cn('grid grid-cols-1 gap-3 border-t border-border pt-8 sm:grid-cols-2', className)}>\n {prev ? card(prev, 'prev') : null}\n {next ? card(next, 'next') : null}\n </nav>\n );\n}\n\n/* ── On this page ────────────────────────────────────────────────────── */\n\n/**\n * The page's h2s and h3s with ids, read from the rendered page. `key` (the\n * path) reads them again after a client-side move to another page.\n */\nexport function useHeadings(selector = '#docs-content', key?: string): { items: TocItem[]; activeId?: string } {\n const [items, setItems] = useState<TocItem[]>([]);\n useEffect(() => {\n const read = () => {\n const root = document.querySelector(selector);\n if (!root) return setItems([]);\n setItems(\n Array.from(root.querySelectorAll<HTMLHeadingElement>('h2[id], h3[id]')).map((h) => ({\n id: h.id,\n // The anchor link's \"#\" is not part of the name.\n label: (h.querySelector('[data-heading-text]') ?? h).textContent?.trim() ?? '',\n level: h.tagName === 'H3' ? 3 : 2,\n }))\n );\n };\n // Once after paint, once more for late layout (fonts, images).\n const raf = requestAnimationFrame(read);\n const t = setTimeout(read, 80);\n return () => {\n cancelAnimationFrame(raf);\n clearTimeout(t);\n };\n }, [selector, key]);\n const activeId = useActiveHeading(items.map((i) => i.id));\n return { items, activeId };\n}\n\n/** The list of a page's sections, the one being read marked. h3s sit in under their h2. */\nexport function OnThisPage({\n items,\n activeId,\n title = 'On this page',\n onNavigate,\n className,\n}: {\n items: TocItem[];\n activeId?: string;\n /** `null` for no visible title. */\n title?: ReactNode;\n onNavigate?: () => void;\n className?: string;\n}) {\n const id = useId();\n if (items.length === 0) return null;\n return (\n // With no visible title (a folded list under its own summary) the name is still \"On this page\".\n <nav aria-labelledby={title ? id : undefined} aria-label={title ? undefined : 'On this page'} className={className}>\n {title ? (\n <p id={id} className=\"mb-3 text-[0.875rem] font-medium\">\n {title}\n </p>\n ) : null}\n <ul>\n {items.map((t) => {\n const on = t.id === activeId;\n return (\n <li key={t.id}>\n <a\n href={`#${t.id}`}\n onClick={onNavigate}\n aria-current={on ? 'location' : undefined}\n className={cn(\n 'block border-l py-1.5 text-[0.875rem] leading-snug transition-colors',\n t.level === 3 ? 'pl-7' : 'pl-4',\n on ? 'border-foreground text-foreground' : 'border-border text-muted-foreground hover:text-foreground'\n )}\n >\n {t.label}\n </a>\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n\n/* ── Blocks MDX writes with ──────────────────────────────────────────── */\n\nconst CALLOUT_TONE = { note: 'neutral', warning: 'brand', danger: 'danger' } as const;\n\n/**\n * A note set apart from the text: `note` (the default), `warning` for\n * something that costs you if missed, `danger` for something that breaks.\n * It is part of the page, so it is a note to a screen reader, never an alert.\n */\nexport function Callout({\n tone = 'note',\n title,\n children,\n className,\n}: {\n tone?: keyof typeof CALLOUT_TONE;\n title?: ReactNode;\n children?: ReactNode;\n className?: string;\n}) {\n return (\n <Notice\n tone={CALLOUT_TONE[tone]}\n title={title}\n role=\"note\"\n // Markdown paragraphs inside take the note's size, not the page's.\n className={cn('my-6 [&_p]:my-0 [&_p]:text-[0.9375rem] [&_p]:leading-relaxed [&_p+p]:mt-3', className)}\n >\n {children}\n </Notice>\n );\n}\n\n/** One step of a guide: a title and whatever it takes (text, code). */\nexport function Step({ title, id, children }: { title: ReactNode; id?: string; children?: ReactNode }) {\n return (\n <li className=\"relative pb-8 pl-11 last:pb-0 [counter-increment:oca-step]\">\n {/* The number, and the line down to the next one. */}\n <span\n aria-hidden\n className=\"absolute left-0 top-0 flex size-7 items-center justify-center rounded-full border border-oca-hairline-strong bg-card text-[0.8125rem] oca-tabular text-foreground before:content-[counter(oca-step)]\"\n />\n <span aria-hidden className=\"absolute bottom-1 left-[0.8125rem] top-9 w-px bg-border\" />\n <h3 id={id} className=\"scroll-mt-28 pt-0.5 text-[1.0625rem] font-medium leading-snug tracking-[-0.008em] text-foreground\">\n {title}\n </h3>\n <div className=\"mt-2 text-muted-foreground [&>*:first-child]:mt-0 [&>*:last-child]:mb-0\">{children}</div>\n </li>\n );\n}\n\n/**\n * A guide's steps, numbered, each with its title and body. For instructions\n * a reader follows in order; ProgressSteps is for where something stands.\n */\nexport function Steps({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <ol className={cn('not-prose my-8 flex flex-col [counter-reset:oca-step] [&>li:last-child>span:nth-child(2)]:hidden', className)}>\n {children}\n </ol>\n );\n}\n\n/** A card that leads somewhere: a title, one line, an optional icon. */\nexport function LinkCard({\n href,\n title,\n description,\n icon,\n meta,\n className,\n}: {\n href: string;\n title: ReactNode;\n description?: ReactNode;\n icon?: ReactNode;\n /** Top right, beside the arrow: a status, a count. */\n meta?: ReactNode;\n className?: string;\n}) {\n const Arrow = isInternal(href) ? ArrowRight : ArrowUpRight;\n return (\n <DocLink\n href={href}\n className={cn(\n 'group flex h-full flex-col gap-3 rounded-[1.25rem] border border-border bg-card p-5 transition-colors hover:border-oca-hairline-strong',\n className\n )}\n >\n <span className=\"flex items-start justify-between gap-3\">\n {icon ? (\n <span className=\"flex size-9 shrink-0 items-center justify-center rounded-xl bg-muted text-foreground [&_svg]:size-[1.125rem]\">\n {icon}\n </span>\n ) : (\n <span className=\"text-[1rem] font-medium leading-snug text-foreground\">{title}</span>\n )}\n <span className=\"flex shrink-0 items-center gap-2\">\n {meta}\n <Arrow aria-hidden className=\"size-4 text-muted-foreground transition-transform group-hover:translate-x-0.5 group-hover:text-foreground\" />\n </span>\n </span>\n {icon ? <span className=\"text-[1rem] font-medium leading-snug text-foreground\">{title}</span> : null}\n {description ? <span className=\"text-[0.9375rem] leading-relaxed text-muted-foreground\">{description}</span> : null}\n </DocLink>\n );\n}\n\n/** LinkCards in a grid: one column on a phone, two or three beside each other. */\nexport function CardGrid({ columns = 2, children, className }: { columns?: 2 | 3; children: ReactNode; className?: string }) {\n return (\n <div className={cn('not-prose my-6 grid grid-cols-1 gap-3 sm:grid-cols-2', columns === 3 && 'lg:grid-cols-3', className)}>\n {children}\n </div>\n );\n}\n\n/* ── Tables ──────────────────────────────────────────────────────────── */\n\n/**\n * A markdown table: hairline rules, a quiet header, and sideways scrolling\n * with an edge that says so when it is wider than the column. Code in a\n * cell drops its pill, so an API table reads as a list of names.\n */\nexport function MdxTable({ className, ...props }: TableHTMLAttributes<HTMLTableElement>) {\n return (\n <div className=\"not-prose my-6 overflow-hidden rounded-2xl border border-border bg-card\">\n <ScrollFade fade=\"var(--card)\">\n <table\n className={cn(\n 'w-full border-collapse text-left text-[0.875rem] leading-relaxed',\n '[&_th]:whitespace-nowrap [&_th]:border-b [&_th]:border-oca-hairline-strong [&_th]:bg-oca-table-head [&_th]:px-4 [&_th]:py-2.5 [&_th]:text-[0.8125rem] [&_th]:font-medium [&_th]:text-foreground',\n '[&_td]:border-t [&_td]:border-border [&_td]:px-4 [&_td]:py-2.5 [&_td]:align-top [&_td]:text-muted-foreground [&_tbody_tr:first-child_td]:border-t-0',\n '[&_td_code]:bg-transparent [&_td_code]:p-0 [&_td_code]:text-foreground [&_td:first-child]:text-foreground',\n '[&_[align=center]]:text-center [&_[align=right]]:text-right',\n // On a phone a cell keeps a readable width; the table scrolls instead of crushing it.\n 'max-sm:[&_td]:min-w-[9rem]',\n className\n )}\n {...props}\n />\n </ScrollFade>\n </div>\n );\n}\n\nexport interface ApiRow {\n name: string;\n /** The row's anchor: a link to `#id` lands on this row. */\n id?: string;\n type?: ReactNode;\n required?: boolean;\n default?: ReactNode;\n description?: ReactNode;\n /** Where it is defined: a link to the source line. Its column is named once, in the header. */\n source?: ReactNode;\n deprecated?: boolean;\n /** Where the member stands, when it is not simply live. */\n status?: Exclude<Status, 'live' | 'good' | 'caution' | 'refused'>;\n}\n\nconst said = (n: ReactNode) => n !== undefined && n !== null && n !== false && n !== '';\n\n/**\n * Parameters, props or fields: name and type in mono, required or default,\n * what it does and where it is defined. A table from sm up; on a phone each\n * row is a card with the name and type on top. One set of rows serves both,\n * so a row's `id` is a single anchor. A column nobody fills is left out.\n */\nexport function ApiTable({\n rows,\n caption,\n nameHeader = 'Name',\n className,\n}: {\n rows: ApiRow[];\n caption?: string;\n nameHeader?: string;\n className?: string;\n}) {\n const hasDefault = rows.some((r) => r.default !== undefined);\n const hasDescription = rows.some((r) => said(r.description));\n const hasSource = rows.some((r) => said(r.source));\n const cell = 'px-4 py-3 max-sm:p-0';\n return (\n <div className={cn('not-prose my-6 overflow-hidden rounded-2xl border border-border bg-card', className)}>\n <ScrollFade fade=\"var(--card)\">\n <table className=\"w-full border-collapse text-left text-[0.875rem] max-sm:block\">\n {caption ? <caption className=\"sr-only\">{caption}</caption> : null}\n <thead className=\"max-sm:sr-only\">\n <tr className=\"border-b border-oca-hairline-strong bg-oca-table-head text-[0.8125rem]\">\n <th scope=\"col\" className=\"px-4 py-2.5 font-medium\">{nameHeader}</th>\n <th scope=\"col\" className=\"px-4 py-2.5 font-medium\">Type</th>\n {hasDefault ? <th scope=\"col\" className=\"px-4 py-2.5 font-medium\">Default</th> : null}\n {hasDescription ? <th scope=\"col\" className=\"px-4 py-2.5 font-medium\">Description</th> : null}\n {hasSource ? <th scope=\"col\" className=\"px-4 py-2.5 font-medium\">Defined in</th> : null}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border max-sm:block\">\n {rows.map((r) => (\n <tr\n key={r.id ?? r.name}\n id={r.id}\n className=\"scroll-mt-28 align-top target:bg-muted max-sm:flex max-sm:flex-col max-sm:gap-1.5 max-sm:px-4 max-sm:py-3.5\"\n >\n <th scope=\"row\" className={cn(cell, 'text-left font-normal')}>\n <span className=\"flex flex-col items-start gap-1 max-sm:flex-row max-sm:flex-wrap max-sm:items-baseline max-sm:gap-x-2\">\n <code className={cn('font-mono text-[0.8125rem] text-foreground max-sm:text-[0.875rem]', r.deprecated && 'line-through decoration-oca-subtle')}>\n {r.name}\n </code>\n {r.required ? <span className=\"text-[0.75rem] text-oca-accent-ink\">Required</span> : null}\n {r.deprecated ? <Badge tone=\"muted\">Deprecated</Badge> : null}\n {r.status ? <StatusBadge status={r.status} /> : null}\n </span>\n </th>\n <td className={cn(cell, 'font-mono text-[0.8125rem] text-muted-foreground max-sm:break-all', !said(r.type) && 'max-sm:hidden')}>\n {r.type ?? '—'}\n </td>\n {hasDefault ? (\n <td className={cn(cell, 'font-mono text-[0.8125rem] text-muted-foreground max-sm:order-last', r.default === undefined && 'max-sm:hidden')}>\n <span className=\"font-sans sm:hidden\">Default </span>\n {r.default ?? '—'}\n </td>\n ) : null}\n {hasDescription ? (\n <td className={cn(cell, 'leading-relaxed text-muted-foreground', !said(r.description) && 'max-sm:hidden')}>\n {r.description}\n </td>\n ) : null}\n {hasSource ? (\n <td className={cn(cell, 'text-[0.8125rem] text-muted-foreground max-sm:order-last max-sm:break-all', !said(r.source) && 'max-sm:hidden')}>\n {r.source}\n </td>\n ) : null}\n </tr>\n ))}\n </tbody>\n </table>\n </ScrollFade>\n </div>\n );\n}\n\n/* ── Diagrams ────────────────────────────────────────────────────────── */\n\n/** The two calls Diagram makes on mermaid; the package does not depend on it. */\nexport interface MermaidLike {\n initialize(config: Record<string, unknown>): void;\n render(id: string, text: string): Promise<{ svg: string }>;\n}\n\nexport type MermaidLoader = () => Promise<MermaidLike | { default: MermaidLike }>;\n\nfunction useDarkMode(): boolean {\n const [dark, setDark] = useState(false);\n useEffect(() => {\n const root = document.documentElement;\n const read = () => setDark(root.classList.contains('dark'));\n read();\n const mo = new MutationObserver(read);\n mo.observe(root, { attributes: true, attributeFilter: ['class'] });\n return () => mo.disconnect();\n }, []);\n return dark;\n}\n\n/** Mermaid's palette from the tokens on the page, so a diagram follows light and dark. */\nfunction mermaidTheme(el: HTMLElement): Record<string, string> {\n const css = getComputedStyle(el);\n const v = (name: string) => css.getPropertyValue(name).trim();\n const card = v('--card');\n const muted = v('--muted');\n const text = v('--foreground');\n const subtle = v('--muted-foreground');\n const line = v('--input');\n const hair = v('--oca-hairline-strong');\n return {\n background: 'transparent',\n fontFamily: css.fontFamily,\n fontSize: '14px',\n textColor: text,\n mainBkg: card,\n primaryColor: card,\n primaryTextColor: text,\n primaryBorderColor: hair,\n secondaryColor: muted,\n secondaryTextColor: text,\n secondaryBorderColor: hair,\n tertiaryColor: muted,\n tertiaryTextColor: text,\n tertiaryBorderColor: hair,\n nodeBorder: hair,\n lineColor: line,\n edgeLabelBackground: card,\n clusterBkg: muted,\n clusterBorder: hair,\n titleColor: text,\n noteBkgColor: muted,\n noteTextColor: text,\n noteBorderColor: hair,\n actorBkg: card,\n actorBorder: hair,\n actorTextColor: text,\n actorLineColor: line,\n signalColor: text,\n signalTextColor: text,\n labelBoxBkgColor: card,\n labelBoxBorderColor: hair,\n labelTextColor: text,\n loopTextColor: subtle,\n activationBkgColor: muted,\n activationBorderColor: hair,\n sequenceNumberColor: card,\n };\n}\n\n/*\n * Mermaid draws at 100% width with its own size as a max-width, so a wide\n * diagram shrinks to fit and its labels with it. Give it its own width\n * instead, and read that width back: one up to a third wider than the\n * column scales down to fit (its 14px labels stay at 10.5px or more); a\n * wider one keeps its type size and scrolls sideways.\n */\nconst FIT = 4 / 3;\n\nfunction naturalSize(svg: string): { svg: string; width: number | null } {\n const w = svg.match(/viewBox=\"[\\d.-]+ [\\d.-]+ ([\\d.]+) [\\d.]+\"/)?.[1];\n if (!w) return { svg, width: null };\n const width = Math.ceil(Number(w));\n return {\n svg: svg.replace(/<svg([^>]*?)\\swidth=\"100%\"/, `<svg$1 width=\"${width}\"`).replace(/max-width:\\s*[\\d.]+px;?/, ''),\n width,\n };\n}\n\n/** The width a diagram has to fill: the figure, less the well's padding. */\nfunction useInnerWidth(ref: RefObject<HTMLElement | null>, padding: number): number | null {\n const [width, setWidth] = useState<number | null>(null);\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n const ro = new ResizeObserver(() => setWidth(el.clientWidth - padding));\n ro.observe(el);\n return () => ro.disconnect();\n }, [ref, padding]);\n return width;\n}\n\n/**\n * A mermaid diagram drawn in the page's own colours, again whenever the\n * page turns light or dark. Pass `load` (`() => import('mermaid')`) so\n * mermaid is fetched only on a page that draws one. If it cannot be drawn,\n * the source shows instead.\n */\nexport function Diagram({ chart, caption, load, className }: { chart: string; caption?: ReactNode; load: MermaidLoader; className?: string }) {\n const ref = useRef<HTMLDivElement>(null);\n const dark = useDarkMode();\n const raw = useId();\n const [drawn, setDrawn] = useState<{ svg: string; width: number | null } | null>(null);\n const [failed, setFailed] = useState(false);\n const room = useInnerWidth(ref, 48);\n const fits = drawn?.width != null && room != null && drawn.width <= room * FIT;\n useEffect(() => {\n let live = true;\n const el = ref.current;\n if (!el) return;\n (async () => {\n try {\n const mod = await load();\n const mermaid = 'default' in mod ? mod.default : mod;\n mermaid.initialize({ startOnLoad: false, securityLevel: 'strict', theme: 'base', themeVariables: mermaidTheme(el) });\n const { svg } = await mermaid.render(`oca-diagram-${raw.replace(/[^a-zA-Z0-9]/g, '')}-${dark ? 'd' : 'l'}`, chart);\n if (live) {\n setDrawn(naturalSize(svg));\n setFailed(false);\n }\n } catch {\n if (live) setFailed(true);\n }\n })();\n return () => {\n live = false;\n };\n }, [chart, dark, load, raw]);\n if (failed) return <CodeBlock code={chart} caption=\"Diagram (shown as its source)\" className={cn('my-6', className)} />;\n return (\n <figure ref={ref} className={cn('not-prose my-6 overflow-hidden rounded-[1.25rem] border border-border bg-card', className)}>\n {drawn ? (\n <ScrollFade fade=\"var(--card)\">\n <div\n data-fit={fits ? '' : undefined}\n className={cn(\n 'flex justify-center p-6 [&_svg]:h-auto',\n fits ? 'w-full [&_svg]:max-w-full' : 'w-max min-w-full [&_svg]:max-w-none'\n )}\n role=\"img\"\n aria-label={typeof caption === 'string' ? caption : 'Diagram'}\n dangerouslySetInnerHTML={{ __html: drawn.svg }}\n />\n </ScrollFade>\n ) : (\n <div role=\"status\" aria-label=\"Drawing the diagram\" className=\"p-6\">\n <Skeleton className=\"h-40 w-full rounded-xl\" />\n </div>\n )}\n {caption ? <figcaption className=\"border-t border-border px-5 py-3 text-[0.8125rem] text-muted-foreground\">{caption}</figcaption> : null}\n </figure>\n );\n}\n\n/* ── Headings with anchors ───────────────────────────────────────────── */\n\nconst HEADING = {\n h1: 'oca-display-3 mb-4 text-foreground',\n h2: 'mb-3 mt-12 text-[1.375rem] font-medium leading-tight tracking-[-0.015em] text-foreground md:text-[1.5rem]',\n h3: 'mb-2 mt-9 text-[1.125rem] font-medium leading-snug tracking-[-0.01em] text-foreground',\n h4: 'mb-2 mt-7 text-[1rem] font-medium leading-snug text-foreground',\n} as const;\n\n/**\n * A docs heading. With an id it carries a \"#\" link to itself, shown on\n * hover or focus, so a reader can copy a link to the section.\n */\nexport function DocsHeading({\n as: Tag,\n id,\n children,\n className,\n ...props\n}: HTMLAttributes<HTMLHeadingElement> & { as: keyof typeof HEADING }) {\n return (\n <Tag id={id} className={cn('group scroll-mt-28', HEADING[Tag], className)} {...props}>\n <span data-heading-text=\"\">{children}</span>\n {id && Tag !== 'h1' ? (\n <a\n href={`#${id}`}\n className=\"ml-2 inline-block rounded-md px-1 align-baseline text-[0.85em] font-normal text-oca-subtle no-underline opacity-0 transition-opacity hover:text-foreground focus-visible:opacity-100 group-hover:opacity-100\"\n >\n <span aria-hidden>#</span>\n <span className=\"sr-only\">Link to this section</span>\n </a>\n ) : null}\n </Tag>\n );\n}\n\n/** Text of an MDX `<code>` child, which may arrive as a string or pieces of one. */\nexport function codeText(node: ReactNode): string {\n if (typeof node === 'string') return node;\n if (typeof node === 'number') return String(node);\n if (Array.isArray(node)) return node.map(codeText).join('');\n if (isValidElement(node)) return codeText((node as ReactElement<{ children?: ReactNode }>).props.children);\n return '';\n}\n\n/** The language of an MDX code fence, from its `language-xx` class. */\nexport function codeLang(node: ReactNode): string | undefined {\n const child = Children.toArray(node)[0];\n if (!isValidElement(child)) return undefined;\n const cls = (child as ReactElement<{ className?: string }>).props.className ?? '';\n return cls.match(/language-([\\w+-]+)/)?.[1];\n}\n","/*\n * The orangecheck family as data: every public site, its one line, its group\n * and its status. The family menu, the footer, the protocol grid and the app\n * grid all read it, so a site is added, renamed or retired here and nowhere\n * else. No React: OG renderers and server code import it too.\n *\n * Status is written here until the claims source exists; then it is read\n * from there. \"live\" shows no badge.\n */\nimport type { FooterColumn, NavItem } from '../lib/nav';\n\n/** The six protocols, in the family's fixed order. */\nexport type ProtocolSlug = 'attest' | 'lock' | 'vote' | 'stamp' | 'agent' | 'pledge';\n\n/** The same slugs as the classic system's, so a site's `current` carries over. */\nexport type FamilySlug =\n | 'home'\n | 'me'\n | 'docs'\n | ProtocolSlug\n | 'vault'\n | 'chat'\n | 'cosign'\n | 'me-demo'\n | 'globe'\n | 'btc';\n\nexport type FamilyGroup = 'orangecheck' | 'protocol' | 'app' | 'public-good';\n\n/** Where a site or feature stands, in the family's words. */\nexport type SiteStatus = 'live' | 'testing' | 'not-yet' | 'paused';\n\nexport interface FamilySite {\n slug: FamilySlug;\n /** The site's word, lowercase, as menus and lockups show it. */\n label: string;\n /** Where the family menu and footer send people. A protocol's is its page on ochk.io. */\n href: string;\n group: FamilyGroup;\n /** What it is, in one sentence. */\n line: string;\n status: SiteStatus;\n /** For an app: the protocols it shows. */\n protocols?: ProtocolSlug[];\n}\n\nexport interface ProtocolSite extends FamilySite {\n slug: ProtocolSlug;\n group: 'protocol';\n /** What it carries: identity, confidentiality, legitimacy, provenance, authority, commitment. */\n verb: string;\n /** The protocol's page on ochk.io. */\n pageHref: string;\n /** The tools, on the protocol's own host. */\n toolHref: string;\n /** The normative spec. */\n specHref: string;\n /** The Nostr event kinds it publishes. */\n kinds: string;\n}\n\nexport const OCHK_IO = 'https://ochk.io';\n/** The docs live under ochk.io; docs.ochk.io 308s here. */\nexport const DOCS_HREF = `${OCHK_IO}/docs`;\n\nfunction protocol(\n slug: ProtocolSlug,\n verb: string,\n line: string,\n kinds: string\n): ProtocolSite {\n return {\n slug,\n label: slug,\n href: `${OCHK_IO}/${slug}`,\n group: 'protocol',\n line,\n status: 'live',\n verb,\n pageHref: `${OCHK_IO}/${slug}`,\n toolHref: `https://${slug}.ochk.io`,\n specHref: `https://github.com/orangecheck/oc-${slug}-protocol`,\n kinds,\n };\n}\n\n/** Attest · Lock · Vote · Stamp · Agent · Pledge, everywhere. */\nexport const PROTOCOLS: readonly ProtocolSite[] = [\n protocol('attest', 'identity', 'Show that an address holds bitcoin, and for how long.', '30078'),\n protocol('lock', 'confidentiality', 'Encrypt to a Bitcoin address, so only its holder can open it.', '30078'),\n protocol('vote', 'legitimacy', 'Polls weighed in sats, that anyone can tally.', '30080–30082'),\n protocol('stamp', 'provenance', 'Prove who signed something, and when.', '30083'),\n protocol('agent', 'authority', 'Give software scoped, revocable permission to act for you.', '30083–30086'),\n protocol('pledge', 'commitment', 'Make a promise with bitcoin behind it, on a public record.', '30078'),\n];\n\nexport const PROTOCOL_ORDER: readonly ProtocolSlug[] = PROTOCOLS.map((p) => p.slug);\n\nexport const FAMILY: readonly FamilySite[] = [\n {\n slug: 'home',\n label: 'ochk.io',\n href: OCHK_IO,\n group: 'orangecheck',\n line: 'The open protocols, and the company behind them.',\n status: 'live',\n },\n {\n slug: 'me',\n label: 'ochk.app',\n href: 'https://ochk.app',\n group: 'orangecheck',\n line: 'One account, with Bitcoin behind it.',\n status: 'testing',\n },\n {\n slug: 'docs',\n label: 'docs',\n href: DOCS_HREF,\n group: 'orangecheck',\n line: 'Specs, SDKs and guides for every protocol.',\n status: 'live',\n },\n ...PROTOCOLS,\n {\n slug: 'vault',\n label: 'vault',\n href: 'https://vault.ochk.io',\n group: 'app',\n line: 'A password manager, encrypted in your browser.',\n status: 'live',\n protocols: ['lock'],\n },\n {\n slug: 'chat',\n label: 'chat',\n href: 'https://chat.ochk.io',\n group: 'app',\n line: 'Messages only the holder of a Bitcoin address can read.',\n status: 'testing',\n protocols: ['lock'],\n },\n {\n slug: 'cosign',\n label: 'cosign',\n href: 'https://cosign.ochk.io',\n group: 'app',\n line: 'Builders find co-founders and backers.',\n status: 'testing',\n // Signs in with an orangecheck account and a wallet; uses none of the six directly.\n protocols: [],\n },\n {\n slug: 'me-demo',\n // \"demo\", not the made-up app's own name, so nobody takes it for ours.\n label: 'demo',\n href: 'https://me-demo.ochk.io',\n group: 'app',\n line: 'Lumen Notes, a made-up app that signs in with orangecheck.',\n status: 'live',\n },\n {\n slug: 'globe',\n label: 'globe',\n href: 'https://globe.ochk.io',\n group: 'public-good',\n line: 'The Bitcoin network, live, on a globe.',\n status: 'live',\n },\n {\n slug: 'btc',\n label: 'btc',\n href: 'https://btc.ochk.io',\n group: 'public-good',\n line: 'A free desk for reading the Bitcoin market.',\n status: 'live',\n },\n];\n\nexport const FAMILY_GROUPS: readonly { id: FamilyGroup; label: string }[] = [\n { id: 'orangecheck', label: 'orangecheck' },\n { id: 'protocol', label: 'Protocols' },\n { id: 'app', label: 'Apps' },\n { id: 'public-good', label: 'Public goods' },\n];\n\nconst BY_SLUG = new Map(FAMILY.map((s) => [s.slug, s]));\n\nexport function familySite(slug: FamilySlug): FamilySite {\n return BY_SLUG.get(slug)!;\n}\n\nexport function protocolSite(slug: ProtocolSlug): ProtocolSite {\n return BY_SLUG.get(slug) as ProtocolSite;\n}\n\n/** The family in its groups, in order, for menus and footers. */\nexport function familyByGroup(): { id: FamilyGroup; label: string; sites: FamilySite[] }[] {\n return FAMILY_GROUPS.map((g) => ({ ...g, sites: FAMILY.filter((s) => s.group === g.id) }));\n}\n\n/** One fixed row on every footer, all on ochk.io. */\nexport const LEGAL_LINKS: readonly NavItem[] = [\n { href: `${OCHK_IO}/privacy`, label: 'Privacy' },\n { href: `${OCHK_IO}/terms`, label: 'Terms' },\n { href: `${OCHK_IO}/security`, label: 'Security' },\n { href: `${OCHK_IO}/trademark`, label: 'Trademarks' },\n { href: `${OCHK_IO}/contact`, label: 'Contact' },\n];\n\n/**\n * The same row for a product that hosts its own documents (ochk.app, vault):\n * ochk.io's cover the free protocols, not a product that holds money, so its\n * privacy, terms, security and contact pages are its own. The trademarks are\n * the company's, on ochk.io.\n */\nexport const SELF_HOSTED_LEGAL_LINKS: readonly NavItem[] = [\n { href: '/privacy', label: 'Privacy' },\n { href: '/terms', label: 'Terms' },\n { href: '/security', label: 'Security' },\n { href: `${OCHK_IO}/trademark`, label: 'Trademarks' },\n { href: '/contact', label: 'Contact' },\n];\n\n/**\n * ochk.io's header navigation. oc-www and the docs (served under ochk.io/docs)\n * both draw it from here, so the two cannot drift. Absolute links work from\n * either; mark the active item where it is rendered.\n */\nexport const OCHK_IO_NAV: readonly NavItem[] = [\n {\n href: `${OCHK_IO}/protocols`,\n label: 'Protocols',\n children: PROTOCOLS.map((p) => ({ href: p.pageHref, label: p.label, description: p.line })),\n },\n { href: `${OCHK_IO}/apps`, label: 'Apps' },\n { href: DOCS_HREF, label: 'Docs' },\n { href: `${OCHK_IO}/trust`, label: 'Trust' },\n { href: `${OCHK_IO}/about`, label: 'About' },\n];\n\n/** ochk.io's own footer column; `SiteFooter family` adds the family's. */\nexport const OCHK_IO_FOOTER: readonly FooterColumn[] = [\n {\n heading: 'Company',\n links: [\n { href: `${OCHK_IO}/about`, label: 'About' },\n { href: `${OCHK_IO}/trust`, label: 'Trust' },\n { href: 'https://github.com/orangecheck', label: 'GitHub', external: true },\n ],\n },\n];\n","import { useContext } from 'react';\n\nimport { sharedContext } from './shared-context';\n\n/** Set by DocsShell: inside the docs, a link to the docs is a page of this site, through the router. */\nexport const InDocsContext = sharedContext<boolean>('in-docs', false);\n\nexport function useInDocs(): boolean {\n return useContext(InDocsContext);\n}\n","import { ArrowRight, ArrowUpRight } from 'lucide-react';\nimport Link from 'next/link';\nimport type { ReactNode } from 'react';\n\nimport {\n DOCS_HREF,\n FAMILY,\n PROTOCOL_ORDER,\n protocolSite,\n type FamilyGroup,\n type FamilySlug,\n type ProtocolSlug,\n type SiteStatus,\n} from '../family';\nimport { cn } from '../lib/cn';\nimport { useInDocs } from '../lib/docs-context';\nimport { Badge } from '../primitives/badge';\nimport { StatusBadge } from '../primitives/status-badge';\n\n/*\n * A card that is one link: the title carries the link and stretches over the\n * card, so the name is what a screen reader hears, and the whole card shows\n * one focus ring when the keyboard reaches it.\n */\nconst CARD =\n 'group relative flex h-full flex-col rounded-[1.25rem] border border-border bg-card p-6 transition-colors hover:border-oca-hairline-strong md:p-7 ' +\n 'has-[a:focus-visible]:ring-2 has-[a:focus-visible]:ring-ring has-[a:focus-visible]:ring-offset-2 has-[a:focus-visible]:ring-offset-background';\nconst STRETCH = 'outline-none after:absolute after:inset-0 after:rounded-[1.25rem] after:content-[\"\"]';\n\nconst pad = (n: number) => String(n + 1).padStart(2, '0');\n\n/**\n * The six protocols as cards, from the registry, in the family's order: the\n * verb's word, what it carries, one line, its Nostr kinds. `link` picks the\n * protocol's page on ochk.io, its tools, or its docs.\n */\nexport function ProtocolGrid({\n protocols = PROTOCOL_ORDER,\n link = 'page',\n className,\n}: {\n protocols?: readonly ProtocolSlug[];\n link?: 'page' | 'tool' | 'docs';\n className?: string;\n}) {\n // Inside the docs, their pages are this site's: through the router, under its base path.\n const inDocs = useInDocs();\n return (\n <ul className={cn('grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 md:gap-5', className)}>\n {protocols.map((slug) => {\n const p = protocolSite(slug);\n const i = PROTOCOL_ORDER.indexOf(slug);\n return (\n <li key={slug}>\n <div className={cn(CARD, 'gap-4')}>\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"oca-numeral\">\n {pad(i)} <span className=\"ml-1.5 capitalize\">{p.verb}</span>\n </span>\n {p.status !== 'live' ? <StatusBadge status={p.status} /> : null}\n </div>\n <h3 className=\"oca-display-3\">\n {link === 'docs' && inDocs ? (\n <Link href={`/${p.slug}`} className={STRETCH}>\n {p.label}\n </Link>\n ) : (\n <a\n href={link === 'tool' ? p.toolHref : link === 'docs' ? `${DOCS_HREF}/${p.slug}` : p.pageHref}\n className={STRETCH}\n >\n {p.label}\n </a>\n )}\n </h3>\n <p className=\"oca-body\">{p.line}</p>\n <div className=\"mt-auto flex items-center justify-between gap-3 pt-2 text-[0.875rem] text-muted-foreground\">\n <span className=\"oca-tabular\">Nostr kind {p.kinds}</span>\n {/* A tool is another site; a page or the docs are on ochk.io. */}\n {link === 'tool' ? (\n <ArrowUpRight\n aria-hidden\n className=\"size-4 transition-transform duration-200 group-hover:-translate-y-0.5 group-hover:translate-x-0.5 group-hover:text-foreground\"\n />\n ) : (\n <ArrowRight\n aria-hidden\n className=\"size-4 transition-transform duration-200 group-hover:translate-x-0.5 group-hover:text-foreground\"\n />\n )}\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n );\n}\n\nexport interface AppCardProps {\n name: ReactNode;\n line: ReactNode;\n href: string;\n /** The protocols it shows, as chips. */\n protocols?: readonly ProtocolSlug[];\n status?: SiteStatus;\n className?: string;\n}\n\n/** One app: its name, one line, the protocols it shows, and where it is. The card is the link. */\nexport function AppCard({ name, line, href, protocols = [], status = 'live', className }: AppCardProps) {\n return (\n <div className={cn(CARD, 'gap-3', className)}>\n <div className=\"flex items-start justify-between gap-3\">\n <h3 className=\"oca-title\">\n <a href={href} className={STRETCH}>\n {name}\n </a>\n </h3>\n {status !== 'live' ? <StatusBadge status={status} /> : null}\n </div>\n <p className=\"oca-body text-[0.9375rem]\">{line}</p>\n <div className=\"mt-auto flex items-end justify-between gap-3 pt-3\">\n {protocols.length > 0 ? (\n <p className=\"flex flex-wrap items-center gap-1.5 text-[0.8125rem] text-muted-foreground\">\n Shows\n {protocols.map((p) => (\n <Badge key={p} tone=\"muted\">\n {p}\n </Badge>\n ))}\n </p>\n ) : (\n <span />\n )}\n <span className=\"flex shrink-0 items-center gap-1 text-[0.875rem] text-muted-foreground transition-colors group-hover:text-foreground\">\n {href.replace(/^https?:\\/\\//, '')}\n <ArrowUpRight aria-hidden className=\"size-4\" />\n </span>\n </div>\n </div>\n );\n}\n\n/** The apps in a group, from the registry: `app` for the showcase apps, `public-good` for globe and btc. */\nexport function AppGrid({\n group = 'app',\n sites,\n className,\n}: {\n group?: Extract<FamilyGroup, 'app' | 'public-good'>;\n /** Pick and order the apps yourself instead. */\n sites?: readonly FamilySlug[];\n className?: string;\n}) {\n const list = sites\n ? sites.map((slug) => FAMILY.find((s) => s.slug === slug)).filter((s) => s !== undefined)\n : FAMILY.filter((s) => s.group === group);\n return (\n <ul className={cn('grid grid-cols-1 gap-4 sm:grid-cols-2 md:gap-5', className)}>\n {list.map((s) => (\n <li key={s.slug}>\n <AppCard name={s.label} line={s.line} href={s.href} protocols={s.protocols} status={s.status} />\n </li>\n ))}\n </ul>\n );\n}\n","import { useRouter } from 'next/compat/router';\nimport Link from 'next/link';\nimport type { ReactNode } from 'react';\n\nimport { cn } from '../lib/cn';\n\nconst LINK = 'text-foreground underline decoration-foreground/35 underline-offset-4 transition-colors hover:decoration-foreground';\n\nconst SCHEME = /^[a-z][a-z\\d+.-]*:/i;\n\n/**\n * `../README` or `VerifyOk`, as generated pages write them, against the page\n * it is on: `/sdk/stamp-core/README`. The router adds the base path. Outside\n * a router it stays as written.\n */\nfunction useResolved(href: string): string {\n const router = useRouter();\n if (!router || !href || href.startsWith('/') || href.startsWith('#') || href.startsWith('?') || SCHEME.test(href)) return href;\n const here = router.asPath.split(/[?#]/)[0] || '/';\n const url = new URL(href, `https://page.invalid${here}`);\n return url.pathname + url.search + url.hash;\n}\n\n/**\n * A link in running text. A page of this site goes through the router, a\n * relative one (`../README`) resolved against the page; an API or a\n * /.well-known file is a plain anchor (the router would try to render it);\n * another site opens in a new tab, and says so to a screen reader.\n */\nexport function TextLink({\n href: written,\n children,\n external,\n className,\n}: {\n href: string;\n children: ReactNode;\n /** Force a new tab (true) or keep it in this one (false). Default: by the address. */\n external?: boolean;\n className?: string;\n}) {\n const href = useResolved(written);\n const internal = href.startsWith('/') && !href.startsWith('/api/') && !href.startsWith('/.well-known/');\n const offsite = external ?? /^https?:\\/\\//.test(href);\n if (internal && !offsite) {\n return (\n <Link href={href} className={cn(LINK, className)}>\n {children}\n </Link>\n );\n }\n return (\n <a href={href} className={cn(LINK, className)} {...(offsite ? { target: '_blank', rel: 'noreferrer' } : {})}>\n {children}\n {offsite ? <span className=\"sr-only\"> (opens in a new tab)</span> : null}\n </a>\n );\n}\n","import { ArrowUpRight } from 'lucide-react';\nimport { useState, type CSSProperties, type FormEvent, type ReactNode } from 'react';\n\nimport { PROTOCOLS, protocolSite, type ProtocolSlug } from '../family';\nimport { cn } from '../lib/cn';\nimport { Button } from '../primitives/button';\nimport { Field, Input, Textarea } from '../primitives/form';\nimport { ScrollFade } from '../primitives/scroll-fade';\nimport { StatusBadge } from '../primitives/status-badge';\nimport { Callout } from './docs';\nimport { PageHero } from './hero';\nimport { TextLink } from './text-link';\n\n/*\n * The parts of a protocol's page on ochk.io. Each takes the protocol's slug\n * and reads its word, verb, links and kinds from the registry, so the six\n * pages are the same page with different data and cannot drift.\n */\n\n/** The top of a protocol page: \"Protocol · provenance\", the title, one line, the ways in. */\nexport function ProtocolHero({\n protocol,\n title,\n lead,\n actions,\n art,\n children,\n className,\n}: {\n protocol: ProtocolSlug;\n title: ReactNode;\n lead?: ReactNode;\n actions?: ReactNode;\n /** Beside the words from md up: the artifact itself, at size. */\n art?: ReactNode;\n children?: ReactNode;\n className?: string;\n}) {\n const p = protocolSite(protocol);\n return (\n <PageHero\n className={className}\n eyebrow={`Protocol · ${p.verb}`}\n title={title}\n lead={lead}\n actions={actions}\n art={art}\n >\n {p.status !== 'live' || children ? (\n <div className=\"flex flex-col items-start gap-4\">\n {p.status !== 'live' ? <StatusBadge status={p.status} /> : null}\n {children}\n </div>\n ) : null}\n </PageHero>\n );\n}\n\n/** The six protocols as a row of links, the current one underlined. Scrolls sideways on a phone. */\nexport function ProtocolNav({\n current,\n link = 'page',\n className,\n}: {\n current?: ProtocolSlug;\n link?: 'page' | 'tool';\n className?: string;\n}) {\n return (\n <nav aria-label=\"Protocols\" className={className}>\n <ScrollFade fade=\"var(--background)\">\n <ul className=\"flex w-max min-w-full items-center gap-6 border-b border-border\">\n {PROTOCOLS.map((p) => {\n const on = p.slug === current;\n return (\n <li key={p.slug}>\n <a\n href={link === 'tool' ? p.toolHref : p.pageHref}\n aria-current={on ? 'page' : undefined}\n className={cn(\n '-mb-px inline-flex h-11 items-center border-b-2 text-[0.9375rem] transition-colors',\n on\n ? 'border-foreground text-foreground'\n : 'border-transparent text-muted-foreground hover:text-foreground'\n )}\n >\n {p.label}\n </a>\n </li>\n );\n })}\n </ul>\n </ScrollFade>\n </nav>\n );\n}\n\n/** Which normative file a page summarises: its default file, title and sentence. */\nexport type SpecFileKind = 'spec' | 'security' | 'rationale';\n\nconst SPEC_FILE: Record<SpecFileKind, { file: string; title: string; note: string }> = {\n spec: {\n file: 'SPEC.md',\n title: 'Normative source',\n note: 'This page is a human-readable summary. The authoritative copy lives in the spec repo. If the two ever drift, the repo wins.',\n },\n security: {\n file: 'SECURITY.md',\n title: 'Normative threat model',\n note: 'This page is the short form. The authoritative, numbered threat model lives in the spec repo.',\n },\n rationale: {\n file: 'WHY.md',\n title: 'Design rationale',\n note: 'This page is the short version. The full rationale and the rejected-design log live in the spec repo.',\n },\n};\n\nexport type SpecCardProps =\n | {\n protocol: ProtocolSlug;\n version: string;\n license?: string;\n /** How many test vectors ship with it. */\n vectors?: number;\n size?: 'md' | 'sm';\n className?: string;\n repo?: never;\n }\n | {\n /** One file in any spec repo, `oc-chat-protocol` included: where a page's normative copy lives. */\n repo: string;\n /** Default: the kind's file (SPEC.md, SECURITY.md, WHY.md). */\n file?: string;\n kind?: SpecFileKind;\n version?: string;\n /** Replaces the kind's sentence. */\n note?: ReactNode;\n className?: string;\n protocol?: never;\n };\n\n/**\n * The spec, as a card: its repository, version, licence, kinds and test\n * vectors, and the way to read it. `sm` is one line, for a reference in\n * running text or a docs page. Given a `repo` instead of a protocol, it is\n * a note naming one file in that repo as the normative copy of the page.\n */\nexport function SpecCard(props: SpecCardProps) {\n return props.repo !== undefined ? <SpecFileNote {...props} /> : <ProtocolSpecCard {...props} />;\n}\n\nfunction SpecFileNote({ repo, file, kind = 'spec', version, note, className }: Extract<SpecCardProps, { repo: string }>) {\n const d = SPEC_FILE[kind];\n const f = file ?? d.file;\n return (\n <Callout title={version ? `${d.title} · ${version}` : d.title} className={className}>\n <p>{note ?? d.note}</p>\n <p>\n <TextLink href={`https://github.com/orangecheck/${repo}/blob/main/${f}`} className=\"break-all font-mono text-[0.875rem]\">\n {`${repo}/${f}`}\n </TextLink>\n </p>\n </Callout>\n );\n}\n\nfunction ProtocolSpecCard({ protocol, version, license, vectors, size = 'md', className }: Extract<SpecCardProps, { protocol: ProtocolSlug }>) {\n const p = protocolSite(protocol);\n const repo = `oc-${p.slug}-protocol`;\n const facts: [string, ReactNode][] = [\n ['Version', version],\n ...(license ? ([['Licence', license]] as [string, ReactNode][]) : []),\n ['Nostr kind', p.kinds],\n ...(vectors !== undefined ? ([['Test vectors', String(vectors)]] as [string, ReactNode][]) : []),\n ];\n if (size === 'sm') {\n return (\n <a\n href={p.specHref}\n className={cn(\n 'group flex flex-wrap items-center gap-x-4 gap-y-1 rounded-2xl border border-border bg-card px-4 py-3 text-[0.875rem] transition-colors hover:border-oca-hairline-strong',\n className\n )}\n >\n <span className=\"font-mono text-[0.8125rem] text-foreground\">{repo}</span>\n <span className=\"text-muted-foreground\">\n {facts.map(([k, v]) => (k === 'Version' ? `v${v}` : k === 'Nostr kind' ? `kind ${v}` : v)).join(' · ')}\n </span>\n <span className=\"ml-auto flex items-center gap-1 text-muted-foreground group-hover:text-foreground\">\n Read the spec <ArrowUpRight aria-hidden className=\"size-4\" />\n </span>\n </a>\n );\n }\n return (\n <div className={cn('flex flex-col gap-6 rounded-[1.25rem] border border-border bg-card p-6 md:p-8', className)}>\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"flex min-w-0 flex-col gap-1.5\">\n <p className=\"text-[0.875rem] text-muted-foreground\">The spec</p>\n <h3 className=\"oca-title break-all font-mono text-[1.0625rem] tracking-normal\">{repo}</h3>\n </div>\n {p.status !== 'live' ? <StatusBadge status={p.status} /> : null}\n </div>\n <dl className=\"grid grid-cols-2 gap-x-6 gap-y-4 sm:grid-cols-4\">\n {facts.map(([k, v]) => (\n <div key={k} className=\"flex flex-col gap-1\">\n <dt className=\"text-[0.8125rem] text-muted-foreground\">{k}</dt>\n <dd className=\"oca-tabular text-[1.0625rem]\">{v}</dd>\n </div>\n ))}\n </dl>\n <div>\n <Button asChild variant=\"secondary\" size=\"sm\">\n <a href={p.specHref}>\n Read the spec <ArrowUpRight aria-hidden />\n </a>\n </Button>\n </div>\n </div>\n );\n}\n\n/**\n * Paste an id, an envelope or a link and go to the page that checks it.\n * Without `onVerify` it is a plain GET form to `action`, so it works before\n * any script has loaded.\n */\nexport function VerifyBox({\n action,\n param = 'q',\n title,\n description,\n label = 'Id, envelope or link',\n placeholder,\n hint,\n submitLabel = 'Verify',\n multiline = false,\n onVerify,\n className,\n}: {\n /** Where the form goes: the tool's verify page. */\n action: string;\n /** The query parameter that carries what was pasted. */\n param?: string;\n title?: ReactNode;\n description?: ReactNode;\n label?: ReactNode;\n placeholder?: string;\n hint?: ReactNode;\n submitLabel?: string;\n /** A textarea, for a whole envelope. */\n multiline?: boolean;\n /** Handle it here instead of navigating. */\n onVerify?: (value: string) => void;\n className?: string;\n}) {\n const [value, setValue] = useState('');\n const submit = (e: FormEvent<HTMLFormElement>) => {\n if (!onVerify) return;\n e.preventDefault();\n if (value.trim()) onVerify(value.trim());\n };\n const button = (\n <Button type=\"submit\" className={multiline ? undefined : 'w-full sm:w-auto'}>\n {submitLabel}\n </Button>\n );\n return (\n <form\n action={action}\n method=\"get\"\n onSubmit={submit}\n className={cn('flex flex-col gap-5 rounded-[1.25rem] border border-border bg-card p-6 md:p-8', className)}\n >\n {title || description ? (\n <div className=\"flex flex-col gap-2\">\n {title ? <h3 className=\"oca-title\">{title}</h3> : null}\n {description ? <p className=\"oca-body text-[0.9375rem]\">{description}</p> : null}\n </div>\n ) : null}\n {multiline ? (\n <>\n <Field label={label} hint={hint}>\n <Textarea\n name={param}\n required\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={placeholder}\n spellCheck={false}\n className=\"min-h-32 font-mono text-base md:text-[0.8125rem]\"\n />\n </Field>\n <div>{button}</div>\n </>\n ) : (\n <Field label={label} hint={hint} action={button}>\n <Input\n name={param}\n required\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={placeholder}\n spellCheck={false}\n autoComplete=\"off\"\n className=\"font-mono text-base md:text-[0.875rem]\"\n />\n </Field>\n )}\n </form>\n );\n}\n\nexport interface ComparisonColumn {\n key: string;\n label: ReactNode;\n /** The one column the page argues for: tinted, read first on a phone. At most one. */\n highlight?: boolean;\n}\n\nexport interface ComparisonRow {\n label: ReactNode;\n /** One line under the property. */\n note?: ReactNode;\n /** An answer per column key, in words: \"Yes\", \"No\", \"Only with an x509 chain\". */\n values: Record<string, ReactNode>;\n}\n\nconst TINT = 'bg-[color-mix(in_oklab,var(--oca-orange)_9%,var(--card))]';\n\n/**\n * Systems side by side, a property per row, answers in words (never ✓ ✗ ~).\n * One column is tinted. On a phone each property becomes a card: the tinted\n * answer first and full width, the others two by two, each under its name.\n * Four or more columns wait for a desk to sit side by side.\n */\nexport function ComparisonTable({\n columns,\n rows,\n label,\n propertyHeading = 'Property',\n className,\n}: {\n columns: ComparisonColumn[];\n rows: ComparisonRow[];\n /** The list's name for a screen reader. */\n label: string;\n propertyHeading?: ReactNode;\n className?: string;\n}) {\n const wide = columns.length > 3;\n // Static class names per breakpoint, so Tailwind can see them.\n const grid = wide ? 'lg:grid lg:grid-cols-[var(--oca-compare)]' : 'md:grid md:grid-cols-[var(--oca-compare)]';\n const desk = wide ? 'lg' : 'md';\n const style = {\n // The argued-for column gets a little more room: its answers carry the page.\n '--oca-compare': ['minmax(0, 1.4fr)', ...columns.map((c) => (c.highlight ? 'minmax(0, 1.3fr)' : 'minmax(0, 1fr)'))].join(' '),\n } as CSSProperties;\n const ordered = [...columns].sort((a, b) => Number(Boolean(b.highlight)) - Number(Boolean(a.highlight)));\n return (\n <ul aria-label={label} style={style} className={cn('divide-y divide-border rounded-[1.25rem] border border-border bg-card', className)}>\n <li\n aria-hidden\n className={cn(\n 'hidden gap-5 px-5 py-4 text-[0.875rem] font-medium text-muted-foreground',\n wide ? 'lg:grid lg:px-8' : 'md:grid md:px-8',\n grid\n )}\n >\n <span>{propertyHeading}</span>\n {columns.map((c) => (\n <span key={c.key} className={cn(c.highlight && cn(TINT, '-my-4 px-4 py-4 text-oca-accent-ink'))}>\n {c.label}\n </span>\n ))}\n </li>\n {rows.map((r, ri) => (\n <li key={ri} className={cn('grid grid-cols-1 gap-3 px-5 py-5', wide ? 'lg:items-start lg:gap-5 lg:px-8' : 'md:items-start md:gap-5 md:px-8', grid)}>\n <div className=\"flex min-w-0 flex-col gap-1\">\n <span className=\"oca-title-sm\">{r.label}</span>\n {r.note ? <span className=\"text-[0.875rem] leading-snug text-muted-foreground\">{r.note}</span> : null}\n </div>\n <div className={cn('grid grid-cols-2 gap-1', desk === 'lg' ? 'lg:contents' : 'md:contents')}>\n {columns.map((c) => {\n // On a phone the tinted answer leads; on a desk the columns keep their order.\n return (\n <div\n key={c.key}\n style={{ '--oca-order': ordered.indexOf(c) } as CSSProperties}\n className={cn(\n // Two rows of the pair's grid (name, answer), so answers line up\n // across a pair even when one name wraps.\n 'order-[var(--oca-order)] row-span-2 grid min-w-0 grid-rows-subgrid gap-1 rounded-xl px-3 py-2.5',\n desk === 'lg'\n ? 'lg:order-none lg:row-span-1 lg:flex lg:flex-col'\n : 'md:order-none md:row-span-1 md:flex md:flex-col',\n c.highlight\n ? cn(\n TINT,\n 'col-span-2',\n desk === 'lg'\n ? 'lg:col-span-1 lg:-my-5 lg:self-stretch lg:rounded-none lg:px-4 lg:py-5'\n : 'md:col-span-1 md:-my-5 md:self-stretch md:rounded-none md:px-4 md:py-5'\n )\n : desk === 'lg'\n ? 'lg:p-0'\n : 'md:p-0'\n )}\n >\n <span\n className={cn(\n 'text-[0.8125rem]',\n c.highlight ? 'text-oca-accent-ink' : 'text-muted-foreground',\n desk === 'lg' ? 'lg:sr-only' : 'md:sr-only'\n )}\n >\n {c.label}\n </span>\n <span className={cn('text-[0.9375rem]', c.highlight && 'font-medium')}>\n {r.values[c.key] ?? '—'}\n </span>\n </div>\n );\n })}\n </div>\n </li>\n ))}\n </ul>\n );\n}\n","import type { AnchorHTMLAttributes, HTMLAttributes, ImgHTMLAttributes, InputHTMLAttributes, ReactNode } from 'react';\n\nimport { CodeBlock, CodeTabs, InstallTabs } from '../components/code-block';\nimport {\n ApiTable,\n Callout,\n CardGrid,\n codeLang,\n codeText,\n Diagram,\n DocsHeading,\n LinkCard,\n MdxTable,\n Step,\n Steps,\n type MermaidLoader,\n} from '../components/docs';\nimport { ProtocolGrid } from '../components/family-grids';\nimport { SpecCard } from '../components/protocol';\nimport { TextLink } from '../components/text-link';\nimport { cn } from '../lib/cn';\nimport { StatusBadge } from '../primitives/status-badge';\n\n/*\n * Markdown in the system's type: hand the map to MDX (useMDXComponents or\n * <MDXProvider components>) and every heading, paragraph, list, table,\n * quote and code fence takes its place. Pair it with rehypeCode (./code) so\n * fences arrive highlighted from the build; without it, a fence is\n * highlighted when the page renders.\n *\n * The blocks a page writes by name are in the map too: Callout, Steps and\n * Step, LinkCard and CardGrid, ApiTable, CodeTabs, InstallTabs, SpecCard,\n * ProtocolGrid, StatusBadge.\n */\n\n\nexport interface MdxOptions {\n /** `() => import('mermaid')`: draws ```mermaid fences as diagrams. Without it they show as code. */\n mermaid?: MermaidLoader;\n}\n\ntype PreProps = HTMLAttributes<HTMLPreElement> & {\n 'data-oca-code'?: string;\n 'data-html'?: string;\n 'data-lang'?: string;\n 'data-title'?: string;\n 'data-diff'?: string;\n 'data-line-numbers'?: string;\n 'data-eol'?: string;\n};\n\nexport function createMdxComponents({ mermaid }: MdxOptions = {}) {\n function Pre(props: PreProps) {\n // Highlighted at build time by rehypeCode.\n if (props['data-oca-code'] !== undefined) {\n return (\n <CodeBlock\n html={props['data-html'] ?? ''}\n lang={props['data-lang']}\n caption={props['data-title']}\n diff={props['data-diff'] !== undefined}\n lineNumbers={props['data-line-numbers'] !== undefined}\n trailingNewline={props['data-eol'] !== undefined}\n className=\"my-6\"\n />\n );\n }\n const lang = codeLang(props.children);\n const code = codeText(props.children);\n if (lang === 'mermaid' && mermaid) return <Diagram chart={code} load={mermaid} />;\n return (\n <CodeBlock\n code={code}\n lang={lang === 'mermaid' ? undefined : lang}\n caption={lang === 'mermaid' ? 'Diagram source' : undefined}\n className=\"my-6\"\n />\n );\n }\n\n function A({ href, children, ...rest }: AnchorHTMLAttributes<HTMLAnchorElement>) {\n // In-page anchors and footnote links stay plain.\n if (!href || href.startsWith('#')) {\n return (\n <a href={href} {...rest} className=\"text-foreground underline decoration-foreground/35 underline-offset-4 hover:decoration-foreground\">\n {children}\n </a>\n );\n }\n return <TextLink href={href}>{children}</TextLink>;\n }\n\n const heading = (as: 'h1' | 'h2' | 'h3' | 'h4') =>\n function Heading(props: HTMLAttributes<HTMLHeadingElement>) {\n return <DocsHeading as={as} {...props} />;\n };\n\n // TypeDoc writes h5 for a method's \"Returns\": a label over what follows, not a section.\n const minor = (Tag: 'h5' | 'h6') =>\n function Minor({ className, ...props }: HTMLAttributes<HTMLHeadingElement>) {\n return <Tag className={cn('mb-2 mt-6 scroll-mt-28 text-[0.9375rem] font-medium leading-snug text-foreground', className)} {...props} />;\n };\n\n return {\n h1: heading('h1'),\n h2: heading('h2'),\n h3: heading('h3'),\n h4: heading('h4'),\n p: ({ className, ...props }: HTMLAttributes<HTMLParagraphElement>) => (\n <p className={cn('my-4 text-[1rem] leading-[1.75] text-muted-foreground md:text-[1.0625rem]', className)} {...props} />\n ),\n a: A,\n strong: (props: HTMLAttributes<HTMLElement>) => <strong className=\"font-medium text-foreground\" {...props} />,\n h5: minor('h5'),\n h6: minor('h6'),\n ul: ({ className, ...props }: HTMLAttributes<HTMLUListElement>) => (\n <ul\n className={cn(\n 'my-4 list-disc space-y-1.5 pl-5 text-[1rem] leading-[1.7] text-muted-foreground marker:text-oca-subtle md:text-[1.0625rem]',\n // A GitHub task list: the box replaces the bullet.\n className?.includes('contains-task-list') && 'list-none pl-0',\n className\n )}\n {...props}\n />\n ),\n ol: ({ className, ...props }: HTMLAttributes<HTMLOListElement>) => (\n <ol\n className={cn(\n 'my-4 list-decimal space-y-1.5 pl-5 text-[1rem] leading-[1.7] text-muted-foreground marker:text-oca-subtle md:text-[1.0625rem]',\n className\n )}\n {...props}\n />\n ),\n li: ({ className, ...props }: HTMLAttributes<HTMLLIElement>) => (\n <li\n className={cn(\n 'pl-1 [&>p]:my-1 [&>ul]:my-1.5 [&>ol]:my-1.5',\n // A wrapped task starts under its text, not under the box.\n className?.includes('task-list-item') && 'pl-6 -indent-6',\n className\n )}\n {...props}\n />\n ),\n input: (props: InputHTMLAttributes<HTMLInputElement>) =>\n props.type === 'checkbox' ? (\n <input\n {...props}\n className={cn('mr-2 size-4 translate-y-[2px] align-baseline accent-foreground', props.className)}\n aria-label={props.checked ? 'Done' : 'To do'}\n />\n ) : (\n <input {...props} />\n ),\n blockquote: ({ children }: { children?: ReactNode }) => <Callout>{children}</Callout>,\n hr: () => <hr className=\"my-10 border-border\" />,\n table: MdxTable,\n code: ({ className, ...props }: HTMLAttributes<HTMLElement>) => (\n <code\n className={cn('break-words rounded-md bg-muted px-1.5 py-0.5 font-mono text-[0.875em] text-foreground', className)}\n {...props}\n />\n ),\n pre: Pre,\n img: ({ className, alt = '', ...props }: ImgHTMLAttributes<HTMLImageElement>) => (\n <img alt={alt} loading=\"lazy\" className={cn('my-6 h-auto max-w-full rounded-2xl border border-border', className)} {...props} />\n ),\n Callout,\n Steps,\n Step,\n LinkCard,\n CardGrid,\n ApiTable,\n CodeBlock,\n CodeTabs,\n InstallTabs,\n SpecCard,\n ProtocolGrid,\n StatusBadge,\n ...(mermaid\n ? { Diagram: (p: { chart: string; caption?: ReactNode }) => <Diagram {...p} load={mermaid} /> }\n : {}),\n };\n}\n\n/** Every key it maps, each a component: what MDX's useMDXComponents takes. */\nexport type MdxComponentMap = ReturnType<typeof createMdxComponents>;\n\n/** The map with no diagrams; createMdxComponents({ mermaid }) draws them. */\nexport const mdxComponents: MdxComponentMap = createMdxComponents();\n"]}
1
+ {"version":3,"sources":["../src/code/highlight.ts","../src/lib/cn.ts","../src/primitives/scroll-fade.tsx","../src/lib/shared-context.ts","../src/primitives/feedback.tsx","../src/primitives/button.tsx","../src/components/data.tsx","../src/components/code-block.tsx","../src/primitives/badge.tsx","../src/primitives/status-badge.tsx","../src/components/docs.tsx","../src/family/index.ts","../src/lib/docs-context.ts","../src/components/family-grids.tsx","../src/components/text-link.tsx","../src/components/protocol.tsx","../src/mdx/index.tsx"],"names":["jsx","extendTailwindMerge","clsx","useRef","useState","useCallback","useEffect","jsxs","createContext","forwardRef","Separator","SeparatorPrimitive","cva","Button","Slot","Fragment","Check","Copy","useMemo","useSyncExternalStore","TabsPrimitive","Link","ArrowRight","ArrowUpRight","useId","isValidElement","Children","useContext","router","useRouter","protocol"],"mappings":"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","file":"mdx.js","sourcesContent":["/*\n * Syntax highlighting with no dependency and no async step, so code is\n * coloured in the server's HTML: at build time in the docs (rehypeCode), and\n * in a page's own render for code made at run time (an envelope, an install\n * line). It reads the languages the family writes: TypeScript and JavaScript\n * (with JSX), JSON, shell, Python, YAML and diffs. Anything else is shown as\n * plain text, never guessed at.\n *\n * Each token names a kind; the kind is a class, and the class is a colour in\n * tokens.css (--oca-code-*). One palette for every highlighter: the shiki\n * theme in ./theme maps TextMate scopes onto the same variables.\n */\n\nexport type TokenKind =\n | 'keyword'\n | 'string'\n | 'number'\n | 'function'\n | 'type'\n | 'property'\n | 'comment'\n | 'tag'\n | 'url';\n\nexport interface Token {\n text: string;\n kind?: TokenKind;\n}\n\n/** One line of code, as tokens. */\nexport type CodeLine = Token[];\n\n/** The class each kind is drawn with (styles/code.css). */\nexport const TOKEN_CLASS: Record<TokenKind, string> = {\n keyword: 'oca-k',\n string: 'oca-s',\n number: 'oca-n',\n function: 'oca-f',\n type: 'oca-y',\n property: 'oca-p',\n comment: 'oca-c',\n tag: 'oca-g',\n url: 'oca-u',\n};\n\ntype Grammar = 'js' | 'json' | 'shell' | 'python' | 'yaml' | 'diff' | 'plain';\n\nconst ALIASES: Record<string, Grammar> = {\n ts: 'js',\n typescript: 'js',\n tsx: 'js',\n js: 'js',\n javascript: 'js',\n jsx: 'js',\n mjs: 'js',\n cjs: 'js',\n json: 'json',\n jsonc: 'json',\n json5: 'json',\n bash: 'shell',\n sh: 'shell',\n shell: 'shell',\n zsh: 'shell',\n console: 'shell',\n terminal: 'shell',\n py: 'python',\n python: 'python',\n yaml: 'yaml',\n yml: 'yaml',\n diff: 'diff',\n};\n\n/** The languages read, by the names a code fence uses. */\nexport const CODE_LANGS: readonly string[] = Object.keys(ALIASES);\n\nexport function grammarOf(lang?: string | null): Grammar {\n return (lang && ALIASES[lang.toLowerCase()]) || 'plain';\n}\n\n/* ── Scanner ─────────────────────────────────────────────────────────── */\n\ntype Emit = (text: string, kind?: TokenKind) => void;\n\n/** Collects tokens, merging neighbours of one kind so the markup stays small. */\nfunction collector(): { emit: Emit; tokens: Token[] } {\n const tokens: Token[] = [];\n const emit: Emit = (text, kind) => {\n if (!text) return;\n const last = tokens[tokens.length - 1];\n if (last && last.kind === kind) last.text += text;\n else tokens.push(kind ? { text, kind } : { text });\n };\n return { emit, tokens };\n}\n\nfunction at(re: RegExp, src: string, i: number): string | null {\n re.lastIndex = i;\n const m = re.exec(src);\n return m ? m[0] : null;\n}\n\nconst WS = /[ \\t]+/y;\nconst NEWLINE = /\\r?\\n/y;\n\n/* ── JavaScript, TypeScript, JSX ─────────────────────────────────────── */\n\nconst JS_KEYWORDS = new Set(\n (\n 'abstract as async await break case catch class const continue debugger declare default delete do else enum export ' +\n 'extends finally for from function get if implements import in infer instanceof interface is keyof let module ' +\n 'namespace new of override private protected public readonly return satisfies set static super switch this throw ' +\n 'try type typeof unique var void while with yield'\n ).split(' ')\n);\nconst JS_CONSTANTS = new Set(['true', 'false', 'null', 'undefined', 'NaN', 'Infinity']);\nconst TS_PRIMITIVES = new Set(['string', 'number', 'boolean', 'bigint', 'symbol', 'object', 'unknown', 'any', 'never']);\n\n/* MAX_SATS, DOCS_HREF: a constant. JSON, URL: a namespace, read as a type. */\nconst isConstant = (m: string) => /^[A-Z][A-Z\\d_]+$/.test(m) && (m.includes('_') || m.length > 4);\n\nconst JS_LINE_COMMENT = /\\/\\/[^\\n]*/y;\nconst JS_BLOCK_COMMENT = /\\/\\*[\\s\\S]*?(?:\\*\\/|$)/y;\nconst JS_TEMPLATE = /`(?:\\\\[\\s\\S]|[^\\\\`])*`?/y;\nconst JS_STRING = /'(?:\\\\.|[^\\\\'\\n])*'?|\"(?:\\\\.|[^\\\\\"\\n])*\"?/y;\nconst JS_NUMBER = /(?:0[xX][\\da-fA-F_]+|0[bB][01_]+|0[oO][0-7_]+|\\d[\\d_]*(?:\\.[\\d_]+)?(?:[eE][+-]?\\d+)?|\\.\\d[\\d_]*(?:[eE][+-]?\\d+)?)n?/y;\nconst JS_IDENT = /[A-Za-z_$][\\w$]*/y;\nconst JS_DECORATOR = /@[A-Za-z_$][\\w$.]*/y;\nconst JS_CALL_AFTER = /\\s*(?:<[\\w$\\s,.[\\]|&'\"]*>)?\\s*\\(/y;\nconst JS_TAG = /<\\/?(?=[A-Za-z])/y;\nconst JS_TAG_NAME = /[A-Za-z][\\w$.:-]*/y;\nconst JS_PUNCT = /=>|\\.\\.\\.|[{}()[\\];,.<>=+\\-*/%!?:&|^~#]/y;\n/* Where a JSX tag can start: after one of these, or at the start of a line. */\nconst JSX_BEFORE = new Set(['(', ',', '=', '?', ':', '{', '[', ';', '>', '&&', '||', '=>', 'return']);\n\nfunction scanJs(src: string, emit: Emit, jsx: boolean) {\n let i = 0;\n let prev = ''; // the last significant token, for property access and JSX starts\n let tagDepth = 0; // inside <Tag …> before its >\n let braceInTag = 0; // a {…} expression inside a tag's attributes\n const sig = (t: string) => {\n prev = t;\n };\n while (i < src.length) {\n let m: string | null;\n if ((m = at(WS, src, i)) || (m = at(NEWLINE, src, i))) {\n emit(m);\n i += m.length;\n continue;\n }\n if ((m = at(JS_LINE_COMMENT, src, i)) || (m = at(JS_BLOCK_COMMENT, src, i))) {\n emit(m, 'comment');\n i += m.length;\n continue;\n }\n if ((m = at(JS_TEMPLATE, src, i)) || (m = at(JS_STRING, src, i))) {\n emit(m, 'string');\n i += m.length;\n sig('\"');\n continue;\n }\n if (jsx && tagDepth === 0 && (m = at(JS_TAG, src, i)) && (prev === '' || JSX_BEFORE.has(prev))) {\n const name = at(JS_TAG_NAME, src, i + m.length);\n if (name) {\n emit(m);\n emit(name, 'tag');\n i += m.length + name.length;\n tagDepth = 1;\n braceInTag = 0;\n sig('tag');\n continue;\n }\n }\n if (jsx && tagDepth > 0 && braceInTag === 0) {\n if (src.startsWith('/>', i) || src[i] === '>') {\n const close = src[i] === '>' ? '>' : '/>';\n emit(close);\n i += close.length;\n tagDepth = 0;\n sig('>');\n continue;\n }\n if ((m = at(JS_IDENT, src, i)) && /^\\s*=/.test(src.slice(i + m.length, i + m.length + 4))) {\n emit(m, 'property');\n i += m.length;\n continue;\n }\n if ((m = at(JS_IDENT, src, i))) {\n emit(m, 'property');\n i += m.length;\n continue;\n }\n if (src[i] === '{') braceInTag = 1;\n } else if (jsx && tagDepth > 0 && braceInTag > 0) {\n if (src[i] === '{') braceInTag++;\n else if (src[i] === '}') braceInTag--;\n }\n if ((m = at(JS_DECORATOR, src, i))) {\n emit(m, 'function');\n i += m.length;\n sig('@');\n continue;\n }\n if ((m = at(JS_IDENT, src, i))) {\n const end = i + m.length;\n let kind: TokenKind | undefined;\n if (prev !== '.' && JS_CONSTANTS.has(m)) kind = 'number';\n else if (prev !== '.' && JS_KEYWORDS.has(m)) kind = 'keyword';\n else if (at(JS_CALL_AFTER, src, end) !== null) kind = 'function';\n else if (prev !== '.' && TS_PRIMITIVES.has(m)) kind = 'type';\n else if (isConstant(m)) kind = 'number';\n else if (/^[A-Z]/.test(m)) kind = 'type';\n emit(m, kind);\n i = end;\n sig(kind === 'keyword' ? m : 'id');\n continue;\n }\n if ((m = at(JS_NUMBER, src, i))) {\n emit(m, 'number');\n i += m.length;\n sig('0');\n continue;\n }\n if ((m = at(JS_PUNCT, src, i))) {\n emit(m);\n i += m.length;\n sig(m === '.' ? '.' : m);\n continue;\n }\n emit(src[i]!);\n i++;\n }\n}\n\n/* ── JSON ────────────────────────────────────────────────────────────── */\n\nconst JSON_STRING = /\"(?:\\\\.|[^\\\\\"\\n])*\"?/y;\nconst JSON_KEY_AFTER = /\\s*:/y;\nconst JSON_NUMBER = /-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/y;\nconst JSON_WORD = /true|false|null/y;\n\nfunction scanJson(src: string, emit: Emit) {\n let i = 0;\n while (i < src.length) {\n let m: string | null;\n if ((m = at(JS_LINE_COMMENT, src, i)) || (m = at(JS_BLOCK_COMMENT, src, i))) {\n emit(m, 'comment');\n } else if ((m = at(JSON_STRING, src, i))) {\n emit(m, at(JSON_KEY_AFTER, src, i + m.length) !== null ? 'property' : 'string');\n } else if ((m = at(JSON_NUMBER, src, i)) || (m = at(JSON_WORD, src, i))) {\n emit(m, 'number');\n } else {\n m = src[i]!;\n emit(m);\n }\n i += m.length;\n }\n}\n\n/* ── Shell ───────────────────────────────────────────────────────────── */\n\nconst SH_KEYWORDS = new Set(\n 'if then else elif fi for in do done case esac while until function return export local select time'.split(' ')\n);\nconst SH_PROMPT = /\\$ (?=\\S)/y;\nconst SH_COMMENT = /#[^\\n]*/y;\nconst SH_SINGLE = /'[^']*'?/y;\nconst SH_DOUBLE = /\"(?:\\\\.|[^\\\\\"])*\"?/y;\nconst SH_VAR = /\\$(?:\\{[^}\\n]*\\}?|[A-Za-z_][\\w]*|[@*#?$!\\d])/y;\nconst SH_URL = /https?:\\/\\/[^\\s'\"`)]+/y;\nconst SH_FLAG = /--?[A-Za-z][\\w-]*/y;\nconst SH_ASSIGN = /[A-Za-z_][\\w]*(?==)/y;\nconst SH_VALUE = /=[^\\s|&;()<>'\"`$]*/y;\nconst SH_WORD = /[^\\s|&;()<>'\"`$#]+/y;\nconst SH_OPERATOR = /\\|\\||&&|[|;&]|\\$\\(|[()<>]/y;\n\nfunction scanShell(src: string, emit: Emit) {\n let i = 0;\n let command = true; // the next word is a command\n let lineStart = true;\n while (i < src.length) {\n let m: string | null;\n if ((m = at(NEWLINE, src, i))) {\n emit(m);\n i += m.length;\n // A trailing backslash continues the command on the next line.\n command = !/\\\\\\s*$/.test(src.slice(0, i - m.length));\n lineStart = true;\n continue;\n }\n if ((m = at(WS, src, i))) {\n emit(m);\n i += m.length;\n continue;\n }\n if (lineStart && (m = at(SH_PROMPT, src, i))) {\n emit(m, 'comment');\n i += m.length;\n lineStart = false;\n continue;\n }\n lineStart = false;\n // A # starts a comment at the start of a word, not inside one (url#frag).\n if ((m = at(SH_COMMENT, src, i)) && (i === 0 || /\\s/.test(src[i - 1]!))) {\n emit(m, 'comment');\n i += m.length;\n continue;\n }\n if ((m = at(SH_SINGLE, src, i)) || (m = at(SH_DOUBLE, src, i))) {\n emit(m, 'string');\n i += m.length;\n command = false;\n continue;\n }\n if ((m = at(SH_OPERATOR, src, i))) {\n emit(m);\n i += m.length;\n command = m !== ')' && m !== '>' && m !== '<';\n continue;\n }\n if ((m = at(SH_VAR, src, i))) {\n emit(m, 'type');\n i += m.length;\n command = false;\n continue;\n }\n if ((m = at(SH_URL, src, i))) {\n emit(m, 'url');\n i += m.length;\n command = false;\n continue;\n }\n if (command && (m = at(SH_ASSIGN, src, i))) {\n // FOO=bar cmd: the name, then its value; the command comes after.\n emit(m, 'property');\n i += m.length;\n const v = at(SH_VALUE, src, i)!;\n emit(v);\n i += v.length;\n continue;\n }\n if ((m = at(SH_FLAG, src, i)) && !command) {\n emit(m, 'keyword');\n i += m.length;\n continue;\n }\n if ((m = at(SH_WORD, src, i))) {\n if (command && SH_KEYWORDS.has(m)) emit(m, 'keyword');\n else if (command) {\n emit(m, 'function');\n // `sudo npm …`, `npx tsx …`: the next word is the real command.\n command = m === 'sudo' || m === 'npx' || m === 'env' || m === 'time';\n i += m.length;\n continue;\n } else emit(m);\n i += m.length;\n continue;\n }\n emit(src[i]!);\n i++;\n }\n}\n\n/* ── Python ──────────────────────────────────────────────────────────── */\n\nconst PY_KEYWORDS = new Set(\n (\n 'and as assert async await break class continue def del elif else except finally for from global if import in is ' +\n 'lambda match case nonlocal not or pass raise return try while with yield self cls'\n ).split(' ')\n);\nconst PY_CONSTANTS = new Set(['True', 'False', 'None']);\nconst PY_TYPES = new Set(['int', 'str', 'bool', 'float', 'bytes', 'list', 'dict', 'tuple', 'set', 'object']);\nconst PY_COMMENT = /#[^\\n]*/y;\nconst PY_TRIPLE = /[rRbBuUfF]{0,2}(?:\"\"\"[\\s\\S]*?(?:\"\"\"|$)|'''[\\s\\S]*?(?:'''|$))/y;\nconst PY_STRING = /[rRbBuUfF]{0,2}(?:'(?:\\\\.|[^\\\\'\\n])*'?|\"(?:\\\\.|[^\\\\\"\\n])*\"?)/y;\nconst PY_NUMBER = /(?:0[xX][\\da-fA-F_]+|\\d[\\d_]*(?:\\.[\\d_]*)?(?:[eE][+-]?\\d+)?j?)/y;\nconst PY_IDENT = /[A-Za-z_]\\w*/y;\nconst PY_DECORATOR = /@[A-Za-z_][\\w.]*/y;\nconst PY_CALL_AFTER = /\\s*\\(/y;\n\nfunction scanPython(src: string, emit: Emit) {\n let i = 0;\n let prev = '';\n while (i < src.length) {\n let m: string | null;\n if ((m = at(WS, src, i)) || (m = at(NEWLINE, src, i))) {\n emit(m);\n i += m.length;\n continue;\n }\n if ((m = at(PY_COMMENT, src, i))) {\n emit(m, 'comment');\n } else if ((m = at(PY_TRIPLE, src, i)) || (m = at(PY_STRING, src, i))) {\n // An identifier like `f` or `rb` is only a prefix when a quote follows.\n if (/^[A-Za-z]+$/.test(m)) {\n emit(m);\n } else emit(m, 'string');\n prev = '\"';\n } else if ((m = at(PY_DECORATOR, src, i))) {\n emit(m, 'function');\n prev = '@';\n } else if ((m = at(PY_IDENT, src, i))) {\n let kind: TokenKind | undefined;\n if (PY_CONSTANTS.has(m)) kind = 'number';\n else if (prev !== '.' && PY_KEYWORDS.has(m)) kind = 'keyword';\n else if (prev === 'def' || at(PY_CALL_AFTER, src, i + m.length) !== null) kind = 'function';\n else if (prev === 'class' || /^[A-Z][a-z]/.test(m) || PY_TYPES.has(m)) kind = 'type';\n else if (isConstant(m)) kind = 'number';\n emit(m, kind);\n prev = kind === 'keyword' ? m : 'id';\n } else if ((m = at(PY_NUMBER, src, i))) {\n emit(m, 'number');\n prev = '0';\n } else {\n m = src[i]!;\n emit(m);\n prev = m;\n }\n i += m.length;\n }\n}\n\n/* ── YAML ────────────────────────────────────────────────────────────── */\n\nconst YAML_KEY = /[ \\t]*(?:- )?[\\w.$/-]+(?=[ \\t]*:(?:\\s|$))/y;\nconst YAML_VALUE_WORD = /(?:true|false|null|yes|no|~|-?\\d+(?:\\.\\d+)?)(?=\\s*(?:#|$))/y;\n\nfunction scanYaml(src: string, emit: Emit) {\n let i = 0;\n let lineStart = true;\n while (i < src.length) {\n let m: string | null;\n if ((m = at(NEWLINE, src, i))) {\n emit(m);\n i += m.length;\n lineStart = true;\n continue;\n }\n if (lineStart && (m = at(YAML_KEY, src, i))) {\n const dash = m.match(/^([ \\t]*(?:- )?)/)![1]!;\n emit(dash);\n emit(m.slice(dash.length), 'property');\n i += m.length;\n lineStart = false;\n continue;\n }\n lineStart = false;\n if ((m = at(SH_COMMENT, src, i)) && (i === 0 || /\\s/.test(src[i - 1]!))) emit(m, 'comment');\n else if ((m = at(SH_SINGLE, src, i)) || (m = at(JSON_STRING, src, i))) emit(m, 'string');\n else if ((m = at(YAML_VALUE_WORD, src, i))) emit(m, 'number');\n else if ((m = at(SH_URL, src, i))) emit(m, 'url');\n else {\n m = src[i]!;\n emit(m);\n }\n i += m.length;\n }\n}\n\n/* ── Lines ───────────────────────────────────────────────────────────── */\n\n/** Split tokens into lines; a token that spans lines (a block comment) is cut at each break. */\nfunction toLines(tokens: Token[]): CodeLine[] {\n const lines: CodeLine[] = [[]];\n for (const t of tokens) {\n const parts = t.text.split(/\\r?\\n/);\n parts.forEach((part, j) => {\n if (j > 0) lines.push([]);\n if (part) lines[lines.length - 1]!.push(t.kind ? { text: part, kind: t.kind } : { text: part });\n });\n }\n return lines;\n}\n\n/**\n * Highlight `code` written in `lang` (a fence name: ts, json, bash…). Returns\n * one array of tokens per line. An unknown language comes back as plain text.\n */\nexport function highlight(code: string, lang?: string | null): CodeLine[] {\n // A trailing newline (every fence has one) is not an extra empty line.\n const src = code.replace(/\\r?\\n$/, '');\n const grammar = grammarOf(lang);\n const { emit, tokens } = collector();\n const name = (lang ?? '').toLowerCase();\n switch (grammar) {\n case 'js':\n scanJs(src, emit, name === 'tsx' || name === 'jsx');\n break;\n case 'json':\n scanJson(src, emit);\n break;\n case 'shell':\n scanShell(src, emit);\n break;\n case 'python':\n scanPython(src, emit);\n break;\n case 'yaml':\n scanYaml(src, emit);\n break;\n default:\n emit(src);\n }\n return toLines(tokens);\n}\n\n/* ── Line marks: highlight, diff ─────────────────────────────────────── */\n\nexport type DiffMark = 'add' | 'remove';\n\nexport interface LineMarks {\n /** 1-based line numbers to mark as highlighted. */\n highlight?: ReadonlySet<number>;\n /** 1-based line numbers added or removed. */\n diff?: ReadonlyMap<number, DiffMark>;\n}\n\n/**\n * Read `+` and `-` at the start of each line as a diff, and return the code\n * without them and the marks. A line that starts with neither is context; a\n * single leading space (as `git diff` writes context) is dropped too.\n */\nexport function readDiff(code: string): { code: string; diff: Map<number, DiffMark> } {\n const diff = new Map<number, DiffMark>();\n const lines = code.replace(/\\r?\\n$/, '').split(/\\r?\\n/);\n const out = lines.map((line, i) => {\n const c = line[0];\n if (c === '+' || c === '-') {\n diff.set(i + 1, c === '+' ? 'add' : 'remove');\n return line.slice(1);\n }\n return c === ' ' ? line.slice(1) : line;\n });\n return { code: out.join('\\n'), diff };\n}\n\n/** \"1,3-5\" → {1, 3, 4, 5}. Out-of-order and repeated parts are fine. */\nexport function parseLineRanges(spec: string | readonly number[] | undefined | null): Set<number> {\n if (!spec) return new Set();\n if (typeof spec !== 'string') return new Set(spec);\n const out = new Set<number>();\n for (const part of spec.split(',')) {\n const m = part.trim().match(/^(\\d+)(?:\\s*-\\s*(\\d+))?$/);\n if (!m) continue;\n const a = Number(m[1]);\n const b = m[2] ? Number(m[2]) : a;\n for (let n = Math.min(a, b); n <= Math.max(a, b) && n - a < 10_000; n++) out.add(n);\n }\n return out;\n}\n\n/** What a fence's meta string says: ```ts title=\"gate.ts\" {2,4} diff showLineNumbers */\nexport interface CodeMeta {\n title?: string;\n highlight?: string;\n diff?: boolean;\n lineNumbers?: boolean;\n}\n\nexport function parseCodeMeta(meta?: string | null): CodeMeta {\n if (!meta) return {};\n const out: CodeMeta = {};\n const title = meta.match(/(?:title|filename)=(?:\"([^\"]*)\"|'([^']*)'|(\\S+))/);\n if (title) out.title = title[1] ?? title[2] ?? title[3];\n const lines = meta.match(/\\{([\\d,\\s-]+)\\}/);\n if (lines) out.highlight = lines[1]!.replace(/\\s+/g, '');\n const rest = meta.replace(/(?:title|filename)=(?:\"[^\"]*\"|'[^']*'|\\S+)/, '');\n if (/\\bdiff\\b/.test(rest)) out.diff = true;\n if (/\\b(?:showLineNumbers|lineNumbers|numbers)\\b/.test(rest)) out.lineNumbers = true;\n return out;\n}\n\n/* ── HTML ────────────────────────────────────────────────────────────── */\n\nconst ESCAPE: Record<string, string> = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;' };\nexport function escapeHtml(s: string): string {\n return s.replace(/[&<>\"]/g, (c) => ESCAPE[c]!);\n}\n\n/**\n * Lines as markup for CodeBlock's `html`: one `<span data-line>` per line\n * (with `data-mark` or `data-diff` where marked), tokens as classed spans,\n * lines joined by newlines so selecting and copying keeps them.\n */\nexport function linesToHtml(lines: CodeLine[], marks: LineMarks = {}): string {\n return lines\n .map((line, i) => {\n const n = i + 1;\n const attrs = [\n 'data-line=\"\"',\n marks.highlight?.has(n) ? 'data-mark=\"\"' : '',\n marks.diff?.has(n) ? `data-diff=\"${marks.diff.get(n)}\"` : '',\n ]\n .filter(Boolean)\n .join(' ');\n const body = line\n .map((t) => (t.kind ? `<span class=\"${TOKEN_CLASS[t.kind]}\">${escapeHtml(t.text)}</span>` : escapeHtml(t.text)))\n .join('');\n return `<span ${attrs}>${body}</span>`;\n })\n .join('\\n');\n}\n\n/** Highlight and render in one step, reading `diff` and line ranges as CodeBlock does. */\nexport function highlightToHtml(\n code: string,\n lang?: string | null,\n opts: { highlight?: string | readonly number[]; diff?: boolean } = {}\n): string {\n const d = opts.diff ? readDiff(code) : null;\n return linesToHtml(highlight(d ? d.code : code, lang), {\n highlight: parseLineRanges(opts.highlight),\n diff: d?.diff,\n });\n}\n","import { clsx, type ClassValue } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\n// tailwind-merge would treat `oca-display-1` and `text-foreground` as the same\n// group and drop one; teach it the package's own type utilities.\nconst merge = extendTailwindMerge<'oca-type'>({\n extend: {\n classGroups: {\n 'oca-type': [\n 'oca-display-1',\n 'oca-display-2',\n 'oca-display-3',\n 'oca-title',\n 'oca-title-sm',\n 'oca-eyebrow',\n 'oca-lead',\n 'oca-body',\n 'oca-numeral',\n ],\n },\n },\n});\n\nexport function cn(...inputs: ClassValue[]): string {\n return merge(clsx(inputs));\n}\n","import { useCallback, useEffect, useRef, useState, type HTMLAttributes } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/*\n * A horizontal scroller that says when there is more. Content that is wider\n * than its box scrolls instead of being clipped, and a soft edge appears on\n * whichever side hides something. Tables, code and tab bars all use it.\n */\nexport interface ScrollFadeProps extends HTMLAttributes<HTMLDivElement> {\n /** The colour under the scroller, as a CSS value; the edge fades to it. */\n fade?: string;\n /** Classes for the scrolling element itself. */\n innerClassName?: string;\n}\n\nexport function ScrollFade({ fade = 'var(--card)', className, innerClassName, children, ...props }: ScrollFadeProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [edges, setEdges] = useState({ left: false, right: false });\n const measure = useCallback(() => {\n const el = ref.current;\n if (!el) return;\n const left = el.scrollLeft > 1;\n const right = el.scrollLeft + el.clientWidth < el.scrollWidth - 1;\n setEdges((e) => (e.left === left && e.right === right ? e : { left, right }));\n }, []);\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n measure();\n // Without ResizeObserver (old engines, jsdom) the edges still follow scrolling.\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n if (el.firstElementChild) ro.observe(el.firstElementChild);\n return () => ro.disconnect();\n }, [measure]);\n return (\n <div className={cn('relative min-w-0', className)} {...props}>\n <div\n ref={ref}\n onScroll={measure}\n // While it hides something, a keyboard can reach it to scroll.\n tabIndex={edges.left || edges.right ? 0 : undefined}\n className={cn(\n // Positioned, so sr-only text deep in a wide row scrolls and clips with the row.\n 'relative overflow-x-auto overscroll-x-contain rounded-[inherit] outline-none focus-visible:ring-2 focus-visible:ring-ring',\n innerClassName\n )}\n >\n {children}\n </div>\n <span\n aria-hidden\n className={cn(\n 'pointer-events-none absolute inset-y-0 left-0 w-8 transition-opacity duration-150',\n edges.left ? 'opacity-100' : 'opacity-0'\n )}\n style={{ background: `linear-gradient(to right, ${fade}, transparent)` }}\n />\n <span\n aria-hidden\n className={cn(\n 'pointer-events-none absolute inset-y-0 right-0 w-10 transition-opacity duration-150',\n edges.right ? 'opacity-100' : 'opacity-0'\n )}\n style={{ background: `linear-gradient(to left, ${fade}, transparent)` }}\n />\n </div>\n );\n}\n","import { createContext, type Context } from 'react';\n\n/**\n * A context that is the same object in every entry. Each entry (./chrome,\n * ./components, ./primitives) is bundled on its own, so a plain\n * createContext in a shared module makes one context per entry, and a\n * provider from one entry is invisible to a reader from another. Keyed on\n * globalThis by name, there is one.\n */\nexport function sharedContext<T>(name: string, initial: T): Context<T> {\n const key = Symbol.for(`@orangecheck/app-design/${name}`);\n const store = globalThis as unknown as Record<symbol, Context<T> | undefined>;\n return (store[key] ??= createContext<T>(initial));\n}\n","import * as SeparatorPrimitive from '@radix-ui/react-separator';\nimport {\n forwardRef,\n useEffect,\n useState,\n type ComponentPropsWithoutRef,\n type CSSProperties,\n type ElementRef,\n type HTMLAttributes,\n} from 'react';\nimport { useTheme } from 'next-themes';\nimport { Toaster as SonnerToaster, type ToasterProps } from 'sonner';\n\nimport { cn } from '../lib/cn';\n\nexport function Spinner({ className, label }: { className?: string; label?: string }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n role={label ? 'status' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n className={cn('size-4 animate-spin', className)}\n >\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" strokeOpacity=\"0.2\" strokeWidth=\"2.5\" />\n <path d=\"M21 12a9 9 0 0 0-9-9\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\n/** A placeholder bar, visible on the canvas and on a card in both modes. */\nexport function Skeleton({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n data-ui=\"skeleton\"\n className={cn('animate-pulse rounded-lg bg-[var(--oca-skeleton)]', className)}\n {...props}\n />\n );\n}\n\n/**\n * True once `active` has stayed true for `ms`. A loading state that never\n * ends reads as a broken page; pass this to show a way out instead.\n */\nexport function useTimedOut(active: boolean, ms = 12_000): boolean {\n const [timedOut, setTimedOut] = useState(false);\n useEffect(() => {\n if (!active) {\n setTimedOut(false);\n return;\n }\n const t = setTimeout(() => setTimedOut(true), ms);\n return () => clearTimeout(t);\n }, [active, ms]);\n return timedOut;\n}\n\nexport const Separator = forwardRef<\n ElementRef<typeof SeparatorPrimitive.Root>,\n ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(function Separator({ className, orientation = 'horizontal', decorative = true, ...props }, ref) {\n return (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n 'shrink-0 bg-border',\n orientation === 'horizontal' ? 'h-px w-full' : 'h-full w-px',\n className\n )}\n {...props}\n />\n );\n});\n\nexport function Kbd({ className, ...props }: HTMLAttributes<HTMLElement>) {\n return (\n <kbd\n className={cn(\n 'inline-flex h-5 min-w-5 items-center justify-center rounded-md border border-border bg-card px-1.5 font-mono text-[11px] text-muted-foreground',\n className\n )}\n {...props}\n />\n );\n}\n\n/** Live-region status dot: a calm pulse for \"running\", solid otherwise. */\nexport function StatusDot({\n tone = 'neutral',\n pulse = false,\n className,\n}: {\n tone?: 'neutral' | 'success' | 'warning' | 'danger' | 'brand';\n pulse?: boolean;\n className?: string;\n}) {\n const color = {\n neutral: 'bg-oca-subtle',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-destructive',\n brand: 'bg-brand',\n }[tone];\n return (\n <span\n aria-hidden\n className={cn('inline-block size-2 shrink-0 rounded-full', color, pulse && 'oca-animate-pulse-dot', className)}\n />\n );\n}\n\n/** Toasts in the system's type and surfaces. Mount once. */\n/*\n * sonner paints a toast from its own variables (white, or black in dark), and\n * they outrank a class. Set to the tokens, a toast is the popover in both modes.\n */\nconst TOAST_COLOURS = {\n '--normal-bg': 'var(--popover)',\n '--normal-text': 'var(--popover-foreground)',\n '--normal-border': 'var(--border)',\n} as CSSProperties;\n\n/** Toasts in the page's mode: it reads next-themes, so a site passes nothing for dark. */\nexport function Toaster({ style, ...props }: ToasterProps) {\n const { resolvedTheme } = useTheme();\n return (\n <SonnerToaster\n theme={resolvedTheme === 'dark' ? 'dark' : resolvedTheme === 'light' ? 'light' : 'system'}\n style={{ ...TOAST_COLOURS, ...style }}\n position=\"bottom-right\"\n toastOptions={{\n classNames: {\n toast: 'oca-toast rounded-2xl border border-border bg-popover text-popover-foreground shadow-lg font-sans',\n title: 'text-[0.9375rem] font-medium',\n description: 'text-sm text-muted-foreground',\n actionButton: 'rounded-full bg-primary text-primary-foreground',\n cancelButton: 'rounded-full bg-muted text-foreground',\n },\n }}\n {...props}\n />\n );\n}\n\nexport { toast } from 'sonner';\n","import { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type ButtonHTMLAttributes } from 'react';\n\nimport { cn } from '../lib/cn';\nimport { Spinner } from './feedback';\n\n/*\n * Pills, as the deck draws them: the black filled pill leads, the white\n * outlined pill follows. `brand` is for the orange band only; `onInk` and\n * `onInkOutline` are the same pair inverted for dark bands.\n */\nexport const buttonVariants = cva(\n [\n 'inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-full font-medium',\n 'transition-[background-color,border-color,color,box-shadow,transform] duration-150',\n 'outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'active:translate-y-px disabled:pointer-events-none',\n // Disabled is one look for every variant: a quiet grey pill, never a\n // faded black or orange slab that reads as broken.\n 'disabled:border disabled:border-border disabled:bg-muted disabled:text-oca-subtle disabled:shadow-none',\n '[&_svg]:pointer-events-none [&_svg]:size-[1.1em] [&_svg]:shrink-0',\n ],\n {\n variants: {\n variant: {\n primary: 'bg-primary text-primary-foreground hover:bg-primary/85',\n secondary:\n 'border border-border bg-secondary text-secondary-foreground hover:border-oca-hairline-strong hover:bg-accent',\n brand: 'bg-brand text-brand-foreground hover:bg-oca-orange-deep',\n ghost: 'text-foreground hover:bg-accent',\n danger: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n link: 'h-auto rounded-none px-0 text-foreground underline decoration-foreground/35 underline-offset-4 hover:decoration-foreground',\n onInk: 'bg-white text-oca-ink hover:bg-white/90',\n onInkOutline: 'border border-white/20 text-white hover:bg-white/10',\n },\n size: {\n sm: 'h-9 px-4 text-sm',\n md: 'h-11 px-5 text-[0.9375rem]',\n lg: 'h-14 px-7 text-[1.0625rem]',\n icon: 'size-10',\n 'icon-sm': 'size-8',\n },\n },\n compoundVariants: [{ variant: 'link', className: 'h-auto px-0' }],\n defaultVariants: { variant: 'primary', size: 'md' },\n }\n);\n\nexport interface ButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n /** Render the child element (a Link, an <a>) with the button's styles. */\n asChild?: boolean;\n /** Shows a spinner and disables the button. */\n loading?: boolean;\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n { className, variant, size, asChild = false, loading = false, disabled, children, type, ...props },\n ref\n) {\n const Comp = asChild ? Slot : 'button';\n return (\n <Comp\n ref={ref}\n data-ui=\"button\"\n className={cn(buttonVariants({ variant, size }), className)}\n disabled={asChild ? undefined : disabled || loading}\n aria-busy={loading || undefined}\n type={asChild ? undefined : (type ?? 'button')}\n {...props}\n >\n {asChild ? (\n children\n ) : (\n <>\n {loading ? <Spinner className=\"size-[1.1em]\" /> : null}\n {children}\n </>\n )}\n </Comp>\n );\n});\n","import { Check, Copy } from 'lucide-react';\nimport {\n Children,\n cloneElement,\n createContext,\n isValidElement,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from 'react';\n\nimport { explorerUrl, shortenMiddle, type ExplorerKind, type Network } from '../format';\nimport { cn } from '../lib/cn';\nimport { useDensity } from '../lib/density';\nimport { useShellPlace } from '../lib/shell-context';\nimport { Button } from '../primitives/button';\nimport { Skeleton, useTimedOut } from '../primitives/feedback';\nimport { ScrollFade } from '../primitives/scroll-fade';\n\n/* ── Page header ─────────────────────────────────────────────────────── */\n\n/**\n * The top of a signed-in page: section, page title, one sentence, actions.\n * Inside AppShell the eyebrow defaults to the current section, so every page\n * in a section opens at the same height. Pass `eyebrow={null}` to omit it.\n * Public pages use PageHero.\n */\nexport function PageHeader({\n eyebrow,\n title,\n description,\n actions,\n className,\n}: {\n eyebrow?: ReactNode;\n title: ReactNode;\n /** One sentence. Longer explanation belongs in the docs, not the header. */\n description?: ReactNode;\n actions?: ReactNode;\n className?: string;\n}) {\n const place = useShellPlace();\n const eb = eyebrow === undefined ? place.section : eyebrow;\n return (\n <header className={cn('flex flex-col gap-5 md:flex-row md:items-end md:justify-between', className)}>\n <div className=\"flex min-w-0 max-w-[44rem] flex-col gap-2.5\">\n {eb ? <p className=\"oca-eyebrow\">{eb}</p> : null}\n <h1 className=\"oca-display-3\">{title}</h1>\n {description ? <p className=\"oca-body max-w-[40rem] text-[1.0625rem]\">{description}</p> : null}\n </div>\n {actions ? <div className=\"flex flex-wrap items-center gap-2.5 md:shrink-0 md:justify-end\">{actions}</div> : null}\n </header>\n );\n}\n\n/* ── Stats ───────────────────────────────────────────────────────────── */\n\nconst InStatGrid = createContext(false);\n\nexport interface StatCardProps {\n label: ReactNode;\n value: ReactNode;\n hint?: ReactNode;\n /**\n * The number behind `value`, when there is one. StatGrid reads it: a grid\n * whose every `raw` is 0 or null shows one empty line instead of zeros.\n */\n raw?: number | null;\n /** `sm` for a tool page: tighter, a smaller figure. Defaults to the density around it. */\n size?: 'md' | 'sm';\n /**\n * The change beside the figure: `{ value: -2.4, suffix: '%' }`. Green when\n * it moves the good way (`good`, default up), red the other, quiet at 0.\n */\n delta?: { value: number; suffix?: string; good?: 'up' | 'down'; label?: string };\n className?: string;\n}\n\nfunction Delta({ value, suffix = '', good = 'up', label }: NonNullable<StatCardProps['delta']>) {\n const dir = value > 0 ? 'up' : value < 0 ? 'down' : 'flat';\n const tone = dir === 'flat' ? 'text-muted-foreground' : dir === good ? 'text-success' : 'text-destructive';\n const sign = value > 0 ? '+' : value < 0 ? '−' : '';\n return (\n <span className={cn('inline-flex items-baseline gap-1 text-[0.8125rem] font-normal tracking-normal oca-tabular', tone)}>\n <span aria-hidden>{dir === 'up' ? '↑' : dir === 'down' ? '↓' : '·'}</span>\n {sign}\n {Math.abs(value).toLocaleString('en-US', { maximumFractionDigits: 2 })}\n {suffix}\n {label ? <span className=\"text-muted-foreground\"> {label}</span> : null}\n </span>\n );\n}\n\nexport function StatCard({ label, value, hint, size, delta, className }: StatCardProps) {\n const inGrid = useContext(InStatGrid);\n const density = useDensity();\n const sm = (size ?? (density === 'compact' ? 'sm' : 'md')) === 'sm';\n return (\n <div\n data-ui=\"stat\"\n className={cn(\n 'border border-border bg-card',\n sm ? 'rounded-2xl p-4' : 'rounded-[1.25rem] p-5 md:p-6',\n // In a grid, label, value and hint each share a row with their\n // neighbours, so values line up whatever wraps above them.\n inGrid ? 'row-span-3 grid grid-rows-subgrid gap-1.5' : 'flex flex-col gap-2',\n className\n )}\n >\n <span className={cn('leading-snug text-muted-foreground', sm ? 'text-[0.8125rem]' : 'text-[0.875rem]')}>{label}</span>\n {/* Bottom-aligned within a grid row; a lone card keeps it under its label. */}\n <span\n className={cn(\n 'break-words oca-tabular leading-tight tracking-[-0.02em]',\n sm ? 'text-[1.25rem]' : 'text-[1.5rem] md:text-[1.75rem]',\n inGrid && 'self-end',\n delta && 'flex flex-wrap items-baseline gap-x-2'\n )}\n >\n {value}\n {delta ? <Delta {...delta} /> : null}\n </span>\n {hint ? (\n <span className=\"text-[0.8125rem] leading-snug text-muted-foreground\">{hint}</span>\n ) : inGrid ? (\n <span aria-hidden />\n ) : null}\n </div>\n );\n}\n\nconst MD_COLS: Record<number, string> = {\n 1: 'md:grid-cols-1',\n 2: 'md:grid-cols-2',\n 3: 'md:grid-cols-3',\n 4: 'md:grid-cols-4',\n};\nconst LG_COLS: Record<number, string> = {\n 1: 'lg:grid-cols-1',\n 2: 'lg:grid-cols-2',\n 3: 'lg:grid-cols-3',\n 4: 'lg:grid-cols-4',\n 5: 'lg:grid-cols-5',\n};\nconst MD_SPAN: Record<number, string> = {\n 1: 'md:col-span-1',\n 2: 'md:col-span-2',\n 3: 'md:col-span-3',\n 4: 'md:col-span-4',\n};\nconst LG_SPAN: Record<number, string> = {\n 1: 'lg:col-span-1',\n 2: 'lg:col-span-2',\n 3: 'lg:col-span-3',\n 4: 'lg:col-span-4',\n};\n\n/** Columns for n tiles: as few ragged rows as possible, never more than five. */\nfunction statColumns(n: number): number {\n if (n <= 5) return Math.max(1, n);\n if (n % 4 === 0) return 4;\n if (n % 3 === 0) return 3;\n return 4;\n}\n\n/** How wide the last tile must be to fill its row of `cols`. */\nfunction lastSpan(n: number, cols: number): number {\n const rest = n % cols;\n return rest === 0 ? 1 : cols - rest + 1;\n}\n\n/** One quiet line where a group of numbers would all be zero. */\nexport function EmptyLine({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <p\n className={cn(\n 'rounded-[1.25rem] border border-dashed border-oca-hairline-strong px-5 py-4 text-[0.9375rem] text-muted-foreground',\n className\n )}\n >\n {children}\n </p>\n );\n}\n\nexport interface StatGridProps extends HTMLAttributes<HTMLDivElement> {\n /** Columns from md up. Default: the count up to 4, then 3 or 4. */\n columns?: 1 | 2 | 3 | 4 | 5;\n /** Shown instead of the tiles when the group is empty. */\n empty?: ReactNode;\n /** Force the empty line. Default: every child's `raw` is 0 or null. */\n isEmpty?: boolean;\n}\n\n/**\n * Stat tiles, two to a row on a phone. The last tile stretches to fill its row,\n * so a grid never ends in a hole, and a group of zeros becomes one line.\n */\nexport function StatGrid({ columns, empty, isEmpty, className, children, ...props }: StatGridProps) {\n const items = Children.toArray(children).filter(isValidElement) as ReactElement<StatCardProps>[];\n const n = items.length;\n const allZero =\n n > 0 && items.every((el) => 'raw' in el.props && (el.props.raw === 0 || el.props.raw === null));\n const compact = useDensity() === 'compact';\n if (isEmpty ?? allZero) return <EmptyLine className={className}>{empty ?? 'Nothing here yet.'}</EmptyLine>;\n const lg = columns ?? statColumns(n);\n // Five across is a desk-width row; a tablet gets three.\n const md = lg > 4 ? 3 : lg;\n const mdSpan = lastSpan(n, md);\n const lgSpan = lastSpan(n, lg);\n return (\n <InStatGrid.Provider value>\n <div\n className={cn(\n 'grid',\n compact ? 'gap-2.5 md:gap-3' : 'gap-3 md:gap-4',\n n === 1 ? 'grid-cols-1' : 'grid-cols-2',\n MD_COLS[md],\n LG_COLS[lg],\n className\n )}\n {...props}\n >\n {items.map((el, i) => {\n if (i !== n - 1) return el;\n const span = cn(\n n % 2 === 1 && n > 1 && 'max-md:col-span-2',\n (mdSpan > 1 || lgSpan > 1) && MD_SPAN[mdSpan],\n (mdSpan > 1 || lgSpan > 1) && LG_SPAN[lgSpan]\n );\n return span ? cloneElement(el, { className: cn(el.props.className, span) }) : el;\n })}\n </div>\n </InStatGrid.Provider>\n );\n}\n\n/* ── Key / value ─────────────────────────────────────────────────────── */\n\nexport interface KeyValueItem {\n label: ReactNode;\n value: ReactNode;\n mono?: boolean;\n /** After the value: what it means (\"Undervalued\", \"Above the 200-week mean\"). */\n note?: ReactNode;\n /** Colours the note, or the value when there is none. */\n tone?: ValueTone;\n}\n\n/** A reading's verdict, in words and colour: good, caution, bad, the accent, or quiet. */\nexport type ValueTone = 'good' | 'caution' | 'bad' | 'brand' | 'muted';\n\nconst TONE_TEXT: Record<ValueTone, string> = {\n good: 'text-success',\n caution: 'text-warning',\n bad: 'text-destructive',\n brand: 'text-oca-accent-ink',\n muted: 'text-muted-foreground',\n};\n\nexport function KeyValueList({\n items,\n dense,\n className,\n}: {\n items: KeyValueItem[];\n /** Tighter rows and smaller text, for a tool page. Defaults to the density around it. */\n dense?: boolean;\n className?: string;\n}) {\n const density = useDensity();\n const tight = dense ?? density === 'compact';\n return (\n // The rows go side by side when the list itself is wide enough, wherever it sits: a narrow card stacks them.\n <dl className={cn('@container divide-y divide-border border border-border bg-card', tight ? 'rounded-2xl' : 'rounded-[1.25rem]', className)}>\n {items.map((it, i) => (\n <div\n key={i}\n className={cn(\n 'flex flex-col gap-1 @md:flex-row @md:items-baseline',\n tight ? 'px-4 py-2.5 @md:gap-5' : 'px-5 py-3.5 @md:gap-6'\n )}\n >\n <dt className={cn('shrink-0 text-muted-foreground', tight ? 'text-[0.8125rem] @md:w-36' : 'text-[0.875rem] @md:w-48')}>\n {it.label}\n </dt>\n <dd\n className={cn(\n 'min-w-0 break-words',\n tight ? 'text-[0.875rem]' : 'text-[0.9375rem]',\n it.mono && (tight ? 'font-mono text-[0.8125rem]' : 'font-mono text-[0.875rem]'),\n it.tone && !it.note && TONE_TEXT[it.tone]\n )}\n >\n {it.value}\n {it.note ? (\n <span className={cn('ml-2 font-sans text-[0.8125rem]', TONE_TEXT[it.tone ?? 'muted'])}>{it.note}</span>\n ) : null}\n </dd>\n </div>\n ))}\n </dl>\n );\n}\n\n/* ── Table ───────────────────────────────────────────────────────────── */\n\nexport interface Column<T> {\n key: string;\n header: ReactNode;\n cell: (row: T) => ReactNode;\n align?: 'start' | 'end';\n /** A number: right-aligned, tabular, never wrapped. */\n numeric?: boolean;\n /** Hide below md in the table (the phone card list still shows it). */\n wide?: boolean;\n /** A CSS width for the column, e.g. '12rem' or '30%'. */\n width?: string;\n /** The narrowest it may get before the table scrolls instead. */\n minWidth?: string;\n /** Cut long content to one line (put the full value in a title or HashChip). */\n truncate?: boolean;\n /** The phone card's title. Defaults to the first column. */\n primary?: boolean;\n /** Leave out of the phone card list. */\n hideOnPhone?: boolean;\n}\n\n/**\n * Rows of data. Wider than its box, the table scrolls with an edge that says\n * so; under 640px it becomes a list of cards that keep every column's label.\n */\nexport function DataTable<T>({\n columns,\n rows,\n rowKey,\n empty,\n caption,\n phone = 'cards',\n dense,\n className,\n}: {\n columns: Column<T>[];\n rows: T[];\n rowKey: (row: T, i: number) => string;\n empty?: ReactNode;\n caption?: string;\n /** Under 640px: a card per row (default), or the same table scrolling. */\n phone?: 'cards' | 'scroll';\n /** Tighter rows and 14px text, for a tool page. Defaults to the density around it. */\n dense?: boolean;\n className?: string;\n}) {\n const density = useDensity();\n const tight = dense ?? density === 'compact';\n if (rows.length === 0 && empty) return <>{empty}</>;\n const primary = columns.find((c) => c.primary) ?? columns[0];\n const right = (c: Column<T>) => c.numeric || c.align === 'end';\n const table = (\n <div\n className={cn(\n 'overflow-hidden border border-border bg-card',\n tight ? 'rounded-2xl' : 'rounded-[1.25rem]',\n phone === 'cards' && 'max-sm:hidden',\n className\n )}\n >\n <ScrollFade fade=\"var(--card)\">\n <table className={cn('w-full border-collapse text-left', tight ? 'text-[0.875rem]' : 'text-[0.9375rem]')}>\n {caption ? <caption className=\"sr-only\">{caption}</caption> : null}\n <thead>\n <tr className=\"border-b border-border\">\n {columns.map((c) => (\n <th\n key={c.key}\n scope=\"col\"\n style={{ width: c.width, minWidth: c.minWidth }}\n className={cn(\n 'whitespace-nowrap text-[0.8125rem] font-medium text-muted-foreground',\n tight ? 'px-4 py-2.5' : 'px-5 py-3',\n right(c) && 'text-right',\n c.wide && 'hidden md:table-cell'\n )}\n >\n {c.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {rows.map((r, i) => (\n <tr key={rowKey(r, i)} className=\"transition-colors hover:bg-accent/60\">\n {columns.map((c) => (\n <td\n key={c.key}\n style={{ minWidth: c.minWidth }}\n className={cn(\n 'align-middle',\n tight ? 'px-4 py-2' : 'px-5 py-3.5',\n right(c) && 'text-right',\n c.numeric && 'whitespace-nowrap oca-tabular',\n c.wide && 'hidden md:table-cell'\n )}\n >\n {c.truncate ? (\n <div className=\"truncate\" style={{ maxWidth: c.width ?? '16rem' }}>\n {c.cell(r)}\n </div>\n ) : (\n c.cell(r)\n )}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </ScrollFade>\n </div>\n );\n if (phone !== 'cards') return table;\n const rest = columns.filter((c) => c !== primary && !c.hideOnPhone);\n return (\n <>\n {table}\n <ul\n aria-label={caption}\n className={cn(\n 'divide-y divide-border border border-border bg-card sm:hidden',\n tight ? 'rounded-2xl' : 'rounded-[1.25rem]',\n className\n )}\n >\n {rows.map((r, i) => (\n <li key={rowKey(r, i)} className={cn('flex flex-col gap-2.5 px-4', tight ? 'py-3' : 'py-4')}>\n <div className=\"min-w-0 break-words text-[0.9375rem] font-medium\">{primary?.cell(r)}</div>\n {rest.length > 0 ? (\n <dl className=\"grid grid-cols-[minmax(5.5rem,auto)_minmax(0,1fr)] gap-x-4 gap-y-1.5 text-[0.875rem]\">\n {rest.map((c) => (\n <div key={c.key} className=\"contents\">\n <dt className=\"text-muted-foreground\">{c.header}</dt>\n <dd className={cn('min-w-0 break-words', c.numeric && 'oca-tabular')}>{c.cell(r)}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n </li>\n ))}\n </ul>\n </>\n );\n}\n\n/* ── Empty, notice ───────────────────────────────────────────────────── */\n\nexport function EmptyState({\n title,\n children,\n action,\n icon,\n className,\n}: {\n title: ReactNode;\n children?: ReactNode;\n action?: ReactNode;\n /** An icon that says what is missing. None by default: the words carry it. */\n icon?: ReactNode;\n className?: string;\n}) {\n return (\n <div\n className={cn(\n 'flex flex-col items-center gap-3 rounded-[1.25rem] border border-dashed border-oca-hairline-strong px-6 py-10 text-center',\n className\n )}\n >\n {icon ? (\n <span className=\"mb-1 flex size-11 items-center justify-center rounded-full bg-muted text-muted-foreground [&_svg]:size-5\">\n {icon}\n </span>\n ) : null}\n <h3 className=\"oca-title-sm\">{title}</h3>\n {children ? <div className=\"oca-body max-w-md text-[0.9375rem]\">{children}</div> : null}\n {action ? <div className=\"mt-2 flex flex-wrap justify-center gap-3\">{action}</div> : null}\n </div>\n );\n}\n\n/*\n * Three kinds of notice: neutral, the orange accent for something that needs\n * attention, and red for a real error. The old tone names still compile and\n * land on one of the three, so no page can add a fourth colour.\n */\ntype NoticeTone = 'neutral' | 'brand' | 'danger' | 'info' | 'success' | 'warning';\n\nconst NOTICE_KIND: Record<NoticeTone, 'neutral' | 'brand' | 'danger'> = {\n neutral: 'neutral',\n info: 'neutral',\n success: 'neutral',\n brand: 'brand',\n warning: 'brand',\n danger: 'danger',\n};\n\nexport function Notice({\n tone = 'neutral',\n title,\n children,\n action,\n role,\n className,\n}: {\n tone?: NoticeTone;\n title?: ReactNode;\n children?: ReactNode;\n action?: ReactNode;\n /** Default: `alert` for danger and warning, which a screen reader announces. Text that is\n * simply part of the page (a docs callout) is a `note`. */\n role?: 'alert' | 'status' | 'note';\n className?: string;\n}) {\n const kind = NOTICE_KIND[tone];\n return (\n <div\n role={role ?? (tone === 'danger' || tone === 'warning' ? 'alert' : 'note')}\n data-tone={kind}\n className={cn(\n 'flex flex-col gap-3 rounded-2xl border border-border bg-card px-5 py-4 sm:flex-row sm:items-start sm:justify-between',\n kind === 'danger' && 'border-[color-mix(in_oklab,var(--destructive)_40%,var(--border))]',\n className\n )}\n >\n <div className=\"flex min-w-0 gap-3\">\n {kind !== 'neutral' ? (\n <span\n aria-hidden\n className={cn(\n 'mt-[0.45rem] size-2 shrink-0 rounded-full',\n kind === 'brand' ? 'bg-oca-orange' : 'bg-destructive'\n )}\n />\n ) : null}\n <div className=\"flex min-w-0 flex-col gap-1\">\n {title ? (\n <p className={cn('text-[0.9375rem] font-medium', kind === 'danger' && 'text-destructive')}>\n {title}\n </p>\n ) : null}\n {children ? <div className=\"text-[0.9375rem] leading-relaxed text-muted-foreground\">{children}</div> : null}\n </div>\n </div>\n {action ? <div className=\"shrink-0\">{action}</div> : null}\n </div>\n );\n}\n\n/**\n * Placeholder rows while something loads, and a way out if it never does:\n * after `timeoutMs` the skeleton turns into a message with a retry.\n */\nexport function LoadingBlock({\n rows = 3,\n timeoutMs = 12_000,\n onRetry,\n label = 'Loading',\n className,\n}: {\n rows?: number;\n timeoutMs?: number;\n onRetry?: () => void;\n label?: string;\n className?: string;\n}) {\n const timedOut = useTimedOut(true, timeoutMs);\n if (timedOut) {\n return (\n <Notice\n className={className}\n title=\"This is taking longer than it should.\"\n action={\n <Button size=\"sm\" variant=\"secondary\" onClick={onRetry ?? (() => window.location.reload())}>\n Try again\n </Button>\n }\n >\n Check your connection, then try again.\n </Notice>\n );\n }\n return (\n <div role=\"status\" aria-label={label} className={cn('flex flex-col gap-3', className)}>\n {Array.from({ length: rows }, (_, i) => (\n <Skeleton key={i} className=\"h-16 rounded-2xl\" />\n ))}\n </div>\n );\n}\n\n/* ── Hashes, addresses, ids ──────────────────────────────────────────── */\n\n/** Wipe the clipboard if it still holds `expected`, and only then. */\nasync function wipeIfUnchanged(expected: string): Promise<void> {\n try {\n if ((await navigator.clipboard.readText()) !== expected) return;\n } catch {\n // Reading needs a permission most browsers withhold; wiping does not.\n }\n try {\n await navigator.clipboard.writeText('');\n } catch {\n /* the clipboard is unavailable here */\n }\n}\n\nexport function useCopy(timeoutMs = 1600) {\n const [copied, setCopied] = useState(false);\n const t = useRef<ReturnType<typeof setTimeout> | null>(null);\n const wipe = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(\n () => () => {\n if (t.current) clearTimeout(t.current);\n },\n []\n );\n const copy = useCallback(\n async (text: string, opts: { clearAfter?: number } = {}): Promise<boolean> => {\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n if (t.current) clearTimeout(t.current);\n t.current = setTimeout(() => setCopied(false), timeoutMs);\n if (opts.clearAfter && opts.clearAfter > 0) {\n // Outlives the component on purpose: the secret should go even if the page moves on.\n if (wipe.current) clearTimeout(wipe.current);\n wipe.current = setTimeout(() => void wipeIfUnchanged(text), opts.clearAfter);\n }\n return true;\n } catch {\n setCopied(false);\n return false;\n }\n },\n [timeoutMs]\n );\n return { copied, copy };\n}\n\nexport interface CopyButtonProps {\n /** The text, or a function that reads it at the moment of copying. */\n value: string | (() => string);\n label?: string;\n /**\n * Milliseconds after which the clipboard is wiped, if it still holds what\n * was copied (a secret, a recovery code). Unset: never.\n */\n clearAfter?: number;\n /** Called once the text is on the clipboard. */\n onCopied?: () => void;\n className?: string;\n}\n\nexport function CopyButton({ value, label = 'Copy', clearAfter, onCopied, className }: CopyButtonProps) {\n const { copied, copy } = useCopy();\n const done = copied ? (clearAfter ? `Copied. Cleared in ${Math.round(clearAfter / 1000)} seconds` : 'Copied') : '';\n return (\n <button\n type=\"button\"\n onClick={async () => {\n if (await copy(typeof value === 'function' ? value() : value, { clearAfter })) onCopied?.();\n }}\n aria-label={copied ? 'Copied' : label}\n title={label}\n className={cn(\n 'inline-flex size-8 shrink-0 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-accent hover:text-foreground',\n className\n )}\n >\n {copied ? <Check className=\"size-4 text-success\" /> : <Copy className=\"size-4\" />}\n <span aria-live=\"polite\" className=\"sr-only\">\n {done}\n </span>\n </button>\n );\n}\n\n/**\n * A long identifier shown as head…tail in mono, with copy. The full value is\n * the title and the copied text, never lost to the truncation. `explorer`\n * links an address, transaction or block to mempool.space.\n */\nexport function HashChip({\n value,\n head = 8,\n tail = 6,\n copy = true,\n href,\n explorer,\n network = 'mainnet',\n className,\n}: {\n value: string;\n head?: number;\n tail?: number;\n copy?: boolean;\n href?: string;\n /** What the value is, to link it on mempool.space. `href` wins when both are set. */\n explorer?: ExplorerKind;\n network?: Network;\n className?: string;\n}) {\n const shown = shortenMiddle(value, head, tail);\n const link = href ?? (explorer ? explorerUrl(explorer, value, network) : undefined);\n const offsite = !!link && /^https?:\\/\\//.test(link);\n const text = (\n <span title={value} className=\"font-mono text-[0.875rem]\">\n {shown}\n </span>\n );\n return (\n <span className={cn('inline-flex max-w-full items-center gap-1', className)}>\n {link ? (\n <a\n href={link}\n {...(offsite ? { target: '_blank', rel: 'noreferrer' } : {})}\n className=\"underline decoration-foreground/35 underline-offset-4 hover:decoration-foreground\"\n >\n {text}\n {offsite ? <span className=\"sr-only\"> (opens in a new tab)</span> : null}\n </a>\n ) : (\n text\n )}\n {copy ? <CopyButton value={value} label=\"Copy full value\" /> : null}\n </span>\n );\n}\n\n/* ── Progress ────────────────────────────────────────────────────────── */\n\nexport type StepState = 'done' | 'current' | 'upcoming' | 'blocked';\n\nexport interface ProgressStep {\n label: ReactNode;\n hint?: ReactNode;\n state: StepState;\n}\n\nexport function ProgressSteps({ steps, className }: { steps: ProgressStep[]; className?: string }) {\n return (\n <ol className={cn('flex flex-col gap-0', className)}>\n {steps.map((s, i) => {\n const last = i === steps.length - 1;\n return (\n <li key={i} className=\"relative flex gap-4 pb-6 last:pb-0\" aria-current={s.state === 'current' ? 'step' : undefined}>\n {!last ? (\n <span\n aria-hidden\n className={cn(\n 'absolute left-[11px] top-7 h-[calc(100%-1.5rem)] w-px',\n s.state === 'done' ? 'bg-foreground/30' : 'bg-border'\n )}\n />\n ) : null}\n <span\n className={cn(\n 'relative z-10 mt-0.5 flex size-6 shrink-0 items-center justify-center rounded-full border text-[0.75rem] oca-tabular',\n s.state === 'done' && 'border-primary bg-primary text-primary-foreground',\n s.state === 'current' && 'border-brand bg-card text-oca-accent-ink',\n s.state === 'upcoming' && 'border-border bg-card text-muted-foreground',\n s.state === 'blocked' && 'border-destructive bg-card text-destructive'\n )}\n >\n {s.state === 'done' ? <Check className=\"size-3.5\" strokeWidth={3} /> : String(i + 1).padStart(2, '0')}\n </span>\n <div className=\"flex min-w-0 flex-col gap-1\">\n <span className={cn('text-[0.9375rem]', s.state === 'upcoming' ? 'text-muted-foreground' : 'font-medium')}>\n {s.label}\n </span>\n {s.hint ? <span className=\"text-[0.875rem] leading-snug text-muted-foreground\">{s.hint}</span> : null}\n </div>\n </li>\n );\n })}\n </ol>\n );\n}\n\n/* ── Activity ────────────────────────────────────────────────────────── */\n\nexport interface ActivityItem {\n id: string;\n title: ReactNode;\n meta?: ReactNode;\n /** A small mark before the text, such as a Monogram. */\n leading?: ReactNode;\n trailing?: ReactNode;\n href?: string;\n}\n\nexport function ActivityList({ items, empty, className }: { items: ActivityItem[]; empty?: ReactNode; className?: string }) {\n if (items.length === 0 && empty) return <>{empty}</>;\n return (\n <ul className={cn('divide-y divide-border rounded-[1.25rem] border border-border bg-card', className)}>\n {items.map((it) => {\n const body = (\n <div className=\"flex items-center justify-between gap-4 px-5 py-4\">\n <div className=\"flex min-w-0 items-center gap-3\">\n {it.leading ? <div className=\"shrink-0\">{it.leading}</div> : null}\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"truncate text-[0.9375rem]\">{it.title}</span>\n {it.meta ? <span className=\"truncate text-[0.8125rem] text-muted-foreground\">{it.meta}</span> : null}\n </div>\n </div>\n {it.trailing ? <div className=\"shrink-0 text-right\">{it.trailing}</div> : null}\n </div>\n );\n return (\n <li key={it.id}>\n {it.href ? (\n <a href={it.href} className=\"block transition-colors hover:bg-accent/60\">\n {body}\n </a>\n ) : (\n body\n )}\n </li>\n );\n })}\n </ul>\n );\n}\n","import * as TabsPrimitive from '@radix-ui/react-tabs';\nimport { useCallback, useMemo, useRef, useState, useSyncExternalStore, type ReactNode, type RefObject } from 'react';\n\nimport { grammarOf, highlight, linesToHtml, parseLineRanges, readDiff } from '../code/highlight';\nimport { cn } from '../lib/cn';\nimport { ScrollFade } from '../primitives/scroll-fade';\nimport { CopyButton } from './data';\n\nconst LANG_NAME: Record<string, string> = {\n ts: 'TypeScript',\n typescript: 'TypeScript',\n tsx: 'TSX',\n js: 'JavaScript',\n javascript: 'JavaScript',\n jsx: 'JSX',\n mjs: 'JavaScript',\n json: 'JSON',\n jsonc: 'JSON',\n bash: 'Shell',\n sh: 'Shell',\n shell: 'Shell',\n zsh: 'Shell',\n console: 'Terminal',\n terminal: 'Terminal',\n python: 'Python',\n py: 'Python',\n yaml: 'YAML',\n yml: 'YAML',\n diff: 'Diff',\n text: 'Text',\n};\n\n/** \"TypeScript\" for ts, \"Shell\" for bash; the fence name itself for anything else. */\nexport function languageName(lang?: string): string | undefined {\n return lang ? (LANG_NAME[lang.toLowerCase()] ?? lang) : undefined;\n}\n\n/*\n * What a copy button puts on the clipboard: the code exactly as written,\n * final newline included, without removed lines and, for a shell transcript\n * with `$ ` prompts, only the commands, without their prompts.\n */\nfunction forClipboard(text: string, lang?: string): string {\n if (grammarOf(lang) !== 'shell') return text;\n const lines = text.split('\\n');\n if (!lines.some((l) => l.startsWith('$ '))) return text;\n return lines\n .filter((l) => l.startsWith('$ '))\n .map((l) => l.slice(2))\n .join('\\n');\n}\n\nfunction linesFromDom(pre: HTMLElement | null, newline: boolean): string | null {\n if (!pre) return null;\n const lines = pre.querySelectorAll('[data-line]');\n if (lines.length === 0) return pre.textContent ?? '';\n const text = Array.from(lines)\n .filter((l) => l.getAttribute('data-diff') !== 'remove')\n .map((l) => l.textContent ?? '')\n .join('\\n');\n return newline ? `${text}\\n` : text;\n}\n\ninterface Prepared {\n html: string;\n /** The code as a reader would copy it. */\n copy: string;\n lines: number;\n diff: boolean;\n}\n\nfunction prepare(code: string, lang: string | undefined, marks: string | readonly number[] | undefined, diff: boolean): Prepared {\n const d = diff ? readDiff(code) : null;\n const src = d ? d.code : code.replace(/\\r?\\n$/, '');\n const lines = highlight(src, lang === 'diff' ? undefined : lang);\n const kept = d ? src.split('\\n').filter((_, i) => d.diff.get(i + 1) !== 'remove') : null;\n return {\n html: linesToHtml(lines, { highlight: parseLineRanges(marks), diff: d?.diff }),\n // Byte for byte, the final newline too: a hash printed beside the code must match a copy of it.\n copy: kept ? kept.join('\\n') + (/\\n$/.test(code) ? '\\n' : '') : code,\n lines: lines.length,\n diff: !!d,\n };\n}\n\n/** The dark well: lines that scroll sideways, folding past `maxLines`. */\nfunction Well({\n preRef,\n html,\n children,\n lang,\n lines,\n maxLines,\n diff,\n lineNumbers,\n wrap,\n}: {\n preRef?: RefObject<HTMLPreElement | null>;\n html?: string;\n children?: ReactNode;\n lang?: string;\n lines: number;\n maxLines?: number;\n diff?: boolean;\n lineNumbers?: boolean;\n wrap?: boolean;\n}) {\n const foldable = maxLines !== undefined && lines > maxLines + 2;\n const [open, setOpen] = useState(false);\n const folded = foldable && !open;\n // Markup made of lines carries its own side padding, so a marked line runs edge to edge.\n const lined = html !== undefined;\n return (\n <div className=\"relative\">\n <div\n className={cn(folded && 'overflow-hidden')}\n style={folded ? { maxHeight: `calc(${maxLines} * 1.625em + 2rem)` } : undefined}\n >\n <ScrollFade fade=\"var(--oca-code-surface)\">\n <pre\n ref={preRef}\n data-diff={diff ? '' : undefined}\n data-line-numbers={lineNumbers ? '' : undefined}\n className={cn(\n 'oca-code py-4 font-mono text-[0.875rem] leading-[1.625] text-oca-ink-muted [font-variant-ligatures:none]',\n wrap ? 'whitespace-pre-wrap break-all' : 'w-max min-w-full',\n !lined && 'px-5'\n )}\n >\n {lined ? (\n <code className=\"block\" data-lang={lang} dangerouslySetInnerHTML={{ __html: html }} />\n ) : (\n <code className=\"block\" data-lang={lang}>\n {children}\n </code>\n )}\n </pre>\n </ScrollFade>\n </div>\n {foldable ? (\n <div\n className={cn('flex justify-center px-5 pb-4', folded && 'absolute inset-x-0 bottom-0 pt-16')}\n style={folded ? { background: 'linear-gradient(to top, var(--oca-code-surface) 40%, transparent)' } : undefined}\n >\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n aria-expanded={open}\n className=\"rounded-full border border-white/20 px-4 py-1.5 text-[0.8125rem] text-white transition-colors hover:bg-white/10\"\n >\n {open ? 'Show less' : `Show all ${lines} lines`}\n </button>\n </div>\n ) : null}\n </div>\n );\n}\n\nconst FRAME = 'overflow-hidden rounded-[1.25rem] border border-[var(--oca-code-line)] bg-[var(--oca-code-surface)]';\n// The bar is 44px tall: on a phone the copy fills it, a thumb's target.\nconst COPY_ON_INK = 'text-oca-ink-subtle hover:bg-white/10 hover:text-white max-md:size-11';\n\nexport interface CodeBlockProps {\n /** The source. Highlighted here, on the server too, when `lang` is one the package reads. */\n code?: string;\n /**\n * Highlighted markup made at build time (rehypeCode, highlightToHtml).\n * Trusted markup only: it is set as HTML.\n */\n html?: string;\n /** Highlighted nodes from another highlighter. */\n children?: ReactNode;\n /** With `html`: the source ended in a newline, and a copy keeps it (rehypeCode sets this). */\n trailingNewline?: boolean;\n /** The fence name: ts, tsx, json, bash, python, yaml, diff. */\n lang?: string;\n /** The file name or purpose. Defaults to the language's name, or \"Code\". */\n caption?: ReactNode;\n copy?: boolean;\n /** Wipe the clipboard this many milliseconds after a copy (a secret in code). */\n clearAfter?: number;\n /** Fold past this many lines, with a button for the rest. */\n maxLines?: number;\n /** Lines to mark, 1-based: \"2,4-6\" or [2, 4, 5, 6]. With `code`. */\n highlight?: string | readonly number[];\n /** Read `+` and `-` at the start of each line as added and removed. With `code`; `lang=\"diff\"` implies it. */\n diff?: boolean;\n /** Number the lines. */\n lineNumbers?: boolean;\n /**\n * Break long lines at any character instead of scrolling: a message to\n * sign, a 64-character id. Copying still takes the exact bytes.\n */\n wrap?: boolean;\n /** Beside the copy button: a download, a raw/pretty switch. */\n actions?: ReactNode;\n className?: string;\n}\n\n/**\n * A block of code: a header with its name and a copy button, then the code\n * on a dark well, highlighted, that scrolls sideways (with an edge that says\n * so) rather than cutting a line off. Lines can be marked, shown as a diff,\n * or numbered; the marks are drawn, so copying takes the code as written.\n * Past `maxLines` it folds.\n */\nexport function CodeBlock({\n code,\n html,\n children,\n trailingNewline = false,\n lang,\n caption,\n copy = true,\n clearAfter,\n maxLines,\n highlight: marks,\n diff,\n lineNumbers,\n wrap,\n actions,\n className,\n}: CodeBlockProps) {\n const preRef = useRef<HTMLPreElement>(null);\n const isDiff = diff || lang === 'diff';\n const markKey = typeof marks === 'string' ? marks : marks?.join(',');\n const prepared = useMemo(\n () => (html === undefined && children === undefined && code !== undefined ? prepare(code, lang, markKey, !!isDiff) : null),\n [code, html, children, lang, markKey, isDiff]\n );\n const markup = prepared?.html ?? html;\n const lines = prepared?.lines ?? (html !== undefined ? html.split('\\n').length : (code?.split('\\n').length ?? 0));\n const read = () => forClipboard(prepared?.copy ?? linesFromDom(preRef.current, trailingNewline) ?? code ?? '', lang);\n return (\n <figure className={cn(FRAME, className)}>\n <figcaption className=\"flex h-11 items-center justify-between gap-3 border-b border-[var(--oca-code-line)] pl-5 pr-2\">\n <span className=\"truncate text-[0.8125rem] text-oca-ink-subtle\">{caption ?? languageName(lang) ?? 'Code'}</span>\n <span className=\"flex shrink-0 items-center gap-1\">\n {actions}\n {copy ? <CopyButton value={read} label=\"Copy code\" clearAfter={clearAfter} className={COPY_ON_INK} /> : null}\n </span>\n </figcaption>\n <Well\n preRef={preRef}\n html={markup}\n lang={lang}\n lines={lines}\n maxLines={maxLines}\n diff={prepared ? prepared.diff : isDiff}\n lineNumbers={lineNumbers}\n wrap={wrap}\n >\n {children}\n </Well>\n </figure>\n );\n}\n\n/* ── Tabs of code ────────────────────────────────────────────────────── */\n\nconst tabListeners = new Map<string, Set<() => void>>();\nconst tabMemory = new Map<string, string>();\nconst storeKey = (k: string) => `oca-code-tab:${k}`;\n\nfunction readTab(key: string): string | null {\n if (tabMemory.has(key)) return tabMemory.get(key)!;\n try {\n return window.localStorage.getItem(storeKey(key));\n } catch {\n return null;\n }\n}\n\nfunction writeTab(key: string, value: string) {\n tabMemory.set(key, value);\n try {\n window.localStorage.setItem(storeKey(key), value);\n } catch {\n /* private mode: the choice lasts for this page */\n }\n tabListeners.get(key)?.forEach((l) => l());\n}\n\n/** One choice shared by every CodeTabs with the same key, remembered in this browser. */\nfunction useSyncedTab(key: string | undefined): [string | null, (v: string) => void] {\n const subscribe = useCallback(\n (cb: () => void) => {\n if (!key) return () => {};\n const set = tabListeners.get(key) ?? new Set();\n set.add(cb);\n tabListeners.set(key, set);\n return () => {\n set.delete(cb);\n };\n },\n [key]\n );\n const value = useSyncExternalStore(\n subscribe,\n () => (key ? readTab(key) : null),\n () => null\n );\n return [value, (v: string) => key && writeTab(key, v)];\n}\n\nexport interface CodeTab {\n /** The tab's name, and what `syncKey` remembers: \"npm\", \"curl\", \"Python\". */\n label: string;\n code: string;\n lang?: string;\n}\n\n/**\n * The same thing in several forms (npm, yarn, pnpm; curl, Node, Python) in\n * one well, with tabs in its header and a copy button for the one shown.\n * Give every set the same `syncKey` and choosing \"pnpm\" once switches them\n * all, on this page and the next.\n */\nexport function CodeTabs({\n items,\n syncKey,\n defaultValue,\n maxLines,\n className,\n}: {\n items: CodeTab[];\n syncKey?: string;\n /** The label shown first. Default: the first item. */\n defaultValue?: string;\n maxLines?: number;\n className?: string;\n}) {\n const [synced, setSynced] = useSyncedTab(syncKey);\n const [local, setLocal] = useState<string | null>(null);\n const labels = items.map((it) => it.label);\n const pick = [local, synced, defaultValue].find((v): v is string => !!v && labels.includes(v)) ?? labels[0] ?? '';\n const active = items.find((it) => it.label === pick);\n const prepared = useMemo(() => items.map((it) => prepare(it.code, it.lang, undefined, it.lang === 'diff')), [items]);\n return (\n <TabsPrimitive.Root\n value={pick}\n onValueChange={(v) => {\n setLocal(v);\n setSynced(v);\n }}\n className={cn(FRAME, className)}\n >\n <div className=\"flex h-11 items-center justify-between gap-3 border-b border-[var(--oca-code-line)] pl-2 pr-2\">\n <ScrollFade fade=\"var(--oca-code-surface)\" className=\"min-w-0 flex-1\">\n <TabsPrimitive.List aria-label=\"Versions\" className=\"flex w-max items-center gap-0.5\">\n {items.map((it) => (\n <TabsPrimitive.Trigger\n key={it.label}\n value={it.label}\n className={cn(\n 'relative inline-flex h-11 items-center whitespace-nowrap px-3 text-[0.8125rem] text-oca-ink-subtle outline-none transition-colors',\n 'hover:text-white focus-visible:text-white focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring',\n 'data-[state=active]:text-white',\n 'after:absolute after:inset-x-3 after:bottom-0 after:h-0.5 after:rounded-full after:bg-transparent data-[state=active]:after:bg-oca-orange'\n )}\n >\n {it.label}\n </TabsPrimitive.Trigger>\n ))}\n </TabsPrimitive.List>\n </ScrollFade>\n {active ? (\n <CopyButton\n value={() => forClipboard(prepared[items.indexOf(active)]?.copy ?? active.code, active.lang)}\n label={`Copy ${active.label}`}\n className={COPY_ON_INK}\n />\n ) : null}\n </div>\n {items.map((it, i) => (\n <TabsPrimitive.Content key={it.label} value={it.label} className=\"outline-none\" tabIndex={-1}>\n <Well\n html={prepared[i]!.html}\n lang={it.lang}\n lines={prepared[i]!.lines}\n maxLines={maxLines}\n diff={prepared[i]!.diff}\n />\n </TabsPrimitive.Content>\n ))}\n </TabsPrimitive.Root>\n );\n}\n\n/** `npm install`, `yarn add` and `pnpm add` for a package, in one remembered set of tabs. */\nexport function InstallTabs({ pkg, dev = false, className }: { pkg: string; dev?: boolean; className?: string }) {\n const items: CodeTab[] = [\n { label: 'npm', code: `npm install ${dev ? '--save-dev ' : ''}${pkg}`, lang: 'bash' },\n { label: 'yarn', code: `yarn add ${dev ? '--dev ' : ''}${pkg}`, lang: 'bash' },\n { label: 'pnpm', code: `pnpm add ${dev ? '--save-dev ' : ''}${pkg}`, lang: 'bash' },\n ];\n return <CodeTabs items={items} syncKey=\"package-manager\" className={className} />;\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport type { HTMLAttributes } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/*\n * The small white pill from the deck (\"in testing\", \"on the path\"). Three tones\n * carry meaning: neutral, the orange accent for attention, and red for a real\n * error. Text stays on the token that clears 4.5:1 against its tint.\n */\nconst GOOD_DOT =\n \"border-border bg-card text-foreground before:size-1.5 before:shrink-0 before:rounded-full before:bg-success before:content-['']\";\n\nexport const badgeVariants = cva(\n 'inline-flex h-6 shrink-0 items-center gap-1.5 whitespace-nowrap rounded-full border px-2.5 text-[0.8125rem] font-medium leading-none',\n {\n variants: {\n tone: {\n neutral: 'border-border bg-card text-foreground',\n muted: 'border-transparent bg-muted text-muted-foreground',\n brand: 'border-transparent bg-[color-mix(in_oklab,var(--oca-orange)_9%,var(--card))] text-oca-accent-ink',\n danger: 'border-transparent bg-[color-mix(in_oklab,var(--destructive)_12%,var(--card))] text-destructive',\n // A good state is a neutral pill with a green dot, not a green pill.\n success: GOOD_DOT,\n // Aliases kept so older call sites keep compiling: attention is\n // the brand accent, information is neutral.\n warning: 'border-transparent bg-[color-mix(in_oklab,var(--oca-orange)_9%,var(--card))] text-oca-accent-ink',\n info: 'border-border bg-card text-foreground',\n // Inverted in dark mode, where ink would sit on a card of nearly its own colour.\n ink: 'border-transparent bg-oca-ink text-oca-ink-foreground dark:bg-foreground dark:text-background',\n onInk: 'border-white/15 bg-white/5 text-white/90',\n },\n },\n defaultVariants: { tone: 'neutral' },\n }\n);\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement>, VariantProps<typeof badgeVariants> {}\n\nexport function Badge({ className, tone, ...props }: BadgeProps) {\n return <span data-ui=\"badge\" className={cn(badgeVariants({ tone }), className)} {...props} />;\n}\n\n/** A pill with a live dot: where something stands right now (\"In testing · payouts start after\"). */\nexport function StatusPill({\n className,\n children,\n pulse = true,\n ...props\n}: HTMLAttributes<HTMLSpanElement> & { pulse?: boolean }) {\n return (\n <span\n data-ui=\"status-pill\"\n className={cn(\n 'inline-flex min-h-8 w-fit items-center gap-2.5 rounded-full border border-border bg-card py-1 pl-3 pr-3.5 text-[0.875rem] leading-snug text-foreground',\n className\n )}\n {...props}\n >\n <span aria-hidden className=\"relative flex size-2 shrink-0\">\n {pulse ? (\n <span className=\"absolute inset-0 rounded-full bg-oca-orange opacity-50 motion-safe:animate-ping\" />\n ) : null}\n <span className=\"relative size-2 rounded-full bg-oca-orange\" />\n </span>\n {children}\n </span>\n );\n}\n","import type { HTMLAttributes } from 'react';\n\nimport type { SiteStatus } from '../family';\nimport { cn } from '../lib/cn';\nimport { Badge } from './badge';\n\n/*\n * Where something stands, in the family's fixed words. A site or feature is\n * live, in testing, not yet, or paused; a check on an artifact is good,\n * caution or refused. There is no free text: the words are the component, so\n * no page can invent \"LIVE · MAINNET\", \"BETA\" or \"PRO\" again.\n */\nexport type Statement = 'good' | 'caution' | 'refused';\nexport type Status = SiteStatus | Statement;\n\nconst WORD: Record<Status, string> = {\n live: 'Live',\n testing: 'In testing',\n 'not-yet': 'Not yet',\n paused: 'Paused',\n good: 'Good',\n caution: 'Caution',\n refused: 'Refused',\n};\n\nconst TONE = {\n live: 'success',\n testing: 'brand',\n 'not-yet': 'muted',\n paused: 'muted',\n good: 'success',\n caution: 'brand',\n refused: 'danger',\n} as const;\n\n/** The word for a status, for places that need it as text. */\nexport function statusWord(status: Status): string {\n return WORD[status];\n}\n\nexport interface StatusBadgeProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {\n status: Status;\n}\n\nexport function StatusBadge({ status, className, ...props }: StatusBadgeProps) {\n return (\n <Badge tone={TONE[status]} data-status={status} className={cn(className)} {...props}>\n {WORD[status]}\n </Badge>\n );\n}\n","import { ArrowLeft, ArrowRight, ArrowUpRight, ChevronRight } from 'lucide-react';\nimport Link from 'next/link';\nimport {\n Children,\n isValidElement,\n useEffect,\n useId,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n type RefObject,\n type TableHTMLAttributes,\n} from 'react';\n\nimport { cn } from '../lib/cn';\nimport { Badge } from '../primitives/badge';\nimport { ScrollFade } from '../primitives/scroll-fade';\nimport { Skeleton } from '../primitives/feedback';\nimport { StatusBadge, type Status } from '../primitives/status-badge';\nimport { CodeBlock } from './code-block';\nimport { Notice } from './data';\nimport { useActiveHeading, type TocItem } from './hero';\n\n/*\n * The parts of a docs page: where you are (Breadcrumbs), where to go next\n * (DocsPager), what is on this page (OnThisPage), and the blocks MDX writes\n * with (Callout, Steps, LinkCard, ApiTable, MdxTable, Diagram). DocsShell\n * (chrome) puts them in place; mdxComponents (./mdx) maps markdown onto them.\n */\n\nconst isInternal = (href: string) => href.startsWith('/') || href.startsWith('#');\n\n/** A router link for this site's pages, a plain anchor for another site. */\nfunction DocLink({ href, className, children, ...rest }: { href: string; className?: string; children: ReactNode; 'aria-label'?: string }) {\n return isInternal(href) ? (\n <Link href={href} className={className} {...rest}>\n {children}\n </Link>\n ) : (\n <a href={href} className={className} {...rest}>\n {children}\n </a>\n );\n}\n\n/* ── Breadcrumbs ─────────────────────────────────────────────────────── */\n\nexport interface Crumb {\n label: ReactNode;\n /** Omit for the page you are on. */\n href?: string;\n}\n\n/** Where this page sits: docs › section › page, with room on the right for \"View source\". */\nexport function Breadcrumbs({ items, action, className }: { items: Crumb[]; action?: ReactNode; className?: string }) {\n return (\n <div className={cn('flex min-h-11 items-center justify-between gap-4 sm:min-h-0', className)}>\n <nav aria-label=\"Breadcrumb\" className=\"min-w-0\">\n <ol className=\"flex min-w-0 items-center gap-1.5 text-[0.875rem] text-muted-foreground\">\n {items.map((c, i) => {\n const last = i === items.length - 1;\n return (\n <li key={i} className={cn('flex items-center gap-1.5', last ? 'min-w-0' : 'shrink-0')}>\n {c.href && !last ? (\n <DocLink href={c.href} className=\"inline-flex min-h-11 items-center transition-colors hover:text-foreground sm:min-h-0\">\n {c.label}\n </DocLink>\n ) : (\n <span aria-current={last ? 'page' : undefined} className={cn('truncate', last && 'text-foreground')}>\n {c.label}\n </span>\n )}\n {!last ? <ChevronRight aria-hidden className=\"size-3.5 shrink-0 text-oca-subtle\" /> : null}\n </li>\n );\n })}\n </ol>\n </nav>\n {action ? <div className=\"shrink-0 text-[0.875rem]\">{action}</div> : null}\n </div>\n );\n}\n\n/* ── Previous / next ─────────────────────────────────────────────────── */\n\nexport interface PagerLink {\n href: string;\n label: ReactNode;\n /** The section it is in, when that differs from this page's. */\n section?: ReactNode;\n}\n\n/** The page before and after this one, as two cards at the foot of the page. */\nexport function DocsPager({ prev, next, className }: { prev?: PagerLink; next?: PagerLink; className?: string }) {\n if (!prev && !next) return null;\n const card = (l: PagerLink, dir: 'prev' | 'next') => (\n <DocLink\n href={l.href}\n className={cn(\n 'group flex min-h-20 flex-col justify-center gap-1 rounded-2xl border border-border bg-card px-5 py-4 transition-colors hover:border-oca-hairline-strong',\n dir === 'next' && 'items-end text-right sm:col-start-2'\n )}\n >\n <span className=\"flex items-center gap-1.5 text-[0.8125rem] text-muted-foreground\">\n {dir === 'prev' ? <ArrowLeft aria-hidden className=\"size-3.5\" /> : null}\n {dir === 'prev' ? 'Previous' : 'Next'}\n {l.section ? <span aria-hidden>·</span> : null}\n {l.section ? <span className=\"truncate\">{l.section}</span> : null}\n {dir === 'next' ? <ArrowRight aria-hidden className=\"size-3.5\" /> : null}\n </span>\n <span className=\"text-[1rem] font-medium leading-snug text-foreground\">{l.label}</span>\n </DocLink>\n );\n return (\n <nav aria-label=\"Previous and next page\" className={cn('grid grid-cols-1 gap-3 border-t border-border pt-8 sm:grid-cols-2', className)}>\n {prev ? card(prev, 'prev') : null}\n {next ? card(next, 'next') : null}\n </nav>\n );\n}\n\n/* ── On this page ────────────────────────────────────────────────────── */\n\n/**\n * The page's h2s and h3s with ids, read from the rendered page. `key` (the\n * path) reads them again after a client-side move to another page.\n */\nexport function useHeadings(selector = '#docs-content', key?: string): { items: TocItem[]; activeId?: string } {\n const [items, setItems] = useState<TocItem[]>([]);\n useEffect(() => {\n const read = () => {\n const root = document.querySelector(selector);\n if (!root) return setItems([]);\n setItems(\n Array.from(root.querySelectorAll<HTMLHeadingElement>('h2[id], h3[id]')).map((h) => ({\n id: h.id,\n // The anchor link's \"#\" is not part of the name.\n label: (h.querySelector('[data-heading-text]') ?? h).textContent?.trim() ?? '',\n level: h.tagName === 'H3' ? 3 : 2,\n }))\n );\n };\n // Once after paint, once more for late layout (fonts, images).\n const raf = requestAnimationFrame(read);\n const t = setTimeout(read, 80);\n return () => {\n cancelAnimationFrame(raf);\n clearTimeout(t);\n };\n }, [selector, key]);\n const activeId = useActiveHeading(items.map((i) => i.id));\n return { items, activeId };\n}\n\n/** The list of a page's sections, the one being read marked. h3s sit in under their h2. */\nexport function OnThisPage({\n items,\n activeId,\n title = 'On this page',\n onNavigate,\n className,\n}: {\n items: TocItem[];\n activeId?: string;\n /** `null` for no visible title. */\n title?: ReactNode;\n onNavigate?: () => void;\n className?: string;\n}) {\n const id = useId();\n if (items.length === 0) return null;\n return (\n // With no visible title (a folded list under its own summary) the name is still \"On this page\".\n <nav aria-labelledby={title ? id : undefined} aria-label={title ? undefined : 'On this page'} className={className}>\n {title ? (\n <p id={id} className=\"mb-3 text-[0.875rem] font-medium\">\n {title}\n </p>\n ) : null}\n <ul>\n {items.map((t) => {\n const on = t.id === activeId;\n return (\n <li key={t.id}>\n <a\n href={`#${t.id}`}\n onClick={onNavigate}\n aria-current={on ? 'location' : undefined}\n className={cn(\n 'block border-l py-1.5 text-[0.875rem] leading-snug transition-colors',\n t.level === 3 ? 'pl-7' : 'pl-4',\n on ? 'border-foreground text-foreground' : 'border-border text-muted-foreground hover:text-foreground'\n )}\n >\n {t.label}\n </a>\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n\n/* ── Blocks MDX writes with ──────────────────────────────────────────── */\n\nconst CALLOUT_TONE = { note: 'neutral', warning: 'brand', danger: 'danger' } as const;\n\n/**\n * A note set apart from the text: `note` (the default), `warning` for\n * something that costs you if missed, `danger` for something that breaks.\n * It is part of the page, so it is a note to a screen reader, never an alert.\n */\nexport function Callout({\n tone = 'note',\n title,\n children,\n className,\n}: {\n tone?: keyof typeof CALLOUT_TONE;\n title?: ReactNode;\n children?: ReactNode;\n className?: string;\n}) {\n return (\n <Notice\n tone={CALLOUT_TONE[tone]}\n title={title}\n role=\"note\"\n // Markdown paragraphs inside take the note's size, not the page's.\n className={cn('my-6 [&_p]:my-0 [&_p]:text-[0.9375rem] [&_p]:leading-relaxed [&_p+p]:mt-3', className)}\n >\n {children}\n </Notice>\n );\n}\n\n/** One step of a guide: a title and whatever it takes (text, code). */\nexport function Step({ title, id, children }: { title: ReactNode; id?: string; children?: ReactNode }) {\n return (\n <li className=\"relative pb-8 pl-11 last:pb-0 [counter-increment:oca-step]\">\n {/* The number, and the line down to the next one. */}\n <span\n aria-hidden\n className=\"absolute left-0 top-0 flex size-7 items-center justify-center rounded-full border border-oca-hairline-strong bg-card text-[0.8125rem] oca-tabular text-foreground before:content-[counter(oca-step)]\"\n />\n <span aria-hidden className=\"absolute bottom-1 left-[0.8125rem] top-9 w-px bg-border\" />\n <h3 id={id} className=\"scroll-mt-28 pt-0.5 text-[1.0625rem] font-medium leading-snug tracking-[-0.008em] text-foreground\">\n {title}\n </h3>\n <div className=\"mt-2 text-muted-foreground [&>*:first-child]:mt-0 [&>*:last-child]:mb-0\">{children}</div>\n </li>\n );\n}\n\n/**\n * A guide's steps, numbered, each with its title and body. For instructions\n * a reader follows in order; ProgressSteps is for where something stands.\n */\nexport function Steps({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <ol className={cn('not-prose my-8 flex flex-col [counter-reset:oca-step] [&>li:last-child>span:nth-child(2)]:hidden', className)}>\n {children}\n </ol>\n );\n}\n\n/** A card that leads somewhere: a title, one line, an optional icon. */\nexport function LinkCard({\n href,\n title,\n description,\n icon,\n meta,\n className,\n}: {\n href: string;\n title: ReactNode;\n description?: ReactNode;\n icon?: ReactNode;\n /** Top right, beside the arrow: a status, a count. */\n meta?: ReactNode;\n className?: string;\n}) {\n const Arrow = isInternal(href) ? ArrowRight : ArrowUpRight;\n return (\n <DocLink\n href={href}\n className={cn(\n 'group flex h-full flex-col gap-3 rounded-[1.25rem] border border-border bg-card p-5 transition-colors hover:border-oca-hairline-strong',\n className\n )}\n >\n <span className=\"flex items-start justify-between gap-3\">\n {icon ? (\n <span className=\"flex size-9 shrink-0 items-center justify-center rounded-xl bg-muted text-foreground [&_svg]:size-[1.125rem]\">\n {icon}\n </span>\n ) : (\n <span className=\"text-[1rem] font-medium leading-snug text-foreground\">{title}</span>\n )}\n <span className=\"flex shrink-0 items-center gap-2\">\n {meta}\n <Arrow aria-hidden className=\"size-4 text-muted-foreground transition-transform group-hover:translate-x-0.5 group-hover:text-foreground\" />\n </span>\n </span>\n {icon ? <span className=\"text-[1rem] font-medium leading-snug text-foreground\">{title}</span> : null}\n {description ? <span className=\"text-[0.9375rem] leading-relaxed text-muted-foreground\">{description}</span> : null}\n </DocLink>\n );\n}\n\n/** LinkCards in a grid: one column on a phone, two or three beside each other. */\nexport function CardGrid({ columns = 2, children, className }: { columns?: 2 | 3; children: ReactNode; className?: string }) {\n return (\n <div className={cn('not-prose my-6 grid grid-cols-1 gap-3 sm:grid-cols-2', columns === 3 && 'lg:grid-cols-3', className)}>\n {children}\n </div>\n );\n}\n\n/* ── Tables ──────────────────────────────────────────────────────────── */\n\n/**\n * A markdown table: hairline rules, a quiet header, and sideways scrolling\n * with an edge that says so when it is wider than the column. Code in a\n * cell drops its pill, so an API table reads as a list of names.\n */\nexport function MdxTable({ className, ...props }: TableHTMLAttributes<HTMLTableElement>) {\n return (\n <div className=\"not-prose my-6 overflow-hidden rounded-2xl border border-border bg-card\">\n <ScrollFade fade=\"var(--card)\">\n <table\n className={cn(\n 'w-full border-collapse text-left text-[0.875rem] leading-relaxed',\n '[&_th]:whitespace-nowrap [&_th]:border-b [&_th]:border-oca-hairline-strong [&_th]:bg-oca-table-head [&_th]:px-4 [&_th]:py-2.5 [&_th]:text-[0.8125rem] [&_th]:font-medium [&_th]:text-foreground',\n '[&_td]:border-t [&_td]:border-border [&_td]:px-4 [&_td]:py-2.5 [&_td]:align-top [&_td]:text-muted-foreground [&_tbody_tr:first-child_td]:border-t-0',\n '[&_td_code]:bg-transparent [&_td_code]:p-0 [&_td_code]:text-foreground [&_td:first-child]:text-foreground',\n '[&_[align=center]]:text-center [&_[align=right]]:text-right',\n // On a phone a cell keeps a readable width; the table scrolls instead of crushing it.\n 'max-sm:[&_td]:min-w-[9rem]',\n className\n )}\n {...props}\n />\n </ScrollFade>\n </div>\n );\n}\n\nexport interface ApiRow {\n name: string;\n /** The row's anchor: a link to `#id` lands on this row. */\n id?: string;\n type?: ReactNode;\n required?: boolean;\n default?: ReactNode;\n description?: ReactNode;\n /** Where it is defined: a link to the source line. Its column is named once, in the header. */\n source?: ReactNode;\n deprecated?: boolean;\n /** Where the member stands, when it is not simply live. */\n status?: Exclude<Status, 'live' | 'good' | 'caution' | 'refused'>;\n}\n\nconst said = (n: ReactNode) => n !== undefined && n !== null && n !== false && n !== '';\n\n/**\n * Parameters, props or fields: name and type in mono, required or default,\n * what it does and where it is defined. A table from sm up; on a phone each\n * row is a card with the name and type on top. One set of rows serves both,\n * so a row's `id` is a single anchor. A column nobody fills is left out.\n */\nexport function ApiTable({\n rows,\n caption,\n nameHeader = 'Name',\n className,\n}: {\n rows: ApiRow[];\n caption?: string;\n nameHeader?: string;\n className?: string;\n}) {\n const hasDefault = rows.some((r) => r.default !== undefined);\n const hasDescription = rows.some((r) => said(r.description));\n const hasSource = rows.some((r) => said(r.source));\n const cell = 'px-4 py-3 max-sm:p-0';\n return (\n <div className={cn('not-prose my-6 overflow-hidden rounded-2xl border border-border bg-card', className)}>\n <ScrollFade fade=\"var(--card)\">\n <table className=\"w-full border-collapse text-left text-[0.875rem] max-sm:block\">\n {caption ? <caption className=\"sr-only\">{caption}</caption> : null}\n <thead className=\"max-sm:sr-only\">\n <tr className=\"border-b border-oca-hairline-strong bg-oca-table-head text-[0.8125rem]\">\n <th scope=\"col\" className=\"px-4 py-2.5 font-medium\">{nameHeader}</th>\n <th scope=\"col\" className=\"px-4 py-2.5 font-medium\">Type</th>\n {hasDefault ? <th scope=\"col\" className=\"px-4 py-2.5 font-medium\">Default</th> : null}\n {hasDescription ? <th scope=\"col\" className=\"px-4 py-2.5 font-medium\">Description</th> : null}\n {hasSource ? <th scope=\"col\" className=\"px-4 py-2.5 font-medium\">Defined in</th> : null}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border max-sm:block\">\n {rows.map((r) => (\n <tr\n key={r.id ?? r.name}\n id={r.id}\n className=\"scroll-mt-28 align-top target:bg-muted max-sm:flex max-sm:flex-col max-sm:gap-1.5 max-sm:px-4 max-sm:py-3.5\"\n >\n <th scope=\"row\" className={cn(cell, 'text-left font-normal')}>\n <span className=\"flex flex-col items-start gap-1 max-sm:flex-row max-sm:flex-wrap max-sm:items-baseline max-sm:gap-x-2\">\n <code className={cn('font-mono text-[0.8125rem] text-foreground max-sm:text-[0.875rem]', r.deprecated && 'line-through decoration-oca-subtle')}>\n {r.name}\n </code>\n {r.required ? <span className=\"text-[0.75rem] text-oca-accent-ink\">Required</span> : null}\n {r.deprecated ? <Badge tone=\"muted\">Deprecated</Badge> : null}\n {r.status ? <StatusBadge status={r.status} /> : null}\n </span>\n </th>\n <td className={cn(cell, 'font-mono text-[0.8125rem] text-muted-foreground max-sm:break-all', !said(r.type) && 'max-sm:hidden')}>\n {r.type ?? '—'}\n </td>\n {hasDefault ? (\n <td className={cn(cell, 'font-mono text-[0.8125rem] text-muted-foreground max-sm:order-last', r.default === undefined && 'max-sm:hidden')}>\n <span className=\"font-sans sm:hidden\">Default </span>\n {r.default ?? '—'}\n </td>\n ) : null}\n {hasDescription ? (\n <td className={cn(cell, 'leading-relaxed text-muted-foreground', !said(r.description) && 'max-sm:hidden')}>\n {r.description}\n </td>\n ) : null}\n {hasSource ? (\n <td className={cn(cell, 'text-[0.8125rem] text-muted-foreground max-sm:order-last max-sm:break-all', !said(r.source) && 'max-sm:hidden')}>\n {r.source}\n </td>\n ) : null}\n </tr>\n ))}\n </tbody>\n </table>\n </ScrollFade>\n </div>\n );\n}\n\n/* ── Diagrams ────────────────────────────────────────────────────────── */\n\n/** The two calls Diagram makes on mermaid; the package does not depend on it. */\nexport interface MermaidLike {\n initialize(config: Record<string, unknown>): void;\n render(id: string, text: string): Promise<{ svg: string }>;\n}\n\nexport type MermaidLoader = () => Promise<MermaidLike | { default: MermaidLike }>;\n\nfunction useDarkMode(): boolean {\n const [dark, setDark] = useState(false);\n useEffect(() => {\n const root = document.documentElement;\n const read = () => setDark(root.classList.contains('dark'));\n read();\n const mo = new MutationObserver(read);\n mo.observe(root, { attributes: true, attributeFilter: ['class'] });\n return () => mo.disconnect();\n }, []);\n return dark;\n}\n\n/** Mermaid's palette from the tokens on the page, so a diagram follows light and dark. */\nfunction mermaidTheme(el: HTMLElement): Record<string, string> {\n const css = getComputedStyle(el);\n const v = (name: string) => css.getPropertyValue(name).trim();\n const card = v('--card');\n const muted = v('--muted');\n const text = v('--foreground');\n const subtle = v('--muted-foreground');\n const line = v('--input');\n const hair = v('--oca-hairline-strong');\n return {\n background: 'transparent',\n fontFamily: css.fontFamily,\n fontSize: '14px',\n textColor: text,\n mainBkg: card,\n primaryColor: card,\n primaryTextColor: text,\n primaryBorderColor: hair,\n secondaryColor: muted,\n secondaryTextColor: text,\n secondaryBorderColor: hair,\n tertiaryColor: muted,\n tertiaryTextColor: text,\n tertiaryBorderColor: hair,\n nodeBorder: hair,\n lineColor: line,\n edgeLabelBackground: card,\n clusterBkg: muted,\n clusterBorder: hair,\n titleColor: text,\n noteBkgColor: muted,\n noteTextColor: text,\n noteBorderColor: hair,\n actorBkg: card,\n actorBorder: hair,\n actorTextColor: text,\n actorLineColor: line,\n signalColor: text,\n signalTextColor: text,\n labelBoxBkgColor: card,\n labelBoxBorderColor: hair,\n labelTextColor: text,\n loopTextColor: subtle,\n activationBkgColor: muted,\n activationBorderColor: hair,\n sequenceNumberColor: card,\n };\n}\n\n/*\n * Mermaid draws at 100% width with its own size as a max-width, so a wide\n * diagram shrinks to fit and its labels with it. Give it its own width\n * instead, and read that width back: one up to a third wider than the\n * column scales down to fit (its 14px labels stay at 10.5px or more); a\n * wider one keeps its type size and scrolls sideways.\n */\nconst FIT = 4 / 3;\n\nfunction naturalSize(svg: string): { svg: string; width: number | null } {\n const w = svg.match(/viewBox=\"[\\d.-]+ [\\d.-]+ ([\\d.]+) [\\d.]+\"/)?.[1];\n if (!w) return { svg, width: null };\n const width = Math.ceil(Number(w));\n return {\n svg: svg.replace(/<svg([^>]*?)\\swidth=\"100%\"/, `<svg$1 width=\"${width}\"`).replace(/max-width:\\s*[\\d.]+px;?/, ''),\n width,\n };\n}\n\n/** The width a diagram has to fill: the figure, less the well's padding. */\nfunction useInnerWidth(ref: RefObject<HTMLElement | null>, padding: number): number | null {\n const [width, setWidth] = useState<number | null>(null);\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n const ro = new ResizeObserver(() => setWidth(el.clientWidth - padding));\n ro.observe(el);\n return () => ro.disconnect();\n }, [ref, padding]);\n return width;\n}\n\n/**\n * A mermaid diagram drawn in the page's own colours, again whenever the\n * page turns light or dark. Pass `load` (`() => import('mermaid')`) so\n * mermaid is fetched only on a page that draws one. If it cannot be drawn,\n * the source shows instead.\n */\nexport function Diagram({ chart, caption, load, className }: { chart: string; caption?: ReactNode; load: MermaidLoader; className?: string }) {\n const ref = useRef<HTMLDivElement>(null);\n const dark = useDarkMode();\n const raw = useId();\n const [drawn, setDrawn] = useState<{ svg: string; width: number | null } | null>(null);\n const [failed, setFailed] = useState(false);\n const room = useInnerWidth(ref, 48);\n const fits = drawn?.width != null && room != null && drawn.width <= room * FIT;\n useEffect(() => {\n let live = true;\n const el = ref.current;\n if (!el) return;\n (async () => {\n try {\n const mod = await load();\n const mermaid = 'default' in mod ? mod.default : mod;\n mermaid.initialize({ startOnLoad: false, securityLevel: 'strict', theme: 'base', themeVariables: mermaidTheme(el) });\n const { svg } = await mermaid.render(`oca-diagram-${raw.replace(/[^a-zA-Z0-9]/g, '')}-${dark ? 'd' : 'l'}`, chart);\n if (live) {\n setDrawn(naturalSize(svg));\n setFailed(false);\n }\n } catch {\n if (live) setFailed(true);\n }\n })();\n return () => {\n live = false;\n };\n }, [chart, dark, load, raw]);\n if (failed) return <CodeBlock code={chart} caption=\"Diagram (shown as its source)\" className={cn('my-6', className)} />;\n return (\n <figure ref={ref} className={cn('not-prose my-6 overflow-hidden rounded-[1.25rem] border border-border bg-card', className)}>\n {drawn ? (\n <ScrollFade fade=\"var(--card)\">\n <div\n data-fit={fits ? '' : undefined}\n className={cn(\n 'flex justify-center p-6 [&_svg]:h-auto',\n fits ? 'w-full [&_svg]:max-w-full' : 'w-max min-w-full [&_svg]:max-w-none'\n )}\n role=\"img\"\n aria-label={typeof caption === 'string' ? caption : 'Diagram'}\n dangerouslySetInnerHTML={{ __html: drawn.svg }}\n />\n </ScrollFade>\n ) : (\n <div role=\"status\" aria-label=\"Drawing the diagram\" className=\"p-6\">\n <Skeleton className=\"h-40 w-full rounded-xl\" />\n </div>\n )}\n {caption ? <figcaption className=\"border-t border-border px-5 py-3 text-[0.8125rem] text-muted-foreground\">{caption}</figcaption> : null}\n </figure>\n );\n}\n\n/* ── Headings with anchors ───────────────────────────────────────────── */\n\nconst HEADING = {\n h1: 'oca-display-3 mb-4 text-foreground',\n h2: 'mb-3 mt-12 text-[1.375rem] font-medium leading-tight tracking-[-0.015em] text-foreground md:text-[1.5rem]',\n h3: 'mb-2 mt-9 text-[1.125rem] font-medium leading-snug tracking-[-0.01em] text-foreground',\n h4: 'mb-2 mt-7 text-[1rem] font-medium leading-snug text-foreground',\n} as const;\n\n/**\n * A docs heading. With an id it carries a \"#\" link to itself, shown on\n * hover or focus, so a reader can copy a link to the section.\n */\nexport function DocsHeading({\n as: Tag,\n id,\n children,\n className,\n ...props\n}: HTMLAttributes<HTMLHeadingElement> & { as: keyof typeof HEADING }) {\n return (\n <Tag id={id} className={cn('group scroll-mt-28', HEADING[Tag], className)} {...props}>\n <span data-heading-text=\"\">{children}</span>\n {id && Tag !== 'h1' ? (\n <a\n href={`#${id}`}\n className=\"ml-2 inline-block rounded-md px-1 align-baseline text-[0.85em] font-normal text-oca-subtle no-underline opacity-0 transition-opacity hover:text-foreground focus-visible:opacity-100 group-hover:opacity-100\"\n >\n <span aria-hidden>#</span>\n <span className=\"sr-only\">Link to this section</span>\n </a>\n ) : null}\n </Tag>\n );\n}\n\n/** Text of an MDX `<code>` child, which may arrive as a string or pieces of one. */\nexport function codeText(node: ReactNode): string {\n if (typeof node === 'string') return node;\n if (typeof node === 'number') return String(node);\n if (Array.isArray(node)) return node.map(codeText).join('');\n if (isValidElement(node)) return codeText((node as ReactElement<{ children?: ReactNode }>).props.children);\n return '';\n}\n\n/** The language of an MDX code fence, from its `language-xx` class. */\nexport function codeLang(node: ReactNode): string | undefined {\n const child = Children.toArray(node)[0];\n if (!isValidElement(child)) return undefined;\n const cls = (child as ReactElement<{ className?: string }>).props.className ?? '';\n return cls.match(/language-([\\w+-]+)/)?.[1];\n}\n","/*\n * The orangecheck family as data: every public site, its one line, its group\n * and its status. The family menu, the footer, the protocol grid and the app\n * grid all read it, so a site is added, renamed or retired here and nowhere\n * else. No React: OG renderers and server code import it too.\n *\n * Status is written here until the claims source exists; then it is read\n * from there. \"live\" shows no badge.\n */\nimport type { FooterColumn, NavItem } from '../lib/nav';\n\n/** The six protocols, in the family's fixed order. */\nexport type ProtocolSlug = 'attest' | 'lock' | 'vote' | 'stamp' | 'agent' | 'pledge';\n\n/** The same slugs as the classic system's, so a site's `current` carries over. */\nexport type FamilySlug =\n | 'home'\n | 'me'\n | 'docs'\n | ProtocolSlug\n | 'vault'\n | 'chat'\n | 'cosign'\n | 'me-demo'\n | 'globe'\n | 'btc';\n\nexport type FamilyGroup = 'orangecheck' | 'protocol' | 'app' | 'public-good';\n\n/** Where a site or feature stands, in the family's words. */\nexport type SiteStatus = 'live' | 'testing' | 'not-yet' | 'paused';\n\nexport interface FamilySite {\n slug: FamilySlug;\n /** The site's word, lowercase, as menus and lockups show it. */\n label: string;\n /** Where the family menu and footer send people. A protocol's is its page on ochk.io. */\n href: string;\n group: FamilyGroup;\n /** What it is, in one sentence. */\n line: string;\n status: SiteStatus;\n /** For an app: the protocols it shows. */\n protocols?: ProtocolSlug[];\n}\n\nexport interface ProtocolSite extends FamilySite {\n slug: ProtocolSlug;\n group: 'protocol';\n /** What it carries: identity, confidentiality, legitimacy, provenance, authority, commitment. */\n verb: string;\n /** The protocol's page on ochk.io. */\n pageHref: string;\n /** The tools, on the protocol's own host. */\n toolHref: string;\n /** The normative spec. */\n specHref: string;\n /** The Nostr event kinds it publishes. */\n kinds: string;\n}\n\nexport const OCHK_IO = 'https://ochk.io';\n/** The docs live under ochk.io; docs.ochk.io 308s here. */\nexport const DOCS_HREF = `${OCHK_IO}/docs`;\n/** The account: one home for it, whichever site a person starts on. */\nexport const OCHK_APP = 'https://ochk.app';\n\n/**\n * The family's one account phrase. ochk.io and its docs offer it in the\n * header and link ochk.app; ochk.app offers it signed out and links its own\n * sign-in. A tool site signs a person in where they are, so it says\n * SIGN_IN_LABEL instead.\n */\nexport const GET_AN_ACCOUNT: NavItem = { href: OCHK_APP, label: 'Get an account' };\nexport const SIGN_IN_LABEL = 'Sign in';\n\nfunction protocol(\n slug: ProtocolSlug,\n verb: string,\n line: string,\n kinds: string\n): ProtocolSite {\n return {\n slug,\n label: slug,\n href: `${OCHK_IO}/${slug}`,\n group: 'protocol',\n line,\n status: 'live',\n verb,\n pageHref: `${OCHK_IO}/${slug}`,\n toolHref: `https://${slug}.ochk.io`,\n specHref: `https://github.com/orangecheck/oc-${slug}-protocol`,\n kinds,\n };\n}\n\n/** Attest · Lock · Vote · Stamp · Agent · Pledge, everywhere. */\nexport const PROTOCOLS: readonly ProtocolSite[] = [\n protocol('attest', 'identity', 'Show that an address holds bitcoin, and for how long.', '30078'),\n protocol('lock', 'confidentiality', 'Encrypt to a Bitcoin address, so only its holder can open it.', '30078'),\n protocol('vote', 'legitimacy', 'Polls weighed in sats, that anyone can tally.', '30080–30082'),\n protocol('stamp', 'provenance', 'Prove who signed something, and when.', '30083'),\n protocol('agent', 'authority', 'Give software scoped, revocable permission to act for you.', '30083–30086'),\n protocol('pledge', 'commitment', 'Make a promise with bitcoin behind it, on a public record.', '30078'),\n];\n\nexport const PROTOCOL_ORDER: readonly ProtocolSlug[] = PROTOCOLS.map((p) => p.slug);\n\nexport const FAMILY: readonly FamilySite[] = [\n {\n slug: 'home',\n label: 'ochk.io',\n href: OCHK_IO,\n group: 'orangecheck',\n line: 'The open protocols, and the company behind them.',\n status: 'live',\n },\n {\n slug: 'me',\n label: 'ochk.app',\n href: OCHK_APP,\n group: 'orangecheck',\n line: 'One account, with Bitcoin behind it.',\n status: 'testing',\n },\n {\n slug: 'docs',\n label: 'docs',\n href: DOCS_HREF,\n group: 'orangecheck',\n line: 'Specs, SDKs and guides for every protocol.',\n status: 'live',\n },\n ...PROTOCOLS,\n {\n slug: 'vault',\n label: 'vault',\n href: 'https://vault.ochk.io',\n group: 'app',\n line: 'A password manager, encrypted in your browser.',\n status: 'live',\n protocols: ['lock'],\n },\n {\n slug: 'chat',\n label: 'chat',\n href: 'https://chat.ochk.io',\n group: 'app',\n line: 'Messages only the holder of a Bitcoin address can read.',\n status: 'testing',\n protocols: ['lock'],\n },\n {\n slug: 'cosign',\n label: 'cosign',\n href: 'https://cosign.ochk.io',\n group: 'app',\n line: 'Builders find co-founders and backers.',\n status: 'testing',\n // Signs in with an orangecheck account and a wallet; uses none of the six directly.\n protocols: [],\n },\n {\n slug: 'me-demo',\n // \"demo\", not the made-up app's own name, so nobody takes it for ours.\n label: 'demo',\n href: 'https://me-demo.ochk.io',\n group: 'app',\n line: 'Lumen Notes, a made-up app that signs in with orangecheck.',\n status: 'live',\n },\n {\n slug: 'globe',\n label: 'globe',\n href: 'https://globe.ochk.io',\n group: 'public-good',\n line: 'The Bitcoin network, live, on a globe.',\n status: 'live',\n },\n {\n slug: 'btc',\n label: 'btc',\n href: 'https://btc.ochk.io',\n group: 'public-good',\n line: 'A free desk for reading the Bitcoin market.',\n status: 'live',\n },\n];\n\nexport const FAMILY_GROUPS: readonly { id: FamilyGroup; label: string }[] = [\n { id: 'orangecheck', label: 'orangecheck' },\n { id: 'protocol', label: 'Protocols' },\n { id: 'app', label: 'Apps' },\n { id: 'public-good', label: 'Public goods' },\n];\n\nconst BY_SLUG = new Map(FAMILY.map((s) => [s.slug, s]));\n\nexport function familySite(slug: FamilySlug): FamilySite {\n return BY_SLUG.get(slug)!;\n}\n\nexport function protocolSite(slug: ProtocolSlug): ProtocolSite {\n return BY_SLUG.get(slug) as ProtocolSite;\n}\n\n/** The family in its groups, in order, for menus and footers. */\nexport function familyByGroup(): { id: FamilyGroup; label: string; sites: FamilySite[] }[] {\n return FAMILY_GROUPS.map((g) => ({ ...g, sites: FAMILY.filter((s) => s.group === g.id) }));\n}\n\n/** One fixed row on every footer, all on ochk.io. */\nexport const LEGAL_LINKS: readonly NavItem[] = [\n { href: `${OCHK_IO}/privacy`, label: 'Privacy' },\n { href: `${OCHK_IO}/terms`, label: 'Terms' },\n { href: `${OCHK_IO}/security`, label: 'Security' },\n { href: `${OCHK_IO}/trademark`, label: 'Trademarks' },\n { href: `${OCHK_IO}/contact`, label: 'Contact' },\n];\n\n/**\n * The same row for a product that hosts its own documents (ochk.app, vault):\n * ochk.io's cover the free protocols, not a product that holds money, so its\n * privacy, terms, security and contact pages are its own. The trademarks are\n * the company's, on ochk.io.\n */\nexport const SELF_HOSTED_LEGAL_LINKS: readonly NavItem[] = [\n { href: '/privacy', label: 'Privacy' },\n { href: '/terms', label: 'Terms' },\n { href: '/security', label: 'Security' },\n { href: `${OCHK_IO}/trademark`, label: 'Trademarks' },\n { href: '/contact', label: 'Contact' },\n];\n\n/**\n * ochk.io's header navigation. oc-www and the docs (served under ochk.io/docs)\n * both draw it from here, so the two cannot drift. Absolute links work from\n * either; mark the active item where it is rendered.\n */\nexport const OCHK_IO_NAV: readonly NavItem[] = [\n {\n href: `${OCHK_IO}/protocols`,\n label: 'Protocols',\n children: PROTOCOLS.map((p) => ({ href: p.pageHref, label: p.label, description: p.line })),\n },\n { href: `${OCHK_IO}/apps`, label: 'Apps' },\n { href: DOCS_HREF, label: 'Docs' },\n { href: `${OCHK_IO}/trust`, label: 'Trust' },\n { href: `${OCHK_IO}/about`, label: 'About' },\n];\n\n/** ochk.io's own footer column; `SiteFooter family` adds the family's. */\nexport const OCHK_IO_FOOTER: readonly FooterColumn[] = [\n {\n heading: 'Company',\n links: [\n { href: `${OCHK_IO}/about`, label: 'About' },\n { href: `${OCHK_IO}/trust`, label: 'Trust' },\n { href: 'https://github.com/orangecheck', label: 'GitHub', external: true },\n ],\n },\n];\n","import { useContext } from 'react';\n\nimport { sharedContext } from './shared-context';\n\n/** Set by DocsShell: inside the docs, a link to the docs is a page of this site, through the router. */\nexport const InDocsContext = sharedContext<boolean>('in-docs', false);\n\nexport function useInDocs(): boolean {\n return useContext(InDocsContext);\n}\n","import { ArrowRight, ArrowUpRight } from 'lucide-react';\nimport Link from 'next/link';\nimport type { ReactNode } from 'react';\n\nimport {\n DOCS_HREF,\n FAMILY,\n PROTOCOL_ORDER,\n protocolSite,\n type FamilyGroup,\n type FamilySlug,\n type ProtocolSlug,\n type SiteStatus,\n} from '../family';\nimport { cn } from '../lib/cn';\nimport { useInDocs } from '../lib/docs-context';\nimport { Badge } from '../primitives/badge';\nimport { StatusBadge } from '../primitives/status-badge';\n\n/*\n * A card that is one link: the title carries the link and stretches over the\n * card, so the name is what a screen reader hears, and the whole card shows\n * one focus ring when the keyboard reaches it.\n */\nconst CARD =\n 'group relative flex h-full flex-col rounded-[1.25rem] border border-border bg-card p-6 transition-colors hover:border-oca-hairline-strong md:p-7 ' +\n 'has-[a:focus-visible]:ring-2 has-[a:focus-visible]:ring-ring has-[a:focus-visible]:ring-offset-2 has-[a:focus-visible]:ring-offset-background';\nconst STRETCH = 'outline-none after:absolute after:inset-0 after:rounded-[1.25rem] after:content-[\"\"]';\n\nconst pad = (n: number) => String(n + 1).padStart(2, '0');\n\n/**\n * The six protocols as cards, from the registry, in the family's order: the\n * verb's word, what it carries, one line, its Nostr kinds. `link` picks the\n * protocol's page on ochk.io, its tools, or its docs.\n */\nexport function ProtocolGrid({\n protocols = PROTOCOL_ORDER,\n link = 'page',\n className,\n}: {\n protocols?: readonly ProtocolSlug[];\n link?: 'page' | 'tool' | 'docs';\n className?: string;\n}) {\n // Inside the docs, their pages are this site's: through the router, under its base path.\n const inDocs = useInDocs();\n return (\n <ul className={cn('grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 md:gap-5', className)}>\n {protocols.map((slug) => {\n const p = protocolSite(slug);\n const i = PROTOCOL_ORDER.indexOf(slug);\n return (\n <li key={slug}>\n <div className={cn(CARD, 'gap-4')}>\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"oca-numeral\">\n {pad(i)} <span className=\"ml-1.5 capitalize\">{p.verb}</span>\n </span>\n {p.status !== 'live' ? <StatusBadge status={p.status} /> : null}\n </div>\n <h3 className=\"oca-display-3\">\n {link === 'docs' && inDocs ? (\n <Link href={`/${p.slug}`} className={STRETCH}>\n {p.label}\n </Link>\n ) : (\n <a\n href={link === 'tool' ? p.toolHref : link === 'docs' ? `${DOCS_HREF}/${p.slug}` : p.pageHref}\n className={STRETCH}\n >\n {p.label}\n </a>\n )}\n </h3>\n <p className=\"oca-body\">{p.line}</p>\n <div className=\"mt-auto flex items-center justify-between gap-3 pt-2 text-[0.875rem] text-muted-foreground\">\n <span className=\"oca-tabular\">Nostr kind {p.kinds}</span>\n {/* A tool is another site; a page or the docs are on ochk.io. */}\n {link === 'tool' ? (\n <ArrowUpRight\n aria-hidden\n className=\"size-4 transition-transform duration-200 group-hover:-translate-y-0.5 group-hover:translate-x-0.5 group-hover:text-foreground\"\n />\n ) : (\n <ArrowRight\n aria-hidden\n className=\"size-4 transition-transform duration-200 group-hover:translate-x-0.5 group-hover:text-foreground\"\n />\n )}\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n );\n}\n\nexport interface AppCardProps {\n name: ReactNode;\n line: ReactNode;\n href: string;\n /** The protocols it shows, as chips. */\n protocols?: readonly ProtocolSlug[];\n status?: SiteStatus;\n className?: string;\n}\n\n/** One app: its name, one line, the protocols it shows, and where it is. The card is the link. */\nexport function AppCard({ name, line, href, protocols = [], status = 'live', className }: AppCardProps) {\n return (\n <div className={cn(CARD, 'gap-3', className)}>\n <div className=\"flex items-start justify-between gap-3\">\n <h3 className=\"oca-title\">\n <a href={href} className={STRETCH}>\n {name}\n </a>\n </h3>\n {status !== 'live' ? <StatusBadge status={status} /> : null}\n </div>\n <p className=\"oca-body text-[0.9375rem]\">{line}</p>\n <div className=\"mt-auto flex items-end justify-between gap-3 pt-3\">\n {protocols.length > 0 ? (\n <p className=\"flex flex-wrap items-center gap-1.5 text-[0.8125rem] text-muted-foreground\">\n Shows\n {protocols.map((p) => (\n <Badge key={p} tone=\"muted\">\n {p}\n </Badge>\n ))}\n </p>\n ) : (\n <span />\n )}\n <span className=\"flex shrink-0 items-center gap-1 text-[0.875rem] text-muted-foreground transition-colors group-hover:text-foreground\">\n {href.replace(/^https?:\\/\\//, '')}\n <ArrowUpRight aria-hidden className=\"size-4\" />\n </span>\n </div>\n </div>\n );\n}\n\n/** The apps in a group, from the registry: `app` for the showcase apps, `public-good` for globe and btc. */\nexport function AppGrid({\n group = 'app',\n sites,\n className,\n}: {\n group?: Extract<FamilyGroup, 'app' | 'public-good'>;\n /** Pick and order the apps yourself instead. */\n sites?: readonly FamilySlug[];\n className?: string;\n}) {\n const list = sites\n ? sites.map((slug) => FAMILY.find((s) => s.slug === slug)).filter((s) => s !== undefined)\n : FAMILY.filter((s) => s.group === group);\n return (\n <ul className={cn('grid grid-cols-1 gap-4 sm:grid-cols-2 md:gap-5', className)}>\n {list.map((s) => (\n <li key={s.slug}>\n <AppCard name={s.label} line={s.line} href={s.href} protocols={s.protocols} status={s.status} />\n </li>\n ))}\n </ul>\n );\n}\n","import { useRouter } from 'next/compat/router';\nimport Link from 'next/link';\nimport type { ReactNode } from 'react';\n\nimport { cn } from '../lib/cn';\n\nconst LINK = 'text-foreground underline decoration-foreground/35 underline-offset-4 transition-colors hover:decoration-foreground';\n\nconst SCHEME = /^[a-z][a-z\\d+.-]*:/i;\n\n/**\n * `../README` or `VerifyOk`, as generated pages write them, against the page\n * it is on: `/sdk/stamp-core/README`. The router adds the base path. Outside\n * a router it stays as written.\n */\nfunction useResolved(href: string): string {\n const router = useRouter();\n if (!router || !href || href.startsWith('/') || href.startsWith('#') || href.startsWith('?') || SCHEME.test(href)) return href;\n const here = router.asPath.split(/[?#]/)[0] || '/';\n const url = new URL(href, `https://page.invalid${here}`);\n return url.pathname + url.search + url.hash;\n}\n\n/**\n * A link in running text. A page of this site goes through the router, a\n * relative one (`../README`) resolved against the page; an API or a\n * /.well-known file is a plain anchor (the router would try to render it);\n * another site opens in a new tab, and says so to a screen reader.\n */\nexport function TextLink({\n href: written,\n children,\n external,\n className,\n}: {\n href: string;\n children: ReactNode;\n /** Force a new tab (true) or keep it in this one (false). Default: by the address. */\n external?: boolean;\n className?: string;\n}) {\n const href = useResolved(written);\n const internal = href.startsWith('/') && !href.startsWith('/api/') && !href.startsWith('/.well-known/');\n const offsite = external ?? /^https?:\\/\\//.test(href);\n if (internal && !offsite) {\n return (\n <Link href={href} className={cn(LINK, className)}>\n {children}\n </Link>\n );\n }\n return (\n <a href={href} className={cn(LINK, className)} {...(offsite ? { target: '_blank', rel: 'noreferrer' } : {})}>\n {children}\n {offsite ? <span className=\"sr-only\"> (opens in a new tab)</span> : null}\n </a>\n );\n}\n","import { ArrowUpRight } from 'lucide-react';\nimport { useState, type CSSProperties, type FormEvent, type ReactNode } from 'react';\n\nimport { PROTOCOLS, protocolSite, type ProtocolSlug } from '../family';\nimport { cn } from '../lib/cn';\nimport { Button } from '../primitives/button';\nimport { Field, Input, Textarea } from '../primitives/form';\nimport { ScrollFade } from '../primitives/scroll-fade';\nimport { StatusBadge } from '../primitives/status-badge';\nimport { Callout } from './docs';\nimport { PageHero } from './hero';\nimport { TextLink } from './text-link';\n\n/*\n * The parts of a protocol's page on ochk.io. Each takes the protocol's slug\n * and reads its word, verb, links and kinds from the registry, so the six\n * pages are the same page with different data and cannot drift.\n */\n\n/** The top of a protocol page: \"Protocol · provenance\", the title, one line, the ways in. */\nexport function ProtocolHero({\n protocol,\n title,\n lead,\n actions,\n art,\n children,\n className,\n}: {\n protocol: ProtocolSlug;\n title: ReactNode;\n lead?: ReactNode;\n actions?: ReactNode;\n /** Beside the words from md up: the artifact itself, at size. */\n art?: ReactNode;\n children?: ReactNode;\n className?: string;\n}) {\n const p = protocolSite(protocol);\n return (\n <PageHero\n className={className}\n eyebrow={`Protocol · ${p.verb}`}\n title={title}\n lead={lead}\n actions={actions}\n art={art}\n >\n {p.status !== 'live' || children ? (\n <div className=\"flex flex-col items-start gap-4\">\n {p.status !== 'live' ? <StatusBadge status={p.status} /> : null}\n {children}\n </div>\n ) : null}\n </PageHero>\n );\n}\n\n/** The six protocols as a row of links, the current one underlined. Scrolls sideways on a phone. */\nexport function ProtocolNav({\n current,\n link = 'page',\n className,\n}: {\n current?: ProtocolSlug;\n link?: 'page' | 'tool';\n className?: string;\n}) {\n return (\n <nav aria-label=\"Protocols\" className={className}>\n <ScrollFade fade=\"var(--background)\">\n <ul className=\"flex w-max min-w-full items-center gap-6 border-b border-border\">\n {PROTOCOLS.map((p) => {\n const on = p.slug === current;\n return (\n <li key={p.slug}>\n <a\n href={link === 'tool' ? p.toolHref : p.pageHref}\n aria-current={on ? 'page' : undefined}\n className={cn(\n '-mb-px inline-flex h-11 items-center border-b-2 text-[0.9375rem] transition-colors',\n on\n ? 'border-foreground text-foreground'\n : 'border-transparent text-muted-foreground hover:text-foreground'\n )}\n >\n {p.label}\n </a>\n </li>\n );\n })}\n </ul>\n </ScrollFade>\n </nav>\n );\n}\n\n/** Which normative file a page summarises: its default file, title and sentence. */\nexport type SpecFileKind = 'spec' | 'security' | 'rationale';\n\nconst SPEC_FILE: Record<SpecFileKind, { file: string; title: string; note: string }> = {\n spec: {\n file: 'SPEC.md',\n title: 'Normative source',\n note: 'This page is a human-readable summary. The authoritative copy lives in the spec repo. If the two ever drift, the repo wins.',\n },\n security: {\n file: 'SECURITY.md',\n title: 'Normative threat model',\n note: 'This page is the short form. The authoritative, numbered threat model lives in the spec repo.',\n },\n rationale: {\n file: 'WHY.md',\n title: 'Design rationale',\n note: 'This page is the short version. The full rationale and the rejected-design log live in the spec repo.',\n },\n};\n\nexport type SpecCardProps =\n | {\n protocol: ProtocolSlug;\n version: string;\n license?: string;\n /** How many test vectors ship with it. */\n vectors?: number;\n size?: 'md' | 'sm';\n className?: string;\n repo?: never;\n }\n | {\n /** One file in any spec repo, `oc-chat-protocol` included: where a page's normative copy lives. */\n repo: string;\n /** Default: the kind's file (SPEC.md, SECURITY.md, WHY.md). */\n file?: string;\n kind?: SpecFileKind;\n version?: string;\n /** Replaces the kind's sentence. */\n note?: ReactNode;\n className?: string;\n protocol?: never;\n };\n\n/**\n * The spec, as a card: its repository, version, licence, kinds and test\n * vectors, and the way to read it. `sm` is one line, for a reference in\n * running text or a docs page. Given a `repo` instead of a protocol, it is\n * a note naming one file in that repo as the normative copy of the page.\n */\nexport function SpecCard(props: SpecCardProps) {\n return props.repo !== undefined ? <SpecFileNote {...props} /> : <ProtocolSpecCard {...props} />;\n}\n\nfunction SpecFileNote({ repo, file, kind = 'spec', version, note, className }: Extract<SpecCardProps, { repo: string }>) {\n const d = SPEC_FILE[kind];\n const f = file ?? d.file;\n return (\n <Callout title={version ? `${d.title} · ${version}` : d.title} className={className}>\n <p>{note ?? d.note}</p>\n <p>\n <TextLink href={`https://github.com/orangecheck/${repo}/blob/main/${f}`} className=\"break-all font-mono text-[0.875rem]\">\n {`${repo}/${f}`}\n </TextLink>\n </p>\n </Callout>\n );\n}\n\nfunction ProtocolSpecCard({ protocol, version, license, vectors, size = 'md', className }: Extract<SpecCardProps, { protocol: ProtocolSlug }>) {\n const p = protocolSite(protocol);\n const repo = `oc-${p.slug}-protocol`;\n const facts: [string, ReactNode][] = [\n ['Version', version],\n ...(license ? ([['Licence', license]] as [string, ReactNode][]) : []),\n ['Nostr kind', p.kinds],\n ...(vectors !== undefined ? ([['Test vectors', String(vectors)]] as [string, ReactNode][]) : []),\n ];\n if (size === 'sm') {\n return (\n <a\n href={p.specHref}\n className={cn(\n 'group flex flex-wrap items-center gap-x-4 gap-y-1 rounded-2xl border border-border bg-card px-4 py-3 text-[0.875rem] transition-colors hover:border-oca-hairline-strong',\n className\n )}\n >\n <span className=\"font-mono text-[0.8125rem] text-foreground\">{repo}</span>\n <span className=\"text-muted-foreground\">\n {facts.map(([k, v]) => (k === 'Version' ? `v${v}` : k === 'Nostr kind' ? `kind ${v}` : v)).join(' · ')}\n </span>\n <span className=\"ml-auto flex items-center gap-1 text-muted-foreground group-hover:text-foreground\">\n Read the spec <ArrowUpRight aria-hidden className=\"size-4\" />\n </span>\n </a>\n );\n }\n return (\n <div className={cn('flex flex-col gap-6 rounded-[1.25rem] border border-border bg-card p-6 md:p-8', className)}>\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"flex min-w-0 flex-col gap-1.5\">\n <p className=\"text-[0.875rem] text-muted-foreground\">The spec</p>\n <h3 className=\"oca-title break-all font-mono text-[1.0625rem] tracking-normal\">{repo}</h3>\n </div>\n {p.status !== 'live' ? <StatusBadge status={p.status} /> : null}\n </div>\n <dl className=\"grid grid-cols-2 gap-x-6 gap-y-4 sm:grid-cols-4\">\n {facts.map(([k, v]) => (\n <div key={k} className=\"flex flex-col gap-1\">\n <dt className=\"text-[0.8125rem] text-muted-foreground\">{k}</dt>\n <dd className=\"oca-tabular text-[1.0625rem]\">{v}</dd>\n </div>\n ))}\n </dl>\n <div>\n <Button asChild variant=\"secondary\" size=\"sm\">\n <a href={p.specHref}>\n Read the spec <ArrowUpRight aria-hidden />\n </a>\n </Button>\n </div>\n </div>\n );\n}\n\n/**\n * Paste an id, an envelope or a link and go to the page that checks it.\n * Without `onVerify` it is a plain GET form to `action`, so it works before\n * any script has loaded.\n */\nexport function VerifyBox({\n action,\n param = 'q',\n title,\n description,\n label = 'Id, envelope or link',\n placeholder,\n hint,\n submitLabel = 'Verify',\n multiline = false,\n onVerify,\n className,\n}: {\n /** Where the form goes: the tool's verify page. */\n action: string;\n /** The query parameter that carries what was pasted. */\n param?: string;\n title?: ReactNode;\n description?: ReactNode;\n label?: ReactNode;\n placeholder?: string;\n hint?: ReactNode;\n submitLabel?: string;\n /** A textarea, for a whole envelope. */\n multiline?: boolean;\n /** Handle it here instead of navigating. */\n onVerify?: (value: string) => void;\n className?: string;\n}) {\n const [value, setValue] = useState('');\n const submit = (e: FormEvent<HTMLFormElement>) => {\n if (!onVerify) return;\n e.preventDefault();\n if (value.trim()) onVerify(value.trim());\n };\n const button = (\n <Button type=\"submit\" className={multiline ? undefined : 'w-full sm:w-auto'}>\n {submitLabel}\n </Button>\n );\n return (\n <form\n action={action}\n method=\"get\"\n onSubmit={submit}\n className={cn('flex flex-col gap-5 rounded-[1.25rem] border border-border bg-card p-6 md:p-8', className)}\n >\n {title || description ? (\n <div className=\"flex flex-col gap-2\">\n {title ? <h3 className=\"oca-title\">{title}</h3> : null}\n {description ? <p className=\"oca-body text-[0.9375rem]\">{description}</p> : null}\n </div>\n ) : null}\n {multiline ? (\n <>\n <Field label={label} hint={hint}>\n <Textarea\n name={param}\n required\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={placeholder}\n spellCheck={false}\n className=\"min-h-32 font-mono text-base md:text-[0.8125rem]\"\n />\n </Field>\n <div>{button}</div>\n </>\n ) : (\n <Field label={label} hint={hint} action={button}>\n <Input\n name={param}\n required\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={placeholder}\n spellCheck={false}\n autoComplete=\"off\"\n className=\"font-mono text-base md:text-[0.875rem]\"\n />\n </Field>\n )}\n </form>\n );\n}\n\nexport interface ComparisonColumn {\n key: string;\n label: ReactNode;\n /** The one column the page argues for: tinted, read first on a phone. At most one. */\n highlight?: boolean;\n}\n\nexport interface ComparisonRow {\n label: ReactNode;\n /** One line under the property. */\n note?: ReactNode;\n /** An answer per column key, in words: \"Yes\", \"No\", \"Only with an x509 chain\". */\n values: Record<string, ReactNode>;\n}\n\nconst TINT = 'bg-[color-mix(in_oklab,var(--oca-orange)_9%,var(--card))]';\n\n/**\n * Systems side by side, a property per row, answers in words (never ✓ ✗ ~).\n * One column is tinted. On a phone each property becomes a card: the tinted\n * answer first and full width, the others two by two, each under its name.\n * Four or more columns wait for a desk to sit side by side.\n */\nexport function ComparisonTable({\n columns,\n rows,\n label,\n propertyHeading = 'Property',\n className,\n}: {\n columns: ComparisonColumn[];\n rows: ComparisonRow[];\n /** The list's name for a screen reader. */\n label: string;\n propertyHeading?: ReactNode;\n className?: string;\n}) {\n const wide = columns.length > 3;\n // Static class names per breakpoint, so Tailwind can see them.\n const grid = wide ? 'lg:grid lg:grid-cols-[var(--oca-compare)]' : 'md:grid md:grid-cols-[var(--oca-compare)]';\n const desk = wide ? 'lg' : 'md';\n const style = {\n // The argued-for column gets a little more room: its answers carry the page.\n '--oca-compare': ['minmax(0, 1.4fr)', ...columns.map((c) => (c.highlight ? 'minmax(0, 1.3fr)' : 'minmax(0, 1fr)'))].join(' '),\n } as CSSProperties;\n const ordered = [...columns].sort((a, b) => Number(Boolean(b.highlight)) - Number(Boolean(a.highlight)));\n return (\n <ul aria-label={label} style={style} className={cn('divide-y divide-border rounded-[1.25rem] border border-border bg-card', className)}>\n <li\n aria-hidden\n className={cn(\n 'hidden gap-5 px-5 py-4 text-[0.875rem] font-medium text-muted-foreground',\n wide ? 'lg:grid lg:px-8' : 'md:grid md:px-8',\n grid\n )}\n >\n <span>{propertyHeading}</span>\n {columns.map((c) => (\n <span key={c.key} className={cn(c.highlight && cn(TINT, '-my-4 px-4 py-4 text-oca-accent-ink'))}>\n {c.label}\n </span>\n ))}\n </li>\n {rows.map((r, ri) => (\n <li key={ri} className={cn('grid grid-cols-1 gap-3 px-5 py-5', wide ? 'lg:items-start lg:gap-5 lg:px-8' : 'md:items-start md:gap-5 md:px-8', grid)}>\n <div className=\"flex min-w-0 flex-col gap-1\">\n <span className=\"oca-title-sm\">{r.label}</span>\n {r.note ? <span className=\"text-[0.875rem] leading-snug text-muted-foreground\">{r.note}</span> : null}\n </div>\n <div className={cn('grid grid-cols-2 gap-1', desk === 'lg' ? 'lg:contents' : 'md:contents')}>\n {columns.map((c) => {\n // On a phone the tinted answer leads; on a desk the columns keep their order.\n return (\n <div\n key={c.key}\n style={{ '--oca-order': ordered.indexOf(c) } as CSSProperties}\n className={cn(\n // Two rows of the pair's grid (name, answer), so answers line up\n // across a pair even when one name wraps.\n 'order-[var(--oca-order)] row-span-2 grid min-w-0 grid-rows-subgrid gap-1 rounded-xl px-3 py-2.5',\n desk === 'lg'\n ? 'lg:order-none lg:row-span-1 lg:flex lg:flex-col'\n : 'md:order-none md:row-span-1 md:flex md:flex-col',\n c.highlight\n ? cn(\n TINT,\n 'col-span-2',\n desk === 'lg'\n ? 'lg:col-span-1 lg:-my-5 lg:self-stretch lg:rounded-none lg:px-4 lg:py-5'\n : 'md:col-span-1 md:-my-5 md:self-stretch md:rounded-none md:px-4 md:py-5'\n )\n : desk === 'lg'\n ? 'lg:p-0'\n : 'md:p-0'\n )}\n >\n <span\n className={cn(\n 'text-[0.8125rem]',\n c.highlight ? 'text-oca-accent-ink' : 'text-muted-foreground',\n desk === 'lg' ? 'lg:sr-only' : 'md:sr-only'\n )}\n >\n {c.label}\n </span>\n <span className={cn('text-[0.9375rem]', c.highlight && 'font-medium')}>\n {r.values[c.key] ?? '—'}\n </span>\n </div>\n );\n })}\n </div>\n </li>\n ))}\n </ul>\n );\n}\n","import type { AnchorHTMLAttributes, HTMLAttributes, ImgHTMLAttributes, InputHTMLAttributes, ReactNode } from 'react';\n\nimport { CodeBlock, CodeTabs, InstallTabs } from '../components/code-block';\nimport {\n ApiTable,\n Callout,\n CardGrid,\n codeLang,\n codeText,\n Diagram,\n DocsHeading,\n LinkCard,\n MdxTable,\n Step,\n Steps,\n type MermaidLoader,\n} from '../components/docs';\nimport { ProtocolGrid } from '../components/family-grids';\nimport { SpecCard } from '../components/protocol';\nimport { TextLink } from '../components/text-link';\nimport { cn } from '../lib/cn';\nimport { StatusBadge } from '../primitives/status-badge';\n\n/*\n * Markdown in the system's type: hand the map to MDX (useMDXComponents or\n * <MDXProvider components>) and every heading, paragraph, list, table,\n * quote and code fence takes its place. Pair it with rehypeCode (./code) so\n * fences arrive highlighted from the build; without it, a fence is\n * highlighted when the page renders.\n *\n * The blocks a page writes by name are in the map too: Callout, Steps and\n * Step, LinkCard and CardGrid, ApiTable, CodeTabs, InstallTabs, SpecCard,\n * ProtocolGrid, StatusBadge.\n */\n\n\nexport interface MdxOptions {\n /** `() => import('mermaid')`: draws ```mermaid fences as diagrams. Without it they show as code. */\n mermaid?: MermaidLoader;\n}\n\ntype PreProps = HTMLAttributes<HTMLPreElement> & {\n 'data-oca-code'?: string;\n 'data-html'?: string;\n 'data-lang'?: string;\n 'data-title'?: string;\n 'data-diff'?: string;\n 'data-line-numbers'?: string;\n 'data-eol'?: string;\n};\n\nexport function createMdxComponents({ mermaid }: MdxOptions = {}) {\n function Pre(props: PreProps) {\n // Highlighted at build time by rehypeCode.\n if (props['data-oca-code'] !== undefined) {\n return (\n <CodeBlock\n html={props['data-html'] ?? ''}\n lang={props['data-lang']}\n caption={props['data-title']}\n diff={props['data-diff'] !== undefined}\n lineNumbers={props['data-line-numbers'] !== undefined}\n trailingNewline={props['data-eol'] !== undefined}\n className=\"my-6\"\n />\n );\n }\n const lang = codeLang(props.children);\n const code = codeText(props.children);\n if (lang === 'mermaid' && mermaid) return <Diagram chart={code} load={mermaid} />;\n return (\n <CodeBlock\n code={code}\n lang={lang === 'mermaid' ? undefined : lang}\n caption={lang === 'mermaid' ? 'Diagram source' : undefined}\n className=\"my-6\"\n />\n );\n }\n\n function A({ href, children, ...rest }: AnchorHTMLAttributes<HTMLAnchorElement>) {\n // In-page anchors and footnote links stay plain.\n if (!href || href.startsWith('#')) {\n return (\n <a href={href} {...rest} className=\"text-foreground underline decoration-foreground/35 underline-offset-4 hover:decoration-foreground\">\n {children}\n </a>\n );\n }\n return <TextLink href={href}>{children}</TextLink>;\n }\n\n const heading = (as: 'h1' | 'h2' | 'h3' | 'h4') =>\n function Heading(props: HTMLAttributes<HTMLHeadingElement>) {\n return <DocsHeading as={as} {...props} />;\n };\n\n // TypeDoc writes h5 for a method's \"Returns\": a label over what follows, not a section.\n const minor = (Tag: 'h5' | 'h6') =>\n function Minor({ className, ...props }: HTMLAttributes<HTMLHeadingElement>) {\n return <Tag className={cn('mb-2 mt-6 scroll-mt-28 text-[0.9375rem] font-medium leading-snug text-foreground', className)} {...props} />;\n };\n\n return {\n h1: heading('h1'),\n h2: heading('h2'),\n h3: heading('h3'),\n h4: heading('h4'),\n p: ({ className, ...props }: HTMLAttributes<HTMLParagraphElement>) => (\n <p className={cn('my-4 text-[1rem] leading-[1.75] text-muted-foreground md:text-[1.0625rem]', className)} {...props} />\n ),\n a: A,\n strong: (props: HTMLAttributes<HTMLElement>) => <strong className=\"font-medium text-foreground\" {...props} />,\n h5: minor('h5'),\n h6: minor('h6'),\n ul: ({ className, ...props }: HTMLAttributes<HTMLUListElement>) => (\n <ul\n className={cn(\n 'my-4 list-disc space-y-1.5 pl-5 text-[1rem] leading-[1.7] text-muted-foreground marker:text-oca-subtle md:text-[1.0625rem]',\n // A GitHub task list: the box replaces the bullet.\n className?.includes('contains-task-list') && 'list-none pl-0',\n className\n )}\n {...props}\n />\n ),\n ol: ({ className, ...props }: HTMLAttributes<HTMLOListElement>) => (\n <ol\n className={cn(\n 'my-4 list-decimal space-y-1.5 pl-5 text-[1rem] leading-[1.7] text-muted-foreground marker:text-oca-subtle md:text-[1.0625rem]',\n className\n )}\n {...props}\n />\n ),\n li: ({ className, ...props }: HTMLAttributes<HTMLLIElement>) => (\n <li\n className={cn(\n 'pl-1 [&>p]:my-1 [&>ul]:my-1.5 [&>ol]:my-1.5',\n // A wrapped task starts under its text, not under the box.\n className?.includes('task-list-item') && 'pl-6 -indent-6',\n className\n )}\n {...props}\n />\n ),\n input: (props: InputHTMLAttributes<HTMLInputElement>) =>\n props.type === 'checkbox' ? (\n <input\n {...props}\n className={cn('mr-2 size-4 translate-y-[2px] align-baseline accent-foreground', props.className)}\n aria-label={props.checked ? 'Done' : 'To do'}\n />\n ) : (\n <input {...props} />\n ),\n blockquote: ({ children }: { children?: ReactNode }) => <Callout>{children}</Callout>,\n hr: () => <hr className=\"my-10 border-border\" />,\n table: MdxTable,\n code: ({ className, ...props }: HTMLAttributes<HTMLElement>) => (\n <code\n className={cn('break-words rounded-md bg-muted px-1.5 py-0.5 font-mono text-[0.875em] text-foreground', className)}\n {...props}\n />\n ),\n pre: Pre,\n img: ({ className, alt = '', ...props }: ImgHTMLAttributes<HTMLImageElement>) => (\n <img alt={alt} loading=\"lazy\" className={cn('my-6 h-auto max-w-full rounded-2xl border border-border', className)} {...props} />\n ),\n Callout,\n Steps,\n Step,\n LinkCard,\n CardGrid,\n ApiTable,\n CodeBlock,\n CodeTabs,\n InstallTabs,\n SpecCard,\n ProtocolGrid,\n StatusBadge,\n ...(mermaid\n ? { Diagram: (p: { chart: string; caption?: ReactNode }) => <Diagram {...p} load={mermaid} /> }\n : {}),\n };\n}\n\n/** Every key it maps, each a component: what MDX's useMDXComponents takes. */\nexport type MdxComponentMap = ReturnType<typeof createMdxComponents>;\n\n/** The map with no diagrams; createMdxComponents({ mermaid }) draws them. */\nexport const mdxComponents: MdxComponentMap = createMdxComponents();\n"]}